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

Artifact 65bfc68f3f09dcbc62cee9f794e560428d96cec7:


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 74 65 73 74 5f 73 65 74 5f 63  urn }.test_set_c
02f0: 6f 6e 66 69 67 5f 70 61 67 65 63 61 63 68 65 20  onfig_pagecache 
0300: 30 20 30 0a 0a 70 72 6f 63 20 72 65 6f 70 65 6e  0 0..proc reopen
0310: 5f 64 62 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68  _db {} {.  catch
0320: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20   { db close }.  
0330: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
0340: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  .db test.db-wal 
0350: 74 65 73 74 2e 64 62 2d 77 61 6c 2d 73 75 6d 6d  test.db-wal-summ
0360: 61 72 79 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  ary.  sqlite3_wa
0370: 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 7d 0a 0a  l db test.db.}..
0380: 73 65 74 20 3a 3a 62 6c 6f 62 63 6e 74 20 30 0a  set ::blobcnt 0.
0390: 70 72 6f 63 20 62 6c 6f 62 20 7b 6e 42 79 74 65  proc blob {nByte
03a0: 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a 62 6c 6f  } {.  incr ::blo
03b0: 62 63 6e 74 0a 20 20 72 65 74 75 72 6e 20 5b 73  bcnt.  return [s
03c0: 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 73 74 72  tring range [str
03d0: 69 6e 67 20 72 65 70 65 61 74 20 22 24 7b 3a 3a  ing repeat "${::
03e0: 62 6c 6f 62 63 6e 74 7d 78 22 20 24 6e 42 79 74  blobcnt}x" $nByt
03f0: 65 5d 20 31 20 24 6e 42 79 74 65 5d 0a 7d 0a 0a  e] 1 $nByte].}..
0400: 70 72 6f 63 20 73 71 6c 69 74 65 33 5f 77 61 6c  proc sqlite3_wal
0410: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c   {args} {.  eval
0420: 20 73 71 6c 69 74 65 33 20 24 61 72 67 73 0a 20   sqlite3 $args. 
0430: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
0440: 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  ] eval { PRAGMA 
0450: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 20  auto_vacuum = 0 
0460: 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  }.  [lindex $arg
0470: 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41 47  s 0] eval { PRAG
0480: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
0490: 30 32 34 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20  024 }.  [lindex 
04a0: 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b 20  $args 0] eval { 
04b0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
04c0: 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20 5b 6c  ode = wal }.  [l
04d0: 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20 65  index $args 0] e
04e0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 73 79 6e  val { PRAGMA syn
04f0: 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d 61  chronous = norma
0500: 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61  l }.  [lindex $a
0510: 72 67 73 20 30 5d 20 66 75 6e 63 74 69 6f 6e 20  rgs 0] function 
0520: 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a 0a 70 72 6f  blob blob.}..pro
0530: 63 20 6c 6f 67 5f 64 65 6c 65 74 65 64 20 7b 6c  c log_deleted {l
0540: 6f 67 66 69 6c 65 7d 20 7b 0a 20 20 72 65 74 75  ogfile} {.  retu
0550: 72 6e 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 65  rn [expr [file e
0560: 78 69 73 74 73 20 24 6c 6f 67 66 69 6c 65 5d 3d  xists $logfile]=
0570: 3d 30 5d 0a 7d 0a 0a 23 0a 23 20 54 68 65 73 65  =0].}..#.# These
0580: 20 61 72 65 20 27 77 61 72 6d 2d 62 6f 64 79 27   are 'warm-body'
0590: 20 74 65 73 74 73 20 75 73 65 64 20 77 68 69 6c   tests used whil
05a0: 65 20 64 65 76 65 6c 6f 70 69 6e 67 20 74 68 65  e developing the
05b0: 20 57 41 4c 20 63 6f 64 65 2e 20 54 68 65 79 0a   WAL code. They.
05c0: 23 20 73 65 72 76 65 20 74 6f 20 70 72 6f 76 65  # serve to prove
05d0: 20 74 68 61 74 20 61 20 66 65 77 20 72 65 61 6c   that a few real
05e0: 6c 79 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  ly simple cases 
05f0: 77 6f 72 6b 3a 0a 23 0a 23 20 77 61 6c 2d 31 2e  work:.#.# wal-1.
0600: 2a 3a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  *: Read and writ
0610: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
0620: 23 20 77 61 6c 2d 32 2e 2a 3a 20 54 65 73 74 20  # wal-2.*: Test 
0630: 4d 56 43 43 20 77 69 74 68 20 6f 6e 65 20 72 65  MVCC with one re
0640: 61 64 65 72 2c 20 6f 6e 65 20 77 72 69 74 65 72  ader, one writer
0650: 2e 0a 23 20 77 61 6c 2d 33 2e 2a 3a 20 54 65 73  ..# wal-3.*: Tes
0660: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  t transaction ro
0670: 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 34 2e  llback..# wal-4.
0680: 2a 3a 20 54 65 73 74 20 73 61 76 65 70 6f 69 6e  *: Test savepoin
0690: 74 2f 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  t/statement roll
06a0: 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 35 2e 2a 3a  back..# wal-5.*:
06b0: 20 54 65 73 74 20 74 68 65 20 74 65 6d 70 20 64   Test the temp d
06c0: 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c 2d 36  atabase..# wal-6
06d0: 2e 2a 3a 20 54 65 73 74 20 63 72 65 61 74 69 6e  .*: Test creatin
06e0: 67 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  g databases with
06f0: 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20   different page 
0700: 73 69 7a 65 73 2e 0a 23 0a 23 0a 23 0a 64 6f 5f  sizes..#.#.#.do_
0710: 74 65 73 74 20 77 61 6c 2d 30 2e 31 20 7b 0a 20  test wal-0.1 {. 
0720: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
0730: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
0740: 30 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  0 }.  execsql { 
0750: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0760: 75 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a 20 20  us = normal }.  
0770: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
0780: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
0790: 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f  wal }.} {wal}.do
07a0: 5f 74 65 73 74 20 77 61 6c 2d 30 2e 32 20 7b 0a  _test wal-0.2 {.
07b0: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
07c0: 2e 64 62 0a 7d 20 7b 31 30 32 34 7d 0a 0a 64 6f  .db.} {1024}..do
07d0: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 30 20 7b 0a  _test wal-1.0 {.
07e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
07f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
0800: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0810: 29 3b 20 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  ); .  }.  list [
0820: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
0830: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5c 0a 20  .db-journal] \. 
0840: 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78 69 73        [file exis
0850: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ts test.db-wal] 
0860: 20 20 20 20 5c 0a 20 20 20 20 20 20 20 5b 66 69      \.       [fi
0870: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
0880: 0a 7d 20 7b 30 20 31 20 31 30 32 34 7d 0a 64 6f  .} {0 1 1024}.do
0890: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 31 20 7b 0a  _test wal-1.1 {.
08a0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
08b0: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78  .  list [file ex
08c0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
08d0: 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73  rnal] [file exis
08e0: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ts test.db-wal].
08f0: 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {0 1}.do_test 
0900: 77 61 6c 2d 31 2e 32 20 7b 0a 20 20 23 20 54 68  wal-1.2 {.  # Th
0910: 65 72 65 20 61 72 65 20 6e 6f 77 20 74 77 6f 20  ere are now two 
0920: 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  pages in the log
0930: 2e 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  ..  file size te
0940: 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 5b 77 61 6c  st.db-wal.} [wal
0950: 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30 32  _file_size 2 102
0960: 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]..do_test wal-
0970: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
0980: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0990: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a  sqlite_master }.
09a0: 7d 20 7b 74 61 62 6c 65 20 74 31 20 74 31 20 32  } {table t1 t1 2
09b0: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
09c0: 31 28 61 2c 20 62 29 7d 7d 0a 0a 64 6f 5f 74 65  1(a, b)}}..do_te
09d0: 73 74 20 77 61 6c 2d 31 2e 34 20 7b 0a 20 20 65  st wal-1.4 {.  e
09e0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
09f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0a00: 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c  , 2) }.  execsql
0a10: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
0a20: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d  1 VALUES(3, 4) }
0a30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0a40: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a50: 45 53 28 35 2c 20 36 29 20 7d 0a 20 20 65 78 65  ES(5, 6) }.  exe
0a60: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0a70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20  TO t1 VALUES(7, 
0a80: 38 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  8) }.  execsql {
0a90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0aa0: 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a  VALUES(9, 10) }.
0ab0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  } {}..do_test wa
0ac0: 6c 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  l-1.5 {.  execsq
0ad0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0ae0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
0af0: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0b00: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 31  .do_test wal-2.1
0b10: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c   {.  sqlite3_wal
0b20: 20 64 62 32 20 2e 2f 74 65 73 74 2e 64 62 0a 20   db2 ./test.db. 
0b30: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
0b40: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
0b50: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20  t1 } db2.} {1 2 
0b60: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0b70: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0b80: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0ba0: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d  VALUES(11, 12) }
0bb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0bc0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0bd0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0be0: 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 0a   8 9 10 11 12}..
0bf0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 33 20  do_test wal-2.3 
0c00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0c10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0c20: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20   db2.} {1 2 3 4 
0c30: 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 64  5 6 7 8 9 10}..d
0c40: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 34 20 7b  o_test wal-2.4 {
0c50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0c60: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0c70: 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20 65  ES(13, 14) }.  e
0c80: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0c90: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
0ca0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0cb0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d   10 11 12 13 14}
0cc0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0cd0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
0ce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0cf0: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
0d00: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0d10: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 36  .do_test wal-2.6
0d20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
0d30: 4f 4d 4d 49 54 3b 20 53 45 4c 45 43 54 20 2a 20  OMMIT; SELECT * 
0d40: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
0d50: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0d60: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
0d70: 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4}..do_test wal-
0d80: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
0d90: 7b 20 42 45 47 49 4e 3b 20 44 45 4c 45 54 45 20  { BEGIN; DELETE 
0da0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65 63  FROM t1 }.  exec
0db0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0dc0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a 64 6f  ROM t1 }.} {}.do
0dd0: 5f 74 65 73 74 20 77 61 6c 2d 33 2e 32 20 7b 0a  _test wal-3.2 {.
0de0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
0e00: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
0e10: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
0e20: 20 31 33 20 31 34 7d 0a 64 6f 5f 74 65 73 74 20   13 14}.do_test 
0e30: 77 61 6c 2d 33 2e 33 20 7b 0a 20 20 65 78 65 63  wal-3.3 {.  exec
0e40: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
0e50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0e60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0e70: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0e80: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
0e90: 20 31 34 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a   14}.db2 close..
0ea0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 65  ----------.# The
0ef0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
0f00: 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74 65 73 74 20  , wal-4.*, test 
0f10: 74 68 61 74 20 73 61 76 65 70 6f 69 6e 74 73 20  that savepoints 
0f20: 77 6f 72 6b 20 77 69 74 68 20 57 41 4c 20 0a 23  work with WAL .#
0f30: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 64 6f   databases..#.do
0f40: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 31 20 7b 0a  _test wal-4.1 {.
0f50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0f60: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
0f70: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0f80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0f90: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
0fa0: 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
0fb0: 54 20 73 70 3b 0a 20 20 20 20 20 20 20 20 49 4e  T sp;.        IN
0fc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0fd0: 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20  UES('c', 'd');. 
0fe0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
0ff0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
1000: 61 20 62 20 63 20 64 7d 0a 64 6f 5f 74 65 73 74  a b c d}.do_test
1010: 20 77 61 6c 2d 34 2e 32 20 7b 0a 20 20 65 78 65   wal-4.2 {.  exe
1020: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 52 4f 4c  csql {.      ROL
1030: 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
1040: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1050: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d   t1;.  }.} {a b}
1060: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 33  .do_test wal-4.3
1070: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1080: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53     COMMIT;.    S
1090: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
10a0: 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a 0a 64 6f  .  }.} {a b}..do
10b0: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 31 20  _test wal-4.4.1 
10c0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
10d0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
10e0: 62 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62  b.  db func blob
10f0: 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20 5b 65 78   blob.  list [ex
1100: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
1110: 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b 66 69 6c   FROM t1 }] [fil
1120: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
1130: 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20 30 7d 0a  al].} {{a b} 0}.
1140: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
1150: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
1160: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1170: 65 20 3d 20 31 30 20 7d 0a 20 20 65 78 65 63 73  e = 10 }.  execs
1180: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1190: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
11a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11b0: 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34  t2 VALUES(blob(4
11c0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b  00), blob(400));
11d0: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74  .    SAVEPOINT t
11e0: 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  r;.      INSERT 
11f0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
1200: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
1210: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
1220: 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   2 */.      INSE
1230: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
1240: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1250: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
1260: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
1270: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1280: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1290: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
12a0: 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20  2; /*  8 */.    
12b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
12c0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
12d0: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
12e0: 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20  M t2; /* 16 */. 
12f0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1300: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
1310: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
1320: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a  FROM t2; /* 32 *
1330: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
1340: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
1350: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1360: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20  0) FROM t1; /*  
1370: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
1380: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1390: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
13a0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
13b0: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
13c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
13d0: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
13e0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
13f0: 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20  ; /*  8 */.     
1400: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1410: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1420: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1430: 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20   t1; /* 16 */.  
1440: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1450: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
1460: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1470: 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f  ROM t1; /* 32 */
1480: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
1490: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a  unt(*) FROM t2;.
14a0: 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65    }.} {32}.do_te
14b0: 73 74 20 77 61 6c 2d 34 2e 34 2e 33 20 7b 0a 20  st wal-4.4.3 {. 
14c0: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
14d0: 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d  ACK TO tr }.} {}
14e0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34  .do_test wal-4.4
14f0: 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69  .4 {.  set logsi
1500: 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  ze [file size te
1510: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65  st.db-wal].  exe
1520: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
1530: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1540: 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20  ES('x', 'y');.  
1550: 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20    RELEASE tr;.  
1560: 7d 0a 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73  }.  expr { $logs
1570: 69 7a 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a  ize == [file siz
1580: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d  e test.db-wal] }
1590: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
15a0: 61 6c 2d 34 2e 34 2e 35 20 7b 0a 20 20 65 78 65  al-4.4.5 {.  exe
15b0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
15c0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d  unt(*) FROM t2 }
15d0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
15e0: 61 6c 2d 34 2e 34 2e 36 20 7b 0a 20 20 66 6f 72  al-4.4.6 {.  for
15f0: 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74  cecopy test.db t
1600: 65 73 74 32 2e 64 62 0a 20 20 66 6f 72 63 65 63  est2.db.  forcec
1610: 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  opy test.db-wal 
1620: 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73  test2.db-wal.  s
1630: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 32  qlite3 db2 test2
1640: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
1650: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1660: 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c 45 43 54  FROM t2 ; SELECT
1670: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1680: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a  1 } db2.} {1 2}.
1690: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
16a0: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
16b0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
16c0: 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b  _check } db2.} {
16d0: 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64  ok}.db2 close..d
16e0: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 31  o_test wal-4.5.1
16f0: 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20   {.  reopen_db. 
1700: 20 64 62 20 66 75 6e 63 20 62 6c 6f 62 20 62 6c   db func blob bl
1710: 6f 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ob.  execsql {. 
1720: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
1730: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
1740: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1750: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
1760: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1770: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
1780: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  }.  sqlite3 db t
1790: 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63  est.db.  db func
17a0: 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73   blob blob.  lis
17b0: 74 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  t [execsql { SEL
17c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d  ECT * FROM t1 }]
17d0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
17e0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62  .db-wal].} {{a b
17f0: 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  } 0}.do_test wal
1800: 2d 34 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73  -4.5.2 {.  execs
1810: 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  ql { PRAGMA cach
1820: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
1830: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1840: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
1850: 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   b);.    BEGIN;.
1860: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1870: 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34  t2 VALUES(blob(4
1880: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b  00), blob(400));
1890: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74  .    SAVEPOINT t
18a0: 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  r;.      INSERT 
18b0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
18c0: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
18d0: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
18e0: 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   2 */.      INSE
18f0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
1900: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1910: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
1920: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
1930: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1940: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1950: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1960: 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20  2; /*  8 */.    
1970: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1980: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1990: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
19a0: 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20  M t2; /* 16 */. 
19b0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
19c0: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
19d0: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
19e0: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a  FROM t2; /* 32 *
19f0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
1a00: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
1a10: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1a20: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20  0) FROM t1; /*  
1a30: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
1a40: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1a50: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1a60: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1a70: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
1a80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1a90: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1aa0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
1ab0: 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20  ; /*  8 */.     
1ac0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1ad0: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1ae0: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1af0: 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20   t1; /* 16 */.  
1b00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1b10: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
1b20: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1b30: 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f  ROM t1; /* 32 */
1b40: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
1b50: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a  unt(*) FROM t2;.
1b60: 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65    }.} {32}.do_te
1b70: 73 74 20 77 61 6c 2d 34 2e 35 2e 33 20 7b 0a 20  st wal-4.5.3 {. 
1b80: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
1b90: 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d  ACK TO tr }.} {}
1ba0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
1bb0: 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69  .4 {.  set logsi
1bc0: 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  ze [file size te
1bd0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65  st.db-wal].  exe
1be0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
1bf0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1c00: 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20  ES('x', 'y');.  
1c10: 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20    RELEASE tr;.  
1c20: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
1c30: 65 78 70 72 20 7b 20 24 6c 6f 67 73 69 7a 65 20  expr { $logsize 
1c40: 3d 3d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  == [file size te
1c50: 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d 20 7b  st.db-wal] }.} {
1c60: 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  1}.do_test wal-4
1c70: 2e 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.5 {.  execsql
1c80: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
1c90: 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c  *) FROM t2 ; SEL
1ca0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1cb0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64  M t1 }.} {1 2}.d
1cc0: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 36  o_test wal-4.5.6
1cd0: 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74   {.  forcecopy t
1ce0: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
1cf0: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
1d00: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
1d10: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64  -wal.  sqlite3 d
1d20: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78  b2 test2.db.  ex
1d30: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
1d40: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
1d50: 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ; SELECT count(*
1d60: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
1d70: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
1d80: 77 61 6c 2d 34 2e 35 2e 37 20 7b 0a 20 20 65 78  wal-4.5.7 {.  ex
1d90: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
1da0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
1db0: 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20   db2.} {ok}.db2 
1dc0: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
1dd0: 61 6c 2d 34 2e 36 2e 31 20 7b 0a 20 20 65 78 65  al-4.6.1 {.  exe
1de0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
1df0: 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 50  E FROM t2;.    P
1e00: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
1e10: 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e 3b  oint;.    BEGIN;
1e20: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1e30: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 77 27  TO t2 VALUES('w'
1e40: 2c 20 27 78 27 29 3b 0a 20 20 20 20 20 20 53 41  , 'x');.      SA
1e50: 56 45 50 4f 49 4e 54 20 73 61 76 65 3b 0a 20 20  VEPOINT save;.  
1e60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1e70: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 79 27 2c  O t2 VALUES('y',
1e80: 20 27 7a 27 29 3b 0a 20 20 20 20 20 20 52 4f 4c   'z');.      ROL
1e90: 4c 42 41 43 4b 20 54 4f 20 73 61 76 65 3b 0a 20  LBACK TO save;. 
1ea0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
1eb0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1ec0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20  T * FROM t2 }.} 
1ed0: 7b 77 20 78 7d 0a 0a 0a 72 65 6f 70 65 6e 5f 64  {w x}...reopen_d
1ee0: 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e  b.do_test wal-5.
1ef0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
1f00: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
1f10: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
1f20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1f30: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t2 VALUES(1, 2);
1f40: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
1f50: 74 20 77 61 6c 2d 35 2e 32 20 7b 0a 20 20 65 78  t wal-5.2 {.  ex
1f60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
1f70: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
1f80: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33  INTO t2 VALUES(3
1f90: 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  , 4);.      SELE
1fa0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
1fb0: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  }.} {1 2 3 4}.do
1fc0: 5f 74 65 73 74 20 77 61 6c 2d 35 2e 33 20 7b 0a  _test wal-5.3 {.
1fd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1fe0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45  ROLLBACK;.    SE
1ff0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
2000: 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74    }.} {1 2}.do_t
2010: 65 73 74 20 77 61 6c 2d 35 2e 34 20 7b 0a 20 20  est wal-5.4 {.  
2020: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2030: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
2040: 74 33 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20  t3(x UNIQUE);.  
2050: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
2060: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
2070: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20  LUES(3, 4);.    
2080: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
2090: 20 56 41 4c 55 45 53 28 27 61 62 63 27 29 3b 0a   VALUES('abc');.
20a0: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
20b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
20c0: 56 41 4c 55 45 53 28 27 61 62 63 27 29 20 7d 0a  VALUES('abc') }.
20d0: 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e  } {1 {UNIQUE con
20e0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
20f0: 74 33 2e 78 7d 7d 0a 64 6f 5f 74 65 73 74 20 77  t3.x}}.do_test w
2100: 61 6c 2d 35 2e 35 20 7b 0a 20 20 65 78 65 63 73  al-5.5 {.  execs
2110: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
2120: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2130: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
2140: 32 20 33 20 34 7d 0a 64 62 20 63 6c 6f 73 65 0a  2 3 4}.db close.
2150: 0a 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 20  .foreach sector 
2160: 7b 35 31 32 20 34 30 39 36 7d 20 7b 0a 20 20 73  {512 4096} {.  s
2170: 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f  qlite3_simulate_
2180: 64 65 76 69 63 65 20 2d 73 65 63 74 6f 72 73 69  device -sectorsi
2190: 7a 65 20 24 73 65 63 74 6f 72 0a 20 20 66 6f 72  ze $sector.  for
21a0: 65 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31  each pgsz {512 1
21b0: 30 32 34 20 32 30 34 38 20 34 30 39 36 7d 20 7b  024 2048 4096} {
21c0: 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .    forcedelete
21d0: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
21e0: 2d 77 61 6c 0a 20 20 20 20 64 6f 5f 74 65 73 74  -wal.    do_test
21f0: 20 77 61 6c 2d 36 2e 24 73 65 63 74 6f 72 2e 24   wal-6.$sector.$
2200: 70 67 73 7a 2e 31 20 7b 0a 20 20 20 20 20 20 73  pgsz.1 {.      s
2210: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2220: 62 20 2d 76 66 73 20 64 65 76 73 79 6d 0a 20 20  b -vfs devsym.  
2230: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
2240: 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
2250: 65 5f 73 69 7a 65 20 3d 20 24 70 67 73 7a 3b 0a  e_size = $pgsz;.
2260: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 61          PRAGMA a
2270: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
2280: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a          PRAGMA j
2290: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
22a0: 6c 3b 0a 20 20 20 20 20 20 22 0a 20 20 20 20 20  l;.      ".     
22b0: 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20   execsql ".     
22c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
22d0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
22e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
22f0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
2300: 20 20 20 20 20 22 0a 20 20 20 20 20 20 64 62 20       ".      db 
2310: 63 6c 6f 73 65 0a 20 20 20 20 20 20 66 69 6c 65  close.      file
2320: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
2330: 20 20 7d 20 5b 65 78 70 72 20 24 70 67 73 7a 2a    } [expr $pgsz*
2340: 32 5d 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73  2].  .    do_tes
2350: 74 20 77 61 6c 2d 36 2e 24 73 65 63 74 6f 72 2e  t wal-6.$sector.
2360: 24 70 67 73 7a 2e 32 20 7b 0a 20 20 20 20 20 20  $pgsz.2 {.      
2370: 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74 65 73 74  log_deleted test
2380: 2e 64 62 2d 77 61 6c 0a 20 20 20 20 7d 20 7b 31  .db-wal.    } {1
2390: 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74  }.  }.}..do_test
23a0: 20 77 61 6c 2d 37 2e 31 20 7b 0a 20 20 66 6f 72   wal-7.1 {.  for
23b0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
23c0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 73   test.db-wal.  s
23d0: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65  qlite3_wal db te
23e0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
23f0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
2400: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
2410: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2420: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
2430: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2440: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
2450: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
2460: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20   test.db] [file 
2470: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
2480: 5d 0a 7d 20 5b 6c 69 73 74 20 31 30 32 34 20 5b  ].} [list 1024 [
2490: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20  wal_file_size 3 
24a0: 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77  1024]].do_test w
24b0: 61 6c 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73  al-7.2 {.  execs
24c0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
24d0: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c  checkpoint }.  l
24e0: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
24f0: 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69  est.db] [file si
2500: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
2510: 7d 20 5b 6c 69 73 74 20 32 30 34 38 20 5b 77 61  } [list 2048 [wa
2520: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30  l_file_size 3 10
2530: 32 34 5d 5d 0a 0a 23 20 45 78 65 63 75 74 65 20  24]]..# Execute 
2540: 73 6f 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  some transaction
2550: 73 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s in auto-vacuum
2560: 20 6d 6f 64 65 20 74 6f 20 74 65 73 74 20 64 61   mode to test da
2570: 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20 74 72  tabase file.# tr
2580: 75 6e 63 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  uncation..#.do_t
2590: 65 73 74 20 77 61 6c 2d 38 2e 31 20 7b 0a 20 20  est wal-8.1 {.  
25a0: 72 65 6f 70 65 6e 5f 64 62 0a 20 20 63 61 74 63  reopen_db.  catc
25b0: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20  h { db close }. 
25c0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
25d0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
25e0: 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  ..  sqlite3 db t
25f0: 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63  est.db.  db func
2600: 74 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f 62 0a 20  tion blob blob. 
2610: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
2620: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2630: 6d 20 3d 20 31 3b 0a 20 20 20 20 50 52 41 47 4d  m = 1;.    PRAGM
2640: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
2650: 20 77 61 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41   wal;.    PRAGMA
2660: 20 61 75 74 6f 5f 76 61 63 75 75 6d 3b 0a 20 20   auto_vacuum;.  
2670: 7d 0a 7d 20 7b 77 61 6c 20 31 7d 0a 64 6f 5f 74  }.} {wal 1}.do_t
2680: 65 73 74 20 77 61 6c 2d 38 2e 32 20 7b 0a 20 20  est wal-8.2 {.  
2690: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
26a0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
26b0: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
26c0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
26d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
26e0: 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30  1 VALUES(blob(90
26f0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
2700: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 62  INTO t1 VALUES(b
2710: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49  lob(900));.    I
2720: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2730: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
2740: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
2750: 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52    4 */.    INSER
2760: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
2770: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
2780: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 20 38 20  t1;       /*  8 
2790: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
27a0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
27b0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
27c0: 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20        /* 16 */. 
27d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
27e0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
27f0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
2800: 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 49    /* 32 */.    I
2810: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2820: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
2830: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
2840: 20 36 34 20 2a 2f 0a 20 20 20 20 50 52 41 47 4d   64 */.    PRAGM
2850: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
2860: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  ;.  }.  file siz
2870: 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70  e test.db.} [exp
2880: 72 20 36 38 2a 31 30 32 34 5d 0a 64 6f 5f 74 65  r 68*1024].do_te
2890: 73 74 20 77 61 6c 2d 38 2e 33 20 7b 0a 20 20 65  st wal-8.3 {.  e
28a0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45  xecsql { .    DE
28b0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
28c0: 52 45 20 72 6f 77 69 64 3c 35 34 3b 0a 20 20 20  RE rowid<54;.   
28d0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
28e0: 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20 66 69  kpoint;.  }.  fi
28f0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
2900: 7d 20 5b 65 78 70 72 20 31 34 2a 31 30 32 34 5d  } [expr 14*1024]
2910: 0a 0a 23 20 52 75 6e 20 73 6f 6d 65 20 22 77 61  ..# Run some "wa
2920: 72 6d 2d 62 6f 64 79 22 20 74 65 73 74 73 20 74  rm-body" tests t
2930: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 6c 6f  o ensure that lo
2940: 67 2d 73 75 6d 6d 61 72 79 20 66 69 6c 65 73 20  g-summary files 
2950: 77 69 74 68 20 6d 6f 72 65 0a 23 20 74 68 61 6e  with more.# than
2960: 20 32 35 36 20 65 6e 74 72 69 65 73 20 28 6c 6f   256 entries (lo
2970: 67 20 73 75 6d 6d 61 72 69 65 73 20 74 68 61 74  g summaries that
2980: 20 63 6f 6e 74 61 69 6e 20 69 6e 64 65 78 20 62   contain index b
2990: 6c 6f 63 6b 73 29 20 77 6f 72 6b 20 4f 6b 2e 0a  locks) work Ok..
29a0: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e  #.do_test wal-9.
29b0: 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64 62 0a  1 {.  reopen_db.
29c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
29d0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
29e0: 65 3d 32 30 30 30 3b 0a 20 20 20 20 43 52 45 41  e=2000;.    CREA
29f0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
2a00: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2a20: 41 4c 55 45 53 28 62 6c 6f 62 28 39 30 30 29 29  ALUES(blob(900))
2a30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2a40: 4f 20 74 31 20 56 41 4c 55 45 53 28 62 6c 6f 62  O t1 VALUES(blob
2a50: 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (900));.    INSE
2a60: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2a70: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
2a80: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 20 34   t1;       /*  4
2a90: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
2aa0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
2ab0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
2ac0: 20 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a         /*  8 */.
2ad0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2ae0: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
2af0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
2b00: 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20     /* 16 */.    
2b10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2b20: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
2b30: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
2b40: 2a 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45  * 32 */.    INSE
2b50: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2b60: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
2b70: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34   t1;       /* 64
2b80: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
2b90: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
2ba0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
2bb0: 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f         /* 128 */
2bc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2bd0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2be0: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2bf0: 20 20 20 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20      /* 256 */.  
2c00: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
2c10: 73 74 2e 64 62 0a 7d 20 31 30 32 34 0a 64 6f 5f  st.db.} 1024.do_
2c20: 74 65 73 74 20 77 61 6c 2d 39 2e 32 20 7b 0a 20  test wal-9.2 {. 
2c30: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32   sqlite3_wal db2
2c40: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
2c50: 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67  ql {PRAGMA integ
2c60: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32  rity_check } db2
2c70: 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74  .} {ok}..do_test
2c80: 20 77 61 6c 2d 39 2e 33 20 7b 0a 20 20 66 6f 72   wal-9.3 {.  for
2c90: 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64  cedelete test2.d
2ca0: 62 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  b test2.db-wal. 
2cb0: 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
2cc0: 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 63 6f  db test2.db.  co
2cd0: 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  py_file test.db-
2ce0: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
2cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
2d00: 62 33 20 74 65 73 74 32 2e 64 62 20 0a 20 20 65  b3 test2.db .  e
2d10: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
2d20: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
2d30: 20 64 62 33 0a 7d 20 7b 6f 6b 7d 0a 64 62 33 20   db3.} {ok}.db3 
2d40: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
2d50: 61 6c 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63 73  al-9.4 {.  execs
2d60: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
2d70: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 64  checkpoint }.  d
2d80: 62 32 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  b2 close.  sqlit
2d90: 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e  e3_wal db2 test.
2da0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52  db.  execsql {PR
2db0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
2dc0: 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
2dd0: 7d 0a 0a 66 6f 72 65 61 63 68 20 68 61 6e 64 6c  }..foreach handl
2de0: 65 20 7b 64 62 20 64 62 32 20 64 62 33 7d 20 7b  e {db db2 db3} {
2df0: 20 63 61 74 63 68 20 7b 20 24 68 61 6e 64 6c 65   catch { $handle
2e00: 20 63 6c 6f 73 65 20 7d 20 7d 0a 75 6e 73 65 74   close } }.unset
2e10: 20 68 61 6e 64 6c 65 0a 0a 23 2d 2d 2d 2d 2d 2d   handle..#------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
2e70: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  ing block of tes
2e80: 74 73 20 2d 20 77 61 6c 2d 31 30 2e 2a 20 2d 20  ts - wal-10.* - 
2e90: 74 65 73 74 20 74 68 61 74 20 74 68 65 20 57 41  test that the WA
2ea0: 4c 20 6c 6f 63 6b 69 6e 67 20 0a 23 20 73 63 68  L locking .# sch
2eb0: 65 6d 65 20 77 6f 72 6b 73 20 69 6e 20 73 69 6d  eme works in sim
2ec0: 70 6c 65 20 63 61 73 65 73 2e 20 54 68 69 73 20  ple cases. This 
2ed0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 69  block of tests i
2ee0: 73 20 72 75 6e 20 74 77 69 63 65 2e 20 4f 6e 63  s run twice. Onc
2ef0: 65 0a 23 20 75 73 69 6e 67 20 6d 75 6c 74 69 70  e.# using multip
2f00: 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 69  le connections i
2f10: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70  n the address sp
2f20: 61 63 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ace of the curre
2f30: 6e 74 20 70 72 6f 63 65 73 73 2c 0a 23 20 61 6e  nt process,.# an
2f40: 64 20 6f 6e 63 65 20 77 69 74 68 20 61 6c 6c 20  d once with all 
2f50: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 65 78 63 65  connections exce
2f60: 70 74 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  pt one running i
2f70: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  n external proce
2f80: 73 73 65 73 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69  sses..#.do_multi
2f90: 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
2fa0: 0a 0a 20 20 23 20 49 6e 69 74 69 61 6c 69 7a 65  ..  # Initialize
2fb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2fc0: 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74  hema and content
2fd0: 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  s..  #.  do_test
2fe0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 20 7b 0a   wal-10.$tn.1 {.
2ff0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3000: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
3010: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
3020: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3030: 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20  _mode = wal;.   
3040: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3050: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
3060: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3070: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3080: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3090: 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t1;.    }.  } {
30a0: 77 61 6c 20 31 20 32 7d 0a 0a 20 20 23 20 4f 70  wal 1 2}..  # Op
30b0: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
30c0: 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 74 68   and write to th
30d0: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
30e0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 74 68 61   [db]. Check tha
30f0: 74 20 5b 64 62 32 5d 0a 20 20 23 20 69 73 20 73  t [db2].  # is s
3100: 74 69 6c 6c 20 61 62 6c 65 20 74 6f 20 72 65 61  till able to rea
3110: 64 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 62  d the snapshot b
3120: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
3130: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
3140: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
3150: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 20 7b 0a 20  wal-10.$tn.2 {. 
3160: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47     execsql { BEG
3170: 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  IN; INSERT INTO 
3180: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
3190: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c   }.    sql2 {SEL
31a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
31b0: 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 23 20 48 61   } {1 2}..  # Ha
31c0: 76 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 74  ve [db] commit t
31d0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
31e0: 43 68 65 63 6b 20 74 68 61 74 20 5b 64 62 32 5d  Check that [db2]
31f0: 20 69 73 20 6e 6f 77 20 73 65 65 69 6e 67 20 74   is now seeing t
3200: 68 65 20 0a 20 20 23 20 6e 65 77 2c 20 75 70 64  he .  # new, upd
3210: 61 74 65 64 20 73 6e 61 70 73 68 6f 74 2e 0a 20  ated snapshot.. 
3220: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
3230: 2d 31 30 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  -10.$tn.3 {.    
3240: 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  execsql { COMMIT
3250: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c   }.    sql2 {SEL
3260: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
3270: 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20   } {1 2 3 4}..  
3280: 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65  # Have [db2] ope
3290: 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
32a0: 74 69 6f 6e 2e 20 54 68 65 6e 20 77 72 69 74 65  tion. Then write
32b0: 20 74 6f 20 74 68 65 20 64 62 20 76 69 61 20 5b   to the db via [
32c0: 64 62 5d 2e 20 43 68 65 63 6b 0a 20 20 23 20 74  db]. Check.  # t
32d0: 68 61 74 20 5b 64 62 32 5d 20 69 73 20 73 74 69  hat [db2] is sti
32e0: 6c 6c 20 73 65 65 69 6e 67 20 74 68 65 20 6f 72  ll seeing the or
32f0: 69 67 69 6e 61 6c 20 73 6e 61 70 73 68 6f 74 2e  iginal snapshot.
3300: 20 54 68 65 6e 20 72 65 61 64 20 77 69 74 68 20   Then read with 
3310: 5b 64 62 33 5d 2e 0a 20 20 23 20 5b 64 62 33 5d  [db3]..  # [db3]
3320: 20 73 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20   should see the 
3330: 6e 65 77 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20  newly committed 
3340: 64 61 74 61 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  data..  #.  do_t
3350: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 34  est wal-10.$tn.4
3360: 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45   {.    sql2 { BE
3370: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  GIN ; SELECT * F
3380: 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32  ROM t1}.  } {1 2
3390: 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20   3 4}.  do_test 
33a0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 35 20 7b 0a 20  wal-10.$tn.5 {. 
33b0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
33c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
33d0: 45 53 28 35 2c 20 36 29 3b 20 7d 0a 20 20 20 20  ES(5, 6); }.    
33e0: 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46  sql2 {SELECT * F
33f0: 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32  ROM t1}.  } {1 2
3400: 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20   3 4}.  do_test 
3410: 77 61 6c 2d 31 30 2e 24 74 6e 2e 36 20 7b 0a 20  wal-10.$tn.6 {. 
3420: 20 20 20 73 71 6c 33 20 7b 53 45 4c 45 43 54 20     sql3 {SELECT 
3430: 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b  * FROM t1}.  } {
3440: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64  1 2 3 4 5 6}.  d
3450: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3460: 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 43  n.7 {.    sql2 C
3470: 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 0a 20 20  OMMIT.  } {}..  
3480: 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65  # Have [db2] ope
3490: 6e 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  n a write transa
34a0: 63 74 69 6f 6e 2e 20 54 68 65 6e 20 61 74 74 65  ction. Then atte
34b0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
34c0: 74 68 65 20 0a 20 20 23 20 64 61 74 61 62 61 73  the .  # databas
34d0: 65 20 76 69 61 20 5b 64 62 5d 2e 20 54 68 69 73  e via [db]. This
34e0: 20 73 68 6f 75 6c 64 20 66 61 69 6c 20 28 77 72   should fail (wr
34f0: 69 74 65 72 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  iter lock cannot
3500: 20 62 65 20 6f 62 74 61 69 6e 65 64 29 2e 0a 20   be obtained).. 
3510: 20 23 0a 20 20 23 20 54 68 65 6e 20 6f 70 65 6e   #.  # Then open
3520: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
3530: 69 6f 6e 20 77 69 74 68 20 5b 64 62 5d 2e 20 43  ion with [db]. C
3540: 6f 6d 6d 69 74 20 74 68 65 20 5b 64 62 32 5d 20  ommit the [db2] 
3550: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 23 20  transaction.  # 
3560: 74 6f 20 64 69 73 6b 2e 20 56 65 72 69 66 79 20  to disk. Verify 
3570: 74 68 61 74 20 5b 64 62 5d 20 73 74 69 6c 6c 20  that [db] still 
3580: 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  cannot write to 
3590: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 62 65  the database (be
35a0: 63 61 75 73 65 0a 20 20 23 20 69 74 20 69 73 20  cause.  # it is 
35b0: 72 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73  reading an old s
35c0: 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20  napshot)..  #.  
35d0: 23 20 43 6c 6f 73 65 20 74 68 65 20 63 75 72 72  # Close the curr
35e0: 65 6e 74 20 5b 64 62 5d 20 74 72 61 6e 73 61 63  ent [db] transac
35f0: 74 69 6f 6e 2e 20 4f 70 65 6e 20 61 20 6e 65 77  tion. Open a new
3600: 20 6f 6e 65 2e 20 5b 64 62 5d 20 63 61 6e 20 6e   one. [db] can n
3610: 6f 77 20 77 72 69 74 65 0a 20 20 23 20 74 6f 20  ow write.  # to 
3620: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 61 73  the database (as
3630: 20 69 74 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65   it is not locke
3640: 64 20 61 6e 64 20 5b 64 62 5d 20 69 73 20 72 65  d and [db] is re
3650: 61 64 69 6e 67 20 74 68 65 20 6c 61 74 65 73 74  ading the latest
3660: 0a 20 20 23 20 73 6e 61 70 73 68 6f 74 29 2e 0a  .  # snapshot)..
3670: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
3680: 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20 20 20  l-10.$tn.7 {.   
3690: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49   sql2 { BEGIN; I
36a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
36b0: 4c 55 45 53 28 37 2c 20 38 29 20 3b 20 7d 0a 20  LUES(7, 8) ; }. 
36c0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e     catchsql { IN
36d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
36e0: 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20 7d  UES(9, 10) }.  }
36f0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
3700: 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74   locked}}.  do_t
3710: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 38  est wal-10.$tn.8
3720: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3730: 20 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20   BEGIN ; SELECT 
3740: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
3750: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20  {1 2 3 4 5 6}.  
3760: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3770: 74 6e 2e 39 20 7b 0a 20 20 20 20 73 71 6c 32 20  tn.9 {.    sql2 
3780: 43 4f 4d 4d 49 54 0a 20 20 20 20 63 61 74 63 68  COMMIT.    catch
3790: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
37a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
37b0: 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74  0) }.  } {1 {dat
37c0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
37d0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
37e0: 31 30 2e 24 74 6e 2e 31 30 20 7b 0a 20 20 20 20  10.$tn.10 {.    
37f0: 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  execsql { COMMIT
3800: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
3810: 20 42 45 47 49 4e 20 7d 0a 20 20 20 20 65 78 65   BEGIN }.    exe
3820: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
3830: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20  TO t1 VALUES(9, 
3840: 31 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71  10) }.    execsq
3850: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20  l { COMMIT }.   
3860: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
3870: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3880: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
3890: 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 4f 70   8 9 10}..  # Op
38a0: 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  en a read transa
38b0: 63 74 69 6f 6e 20 77 69 74 68 20 5b 64 62 32 5d  ction with [db2]
38c0: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  . Check that thi
38d0: 73 20 70 72 65 76 65 6e 74 73 20 5b 64 62 5d 20  s prevents [db] 
38e0: 66 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b 70 6f  from.  # checkpo
38f0: 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  inting the datab
3900: 61 73 65 2e 20 42 75 74 20 6e 6f 74 20 66 72 6f  ase. But not fro
3910: 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 69 74 2e  m writing to it.
3920: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
3930: 61 6c 2d 31 30 2e 24 74 6e 2e 31 31 20 7b 0a 20  al-10.$tn.11 {. 
3940: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
3950: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3960: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
3970: 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 20   5 6 7 8 9 10}. 
3980: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3990: 24 74 6e 2e 31 32 20 7b 0a 20 20 20 20 63 61 74  $tn.12 {.    cat
39a0: 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  chsql { PRAGMA w
39b0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20  al_checkpoint } 
39c0: 0a 20 20 7d 20 7b 30 20 7b 30 20 37 20 37 7d 7d  .  } {0 {0 7 7}}
39d0: 20 20 20 3b 23 20 52 65 61 64 65 72 20 6e 6f 20     ;# Reader no 
39e0: 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b 20 63 68 65  longer block che
39f0: 63 6b 70 6f 69 6e 74 73 0a 20 20 64 6f 5f 74 65  ckpoints.  do_te
3a00: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 33  st wal-10.$tn.13
3a10: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3a20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3a30: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d  VALUES(11, 12) }
3a40: 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43  .    sql2 {SELEC
3a50: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d  T * FROM t1}.  }
3a60: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3a70: 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 57 72 69  8 9 10}..  # Wri
3a80: 74 65 72 73 20 64 6f 20 6e 6f 74 20 62 6c 6f 63  ters do not bloc
3a90: 6b 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e  k checkpoints an
3aa0: 79 20 6d 6f 72 65 20 65 69 74 68 65 72 2e 0a 20  y more either.. 
3ab0: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
3ac0: 2d 31 30 2e 24 74 6e 2e 31 34 20 7b 0a 20 20 20  -10.$tn.14 {.   
3ad0: 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47   catchsql { PRAG
3ae0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
3af0: 74 20 7d 20 0a 20 20 7d 20 7b 30 20 7b 30 20 38  t } .  } {0 {0 8
3b00: 20 37 7d 7d 0a 0a 20 20 23 20 54 68 65 20 66 6f   7}}..  # The fo
3b10: 6c 6c 6f 77 69 6e 67 20 73 65 72 69 65 73 20 6f  llowing series o
3b20: 66 20 74 65 73 74 20 63 61 73 65 73 20 75 73 65  f test cases use
3b30: 64 20 74 6f 20 76 65 72 69 66 79 20 61 6e 6f 74  d to verify anot
3b40: 68 65 72 20 62 6c 6f 63 6b 69 6e 67 0a 20 20 23  her blocking.  #
3b50: 20 63 61 73 65 20 69 6e 20 57 41 4c 20 2d 20 61   case in WAL - a
3b60: 20 63 61 73 65 20 77 68 69 63 68 20 6e 6f 20 6c   case which no l
3b70: 6f 6e 67 65 72 20 62 6c 6f 63 6b 73 2e 0a 20 20  onger blocks..  
3b80: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
3b90: 31 30 2e 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20  10.$tn.15 {.    
3ba0: 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 3b 20 42  sql2 { COMMIT; B
3bb0: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
3bc0: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31  ROM t1; }.  } {1
3bd0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
3be0: 20 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f   10 11 12}.  do_
3bf0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3c00: 31 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  16 {.    catchsq
3c10: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
3c20: 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d  heckpoint } .  }
3c30: 20 7b 30 20 7b 30 20 38 20 38 7d 7d 0a 20 20 64   {0 {0 8 8}}.  d
3c40: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3c50: 6e 2e 31 37 20 7b 0a 20 20 20 20 65 78 65 63 73  n.17 {.    execs
3c60: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
3c70: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20  checkpoint } .  
3c80: 7d 20 7b 30 20 38 20 38 7d 0a 20 20 64 6f 5f 74  } {0 8 8}.  do_t
3c90: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3ca0: 38 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b 20 42  8 {.    sql3 { B
3cb0: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
3cc0: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3cd0: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
3ce0: 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74  10 11 12}.  do_t
3cf0: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3d00: 39 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  9 {.    catchsql
3d10: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3d20: 31 20 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29  1 VALUES(13, 14)
3d30: 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20   }.  } {0 {}}.  
3d40: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3d50: 74 6e 2e 32 30 20 7b 0a 20 20 20 20 65 78 65 63  tn.20 {.    exec
3d60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
3d70: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3d80: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
3d90: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a  10 11 12 13 14}.
3da0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3db0: 2e 24 74 6e 2e 32 31 20 7b 0a 20 20 20 20 73 71  .$tn.21 {.    sq
3dc0: 6c 33 20 43 4f 4d 4d 49 54 0a 20 20 20 20 73 71  l3 COMMIT.    sq
3dd0: 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d  l2 COMMIT.  } {}
3de0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3df0: 30 2e 24 74 6e 2e 32 32 20 7b 0a 20 20 20 20 65  0.$tn.22 {.    e
3e00: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
3e10: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
3e20: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
3e30: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
3e40: 34 7d 0a 0a 20 20 23 20 41 6e 6f 74 68 65 72 20  4}..  # Another 
3e50: 73 65 72 69 65 73 20 6f 66 20 74 65 73 74 73 20  series of tests 
3e60: 74 68 61 74 20 75 73 65 64 20 74 6f 20 64 65 6d  that used to dem
3e70: 6f 6e 73 74 72 61 74 65 20 62 6c 6f 63 6b 69 6e  onstrate blockin
3e80: 67 20 62 65 68 61 76 69 6f 72 0a 20 20 23 20 62  g behavior.  # b
3e90: 75 74 20 77 68 69 63 68 20 6e 6f 77 20 77 6f 72  ut which now wor
3ea0: 6b 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  k..  #.  do_test
3eb0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 33 20 7b   wal-10.$tn.23 {
3ec0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
3ed0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
3ee0: 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 39 20  oint }.  } {0 9 
3ef0: 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  9}.  do_test wal
3f00: 2d 31 30 2e 24 74 6e 2e 32 34 20 7b 0a 20 20 20  -10.$tn.24 {.   
3f10: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53   sql2 { BEGIN; S
3f20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
3f30: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3f40: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
3f50: 31 32 20 31 33 20 31 34 7d 0a 20 20 64 6f 5f 74  12 13 14}.  do_t
3f60: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
3f70: 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  5 {.    execsql 
3f80: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
3f90: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30  ckpoint }.  } {0
3fa0: 20 39 20 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20   9 9}.  do_test 
3fb0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36 20 7b 0a  wal-10.$tn.26 {.
3fc0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
3fd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3fe0: 4c 55 45 53 28 31 35 2c 20 31 36 29 20 7d 0a 20  LUES(15, 16) }. 
3ff0: 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74   } {0 {}}.  do_t
4000: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
4010: 37 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b 20 49  7 {.    sql3 { I
4020: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4030: 4c 55 45 53 28 31 37 2c 20 31 38 29 20 7d 0a 20  LUES(17, 18) }. 
4040: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
4050: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 38 20 7b 0a  wal-10.$tn.28 {.
4060: 20 20 20 20 63 6f 64 65 33 20 7b 0a 20 20 20 20      code3 {.    
4070: 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71    set ::STMT [sq
4080: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 64 62  lite3_prepare db
4090: 33 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  3 "SELECT * FROM
40a0: 20 74 31 22 20 2d 31 20 54 41 49 4c 5d 0a 20 20   t1" -1 TAIL].  
40b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
40c0: 20 24 3a 3a 53 54 4d 54 0a 20 20 20 20 7d 0a 20   $::STMT.    }. 
40d0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
40e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
40f0: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
4100: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
4110: 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31  13 14 15 16 17 1
4120: 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  8}.  do_test wal
4130: 2d 31 30 2e 24 74 6e 2e 32 39 20 7b 0a 20 20 20  -10.$tn.29 {.   
4140: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
4150: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4160: 28 31 39 2c 20 32 30 29 20 7d 0a 20 20 20 20 63  (19, 20) }.    c
4170: 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41  atchsql { PRAGMA
4180: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4190: 7d 0a 20 20 7d 20 7b 30 20 7b 30 20 33 20 30 7d  }.  } {0 {0 3 0}
41a0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
41b0: 31 30 2e 24 74 6e 2e 33 30 20 7b 0a 20 20 20 20  10.$tn.30 {.    
41c0: 63 6f 64 65 33 20 7b 20 73 71 6c 69 74 65 33 5f  code3 { sqlite3_
41d0: 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54  finalize $::STMT
41e0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
41f0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4200: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20  kpoint }.  } {0 
4210: 33 20 30 7d 0a 0a 20 20 23 20 41 74 20 6f 6e 65  3 0}..  # At one
4220: 20 70 6f 69 6e 74 2c 20 69 66 20 61 20 72 65 61   point, if a rea
4230: 64 65 72 20 66 61 69 6c 65 64 20 74 6f 20 75 70  der failed to up
4240: 67 72 61 64 65 20 74 6f 20 61 20 77 72 69 74 65  grade to a write
4250: 72 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 23  r because it.  #
4260: 20 77 61 73 20 72 65 61 64 69 6e 67 20 61 6e 20   was reading an 
4270: 6f 6c 64 20 73 6e 61 70 73 68 6f 74 2c 20 74 68  old snapshot, th
4280: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 77 65  e write-locks we
4290: 72 65 20 6e 6f 74 20 62 65 69 6e 67 20 72 65 6c  re not being rel
42a0: 65 61 73 65 64 2e 0a 20 20 23 20 54 65 73 74 20  eased..  # Test 
42b0: 74 68 61 74 20 74 68 69 73 20 62 75 67 20 68 61  that this bug ha
42c0: 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 20 20  s been fixed..  
42d0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
42e0: 31 30 2e 24 74 6e 2e 33 31 20 7b 0a 20 20 20 20  10.$tn.31 {.    
42f0: 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 20 20  sql2 COMMIT.    
4300: 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20  execsql { BEGIN 
4310: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
4320: 74 31 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20  t1 }.    sql2 { 
4330: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4340: 41 4c 55 45 53 28 32 31 2c 20 32 32 29 20 7d 0a  ALUES(21, 22) }.
4350: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
4360: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4370: 4c 55 45 53 28 32 33 2c 20 32 34 29 20 7d 0a 20  LUES(23, 24) }. 
4380: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
4390: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
43a0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
43b0: 2e 33 32 20 7b 0a 20 20 20 20 23 20 54 68 69 73  .32 {.    # This
43c0: 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64   statement would
43d0: 20 66 61 69 6c 20 77 68 65 6e 20 74 68 65 20 62   fail when the b
43e0: 75 67 20 77 61 73 20 70 72 65 73 65 6e 74 2e 0a  ug was present..
43f0: 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52      sql2 { INSER
4400: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4410: 28 32 33 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b  (23, 24) }.  } {
4420: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4430: 31 30 2e 24 74 6e 2e 33 33 20 7b 0a 20 20 20 20  10.$tn.33 {.    
4440: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
4450: 20 2a 20 46 52 4f 4d 20 74 31 20 3b 20 43 4f 4d   * FROM t1 ; COM
4460: 4d 49 54 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33  MIT }.  } {1 2 3
4470: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
4480: 31 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31  11 12 13 14 15 1
4490: 36 20 31 37 20 31 38 20 31 39 20 32 30 7d 0a 20  6 17 18 19 20}. 
44a0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
44b0: 24 74 6e 2e 33 34 20 7b 0a 20 20 20 20 65 78 65  $tn.34 {.    exe
44c0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
44d0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
44e0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
44f0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
4500: 31 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32  15 16 17 18 19 2
4510: 30 20 32 31 20 32 32 20 32 33 20 32 34 7d 0a 0a  0 21 22 23 24}..
4520: 20 20 23 20 54 65 73 74 20 74 68 61 74 20 69 66    # Test that if
4530: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20   a checkpointer 
4540: 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 74 68  cannot obtain th
4550: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
4560: 2c 20 69 74 0a 20 20 23 20 72 65 6c 65 61 73 65  , it.  # release
4570: 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 62 65 66 6f  s all locks befo
4580: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 20 62  re returning a b
4590: 75 73 79 20 65 72 72 6f 72 2e 0a 20 20 23 0a 20  usy error..  #. 
45a0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
45b0: 24 74 6e 2e 33 35 20 7b 0a 20 20 20 20 65 78 65  $tn.35 {.    exe
45c0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 44 45  csql { .      DE
45d0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
45e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
45f0: 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
4600: 62 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  b');.      INSER
4610: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4620: 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20  ('c', 'd');.    
4630: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 20 20  }.    sql2 {.   
4640: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
4650: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4660: 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61  t1;.    }.  } {a
4670: 20 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73   b c d}.  do_tes
4680: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36 20  t wal-10.$tn.36 
4690: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
46a0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
46b0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20  kpoint }.  } {0 
46c0: 7b 30 20 38 20 38 7d 7d 0a 20 20 64 6f 5f 74 65  {0 8 8}}.  do_te
46d0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36  st wal-10.$tn.36
46e0: 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b 20 49 4e   {.    sql3 { IN
46f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4700: 55 45 53 28 27 65 27 2c 20 27 66 27 29 20 7d 0a  UES('e', 'f') }.
4710: 20 20 20 20 73 71 6c 32 20 7b 20 53 45 4c 45 43      sql2 { SELEC
4720: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
4730: 7d 20 7b 61 20 62 20 63 20 64 7d 0a 20 20 64 6f  } {a b c d}.  do
4740: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4750: 2e 33 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 43  .37 {.    sql2 C
4760: 4f 4d 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71  OMMIT.    execsq
4770: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
4780: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
4790: 7b 30 20 39 20 39 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  {0 9 9}.}..#----
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20 54 68 69 73 20 62 6c 6f  -----.# This blo
47f0: 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c  ck of tests, wal
4800: 2d 31 31 2e 2a 2c 20 74 65 73 74 20 74 68 61 74  -11.*, test that
4810: 20 6e 6f 74 68 69 6e 67 20 67 6f 65 73 20 74 65   nothing goes te
4820: 72 72 69 62 6c 79 20 77 72 6f 6e 67 0a 23 20 69  rribly wrong.# i
4830: 66 20 66 72 61 6d 65 73 20 6d 75 73 74 20 62 65  f frames must be
4840: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4850: 6c 6f 67 20 66 69 6c 65 20 62 65 66 6f 72 65 20  log file before 
4860: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
4870: 0a 23 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e  .# committed (in
4880: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
4890: 70 20 6d 65 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f  p memory)..#.do_
48a0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 20 7b 0a  test wal-11.1 {.
48b0: 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78    reopen_db.  ex
48c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
48d0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
48e0: 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  10;.    PRAGMA p
48f0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
4900: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4910: 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
4920: 45 59 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20  EY);.  }.  list 
4930: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4940: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
4950: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4960: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
4970: 34 34 5d 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74  44].} {1 3}.do_t
4980: 65 73 74 20 77 61 6c 2d 31 31 2e 32 20 7b 0a 20  est wal-11.2 {. 
4990: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
49a0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
49b0: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
49c0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
49d0: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
49e0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
49f0: 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c  ].} [list 3 [wal
4a00: 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32  _file_size 3 102
4a10: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
4a20: 31 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.3 {.  execsql
4a30: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4a40: 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39  1 VALUES( blob(9
4a50: 30 30 29 20 29 20 7d 0a 20 20 6c 69 73 74 20 5b  00) ) }.  list [
4a60: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
4a70: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
4a80: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4a90: 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33  b-wal].} [list 3
4aa0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
4ab0: 34 20 31 30 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73  4 1024]]..do_tes
4ac0: 74 20 77 61 6c 2d 31 31 2e 34 20 7b 0a 20 20 65  t wal-11.4 {.  e
4ad0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
4ae0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
4af0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4b00: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
4b10: 74 31 3b 20 20 20 2d 2d 20 32 0a 20 20 20 20 20  t1;   -- 2.     
4b20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4b30: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
4b40: 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 34   FROM t1;   -- 4
4b50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4b60: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
4b70: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
4b80: 20 20 2d 2d 20 38 0a 20 20 20 20 20 20 49 4e 53    -- 8.      INS
4b90: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4ba0: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
4bb0: 4d 20 74 31 3b 20 20 20 2d 2d 20 31 36 0a 20 20  M t1;   -- 16.  
4bc0: 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  }.  list [expr [
4bd0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4be0: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
4bf0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4c00: 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f  .} [list 3 [wal_
4c10: 66 69 6c 65 5f 73 69 7a 65 20 33 32 20 31 30 32  file_size 32 102
4c20: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
4c30: 31 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.5 {.  execsql
4c40: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63   { .    SELECT c
4c50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
4c60: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
4c70: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
4c80: 0a 7d 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65  .} {16 ok}.do_te
4c90: 73 74 20 77 61 6c 2d 31 31 2e 36 20 7b 0a 20 20  st wal-11.6 {.  
4ca0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
4cb0: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4cc0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4cd0: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4ce0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4cf0: 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c  [list 3 [wal_fil
4d00: 65 5f 73 69 7a 65 20 34 30 20 31 30 32 34 5d 5d  e_size 40 1024]]
4d10: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
4d20: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
4d30: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
4d40: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4d50: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
4d60: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
4d70: 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  {16 ok}.do_test 
4d80: 77 61 6c 2d 31 31 2e 38 20 7b 0a 20 20 65 78 65  wal-11.8 {.  exe
4d90: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
4da0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
4db0: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4dc0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4dd0: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4de0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4df0: 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f 66 69  [list 37 [wal_fi
4e00: 6c 65 5f 73 69 7a 65 20 34 30 20 31 30 32 34 5d  le_size 40 1024]
4e10: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
4e20: 2e 39 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .9 {.  db close.
4e30: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
4e40: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
4e50: 2f 31 30 32 34 5d 20 5b 6c 6f 67 5f 64 65 6c 65  /1024] [log_dele
4e60: 74 65 64 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ted test.db-wal]
4e70: 0a 7d 20 7b 33 37 20 31 7d 0a 73 71 6c 69 74 65  .} {37 1}.sqlite
4e80: 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62  3_wal db test.db
4e90: 0a 0a 23 20 41 66 74 65 72 20 61 64 64 69 6e 67  ..# After adding
4ea0: 20 74 68 65 20 63 61 70 61 62 69 6c 69 74 79 20   the capability 
4eb0: 6f 66 20 57 41 4c 20 74 6f 20 6f 76 65 72 77 72  of WAL to overwr
4ec0: 69 74 65 20 70 72 69 6f 72 20 75 6e 63 6f 6d 6d  ite prior uncomm
4ed0: 69 74 74 65 64 0a 23 20 66 72 61 6d 65 20 69 6e  itted.# frame in
4ee0: 20 74 68 65 20 57 41 4c 2d 66 69 6c 65 20 77 69   the WAL-file wi
4ef0: 74 68 20 72 65 76 69 73 65 64 20 63 6f 6e 74 65  th revised conte
4f00: 6e 74 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nt, the size of 
4f10: 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 23 20 66  the WAL file.# f
4f20: 6f 6c 6c 6f 77 69 6e 67 20 63 61 63 68 65 2d 73  ollowing cache-s
4f30: 70 69 6c 6c 20 69 73 20 73 6d 61 6c 6c 65 72 2e  pill is smaller.
4f40: 0a 23 0a 23 73 65 74 20 6e 57 61 6c 20 33 39 0a  .#.#set nWal 39.
4f50: 23 69 66 20 7b 5b 70 65 72 6d 75 74 61 74 69 6f  #if {[permutatio
4f60: 6e 5d 21 3d 22 6d 6d 61 70 22 7d 20 7b 73 65 74  n]!="mmap"} {set
4f70: 20 6e 57 61 6c 20 33 37 7d 0a 23 69 66 63 61 70   nWal 37}.#ifcap
4f80: 61 62 6c 65 20 21 6d 6d 61 70 20 7b 73 65 74 20  able !mmap {set 
4f90: 6e 57 61 6c 20 33 37 7d 0a 73 65 74 20 6e 57 61  nWal 37}.set nWa
4fa0: 6c 20 33 34 0a 0a 64 6f 5f 74 65 73 74 20 77 61  l 34..do_test wa
4fb0: 6c 2d 31 31 2e 31 30 20 7b 0a 20 20 65 78 65 63  l-11.10 {.  exec
4fc0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
4fd0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
4fe0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
4ff0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5000: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
5010: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d  0) FROM t1;   --
5020: 20 33 32 0a 20 20 20 20 20 20 53 45 4c 45 43 54   32.      SELECT
5030: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
5040: 31 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  1;.  }.  list [e
5050: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5060: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66  est.db]/1024] [f
5070: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5080: 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 37  -wal].} [list 37
5090: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
50a0: 24 6e 57 61 6c 20 31 30 32 34 5d 5d 0a 64 6f 5f  $nWal 1024]].do_
50b0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 31 20 7b  test wal-11.11 {
50c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
50d0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
50e0: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
50f0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45  ROLLBACK;.    SE
5100: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5110: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 33 32  OM t1;.  }.} {32
5120: 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   16}.do_test wal
5130: 2d 31 31 2e 31 32 20 7b 0a 20 20 6c 69 73 74 20  -11.12 {.  list 
5140: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
5150: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
5160: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5170: 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20  db-wal].} [list 
5180: 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  37 [wal_file_siz
5190: 65 20 24 6e 57 61 6c 20 31 30 32 34 5d 5d 0a 64  e $nWal 1024]].d
51a0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 33  o_test wal-11.13
51b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
51c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
51d0: 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39  1 VALUES( blob(9
51e0: 30 30 29 20 29 3b 0a 20 20 20 20 53 45 4c 45 43  00) );.    SELEC
51f0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
5200: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
5210: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
5220: 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d 0a 64 6f    }.} {17 ok}.do
5230: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 34 20  _test wal-11.14 
5240: 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  {.  list [expr [
5250: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
5260: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
5270: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
5280: 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c  .} [list 37 [wal
5290: 5f 66 69 6c 65 5f 73 69 7a 65 20 24 6e 57 61 6c  _file_size $nWal
52a0: 20 31 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d   1024]]...#-----
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
5300: 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d  k of tests, wal-
5310: 31 32 2e 2a 2c 20 74 65 73 74 73 20 74 68 65 20  12.*, tests the 
5320: 66 69 78 20 66 6f 72 20 61 20 70 72 6f 62 6c 65  fix for a proble
5330: 6d 20 74 68 61 74 20 0a 23 20 63 6f 75 6c 64 20  m that .# could 
5340: 6f 63 63 75 72 20 69 66 20 61 20 6c 6f 67 20 74  occur if a log t
5350: 68 61 74 20 69 73 20 61 20 70 72 65 66 69 78 20  hat is a prefix 
5360: 6f 66 20 61 6e 20 6f 6c 64 65 72 20 6c 6f 67 20  of an older log 
5370: 69 73 20 77 72 69 74 74 65 6e 20 0a 23 20 69 6e  is written .# in
5380: 74 6f 20 61 20 72 65 75 73 65 64 20 6c 6f 67 20  to a reused log 
5390: 66 69 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64  file..#.reopen_d
53a0: 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32  b.do_test wal-12
53b0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
53c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
53d0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
53e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
53f0: 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45  1(x, y);.    CRE
5400: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20  ATE TABLE t2(x, 
5410: 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  y);.    INSERT I
5420: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41  NTO t1 VALUES('A
5430: 27 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c 69 73  ', 1);.  }.  lis
5440: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
5450: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
5460: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
5470: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
5480: 74 20 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69  t 1 [wal_file_si
5490: 7a 65 20 35 20 31 30 32 34 5d 5d 0a 64 6f 5f 74  ze 5 1024]].do_t
54a0: 65 73 74 20 77 61 6c 2d 31 32 2e 32 20 7b 0a 20  est wal-12.2 {. 
54b0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
54c0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
54d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
54e0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
54f0: 73 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20  s = normal;.    
5500: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
5510: 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27 41  = 0 WHERE x = 'A
5520: 27 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  ';.  }.  list [e
5530: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5540: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65  est.db]/1024] [e
5550: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5560: 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34  est.db-wal]/1044
5570: 5d 0a 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74 65 73  ].} {3 1}.do_tes
5580: 74 20 77 61 6c 2d 31 32 2e 33 20 7b 0a 20 20 65  t wal-12.3 {.  e
5590: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
55a0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
55b0: 42 27 2c 20 31 29 20 7d 0a 20 20 6c 69 73 74 20  B', 1) }.  list 
55c0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
55d0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
55e0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
55f0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
5600: 34 34 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74  44].} {3 2}.do_t
5610: 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20  est wal-12.4 {. 
5620: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
5630: 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 6f  db test2.db.  fo
5640: 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 2d  rcecopy test.db-
5650: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
5660: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
5670: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78  b2 test2.db.  ex
5680: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
5690: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
56a0: 20 7b 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65   {B 1}.db2 close
56b0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e  .do_test wal-12.
56c0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
56d0: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
56e0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55  heckpoint;.    U
56f0: 50 44 41 54 45 20 74 32 20 53 45 54 20 79 20 3d  PDATE t2 SET y =
5700: 20 32 20 57 48 45 52 45 20 78 20 3d 20 27 42 27   2 WHERE x = 'B'
5710: 3b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  ; .    PRAGMA wa
5720: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
5730: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
5740: 79 20 3d 20 31 20 57 48 45 52 45 20 78 20 3d 20  y = 1 WHERE x = 
5750: 27 41 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  'A';.    PRAGMA 
5760: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
5770: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
5780: 54 20 79 20 3d 20 30 20 57 48 45 52 45 20 78 20  T y = 0 WHERE x 
5790: 3d 20 27 41 27 3b 0a 20 20 7d 0a 20 20 65 78 65  = 'A';.  }.  exe
57a0: 63 73 71 6c 20 7b 20 20 53 45 4c 45 43 54 20 2a  csql {  SELECT *
57b0: 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 42 20   FROM t2 }.} {B 
57c0: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  2}.do_test wal-1
57d0: 32 2e 36 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70  2.6 {.  forcecop
57e0: 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e  y test.db test2.
57f0: 64 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74  db.  forcecopy t
5800: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32  est.db-wal test2
5810: 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65  .db-wal.  sqlite
5820: 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 32 2e  3_wal db2 test2.
5830: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
5840: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
5850: 7d 20 64 62 32 0a 7d 20 7b 42 20 32 7d 0a 64 62  } db2.} {B 2}.db
5860: 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65  2 close.db close
5870: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
58c0: 65 73 74 20 6c 61 72 67 65 20 6c 6f 67 20 73 75  est large log su
58d0: 6d 6d 61 72 69 65 73 2e 0a 23 0a 23 20 49 6e 20  mmaries..#.# In 
58e0: 74 68 69 73 20 63 61 73 65 20 22 6c 61 72 67 65  this case "large
58f0: 22 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  " usually means 
5900: 61 20 6c 6f 67 20 66 69 6c 65 20 74 68 61 74 20  a log file that 
5910: 72 65 71 75 69 72 65 73 20 61 20 77 61 6c 2d 69  requires a wal-i
5920: 6e 64 65 78 0a 23 20 6d 61 70 70 69 6e 67 20 6c  ndex.# mapping l
5930: 61 72 67 65 72 20 74 68 61 6e 20 36 34 4b 42 20  arger than 64KB 
5940: 28 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e 69  (the default ini
5950: 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 29  tial allocation)
5960: 2e 20 41 20 36 34 4b 42 20 77 61 6c 2d 69 6e 64  . A 64KB wal-ind
5970: 65 78 0a 23 20 69 73 20 6c 61 72 67 65 20 65 6e  ex.# is large en
5980: 6f 75 67 68 20 66 6f 72 20 61 20 6c 6f 67 20 66  ough for a log f
5990: 69 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ile that contain
59a0: 73 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  s approximately 
59b0: 31 33 31 30 30 20 66 72 61 6d 65 73 2e 0a 23 20  13100 frames..# 
59c0: 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  So the following
59d0: 20 74 65 73 74 73 20 63 72 65 61 74 65 20 6c 6f   tests create lo
59e0: 67 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 74  gs containing at
59f0: 20 6c 65 61 73 74 20 74 68 69 73 20 6d 61 6e 79   least this many
5a00: 20 66 72 61 6d 65 73 2e 0a 23 0a 23 20 77 61 6c   frames..#.# wal
5a10: 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65  -13.1.*: This te
5a20: 73 74 20 63 61 73 65 20 63 72 65 61 74 65 73 20  st case creates 
5a30: 61 20 76 65 72 79 20 6c 61 72 67 65 20 6c 6f 67  a very large log
5a40: 20 66 69 6c 65 20 77 69 74 68 69 6e 20 74 68 65   file within the
5a50: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .#             f
5a60: 69 6c 65 2d 73 79 73 74 65 6d 20 28 61 72 6f 75  ile-system (arou
5a70: 6e 64 20 32 30 30 4d 42 29 2e 20 54 68 65 20 6c  nd 200MB). The l
5a80: 6f 67 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  og file does not
5a90: 20 63 6f 6e 74 61 69 6e 0a 23 20 20 20 20 20 20   contain.#      
5aa0: 20 20 20 20 20 20 20 61 6e 79 20 76 61 6c 69 64         any valid
5ab0: 20 66 72 61 6d 65 73 2e 20 54 65 73 74 20 74 68   frames. Test th
5ac0: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
5ad0: 66 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c 20 62  file can still b
5ae0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
5af0: 6f 70 65 6e 65 64 20 61 6e 64 20 71 75 65 72 69  opened and queri
5b00: 65 64 2c 20 61 6e 64 20 74 68 61 74 20 74 68 65  ed, and that the
5b10: 20 69 6e 76 61 6c 69 64 20 6c 6f 67 20 66 69 6c   invalid log fil
5b20: 65 20 63 61 75 73 65 73 20 6e 6f 20 0a 23 20 20  e causes no .#  
5b30: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 62 6c             probl
5b40: 65 6d 73 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e  ems..#.# wal-13.
5b50: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  2.*: Test that a
5b60: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 63 72 65   process may cre
5b70: 61 74 65 20 61 20 6c 61 72 67 65 20 6c 6f 67 20  ate a large log 
5b80: 66 69 6c 65 20 61 6e 64 20 71 75 65 72 79 0a 23  file and query.#
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
5ba0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 63 6c 75   database (inclu
5bb0: 64 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ding the log fil
5bc0: 65 20 74 68 61 74 20 69 74 20 69 74 73 65 6c 66  e that it itself
5bd0: 20 63 72 65 61 74 65 64 29 2e 0a 23 0a 23 20 77   created)..#.# w
5be0: 61 6c 2d 31 33 2e 33 2e 2a 3a 20 54 65 73 74 20  al-13.3.*: Test 
5bf0: 74 68 61 74 20 69 66 20 61 20 76 65 72 79 20 6c  that if a very l
5c00: 61 72 67 65 20 6c 6f 67 20 66 69 6c 65 20 69 73  arge log file is
5c10: 20 63 72 65 61 74 65 64 2c 20 61 6e 64 20 74 68   created, and th
5c20: 65 6e 20 61 0a 23 20 20 20 20 20 20 20 20 20 20  en a.#          
5c30: 20 20 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63     second connec
5c40: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f  tion is opened o
5c50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
5c60: 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69  ile, it is possi
5c70: 62 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ble.#           
5c80: 20 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 64    to query the d
5c90: 61 74 61 62 61 73 65 20 28 61 6e 64 20 74 68 65  atabase (and the
5ca0: 20 76 65 72 79 20 6c 61 72 67 65 20 6c 6f 67 29   very large log)
5cb0: 20 75 73 69 6e 67 20 74 68 65 0a 23 20 20 20 20   using the.#    
5cc0: 20 20 20 20 20 20 20 20 20 73 65 63 6f 6e 64 20           second 
5cd0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 23 20  connection..#.# 
5ce0: 77 61 6c 2d 31 33 2e 34 2e 2a 3a 20 53 61 6d 65  wal-13.4.*: Same
5cf0: 20 74 65 73 74 20 61 73 20 77 61 6c 2d 31 33 2e   test as wal-13.
5d00: 33 2e 2a 2e 20 45 78 63 65 70 74 20 69 6e 20 74  3.*. Except in t
5d10: 68 69 73 20 63 61 73 65 20 74 68 65 20 73 65 63  his case the sec
5d20: 6f 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20  ond.#           
5d30: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20    connection is 
5d40: 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 78 74  opened by an ext
5d50: 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 2e 0a 23  ernal process..#
5d60: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e  .do_test wal-13.
5d70: 31 2e 31 20 7b 0a 20 20 6c 69 73 74 20 5b 66 69  1.1 {.  list [fi
5d80: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
5d90: 62 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  b] [file exists 
5da0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b  test.db-wal].} {
5db0: 31 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  1 0}.do_test wal
5dc0: 2d 31 33 2e 31 2e 32 20 7b 0a 20 20 73 65 74 20  -13.1.2 {.  set 
5dd0: 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62  fd [open test.db
5de0: 2d 77 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24  -wal w].  seek $
5df0: 66 64 20 5b 65 78 70 72 20 32 30 30 2a 31 30 32  fd [expr 200*102
5e00: 34 2a 31 30 32 34 5d 0a 20 20 70 75 74 73 20 24  4*1024].  puts $
5e10: 66 64 20 22 22 0a 20 20 63 6c 6f 73 65 20 24 66  fd "".  close $f
5e20: 64 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  d.  sqlite3 db t
5e30: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
5e40: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
5e50: 20 74 32 20 7d 0a 7d 20 7b 42 20 32 7d 0a 64 6f   t2 }.} {B 2}.do
5e60: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e 33  _test wal-13.1.3
5e70: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
5e80: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
5e90: 2e 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a 0a 64  .db-wal.} {0}..d
5ea0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 32 2e  o_test wal-13.2.
5eb0: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  1 {.  sqlite3 db
5ec0: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
5ed0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
5ee0: 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d  t(*) FROM t2 }.}
5ef0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   {1}.do_test wal
5f00: 2d 31 33 2e 32 2e 32 20 7b 0a 20 20 64 62 20 66  -13.2.2 {.  db f
5f10: 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f  unction blob blo
5f20: 62 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  b.  for {set i 0
5f30: 7d 20 7b 24 69 20 3c 20 31 36 7d 20 7b 69 6e 63  } {$i < 16} {inc
5f40: 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
5f50: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
5f60: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
5f70: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
5f80: 46 52 4f 4d 20 74 32 20 7d 0a 20 20 7d 0a 20 20  FROM t2 }.  }.  
5f90: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
5fa0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
5fb0: 32 20 7d 0a 7d 20 5b 65 78 70 72 20 69 6e 74 28  2 }.} [expr int(
5fc0: 70 6f 77 28 32 2c 20 31 36 29 29 5d 0a 64 6f 5f  pow(2, 16))].do_
5fd0: 74 65 73 74 20 77 61 6c 2d 31 33 2e 32 2e 33 20  test wal-13.2.3 
5fe0: 7b 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73  {.  expr [file s
5ff0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
6000: 20 3e 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a   > [wal_file_siz
6010: 65 20 33 33 30 30 30 20 31 30 32 34 5d 0a 7d 20  e 33000 1024].} 
6020: 31 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e  1..do_multiclien
6030: 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20 20 69 6e  t_test tn {.  in
6040: 63 72 20 74 6e 20 32 0a 0a 20 20 64 6f 5f 74 65  cr tn 2..  do_te
6050: 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 30 20  st wal-13.$tn.0 
6060: 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a 20 20 20  {.    sql1 {.   
6070: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
6080: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
6090: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
60a0: 20 74 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e   t1(x);.      IN
60b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
60c0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38  ECT randomblob(8
60d0: 30 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  00);.    }.    s
60e0: 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  ql1 { SELECT cou
60f0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a  nt(*) FROM t1 }.
6100: 20 20 7d 20 7b 31 7d 0a 0a 20 20 66 6f 72 20 7b    } {1}..  for {
6110: 73 65 74 20 69 69 20 31 7d 20 7b 24 69 69 3c 31  set ii 1} {$ii<1
6120: 36 7d 20 7b 69 6e 63 72 20 69 69 7d 20 7b 0a 20  6} {incr ii} {. 
6130: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31     do_test wal-1
6140: 33 2e 24 74 6e 2e 24 69 69 2e 61 20 7b 0a 20 20  3.$tn.$ii.a {.  
6150: 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52      sql2 { INSER
6160: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
6170: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29   randomblob(800)
6180: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 20 20 20   FROM t1 }.     
6190: 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 63   sql2 { SELECT c
61a0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
61b0: 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 28 31  }.    } [expr (1
61c0: 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f 5f 74  <<$ii)].    do_t
61d0: 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24  est wal-13.$tn.$
61e0: 69 69 2e 62 20 7b 0a 20 20 20 20 20 20 73 71 6c  ii.b {.      sql
61f0: 31 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  1 { SELECT count
6200: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  (*) FROM t1 }.  
6210: 20 20 7d 20 5b 65 78 70 72 20 28 31 3c 3c 24 69    } [expr (1<<$i
6220: 69 29 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  i)].    do_test 
6230: 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e 63  wal-13.$tn.$ii.c
6240: 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20   {.      sql1 { 
6250: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
6260: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20  FROM t1 }.    } 
6270: 5b 65 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a  [expr (1<<$ii)].
6280: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
6290: 31 33 2e 24 74 6e 2e 24 69 69 2e 64 20 7b 0a 20  13.$tn.$ii.d {. 
62a0: 20 20 20 20 20 73 71 6c 31 20 7b 20 50 52 41 47       sql1 { PRAG
62b0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
62c0: 63 6b 20 7d 0a 20 20 20 20 7d 20 7b 6f 6b 7d 0a  ck }.    } {ok}.
62d0: 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
62e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
62f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6320: 2d 0a 23 20 43 68 65 63 6b 20 61 20 66 75 6e 20  -.# Check a fun 
6330: 63 6f 72 72 75 70 74 69 6f 6e 20 63 61 73 65 20  corruption case 
6340: 68 61 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a  has been fixed..
6350: 23 0a 23 20 54 68 65 20 70 72 6f 62 6c 65 6d 20  #.# The problem 
6360: 77 61 73 20 74 68 61 74 20 61 66 74 65 72 20 70  was that after p
6370: 65 72 66 6f 72 6d 69 6e 67 20 61 20 63 68 65 63  erforming a chec
6380: 6b 70 6f 69 6e 74 20 75 73 69 6e 67 20 61 20 63  kpoint using a c
6390: 6f 6e 6e 65 63 74 69 6f 6e 0a 23 20 74 68 61 74  onnection.# that
63a0: 20 68 61 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64   had an out-of-d
63b0: 61 74 65 20 70 61 67 65 72 2d 63 61 63 68 65 2c  ate pager-cache,
63c0: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74   the next time t
63d0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  he connection wa
63e0: 73 0a 23 20 75 73 65 64 20 69 74 20 64 69 64 20  s.# used it did 
63f0: 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 65 20  not realize the 
6400: 63 61 63 68 65 20 77 61 73 20 6f 75 74 2d 6f 66  cache was out-of
6410: 2d 64 61 74 65 20 61 6e 64 20 70 72 6f 63 65 65  -date and procee
6420: 64 65 64 20 74 6f 0a 23 20 6f 70 65 72 61 74 65  ded to.# operate
6430: 20 77 69 74 68 20 61 6e 20 69 6e 63 6f 6e 73 69   with an inconsi
6440: 73 74 65 6e 74 20 63 61 63 68 65 2e 20 4c 65 61  stent cache. Lea
6450: 64 69 6e 67 20 74 6f 20 63 6f 72 72 75 70 74 69  ding to corrupti
6460: 6f 6e 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64 62  on..#.catch { db
6470: 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b   close }.catch {
6480: 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74   db2 close }.cat
6490: 63 68 20 7b 20 64 62 33 20 63 6c 6f 73 65 20 7d  ch { db3 close }
64a0: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
64b0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
64c0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
64d0: 2e 64 62 0a 73 71 6c 69 74 65 33 20 64 62 32 20  .db.sqlite3 db2 
64e0: 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20  test.db.do_test 
64f0: 77 61 6c 2d 31 34 20 7b 0a 20 20 65 78 65 63 73  wal-14 {.  execs
6500: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
6510: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
6520: 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  AL;.    CREATE T
6530: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
6540: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49  Y KEY, b);.    I
6550: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6560: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
6570: 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  10), randomblob(
6580: 31 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  100));.    INSER
6590: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
65a0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c   randomblob(10),
65b0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
65c0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
65d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
65e0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
65f0: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
6600: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
6610: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6620: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
6630: 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  b(10), randomblo
6640: 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(100) FROM t1;.
6650: 20 20 7d 0a 0a 20 20 64 62 32 20 65 76 61 6c 20    }..  db2 eval 
6660: 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  { .    INSERT IN
6670: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
6680: 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e  domblob(10), ran
6690: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20  domblob(100);.  
66a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
66b0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
66c0: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
66d0: 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53  ob(100);.    INS
66e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
66f0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  CT randomblob(10
6700: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
6710: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
6720: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
6730: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
6740: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20  ndomblob(100);. 
6750: 20 7d 0a 0a 20 20 23 20 41 66 74 65 72 20 65 78   }..  # After ex
6760: 65 63 75 74 69 6e 67 20 74 68 65 20 22 50 52 41  ecuting the "PRA
6770: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
6780: 6e 74 22 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  nt", connection 
6790: 5b 64 62 5d 20 77 61 73 20 62 65 69 6e 67 0a 20  [db] was being. 
67a0: 20 23 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20   # left with an 
67b0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
67c0: 68 65 2e 20 52 75 6e 6e 69 6e 67 20 74 68 65 20  he. Running the 
67d0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
67e0: 74 65 6d 65 6e 74 0a 20 20 23 20 69 6e 20 74 68  tement.  # in th
67f0: 69 73 20 73 74 61 74 65 20 6c 65 64 20 74 6f 20  is state led to 
6800: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
6810: 69 6f 6e 2e 0a 20 20 63 61 74 63 68 73 71 6c 20  ion..  catchsql 
6820: 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  { .    PRAGMA wa
6830: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
6840: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
6850: 31 20 6f 6e 20 74 31 28 62 29 3b 0a 20 20 7d 0a  1 on t1(b);.  }.
6860: 20 20 20 0a 20 20 64 62 32 20 65 76 61 6c 20 7b     .  db2 eval {
6870: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
6880: 79 5f 63 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d  y_check }.} {ok}
6890: 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f  ..catch { db clo
68a0: 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 32  se }.catch { db2
68b0: 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d   close }..#-----
68c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
6910: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65  wing block of te
6920: 73 74 73 20 2d 20 77 61 6c 2d 31 35 2e 2a 20 2d  sts - wal-15.* -
6930: 20 66 6f 63 75 73 20 6f 6e 20 74 65 73 74 69 6e   focus on testin
6940: 67 20 74 68 65 20 0a 23 20 69 6d 70 6c 65 6d 65  g the .# impleme
6950: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
6960: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
6970: 70 6f 69 6e 74 28 29 20 69 6e 74 65 72 66 61 63  point() interfac
6980: 65 2e 0a 23 0a 66 6f 72 63 65 64 65 6c 65 74 65  e..#.forcedelete
6990: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
69a0: 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20  -wal.sqlite3 db 
69b0: 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20  test.db.do_test 
69c0: 77 61 6c 2d 31 35 2e 31 20 7b 0a 20 20 65 78 65  wal-15.1 {.  exe
69d0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
69e0: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
69f0: 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61  0;.    PRAGMA pa
6a00: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
6a10: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
6a20: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
6a30: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
6a40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
6a50: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
6a60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6a70: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d  UES(1, 2);.  }.}
6a80: 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74   {}..# Test that
6a90: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
6aa0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61 74  urned if the dat
6ab0: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 6e 6f  abase name is no
6ac0: 74 20 72 65 63 6f 67 6e 69 7a 65 64 0a 23 0a 64  t recognized.#.d
6ad0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 32 2e  o_test wal-15.2.
6ae0: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  1 {.  sqlite3_wa
6af0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
6b00: 61 75 78 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52  aux.} {SQLITE_ER
6b10: 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  ROR}.do_test wal
6b20: 2d 31 35 2e 32 2e 32 20 7b 0a 20 20 73 71 6c 69  -15.2.2 {.  sqli
6b30: 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62 0a 7d  te3_errcode db.}
6b40: 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a   {SQLITE_ERROR}.
6b50: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 32  do_test wal-15.2
6b60: 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .3 {.  sqlite3_e
6b70: 72 72 6d 73 67 20 64 62 0a 7d 20 7b 75 6e 6b 6e  rrmsg db.} {unkn
6b80: 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 61 75  own database: au
6b90: 78 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20  x}..# Test that 
6ba0: 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
6bb0: 72 6e 65 64 20 69 66 20 61 6e 20 61 74 74 65 6d  rned if an attem
6bc0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
6bd0: 65 63 6b 70 6f 69 6e 74 0a 23 20 69 66 20 61 20  eckpoint.# if a 
6be0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
6bf0: 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62  pen on the datab
6c00: 61 73 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ase..#.do_test w
6c10: 61 6c 2d 31 35 2e 33 2e 31 20 7b 0a 20 20 65 78  al-15.3.1 {.  ex
6c20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
6c30: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
6c40: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
6c50: 34 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  4);.  }.  sqlite
6c60: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
6c70: 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 53 51 4c 49   db main.} {SQLI
6c80: 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65  TE_LOCKED}.do_te
6c90: 73 74 20 77 61 6c 2d 31 35 2e 33 2e 32 20 7b 0a  st wal-15.3.2 {.
6ca0: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64    sqlite3_errcod
6cb0: 65 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c  e db.} {SQLITE_L
6cc0: 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20 77  OCKED}.do_test w
6cd0: 61 6c 2d 31 35 2e 33 2e 33 20 7b 0a 20 20 73 71  al-15.3.3 {.  sq
6ce0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a  lite3_errmsg db.
6cf0: 7d 20 7b 64 61 74 61 62 61 73 65 20 74 61 62 6c  } {database tabl
6d00: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 0a 0a 23 20  e is locked}..# 
6d10: 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
6d20: 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72 72   returned an err
6d30: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
6d40: 66 20 74 68 65 20 64 62 20 63 61 6e 6e 6f 74 20  f the db cannot 
6d50: 62 65 20 0a 23 20 63 68 65 63 6b 70 6f 69 6e 74  be .# checkpoint
6d60: 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f  ed because of lo
6d70: 63 6b 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74  cks held by anot
6d80: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  her connection. 
6d90: 43 68 65 63 6b 20 74 68 61 74 0a 23 20 74 68 69  Check that.# thi
6da0: 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 74  s is no longer t
6db0: 68 65 20 63 61 73 65 2e 0a 23 0a 73 71 6c 69 74  he case..#.sqlit
6dc0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 64  e3 db2 test.db.d
6dd0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e  o_test wal-15.4.
6de0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
6df0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53      BEGIN;.    S
6e00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
6e10: 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 7d  .  } db2.} {1 2}
6e20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
6e30: 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.2 {.  execsql 
6e40: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 73 71 6c  { COMMIT }.  sql
6e50: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
6e60: 69 6e 74 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45  int db.} {SQLITE
6e70: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  _OK}.do_test wal
6e80: 2d 31 35 2e 34 2e 33 20 7b 0a 20 20 73 71 6c 69  -15.4.3 {.  sqli
6e90: 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20  te3_errmsg db.} 
6ea0: 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 0a  {not an error}..
6eb0: 23 20 41 66 74 65 72 20 5b 64 62 32 5d 20 64 72  # After [db2] dr
6ec0: 6f 70 73 20 69 74 73 20 6c 6f 63 6b 2c 20 5b 64  ops its lock, [d
6ed0: 62 5d 20 6d 61 79 20 63 68 65 63 6b 70 6f 69 6e  b] may checkpoin
6ee0: 74 20 74 68 65 20 64 62 2e 0a 23 0a 64 6f 5f 74  t the db..#.do_t
6ef0: 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 34 20 7b  est wal-15.4.4 {
6f00: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d  .  execsql { COM
6f10: 4d 49 54 20 7d 20 64 62 32 0a 20 20 73 71 6c 69  MIT } db2.  sqli
6f20: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
6f30: 6e 74 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f  nt db.} {SQLITE_
6f40: 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  OK}.do_test wal-
6f50: 31 35 2e 34 2e 35 20 7b 0a 20 20 73 71 6c 69 74  15.4.5 {.  sqlit
6f60: 65 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b  e3_errmsg db.} {
6f70: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 64 6f  not an error}.do
6f80: 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 36  _test wal-15.4.6
6f90: 20 7b 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74   {.  file size t
6fa0: 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31  est.db.} [expr 1
6fb0: 30 32 34 2a 32 5d 0a 0a 63 61 74 63 68 20 7b 20  024*2]..catch { 
6fc0: 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63  db2 close }.catc
6fd0: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 0a  h { db close }..
6fe0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
7030: 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b   following block
7040: 20 6f 66 20 74 65 73 74 73 20 2d 20 77 61 6c 2d   of tests - wal-
7050: 31 36 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74  16.* - test that
7060: 20 69 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   if a NULL point
7070: 65 72 20 6f 72 0a 23 20 61 6e 20 65 6d 70 74 79  er or.# an empty
7080: 20 73 74 72 69 6e 67 20 69 73 20 70 61 73 73 65   string is passe
7090: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
70a0: 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 68 65 20  argument of the 
70b0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 29  wal_checkpoint()
70c0: 0a 23 20 41 50 49 2c 20 61 6e 20 61 74 74 65 6d  .# API, an attem
70d0: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
70e0: 65 63 6b 70 6f 69 6e 74 20 61 6c 6c 20 61 74 74  eckpoint all att
70f0: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e  ached databases.
7100: 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63  .#.foreach {tn c
7110: 6b 70 74 5f 63 6d 64 20 63 6b 70 74 5f 72 65 73  kpt_cmd ckpt_res
7120: 20 63 6b 70 74 5f 6d 61 69 6e 20 63 6b 70 74 5f   ckpt_main ckpt_
7130: 61 75 78 7d 20 7b 0a 20 20 31 20 7b 73 71 6c 69  aux} {.  1 {sqli
7140: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
7150: 6e 74 20 64 62 7d 20 20 20 20 20 20 20 20 20 20  nt db}          
7160: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
7170: 20 20 31 20 31 0a 20 20 32 20 7b 73 71 6c 69 74    1 1.  2 {sqlit
7180: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
7190: 74 20 64 62 20 22 22 7d 20 20 20 20 20 20 20 20  t db ""}        
71a0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
71b0: 20 31 20 31 0a 20 20 33 20 7b 64 62 20 65 76 61   1 1.  3 {db eva
71c0: 6c 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68  l "PRAGMA wal_ch
71d0: 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 20 20 20  eckpoint"}      
71e0: 20 20 7b 30 20 31 30 20 31 30 7d 20 20 20 20 20    {0 10 10}     
71f0: 31 20 31 0a 0a 20 20 34 20 7b 73 71 6c 69 74 65  1 1..  4 {sqlite
7200: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
7210: 20 64 62 20 6d 61 69 6e 7d 20 20 20 20 20 20 20   db main}       
7220: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
7230: 31 20 30 0a 20 20 35 20 7b 73 71 6c 69 74 65 33  1 0.  5 {sqlite3
7240: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
7250: 64 62 20 61 75 78 7d 20 20 20 20 20 20 20 20 20  db aux}         
7260: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 30   SQLITE_OK     0
7270: 20 31 0a 20 20 36 20 7b 73 71 6c 69 74 65 33 5f   1.  6 {sqlite3_
7280: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
7290: 62 20 74 65 6d 70 7d 20 20 20 20 20 20 20 20 20  b temp}         
72a0: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 30 20  SQLITE_OK     0 
72b0: 30 0a 20 20 37 20 7b 64 62 20 65 76 61 6c 20 22  0.  7 {db eval "
72c0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77 61 6c 5f  PRAGMA main.wal_
72d0: 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 7b  checkpoint"}   {
72e0: 30 20 31 30 20 31 30 7d 20 20 20 20 20 31 20 30  0 10 10}     1 0
72f0: 0a 20 20 38 20 7b 64 62 20 65 76 61 6c 20 22 50  .  8 {db eval "P
7300: 52 41 47 4d 41 20 61 75 78 2e 77 61 6c 5f 63 68  RAGMA aux.wal_ch
7310: 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 20 7b 30  eckpoint"}    {0
7320: 20 31 33 20 31 33 7d 20 20 20 20 20 30 20 31 0a   13 13}     0 1.
7330: 20 20 39 20 7b 64 62 20 65 76 61 6c 20 22 50 52    9 {db eval "PR
7340: 41 47 4d 41 20 74 65 6d 70 2e 77 61 6c 5f 63 68  AGMA temp.wal_ch
7350: 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 7b 30 20  eckpoint"}   {0 
7360: 2d 31 20 2d 31 7d 20 20 20 20 20 30 20 30 0a 7d  -1 -1}     0 0.}
7370: 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   {.  do_test wal
7380: 2d 31 36 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20  -16.$tn.1 {.    
7390: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
73a0: 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 77 61  2.db test2.db-wa
73b0: 6c 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e  l test2.db-journ
73c0: 61 6c 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65  al.    forcedele
73d0: 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  te test.db test.
73e0: 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a  db-wal test.db-j
73f0: 6f 75 72 6e 61 6c 0a 0a 20 20 20 20 73 71 6c 69  ournal..    sqli
7400: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
7410: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
7420: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
7430: 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20 20 20  .db' AS aux;.   
7440: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 61     PRAGMA main.a
7450: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
7460: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
7470: 2e 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30  .auto_vacuum = 0
7480: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
7490: 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ain.journal_mode
74a0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50 52   = WAL;.      PR
74b0: 41 47 4d 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c  AGMA aux.journal
74c0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
74d0: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73     PRAGMA main.s
74e0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52  ynchronous = NOR
74f0: 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  MAL;.      PRAGM
7500: 41 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75  A aux.synchronou
7510: 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  s = NORMAL;.    
7520: 7d 0a 20 20 7d 20 7b 77 61 6c 20 77 61 6c 7d 0a  }.  } {wal wal}.
7530: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
7540: 36 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78  6.$tn.2 {.    ex
7550: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
7560: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
7570: 74 31 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59  t1(a, b, PRIMARY
7580: 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20   KEY(a, b));.   
7590: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
75a0: 61 75 78 2e 74 32 28 61 2c 20 62 2c 20 50 52 49  aux.t2(a, b, PRI
75b0: 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b  MARY KEY(a, b));
75c0: 0a 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ..      INSERT I
75d0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
75e0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
75f0: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
7600: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
7610: 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  2, randomblob(10
7620: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
7630: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
7640: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
7650: 20 7d 0a 20 20 0a 20 20 20 20 6c 69 73 74 20 5b   }.  .    list [
7660: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7670: 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  b] [file size te
7680: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b  st.db-wal].  } [
7690: 6c 69 73 74 20 5b 65 78 70 72 20 31 2a 31 30 32  list [expr 1*102
76a0: 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  4] [wal_file_siz
76b0: 65 20 31 30 20 31 30 32 34 5d 5d 0a 20 20 64 6f  e 10 1024]].  do
76c0: 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e  _test wal-16.$tn
76d0: 2e 33 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66  .3 {.    list [f
76e0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64  ile size test2.d
76f0: 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  b] [file size te
7700: 73 74 32 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20  st2.db-wal].  } 
7710: 5b 6c 69 73 74 20 5b 65 78 70 72 20 31 2a 31 30  [list [expr 1*10
7720: 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69  24] [wal_file_si
7730: 7a 65 20 31 33 20 31 30 32 34 5d 5d 0a 20 20 0a  ze 13 1024]].  .
7740: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36    do_test wal-16
7750: 2e 24 74 6e 2e 34 20 5b 6c 69 73 74 20 65 76 61  .$tn.4 [list eva
7760: 6c 20 24 63 6b 70 74 5f 63 6d 64 5d 20 24 63 6b  l $ckpt_cmd] $ck
7770: 70 74 5f 72 65 73 0a 20 20 0a 20 20 64 6f 5f 74  pt_res.  .  do_t
7780: 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 35  est wal-16.$tn.5
7790: 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c   {.    list [fil
77a0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20  e size test.db] 
77b0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
77c0: 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73  db-wal].  } [lis
77d0: 74 20 5b 65 78 70 72 20 28 24 63 6b 70 74 5f 6d  t [expr ($ckpt_m
77e0: 61 69 6e 20 3f 20 37 20 3a 20 31 29 2a 31 30 32  ain ? 7 : 1)*102
77f0: 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  4] [wal_file_siz
7800: 65 20 31 30 20 31 30 32 34 5d 5d 0a 0a 20 20 64  e 10 1024]]..  d
7810: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74  o_test wal-16.$t
7820: 6e 2e 36 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  n.6 {.    list [
7830: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e  file size test2.
7840: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
7850: 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d  est2.db-wal].  }
7860: 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 28 24 63   [list [expr ($c
7870: 6b 70 74 5f 61 75 78 20 3f 20 37 20 3a 20 31 29  kpt_aux ? 7 : 1)
7880: 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65  *1024] [wal_file
7890: 5f 73 69 7a 65 20 31 33 20 31 30 32 34 5d 5d 0a  _size 13 1024]].
78a0: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c  .  catch { db cl
78b0: 6f 73 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ose }.}..#------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7900: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
7910: 69 6e 67 20 74 65 73 74 73 20 2d 20 77 61 6c 2d  ing tests - wal-
7920: 31 37 2e 2a 20 2d 20 61 74 74 65 6d 70 74 20 74  17.* - attempt t
7930: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
7940: 65 20 63 6f 72 72 65 63 74 0a 23 20 6e 75 6d 62  e correct.# numb
7950: 65 72 20 6f 66 20 22 70 61 64 64 69 6e 67 22 20  er of "padding" 
7960: 66 72 61 6d 65 73 20 61 72 65 20 61 70 70 65 6e  frames are appen
7970: 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ded to the log f
7980: 69 6c 65 20 77 68 65 6e 20 61 20 74 72 61 6e 73  ile when a trans
7990: 61 63 74 69 6f 6e 0a 23 20 69 73 20 63 6f 6d 6d  action.# is comm
79a0: 69 74 74 65 64 20 69 6e 20 73 79 6e 63 68 72 6f  itted in synchro
79b0: 6e 6f 75 73 3d 46 55 4c 4c 20 6d 6f 64 65 2e 0a  nous=FULL mode..
79c0: 23 20 0a 23 20 44 6f 20 74 68 69 73 20 62 79 20  # .# Do this by 
79d0: 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
79e0: 61 73 65 20 74 68 61 74 20 75 73 65 73 20 35 31  ase that uses 51
79f0: 32 20 62 79 74 65 20 70 61 67 65 73 2e 20 54 68  2 byte pages. Th
7a00: 65 6e 20 77 72 69 74 69 6e 67 0a 23 20 61 20 74  en writing.# a t
7a10: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
7a20: 6d 6f 64 69 66 69 65 73 20 31 37 31 20 70 61 67  modifies 171 pag
7a30: 65 73 2e 20 49 6e 20 73 79 6e 63 68 72 6f 6e 6f  es. In synchrono
7a40: 75 73 3d 4e 4f 52 4d 41 4c 20 6d 6f 64 65 2c 20  us=NORMAL mode, 
7a50: 74 68 69 73 0a 23 20 70 72 6f 64 75 63 65 73 20  this.# produces 
7a60: 61 20 6c 6f 67 20 66 69 6c 65 20 6f 66 3a 0a 23  a log file of:.#
7a70: 0a 23 20 20 20 33 32 20 2b 20 28 32 34 2b 35 31  .#   32 + (24+51
7a80: 32 29 2a 31 37 31 20 3d 20 39 30 33 31 32 20 62  2)*171 = 90312 b
7a90: 79 74 65 73 2e 0a 23 0a 23 20 53 6c 69 67 68 74  ytes..#.# Slight
7aa0: 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31  ly larger than 1
7ab0: 31 2a 38 31 39 32 20 3d 20 39 30 31 31 32 20 62  1*8192 = 90112 b
7ac0: 79 74 65 73 2e 0a 23 0a 23 20 52 75 6e 20 74 68  ytes..#.# Run th
7ad0: 65 20 74 65 73 74 20 75 73 69 6e 67 20 76 61 72  e test using var
7ae0: 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20 73  ious different s
7af0: 65 63 74 6f 72 2d 73 69 7a 65 73 2e 20 49 6e 20  ector-sizes. In 
7b00: 65 61 63 68 20 63 61 73 65 2c 20 74 68 65 0a 23  each case, the.#
7b10: 20 57 41 4c 20 63 6f 64 65 20 73 68 6f 75 6c 64   WAL code should
7b20: 20 77 72 69 74 65 20 74 68 65 20 39 30 33 30 30   write the 90300
7b30: 20 62 79 74 65 73 20 6f 66 20 6c 6f 67 20 66 69   bytes of log fi
7b40: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
7b50: 65 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  e .# transaction
7b60: 2c 20 74 68 65 6e 20 61 70 70 65 6e 64 20 61 73  , then append as
7b70: 20 6d 61 79 20 66 72 61 6d 65 73 20 61 73 20 61   may frames as a
7b80: 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  re required to e
7b90: 78 74 65 6e 64 20 74 68 65 0a 23 20 6c 6f 67 20  xtend the.# log 
7ba0: 66 69 6c 65 20 73 6f 20 74 68 61 74 20 6e 6f 20  file so that no 
7bb0: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  part of the next
7bc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
7bd0: 6c 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  l be written int
7be0: 6f 0a 23 20 61 20 64 69 73 6b 2d 73 65 63 74 6f  o.# a disk-secto
7bf0: 72 20 75 73 65 64 20 62 79 20 74 72 61 6e 73 61  r used by transa
7c00: 63 74 69 6f 6e 20 6a 75 73 74 20 63 6f 6d 6d 69  ction just commi
7c10: 74 74 65 64 2e 0a 23 0a 73 65 74 20 6f 6c 64 5f  tted..#.set old_
7c20: 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 5b 73 71  pending_byte [sq
7c30: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
7c40: 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20  ol_pending_byte 
7c50: 30 78 31 30 30 30 30 30 30 30 5d 0a 63 61 74 63  0x10000000].catc
7c60: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66  h { db close }.f
7c70: 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 63 74 6f  oreach {tn secto
7c80: 72 73 69 7a 65 20 6c 6f 67 73 69 7a 65 7d 20 22  rsize logsize} "
7c90: 0a 20 20 31 20 20 20 31 32 38 20 20 5b 77 61 6c  .  1   128  [wal
7ca0: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35  _file_size 172 5
7cb0: 31 32 5d 0a 20 20 32 20 20 20 32 35 36 20 20 5b  12].  2   256  [
7cc0: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37  wal_file_size 17
7cd0: 32 20 35 31 32 5d 0a 20 20 33 20 20 20 35 31 32  2 512].  3   512
7ce0: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
7cf0: 20 31 37 32 20 35 31 32 5d 20 0a 20 20 34 20 20   172 512] .  4  
7d00: 31 30 32 34 20 20 5b 77 61 6c 5f 66 69 6c 65 5f  1024  [wal_file_
7d10: 73 69 7a 65 20 31 37 32 20 35 31 32 5d 0a 20 20  size 172 512].  
7d20: 35 20 20 32 30 34 38 20 20 5b 77 61 6c 5f 66 69  5  2048  [wal_fi
7d30: 6c 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d  le_size 172 512]
7d40: 0a 20 20 36 20 20 34 30 39 36 20 20 5b 77 61 6c  .  6  4096  [wal
7d50: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 36 20 35  _file_size 176 5
7d60: 31 32 5d 0a 20 20 37 20 20 38 31 39 32 20 20 5b  12].  7  8192  [
7d70: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 38  wal_file_size 18
7d80: 34 20 35 31 32 5d 0a 22 20 7b 0a 20 20 66 6f 72  4 512]." {.  for
7d90: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
7da0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
7db0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73  t.db-journal.  s
7dc0: 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f  qlite3_simulate_
7dd0: 64 65 76 69 63 65 20 2d 73 65 63 74 6f 72 73 69  device -sectorsi
7de0: 7a 65 20 24 73 65 63 74 6f 72 73 69 7a 65 0a 20  ze $sectorsize. 
7df0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
7e00: 2e 64 62 20 2d 76 66 73 20 64 65 76 73 79 6d 0a  .db -vfs devsym.
7e10: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
7e20: 37 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  7.$tn.1 {.    ex
7e30: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
7e40: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
7e50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41 47   = 0;.      PRAG
7e60: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 35  MA page_size = 5
7e70: 31 32 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  12;.      PRAGMA
7e80: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 2d 32   cache_size = -2
7e90: 30 30 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  000;.      PRAGM
7ea0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
7eb0: 20 57 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47   WAL;.      PRAG
7ec0: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
7ed0: 20 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   FULL;.    }.   
7ee0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
7ef0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 43 52   BEGIN;.      CR
7f00: 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 29 3b  EATE TABLE t(x);
7f10: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20 7b  .    }.    for {
7f20: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 31 36 36  set i 0} {$i<166
7f30: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
7f40: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
7f50: 45 52 54 20 49 4e 54 4f 20 74 20 56 41 4c 55 45  ERT INTO t VALUE
7f60: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 34 30 30  S(randomblob(400
7f70: 29 29 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65  )) }.    }.    e
7f80: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 0a 20  xecsql COMMIT.. 
7f90: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
7fa0: 74 2e 64 62 2d 77 61 6c 0a 20 20 7d 20 24 6c 6f  t.db-wal.  } $lo
7fb0: 67 73 69 7a 65 0a 0a 20 20 64 6f 5f 74 65 73 74  gsize..  do_test
7fc0: 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 32 20 7b 0a   wal-17.$tn.2 {.
7fd0: 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65      file size te
7fe0: 73 74 2e 64 62 0a 20 20 7d 20 35 31 32 0a 0a 20  st.db.  } 512.. 
7ff0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 37 2e   do_test wal-17.
8000: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 64 62 20 63  $tn.3 {.    db c
8010: 6c 6f 73 65 0a 20 20 20 20 66 69 6c 65 20 73 69  lose.    file si
8020: 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 5b  ze test.db.  } [
8030: 65 78 70 72 20 35 31 32 2a 31 37 31 5d 0a 7d 0a  expr 512*171].}.
8040: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
8050: 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74  trol_pending_byt
8060: 65 20 24 6f 6c 64 5f 70 65 6e 64 69 6e 67 5f 62  e $old_pending_b
8070: 79 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  yte..#----------
8080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
80c0: 23 20 54 68 69 73 20 74 65 73 74 20 2d 20 77 61  # This test - wa
80d0: 6c 2d 31 38 2e 2a 20 2d 20 76 65 72 69 66 69 65  l-18.* - verifie
80e0: 73 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 73 70  s a couple of sp
80f0: 65 63 69 66 69 63 20 63 6f 6e 64 69 74 69 6f 6e  ecific condition
8100: 73 20 74 68 61 74 0a 23 20 6d 61 79 20 62 65 20  s that.# may be 
8110: 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c  encountered whil
8120: 65 20 72 65 63 6f 76 65 72 69 6e 67 20 61 20 6c  e recovering a l
8130: 6f 67 20 66 69 6c 65 20 61 72 65 20 68 61 6e 64  og file are hand
8140: 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 3a 0a 23  led correctly:.#
8150: 0a 23 20 20 20 77 61 6c 2d 31 38 2e 31 2e 2a 20  .#   wal-18.1.* 
8160: 57 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 33  When the first 3
8170: 32 2d 62 69 74 73 20 6f 66 20 61 20 66 72 61 6d  2-bits of a fram
8180: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 63 6f  e checksum is co
8190: 72 72 65 63 74 20 62 75 74 20 0a 23 20 20 20 20  rrect but .#    
81a0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73 65            the se
81b0: 63 6f 6e 64 20 33 32 2d 62 69 74 73 20 61 72 65  cond 32-bits are
81c0: 20 66 61 6c 73 65 2c 20 61 6e 64 0a 23 0a 23 20   false, and.#.# 
81d0: 20 20 77 61 6c 2d 31 38 2e 32 2e 2a 20 57 68 65    wal-18.2.* Whe
81e0: 6e 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  n the page-size 
81f0: 66 69 65 6c 64 20 74 68 61 74 20 6f 63 63 75 72  field that occur
8200: 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
8210: 66 20 61 20 6c 6f 67 0a 23 20 20 20 20 20 20 20  f a log.#       
8220: 20 20 20 20 20 20 20 66 69 6c 65 20 69 73 20 61         file is a
8230: 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61   power of 2 grea
8240: 74 65 72 20 74 68 61 6e 20 31 36 33 38 34 20 6f  ter than 16384 o
8250: 72 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 35  r smaller than 5
8260: 31 32 2e 0a 23 0a 66 6f 72 63 65 64 65 6c 65 74  12..#.forcedelet
8270: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
8280: 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f  b-wal test.db-jo
8290: 75 72 6e 61 6c 0a 64 6f 5f 74 65 73 74 20 77 61  urnal.do_test wa
82a0: 6c 2d 31 38 2e 30 20 7b 0a 20 20 73 71 6c 69 74  l-18.0 {.  sqlit
82b0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
82c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
82d0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
82e0: 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d   1024;.    PRAGM
82f0: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
8300: 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  0;.    PRAGMA jo
8310: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
8320: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  ;.    PRAGMA syn
8330: 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a  chronous = OFF;.
8340: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
8350: 45 20 74 31 28 61 2c 20 62 2c 20 55 4e 49 51 55  E t1(a, b, UNIQU
8360: 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 49 4e  E(a, b));.    IN
8370: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
8380: 55 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 50  UES(0, 0);.    P
8390: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
83a0: 6f 69 6e 74 3b 0a 0a 20 20 20 20 49 4e 53 45 52  oint;..    INSER
83b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
83c0: 28 31 2c 20 32 29 3b 20 20 20 20 20 20 20 20 20  (1, 2);         
83d0: 20 2d 2d 20 66 72 61 6d 65 73 20 31 20 61 6e 64   -- frames 1 and
83e0: 20 32 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   2.    INSERT IN
83f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
8400: 34 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20  4);          -- 
8410: 66 72 61 6d 65 73 20 33 20 61 6e 64 20 34 0a 20  frames 3 and 4. 
8420: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8430: 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 20  1 VALUES(5, 6); 
8440: 20 20 20 20 20 20 20 20 20 2d 2d 20 66 72 61 6d           -- fram
8450: 65 73 20 35 20 61 6e 64 20 36 0a 20 20 7d 0a 0a  es 5 and 6.  }..
8460: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
8470: 2e 64 62 20 74 65 73 74 58 2e 64 62 0a 20 20 66  .db testX.db.  f
8480: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62  orcecopy test.db
8490: 2d 77 61 6c 20 74 65 73 74 58 2e 64 62 2d 77 61  -wal testX.db-wa
84a0: 6c 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c  l.  db close.  l
84b0: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
84c0: 65 73 74 58 2e 64 62 5d 20 5b 66 69 6c 65 20 73  estX.db] [file s
84d0: 69 7a 65 20 74 65 73 74 58 2e 64 62 2d 77 61 6c  ize testX.db-wal
84e0: 5d 0a 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20  ].} [list [expr 
84f0: 33 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c  3*1024] [wal_fil
8500: 65 5f 73 69 7a 65 20 36 20 31 30 32 34 5d 5d 0a  e_size 6 1024]].
8510: 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61  .unset -nocompla
8520: 69 6e 20 6e 46 72 61 6d 65 20 72 65 73 75 6c 74  in nFrame result
8530: 0a 66 6f 72 65 61 63 68 20 7b 6e 46 72 61 6d 65  .foreach {nFrame
8540: 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20 20   result} {.     
8550: 20 20 20 20 30 20 20 20 20 20 20 7b 30 20 30 7d      0      {0 0}
8560: 0a 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20  .         1     
8570: 20 7b 30 20 30 7d 0a 20 20 20 20 20 20 20 20 20   {0 0}.         
8580: 32 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 7d  2      {0 0 1 2}
8590: 0a 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20  .         3     
85a0: 20 7b 30 20 30 20 31 20 32 7d 0a 20 20 20 20 20   {0 0 1 2}.     
85b0: 20 20 20 20 34 20 20 20 20 20 20 7b 30 20 30 20      4      {0 0 
85c0: 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20  1 2 3 4}.       
85d0: 20 20 35 20 20 20 20 20 20 7b 30 20 30 20 31 20    5      {0 0 1 
85e0: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20  2 3 4}.         
85f0: 36 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 20  6      {0 0 1 2 
8600: 33 20 34 20 35 20 36 7d 0a 7d 20 7b 0a 20 20 64  3 4 5 6}.} {.  d
8610: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 31 2e  o_test wal-18.1.
8620: 24 6e 46 72 61 6d 65 20 7b 0a 20 20 20 20 66 6f  $nFrame {.    fo
8630: 72 63 65 63 6f 70 79 20 74 65 73 74 58 2e 64 62  rcecopy testX.db
8640: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 66 6f 72   test.db.    for
8650: 63 65 63 6f 70 79 20 74 65 73 74 58 2e 64 62 2d  cecopy testX.db-
8660: 77 61 6c 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  wal test.db-wal.
8670: 0a 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65  .    hexio_write
8680: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 5b 65 78   test.db-wal [ex
8690: 70 72 20 32 34 20 2b 20 24 6e 46 72 61 6d 65 2a  pr 24 + $nFrame*
86a0: 28 32 34 2b 31 30 32 34 29 20 2b 20 32 30 5d 20  (24+1024) + 20] 
86b0: 30 30 30 30 30 30 30 30 0a 0a 20 20 20 20 73 71  00000000..    sq
86c0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
86d0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
86e0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
86f0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 50 52  ROM t1;.      PR
8700: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
8710: 68 65 63 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 7d  heck; .    }.  }
8720: 20 5b 63 6f 6e 63 61 74 20 24 72 65 73 75 6c 74   [concat $result
8730: 20 6f 6b 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a   ok].  db close.
8740: 7d 20 0a 0a 70 72 6f 63 20 72 61 6e 64 6f 6d 62  } ..proc randomb
8750: 6c 6f 62 20 7b 70 67 73 7a 7d 20 7b 0a 20 20 73  lob {pgsz} {.  s
8760: 71 6c 69 74 65 33 20 72 62 64 62 20 3a 6d 65 6d  qlite3 rbdb :mem
8770: 6f 72 79 3a 0a 20 20 73 65 74 20 62 6c 6f 62 20  ory:.  set blob 
8780: 5b 72 62 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43  [rbdb one {SELEC
8790: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 24 70 67  T randomblob($pg
87a0: 73 7a 29 7d 5d 0a 20 20 72 62 64 62 20 63 6c 6f  sz)}].  rbdb clo
87b0: 73 65 0a 20 20 73 65 74 20 62 6c 6f 62 0a 7d 0a  se.  set blob.}.
87c0: 0a 70 72 6f 63 20 6c 6f 67 63 6b 73 75 6d 20 7b  .proc logcksum {
87d0: 63 6b 76 31 20 63 6b 76 32 20 62 6c 6f 62 7d 20  ckv1 ckv2 blob} 
87e0: 7b 0a 20 20 75 70 76 61 72 20 24 63 6b 76 31 20  {.  upvar $ckv1 
87f0: 63 31 0a 20 20 75 70 76 61 72 20 24 63 6b 76 32  c1.  upvar $ckv2
8800: 20 63 32 0a 0a 20 20 23 20 53 69 6e 63 65 20 74   c2..  # Since t
8810: 68 65 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 20  he magic number 
8820: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
8830: 74 68 65 20 2d 77 61 6c 20 66 69 6c 65 20 68 65  the -wal file he
8840: 61 64 65 72 20 69 73 0a 20 20 23 20 39 33 31 30  ader is.  # 9310
8850: 37 31 36 31 38 20 74 68 61 74 20 69 6e 64 69 63  71618 that indic
8860: 61 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f  ates that the co
8870: 6e 74 65 6e 74 20 73 68 6f 75 6c 64 20 61 6c 77  ntent should alw
8880: 61 79 73 20 62 65 20 72 65 61 64 20 61 73 0a 20  ays be read as. 
8890: 20 23 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e   # little-endian
88a0: 2e 0a 20 20 23 20 0a 20 20 73 65 74 20 73 63 61  ..  # .  set sca
88b0: 6e 70 61 74 74 65 72 6e 20 69 2a 0a 0a 20 20 62  npattern i*..  b
88c0: 69 6e 61 72 79 20 73 63 61 6e 20 24 62 6c 6f 62  inary scan $blob
88d0: 20 24 73 63 61 6e 70 61 74 74 65 72 6e 20 76 61   $scanpattern va
88e0: 6c 75 65 73 0a 20 20 66 6f 72 65 61 63 68 20 7b  lues.  foreach {
88f0: 76 31 20 76 32 7d 20 24 76 61 6c 75 65 73 20 7b  v1 v2} $values {
8900: 0a 20 20 20 20 73 65 74 20 63 31 20 5b 65 78 70  .    set c1 [exp
8910: 72 20 7b 28 24 63 31 20 2b 20 24 76 31 20 2b 20  r {($c1 + $v1 + 
8920: 24 63 32 29 26 30 78 46 46 46 46 46 46 46 46 7d  $c2)&0xFFFFFFFF}
8930: 5d 0a 20 20 20 20 73 65 74 20 63 32 20 5b 65 78  ].    set c2 [ex
8940: 70 72 20 7b 28 24 63 32 20 2b 20 24 76 32 20 2b  pr {($c2 + $v2 +
8950: 20 24 63 31 29 26 30 78 46 46 46 46 46 46 46 46   $c1)&0xFFFFFFFF
8960: 7d 5d 0a 20 20 7d 0a 7d 0a 0a 66 6f 72 63 65 63  }].  }.}..forcec
8970: 6f 70 79 20 74 65 73 74 2e 64 62 20 74 65 73 74  opy test.db test
8980: 58 2e 64 62 0a 66 6f 72 65 61 63 68 20 7b 74 6e  X.db.foreach {tn
8990: 20 70 67 73 7a 20 77 6f 72 6b 73 7d 20 7b 20 0a   pgsz works} { .
89a0: 20 20 31 20 20 20 20 31 32 38 20 20 20 20 30 0a    1    128    0.
89b0: 20 20 32 20 20 20 20 32 35 36 20 20 20 20 30 0a    2    256    0.
89c0: 20 20 33 20 20 20 20 35 31 32 20 20 20 20 31 0a    3    512    1.
89d0: 20 20 34 20 20 20 31 30 32 34 20 20 20 20 31 0a    4   1024    1.
89e0: 20 20 35 20 20 20 32 30 34 38 20 20 20 20 31 0a    5   2048    1.
89f0: 20 20 36 20 20 20 34 30 39 36 20 20 20 20 31 0a    6   4096    1.
8a00: 20 20 37 20 20 20 38 31 39 32 20 20 20 20 31 0a    7   8192    1.
8a10: 20 20 38 20 20 31 36 33 38 34 20 20 20 20 31 0a    8  16384    1.
8a20: 20 20 39 20 20 33 32 37 36 38 20 20 20 20 31 0a    9  32768    1.
8a30: 20 31 30 20 20 36 35 35 33 36 20 20 20 20 31 0a   10  65536    1.
8a40: 20 31 31 20 31 33 31 30 37 32 20 20 20 20 30 0a   11 131072    0.
8a50: 20 31 31 20 20 20 31 30 31 36 20 20 20 20 30 0a   11   1016    0.
8a60: 7d 20 7b 0a 0a 20 20 69 66 20 7b 24 3a 3a 53 51  } {..  if {$::SQ
8a70: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8a80: 5a 45 20 3c 20 24 70 67 73 7a 7d 20 7b 0a 20 20  ZE < $pgsz} {.  
8a90: 20 20 73 65 74 20 77 6f 72 6b 73 20 30 0a 20 20    set works 0.  
8aa0: 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 70 67  }..  for {set pg
8ab0: 20 31 7d 20 7b 24 70 67 20 3c 3d 20 33 7d 20 7b   1} {$pg <= 3} {
8ac0: 69 6e 63 72 20 70 67 7d 20 7b 0a 20 20 20 20 66  incr pg} {.    f
8ad0: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 58 2e 64  orcecopy testX.d
8ae0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 66 6f  b test.db.    fo
8af0: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
8b00: 62 2d 77 61 6c 0a 20 20 0a 20 20 20 20 23 20 43  b-wal.  .    # C
8b10: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 64 61  heck that the da
8b20: 74 61 62 61 73 65 20 6e 6f 77 20 65 78 69 73 74  tabase now exist
8b30: 73 20 61 6e 64 20 63 6f 6e 73 69 73 74 73 20 6f  s and consists o
8b40: 66 20 74 68 72 65 65 20 70 61 67 65 73 2e 20 41  f three pages. A
8b50: 6e 64 0a 20 20 20 20 23 20 74 68 61 74 20 74 68  nd.    # that th
8b60: 65 72 65 20 69 73 20 6e 6f 20 61 73 73 6f 63 69  ere is no associ
8b70: 61 74 65 64 20 77 61 6c 20 66 69 6c 65 2e 0a 20  ated wal file.. 
8b80: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
8b90: 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70   wal-18.2.$tn.$p
8ba0: 67 2e 31 20 7b 20 66 69 6c 65 20 65 78 69 73 74  g.1 { file exist
8bb0: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 7d 20  s test.db-wal } 
8bc0: 30 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  0.    do_test wa
8bd0: 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 32  l-18.2.$tn.$pg.2
8be0: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
8bf0: 65 73 74 2e 64 62 20 7d 20 31 0a 20 20 20 20 64  est.db } 1.    d
8c00: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e  o_test wal-18.2.
8c10: 24 74 6e 2e 24 70 67 2e 33 20 7b 20 66 69 6c 65  $tn.$pg.3 { file
8c20: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 20 7d 20   size test.db } 
8c30: 5b 65 78 70 72 20 31 30 32 34 2a 33 5d 0a 20 20  [expr 1024*3].  
8c40: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
8c50: 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 34 20  -18.2.$tn.$pg.4 
8c60: 7b 0a 0a 20 20 20 20 20 20 23 20 43 72 65 61 74  {..      # Creat
8c70: 65 20 61 20 77 61 6c 20 66 69 6c 65 20 74 68 61  e a wal file tha
8c80: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  t contains a sin
8c90: 67 6c 65 20 66 72 61 6d 65 20 28 64 61 74 61 62  gle frame (datab
8ca0: 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20 23  ase page.      #
8cb0: 20 6e 75 6d 62 65 72 20 24 70 67 29 20 77 69 74   number $pg) wit
8cc0: 68 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 6c 61  h the commit fla
8cd0: 67 20 73 65 74 2e 20 54 68 65 20 66 72 61 6d 65  g set. The frame
8ce0: 20 63 68 65 63 6b 73 75 6d 20 69 73 0a 20 20 20   checksum is.   
8cf0: 20 20 20 23 20 63 6f 72 72 65 63 74 2c 20 62 75     # correct, bu
8d00: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
8d10: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  f the database p
8d20: 61 67 65 20 61 72 65 20 63 6f 72 72 75 70 74 2e  age are corrupt.
8d30: 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 23  .      #.      #
8d40: 20 54 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   The page-size i
8d50: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 68  n the log file h
8d60: 65 61 64 65 72 20 69 73 20 73 65 74 20 74 6f 20  eader is set to 
8d70: 24 70 67 73 7a 2e 20 49 66 20 74 68 65 0a 20 20  $pgsz. If the.  
8d80: 20 20 20 20 23 20 57 41 4c 20 63 6f 64 65 20 63      # WAL code c
8d90: 6f 6e 73 69 64 65 72 73 20 24 70 67 73 7a 20 74  onsiders $pgsz t
8da0: 6f 20 62 65 20 61 20 76 61 6c 69 64 20 53 51 4c  o be a valid SQL
8db0: 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
8dc0: 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 20  e page-size,.   
8dd0: 20 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73     # the databas
8de0: 65 20 77 69 6c 6c 20 62 65 20 63 6f 72 72 75 70  e will be corrup
8df0: 74 20 28 62 65 63 61 75 73 65 20 74 68 65 20 67  t (because the g
8e00: 61 72 62 61 67 65 20 66 72 61 6d 65 20 63 6f 6e  arbage frame con
8e10: 74 65 6e 74 73 0a 20 20 20 20 20 20 23 20 77 69  tents.      # wi
8e20: 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ll be treated as
8e30: 20 76 61 6c 69 64 20 63 6f 6e 74 65 6e 74 29 2e   valid content).
8e40: 20 49 66 20 24 70 67 73 7a 20 69 73 20 69 6e 76   If $pgsz is inv
8e50: 61 6c 69 64 20 28 74 6f 6f 20 73 6d 61 6c 6c 0a  alid (too small.
8e60: 20 20 20 20 20 20 23 20 6f 72 20 74 6f 6f 20 6c        # or too l
8e70: 61 72 67 65 29 2c 20 74 68 65 20 64 62 20 77 69  arge), the db wi
8e80: 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
8e90: 74 20 61 73 20 74 68 65 20 6c 6f 67 20 66 69 6c  t as the log fil
8ea0: 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 23 20 62  e will.      # b
8eb0: 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
8ec0: 20 23 0a 20 20 20 20 20 20 73 65 74 20 77 61 6c   #.      set wal
8ed0: 68 64 72 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  hdr [binary form
8ee0: 61 74 20 49 49 49 49 49 49 20 39 33 31 30 37 31  at IIIIII 931071
8ef0: 36 31 38 20 33 30 30 37 30 30 30 20 24 70 67 73  618 3007000 $pgs
8f00: 7a 20 31 32 33 34 20 32 32 20 32 33 5d 0a 20 20  z 1234 22 23].  
8f10: 20 20 20 20 73 65 74 20 66 72 61 6d 65 62 6f 64      set framebod
8f20: 79 20 5b 72 61 6e 64 6f 6d 62 6c 6f 62 20 24 70  y [randomblob $p
8f30: 67 73 7a 5d 0a 20 20 20 20 20 20 73 65 74 20 66  gsz].      set f
8f40: 72 61 6d 65 68 64 72 20 20 5b 62 69 6e 61 72 79  ramehdr  [binary
8f50: 20 66 6f 72 6d 61 74 20 49 49 49 49 20 24 70 67   format IIII $pg
8f60: 20 35 20 32 32 20 32 33 5d 0a 20 20 20 20 20 20   5 22 23].      
8f70: 73 65 74 20 63 31 20 30 0a 20 20 20 20 20 20 73  set c1 0.      s
8f80: 65 74 20 63 32 20 30 0a 20 20 20 20 20 20 6c 6f  et c2 0.      lo
8f90: 67 63 6b 73 75 6d 20 63 31 20 63 32 20 24 77 61  gcksum c1 c2 $wa
8fa0: 6c 68 64 72 0a 0a 20 20 20 20 20 20 61 70 70 65  lhdr..      appe
8fb0: 6e 64 20 77 61 6c 68 64 72 20 5b 62 69 6e 61 72  nd walhdr [binar
8fc0: 79 20 66 6f 72 6d 61 74 20 49 49 20 24 63 31 20  y format II $c1 
8fd0: 24 63 32 5d 0a 20 20 20 20 20 20 6c 6f 67 63 6b  $c2].      logck
8fe0: 73 75 6d 20 63 31 20 63 32 20 5b 73 74 72 69 6e  sum c1 c2 [strin
8ff0: 67 20 72 61 6e 67 65 20 24 66 72 61 6d 65 68 64  g range $framehd
9000: 72 20 30 20 37 5d 0a 20 20 20 20 20 20 6c 6f 67  r 0 7].      log
9010: 63 6b 73 75 6d 20 63 31 20 63 32 20 24 66 72 61  cksum c1 c2 $fra
9020: 6d 65 62 6f 64 79 0a 20 20 20 20 20 20 73 65 74  mebody.      set
9030: 20 66 72 61 6d 65 68 64 72 20 5b 62 69 6e 61 72   framehdr [binar
9040: 79 20 66 6f 72 6d 61 74 20 49 49 49 49 49 49 20  y format IIIIII 
9050: 24 70 67 20 35 20 32 32 20 32 33 20 24 63 31 20  $pg 5 22 23 $c1 
9060: 24 63 32 5d 0a 0a 20 20 20 20 20 20 73 65 74 20  $c2]..      set 
9070: 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62  fd [open test.db
9080: 2d 77 61 6c 20 77 5d 0a 20 20 20 20 20 20 66 63  -wal w].      fc
9090: 6f 6e 66 69 67 75 72 65 20 24 66 64 20 2d 65 6e  onfigure $fd -en
90a0: 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 20 2d 74  coding binary -t
90b0: 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72  ranslation binar
90c0: 79 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f  y.      puts -no
90d0: 6e 65 77 6c 69 6e 65 20 24 66 64 20 24 77 61 6c  newline $fd $wal
90e0: 68 64 72 0a 20 20 20 20 20 20 70 75 74 73 20 2d  hdr.      puts -
90f0: 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24 66  nonewline $fd $f
9100: 72 61 6d 65 68 64 72 0a 20 20 20 20 20 20 70 75  ramehdr.      pu
9110: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
9120: 64 20 24 66 72 61 6d 65 62 6f 64 79 0a 20 20 20  d $framebody.   
9130: 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 0a     close $fd.  .
9140: 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20        file size 
9150: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20  test.db-wal.    
9160: 7d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  } [wal_file_size
9170: 20 31 20 24 70 67 73 7a 5d 0a 20 20 0a 20 20 20   1 $pgsz].  .   
9180: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e   do_test wal-18.
9190: 32 2e 24 74 6e 2e 24 70 67 2e 35 20 7b 0a 20 20  2.$tn.$pg.5 {.  
91a0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
91b0: 65 73 74 2e 64 62 0a 20 20 20 20 20 20 73 65 74  est.db.      set
91c0: 20 72 63 20 5b 63 61 74 63 68 20 7b 20 64 62 20   rc [catch { db 
91d0: 6f 6e 65 20 7b 50 52 41 47 4d 41 20 69 6e 74 65  one {PRAGMA inte
91e0: 67 72 69 74 79 5f 63 68 65 63 6b 7d 20 7d 20 6d  grity_check} } m
91f0: 73 67 5d 0a 20 20 20 20 20 20 65 78 70 72 20 7b  sg].      expr {
9200: 20 24 72 63 21 3d 30 20 7c 7c 20 24 6d 73 67 21   $rc!=0 || $msg!
9210: 3d 22 6f 6b 22 20 7d 0a 20 20 20 20 7d 20 24 77  ="ok" }.    } $w
9220: 6f 72 6b 73 0a 20 20 0a 20 20 20 20 64 62 20 63  orks.  .    db c
9230: 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  lose.  }.}..#---
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9280: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
9290: 6c 6f 77 69 6e 67 20 74 65 73 74 20 2d 20 77 61  lowing test - wa
92a0: 6c 2d 31 39 2e 2a 20 2d 20 66 69 78 65 73 20 61  l-19.* - fixes a
92b0: 20 62 75 67 20 74 68 61 74 20 77 61 73 20 70 72   bug that was pr
92c0: 65 73 65 6e 74 20 64 75 72 69 6e 67 0a 23 20 64  esent during.# d
92d0: 65 76 65 6c 6f 70 6d 65 6e 74 2e 0a 23 0a 23 20  evelopment..#.# 
92e0: 57 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  When a database 
92f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 57 41  connection in WA
9300: 4c 20 6d 6f 64 65 20 69 73 20 63 6c 6f 73 65 64  L mode is closed
9310: 2c 20 69 74 20 61 74 74 65 6d 70 74 73 20 61 6e  , it attempts an
9320: 0a 23 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  .# EXCLUSIVE loc
9330: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9340: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 6c  e file. If the l
9350: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 2c  ock is obtained,
9360: 20 74 68 65 0a 23 20 63 6f 6e 6e 65 63 74 69 6f   the.# connectio
9370: 6e 20 6b 6e 6f 77 73 20 74 68 61 74 20 69 74 20  n knows that it 
9380: 69 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  is the last conn
9390: 65 63 74 69 6f 6e 20 74 6f 20 64 69 73 63 6f 6e  ection to discon
93a0: 6e 65 63 74 20 66 72 6f 6d 0a 23 20 74 68 65 20  nect from.# the 
93b0: 64 61 74 61 62 61 73 65 2c 20 73 6f 20 69 74 20  database, so it 
93c0: 72 75 6e 73 20 61 20 63 68 65 63 6b 70 6f 69 6e  runs a checkpoin
93d0: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  t operation. The
93e0: 20 62 75 67 20 77 61 73 20 74 68 61 74 0a 23 20   bug was that.# 
93f0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
9400: 61 73 20 6e 6f 74 20 75 70 64 61 74 69 6e 67 20  as not updating 
9410: 69 74 73 20 70 72 69 76 61 74 65 20 63 6f 70 79  its private copy
9420: 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   of the wal-inde
9430: 78 20 0a 23 20 68 65 61 64 65 72 20 62 65 66 6f  x .# header befo
9440: 72 65 20 64 6f 69 6e 67 20 73 6f 2c 20 6d 65 61  re doing so, mea
9450: 6e 69 6e 67 20 74 68 61 74 20 69 74 20 63 6f 75  ning that it cou
9460: 6c 64 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  ld checkpoint an
9470: 20 6f 6c 64 0a 23 20 73 6e 61 70 73 68 6f 74 2e   old.# snapshot.
9480: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .#.do_test wal-1
9490: 39 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c  9.1 {.  forcedel
94a0: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
94b0: 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d  .db-wal test.db-
94c0: 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65  journal.  sqlite
94d0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 73  3 db test.db.  s
94e0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
94f0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
9500: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
9510: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
9520: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9530: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
9540: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
9550: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e  ES(1, 2);.    IN
9560: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
9570: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20  UES(3, 4);.  }. 
9580: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9590: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  T * FROM t1 } db
95a0: 32 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  2.} {1 2 3 4}.do
95b0: 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e 32 20 7b  _test wal-19.2 {
95c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
95d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
95e0: 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20  VALUES(5, 6);.  
95f0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
9600: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33  t1;.  }.} {1 2 3
9610: 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65 73 74 20   4 5 6}.do_test 
9620: 77 61 6c 2d 31 39 2e 33 20 7b 0a 20 20 64 62 20  wal-19.3 {.  db 
9630: 63 6c 6f 73 65 0a 20 20 64 62 32 20 63 6c 6f 73  close.  db2 clos
9640: 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  e.  file exists 
9650: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 7b 30  test.db-wal.} {0
9660: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39  }.do_test wal-19
9670: 2e 34 20 7b 0a 20 20 23 20 57 68 65 6e 20 74 68  .4 {.  # When th
9680: 65 20 62 75 67 20 77 61 73 20 70 72 65 73 65 6e  e bug was presen
9690: 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t, the following
96a0: 20 77 61 73 20 72 65 74 75 72 6e 69 6e 67 20 7b   was returning {
96b0: 31 20 32 20 33 20 34 7d 20 6f 6e 6c 79 2c 0a 20  1 2 3 4} only,. 
96c0: 20 23 20 61 73 20 5b 64 62 32 5d 20 68 61 64 20   # as [db2] had 
96d0: 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 63  an out-of-date c
96e0: 6f 70 79 20 6f 66 20 74 68 65 20 77 61 6c 2d 69  opy of the wal-i
96f0: 6e 64 65 78 20 68 65 61 64 65 72 20 77 68 65 6e  ndex header when
9700: 20 69 74 20 77 61 73 0a 20 20 23 20 63 6c 6f 73   it was.  # clos
9710: 65 64 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74 65  ed..  #.  sqlite
9720: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
9730: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
9740: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
9750: 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 23 2d 2d   2 3 4 5 6}..#--
9760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 74  -------.# This t
97b0: 65 73 74 20 2d 20 77 61 6c 2d 32 30 2e 2a 20 2d  est - wal-20.* -
97c0: 20 75 73 65 73 20 74 77 6f 20 63 6f 6e 6e 65 63   uses two connec
97d0: 74 69 6f 6e 73 2e 20 4f 6e 65 20 69 6e 20 74 68  tions. One in th
97e0: 69 73 20 70 72 6f 63 65 73 73 20 61 6e 64 0a 23  is process and.#
97f0: 20 74 68 65 20 6f 74 68 65 72 20 69 6e 20 61 6e   the other in an
9800: 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
9810: 73 2e 20 54 68 65 20 70 72 6f 63 65 64 75 72 65  s. The procedure
9820: 20 69 73 3a 0a 23 0a 23 20 20 20 31 2e 20 55 73   is:.#.#   1. Us
9830: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31  ing connection 1
9840: 2c 20 63 72 65 61 74 65 20 74 68 65 20 64 61 74  , create the dat
9850: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 23 0a  abase schema..#.
9860: 23 20 20 20 32 2e 20 55 73 69 6e 67 20 63 6f 6e  #   2. Using con
9870: 6e 65 63 74 69 6f 6e 20 32 20 28 69 6e 20 61 6e  nection 2 (in an
9880: 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
9890: 73 29 2c 20 61 64 64 20 73 6f 20 6d 75 63 68 0a  s), add so much.
98a0: 23 20 20 20 20 20 20 64 61 74 61 20 74 6f 20 74  #      data to t
98b0: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74 68  he database with
98c0: 6f 75 74 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e  out checkpointin
98d0: 67 20 74 68 61 74 20 61 20 77 61 6c 2d 69 6e 64  g that a wal-ind
98e0: 65 78 20 0a 23 20 20 20 20 20 20 6c 61 72 67 65  ex .#      large
98f0: 72 20 74 68 61 6e 20 36 34 4b 42 20 69 73 20 72  r than 64KB is r
9900: 65 71 75 69 72 65 64 2e 0a 23 0a 23 20 20 20 33  equired..#.#   3
9910: 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69  . Using connecti
9920: 6f 6e 20 31 2c 20 63 68 65 63 6b 70 6f 69 6e 74  on 1, checkpoint
9930: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 4d   the database. M
9940: 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a 23 20 20  ake sure all.#  
9950: 20 20 20 20 74 68 65 20 64 61 74 61 20 69 73 20      the data is 
9960: 70 72 65 73 65 6e 74 20 61 6e 64 20 74 68 65 20  present and the 
9970: 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
9980: 63 6f 72 72 75 70 74 2e 0a 23 0a 23 20 41 74 20  corrupt..#.# At 
9990: 6f 6e 65 20 70 6f 69 6e 74 2c 20 53 51 4c 69 74  one point, SQLit
99a0: 65 20 77 61 73 20 66 61 69 6c 69 6e 67 20 74 6f  e was failing to
99b0: 20 67 72 6f 77 20 74 68 65 20 6d 61 70 70 69 6e   grow the mappin
99c0: 67 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  g of the wal-ind
99d0: 65 78 0a 23 20 66 69 6c 65 20 69 6e 20 73 74 65  ex.# file in ste
99e0: 70 20 33 20 61 6e 64 20 74 68 65 20 63 68 65 63  p 3 and the chec
99f0: 6b 70 6f 69 6e 74 20 77 61 73 20 63 6f 72 72 75  kpoint was corru
9a00: 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pting the databa
9a10: 73 65 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74 65  se file..#.do_te
9a20: 73 74 20 77 61 6c 2d 32 30 2e 31 20 7b 0a 20 20  st wal-20.1 {.  
9a30: 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
9a40: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
9a50: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
9a60: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
9a70: 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  al.  sqlite3 db 
9a80: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
9a90: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
9aa0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
9ab0: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
9ac0: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49  BLE t1(x);.    I
9ad0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
9ae0: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
9af0: 39 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43  900));.    SELEC
9b00: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9b10: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20 31  t1;.  }.} {wal 1
9b20: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30  }.do_test wal-20
9b30: 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 62 75 64  .2 {.  set ::bud
9b40: 64 79 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74 66  dy [launch_testf
9b50: 69 78 74 75 72 65 5d 0a 20 20 74 65 73 74 66 69  ixture].  testfi
9b60: 78 74 75 72 65 20 24 3a 3a 62 75 64 64 79 20 7b  xture $::buddy {
9b70: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
9b80: 74 65 73 74 2e 64 62 0a 20 20 20 20 64 62 20 74  test.db.    db t
9b90: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 20 64 62 20  ransaction { db 
9ba0: 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 50 52 41  eval {.      PRA
9bb0: 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63  GMA wal_autochec
9bc0: 6b 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20  kpoint = 0;.    
9bd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9be0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9bf0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9c00: 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20         /* 2 */. 
9c10: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9c20: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9c30: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
9c40: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 34 20 2a  t1;       /* 4 *
9c50: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9c60: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9c70: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9c80: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9c90: 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  8 */.      INSER
9ca0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9cb0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9cc0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9cd0: 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49  /* 16 */.      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 33 32 20 2a 2f 0a 20 20 20      /* 32 */.   
9d20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9d30: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
9d40: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
9d50: 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f  ;       /* 64 */
9d60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9d70: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
9d80: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
9d90: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31  M t1;       /* 1
9da0: 32 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  28 */.      INSE
9db0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
9dc0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
9dd0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
9de0: 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 20 20 20   /* 256 */.     
9df0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9e00: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9e10: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9e20: 20 20 20 20 20 20 2f 2a 20 35 31 32 20 2a 2f 0a        /* 512 */.
9e30: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9e40: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9e50: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9e60: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 30   t1;       /* 10
9e70: 32 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  24 */.      INSE
9e80: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
9e90: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
9ea0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
9eb0: 20 2f 2a 20 32 30 34 38 20 2a 2f 0a 20 20 20 20   /* 2048 */.    
9ec0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9ed0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9ee0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9ef0: 20 20 20 20 20 20 20 2f 2a 20 34 30 39 36 20 2a         /* 4096 *
9f00: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9f10: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9f20: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9f30: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9f40: 38 31 39 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  8192 */.      IN
9f50: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
9f60: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
9f70: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
9f80: 20 20 20 2f 2a 20 31 36 33 38 34 20 2a 2f 0a 20     /* 16384 */. 
9f90: 20 20 20 7d 20 7d 0a 20 20 7d 0a 7d 20 7b 30 7d     } }.  }.} {0}
9fa0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e  .do_test wal-20.
9fb0: 33 20 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 62  3 {.  close $::b
9fc0: 75 64 64 79 0a 20 20 65 78 65 63 73 71 6c 20 7b  uddy.  execsql {
9fd0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
9fe0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 65 78 65 63 73  kpoint }.  execs
9ff0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
a000: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  t(*) FROM t1 }.}
a010: 20 7b 31 36 33 38 34 7d 0a 64 6f 5f 74 65 73 74   {16384}.do_test
a020: 20 77 61 6c 2d 32 30 2e 34 20 7b 0a 20 20 64 62   wal-20.4 {.  db
a030: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
a040: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
a050: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
a060: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
a070: 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 69 6e 74 65  }.} {16384}.inte
a080: 67 72 69 74 79 5f 63 68 65 63 6b 20 77 61 6c 2d  grity_check wal-
a090: 32 30 2e 35 0a 0a 63 61 74 63 68 20 7b 20 64 62  20.5..catch { db
a0a0: 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20  2 close }.catch 
a0b0: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 0a 64 6f  { db close }..do
a0c0: 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 31 20 7b  _test wal-21.1 {
a0d0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65  .  faultsim_dele
a0e0: 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  te_and_reopen.  
a0f0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
a100: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
a110: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52  de = WAL;.    CR
a120: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
a130: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
a140: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
a150: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
a160: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
a170: 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45 52  3, 4);.    INSER
a180: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a190: 28 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53 45  (5, 6);.    INSE
a1a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
a1b0: 53 28 37 2c 20 38 29 3b 0a 20 20 20 20 49 4e 53  S(7, 8);.    INS
a1c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
a1d0: 45 53 28 39 2c 20 31 30 29 3b 0a 20 20 20 20 49  ES(9, 10);.    I
a1e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
a1f0: 4c 55 45 53 28 31 31 2c 20 31 32 29 3b 0a 20 20  LUES(11, 12);.  
a200: 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f 74 65 73  }.} {wal}.do_tes
a210: 74 20 77 61 6c 2d 32 31 2e 32 20 7b 0a 20 20 65  t wal-21.2 {.  e
a220: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52  xecsql { .    PR
a230: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
a240: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
a250: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
a260: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
a270: 20 20 53 41 56 45 50 4f 49 4e 54 20 73 3b 0a 20    SAVEPOINT s;. 
a280: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
a290: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
a2a0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 72 61  domblob(900), ra
a2b0: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
a2c0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 4f 4c  OM t1;.      ROL
a2d0: 4c 42 41 43 4b 20 54 4f 20 73 3b 0a 20 20 20 20  LBACK TO s;.    
a2e0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78  COMMIT;.  }.  ex
a2f0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
a300: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
a310: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
a320: 31 30 20 31 31 20 31 32 7d 0a 64 6f 5f 74 65 73  10 11 12}.do_tes
a330: 74 20 77 61 6c 2d 32 31 2e 33 20 7b 0a 20 20 65  t wal-21.3 {.  e
a340: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
a350: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
a360: 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 23 2d 2d 2d 2d 2d  }.} {ok}..#-----
a370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a3b0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 72 65 61 64  ----.# Test read
a3c0: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 20  ing and writing 
a3d0: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
a3e0: 68 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  h different page
a3f0: 2d 73 69 7a 65 73 2e 0a 23 0a 66 6f 72 65 61 63  -sizes..#.foreac
a400: 68 20 70 67 73 7a 20 7b 35 31 32 20 31 30 32 34  h pgsz {512 1024
a410: 20 32 30 34 38 20 34 30 39 36 20 38 31 39 32 20   2048 4096 8192 
a420: 31 36 33 38 34 20 33 32 37 36 38 20 36 35 35 33  16384 32768 6553
a430: 36 7d 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69 63  6} {.  do_multic
a440: 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 5b 73  lient_test tn [s
a450: 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74 20  tring map [list 
a460: 25 50 47 53 5a 25 20 24 70 67 73 7a 5d 20 7b 0a  %PGSZ% $pgsz] {.
a470: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
a480: 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 31 20  22.%PGSZ%.$tn.1 
a490: 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 0a 20  {.      sql1 {. 
a4a0: 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61         PRAGMA ma
a4b0: 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20 25  in.page_size = %
a4c0: 50 47 53 5a 25 3b 0a 20 20 20 20 20 20 20 20 50  PGSZ%;.        P
a4d0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
a4e0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 50  m = 0;.        P
a4f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
a500: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
a510: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a520: 31 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  1(x UNIQUE);.   
a530: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a540: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
a550: 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20  mblob(800);.    
a560: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a570: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
a580: 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20 20  blob(800);.     
a590: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a5a0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
a5b0: 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20 20 20  lob(800);.      
a5c0: 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a 20 20  }.    } {wal}.  
a5d0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 32    do_test wal-22
a5e0: 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 32 20 7b 20  .%PGSZ%.$tn.2 { 
a5f0: 73 71 6c 32 20 7b 20 50 52 41 47 4d 41 20 69 6e  sql2 { PRAGMA in
a600: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
a610: 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64 6f 5f 74 65  } {ok}.    do_te
a620: 73 74 20 77 61 6c 2d 32 32 2e 25 50 47 53 5a 25  st wal-22.%PGSZ%
a630: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20 20 73  .$tn.3 {.      s
a640: 71 6c 31 20 7b 50 52 41 47 4d 41 20 77 61 6c 5f  ql1 {PRAGMA wal_
a650: 63 68 65 63 6b 70 6f 69 6e 74 7d 0a 20 20 20 20  checkpoint}.    
a660: 20 20 65 78 70 72 20 7b 5b 66 69 6c 65 20 73 69    expr {[file si
a670: 7a 65 20 74 65 73 74 2e 64 62 5d 20 25 20 25 50  ze test.db] % %P
a680: 47 53 5a 25 7d 0a 20 20 20 20 7d 20 7b 30 7d 0a  GSZ%}.    } {0}.
a690: 20 20 7d 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d    }].}..#-------
a6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6e0: 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20 77  --.# Test that w
a6f0: 68 65 6e 20 31 20 6f 72 20 6d 6f 72 65 20 70 61  hen 1 or more pa
a700: 67 65 73 20 61 72 65 20 72 65 63 6f 76 65 72 65  ges are recovere
a710: 64 20 66 72 6f 6d 20 61 20 57 41 4c 20 66 69 6c  d from a WAL fil
a720: 65 2c 20 0a 23 20 73 71 6c 69 74 65 33 5f 6c 6f  e, .# sqlite3_lo
a730: 67 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  g() is invoked t
a740: 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 74 6f  o report this to
a750: 20 74 68 65 20 75 73 65 72 2e 0a 23 0a 69 66 63   the user..#.ifc
a760: 61 70 61 62 6c 65 20 63 75 72 64 69 72 20 7b 0a  apable curdir {.
a770: 20 20 73 65 74 20 77 61 6c 66 69 6c 65 20 5b 66    set walfile [f
a780: 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b  ile nativename [
a790: 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 5f 70  file join [get_p
a7a0: 77 64 5d 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  wd] test.db-wal]
a7b0: 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20 73 65 74  ].} else {.  set
a7c0: 20 77 61 6c 66 69 6c 65 20 74 65 73 74 2e 64 62   walfile test.db
a7d0: 2d 77 61 6c 0a 7d 0a 63 61 74 63 68 20 7b 64 62  -wal.}.catch {db
a7e0: 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65 64 65 6c   close}.forcedel
a7f0: 65 74 65 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74  ete test.db.do_t
a800: 65 73 74 20 77 61 6c 2d 32 33 2e 31 20 7b 0a 20  est wal-23.1 {. 
a810: 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65   faultsim_delete
a820: 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78  _and_reopen.  ex
a830: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
a840: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
a850: 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  );.    PRAGMA jo
a860: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
a870: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a880: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
a890: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a8a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
a8b0: 34 29 3b 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73  4);.  }.  faults
a8c0: 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73  im_save_and_clos
a8d0: 65 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 68 75  e..  sqlite3_shu
a8e0: 74 64 6f 77 6e 0a 20 20 74 65 73 74 5f 73 71 6c  tdown.  test_sql
a8f0: 69 74 65 33 5f 6c 6f 67 20 5b 6c 69 73 74 20 6c  ite3_log [list l
a900: 61 70 70 65 6e 64 20 3a 3a 6c 6f 67 5d 0a 20 20  append ::log].  
a910: 73 65 74 20 3a 3a 6c 6f 67 20 5b 6c 69 73 74 5d  set ::log [list]
a920: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
a930: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
a940: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
a950: 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d  t1 }.} {1 2 3 4}
a960: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e  .do_test wal-23.
a970: 32 20 7b 20 73 65 74 20 3a 3a 6c 6f 67 20 7d 20  2 { set ::log } 
a980: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  {}..do_test wal-
a990: 32 33 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73  23.3 {.  db clos
a9a0: 65 0a 20 20 73 65 74 20 3a 3a 6c 6f 67 20 5b 6c  e.  set ::log [l
a9b0: 69 73 74 5d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  ist].  faultsim_
a9c0: 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70  restore_and_reop
a9d0: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  en.  execsql { S
a9e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
a9f0: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  }.} {1 2 3 4}.do
aa00: 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e 34 20 7b  _test wal-23.4 {
aa10: 20 0a 20 20 73 65 74 20 3a 3a 6c 6f 67 20 0a 7d   .  set ::log .}
aa20: 20 5b 6c 69 73 74 20 53 51 4c 49 54 45 5f 4e 4f   [list SQLITE_NO
aa30: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
aa40: 20 5c 0a 20 20 20 20 22 72 65 63 6f 76 65 72 65   \.    "recovere
aa50: 64 20 32 20 66 72 61 6d 65 73 20 66 72 6f 6d 20  d 2 frames from 
aa60: 57 41 4c 20 66 69 6c 65 20 24 77 61 6c 66 69 6c  WAL file $walfil
aa70: 65 22 5d 0a 0a 0a 69 66 63 61 70 61 62 6c 65 20  e"]...ifcapable 
aa80: 61 75 74 6f 76 61 63 75 75 6d 20 7b 0a 20 20 23  autovacuum {.  #
aa90: 20 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74   This block test
aaa0: 73 20 74 68 61 74 20 69 66 20 74 68 65 20 73 69  s that if the si
aab0: 7a 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  ze of a database
aac0: 20 69 73 20 72 65 64 75 63 65 64 20 62 79 20 61   is reduced by a
aad0: 20 0a 20 20 23 20 74 72 61 6e 73 61 63 74 69 6f   .  # transactio
aae0: 6e 20 28 62 65 63 61 75 73 65 20 6f 66 20 61 6e  n (because of an
aaf0: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6f 72 20   incremental or 
ab00: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 74 68  auto-vacuum), th
ab10: 61 74 20 6e 6f 0a 20 20 23 20 64 61 74 61 20 69  at no.  # data i
ab20: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
ab30: 20 57 41 4c 20 66 69 6c 65 20 66 6f 72 20 74 68   WAL file for th
ab40: 65 20 74 72 75 6e 63 61 74 65 64 20 70 61 67 65  e truncated page
ab50: 73 20 61 73 20 70 61 72 74 0a 20 20 23 20 6f 66  s as part.  # of
ab60: 20 74 68 65 20 63 6f 6d 6d 69 74 2e 20 65 2e 67   the commit. e.g
ab70: 2e 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  . if a transacti
ab80: 6f 6e 20 72 65 64 75 63 65 73 20 74 68 65 20 73  on reduces the s
ab90: 69 7a 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ize of a databas
aba0: 65 0a 20 20 23 20 74 6f 20 4e 20 70 61 67 65 73  e.  # to N pages
abb0: 2c 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  , data for page 
abc0: 4e 2b 31 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  N+1 should not b
abd0: 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
abe0: 20 57 41 4c 20 66 69 6c 65 20 0a 20 20 23 20 77   WAL file .  # w
abf0: 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74  hen committing t
ac00: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
ac10: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20 73 75 63  At one point suc
ac20: 68 20 64 61 74 61 20 77 61 73 20 62 65 69 6e 67  h data was being
ac30: 20 0a 20 20 23 20 77 72 69 74 74 65 6e 2e 0a 20   .  # written.. 
ac40: 20 23 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63   #.  catch {db c
ac50: 6c 6f 73 65 7d 0a 20 20 66 6f 72 63 65 64 65 6c  lose}.  forcedel
ac60: 65 74 65 20 74 65 73 74 2e 64 62 0a 20 20 73 71  ete test.db.  sq
ac70: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
ac80: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
ac90: 73 74 20 32 34 2e 31 20 7b 0a 20 20 20 20 50 52  st 24.1 {.    PR
aca0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
acb0: 20 3d 20 32 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 2;.    PRAGMA
acc0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
acd0: 57 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  WAL;.    PRAGMA 
ace0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
acf0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
ad00: 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e  LE t1(x);.    IN
ad10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
ad20: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 35  UES(randomblob(5
ad30: 30 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  000));.    INSER
ad40: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
ad50: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
ad60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
ad70: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
ad80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ad90: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
ada0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
adb0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
adc0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b  * FROM t1;.  } {
add0: 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73 74 20 32  wal}.  do_test 2
ade0: 34 2e 32 20 7b 20 0a 20 20 20 20 65 78 65 63 73  4.2 { .    execs
adf0: 71 6c 20 7b 0a 20 20 20 20 20 20 44 45 4c 45 54  ql {.      DELET
ae00: 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  E FROM t1;.     
ae10: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
ae20: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  kpoint;.    }.  
ae30: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73    db close.    s
ae40: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
ae50: 62 0a 20 20 20 20 66 69 6c 65 20 65 78 69 73 74  b.    file exist
ae60: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20  s test.db-wal.  
ae70: 7d 20 30 0a 20 20 64 6f 5f 74 65 73 74 20 32 34  } 0.  do_test 24
ae80: 2e 33 20 7b 0a 20 20 20 20 66 69 6c 65 20 73 69  .3 {.    file si
ae90: 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 5b  ze test.db.  } [
aea0: 65 78 70 72 20 38 34 20 2a 20 31 30 32 34 5d 0a  expr 84 * 1024].
aeb0: 20 20 64 6f 5f 74 65 73 74 20 32 34 2e 34 20 7b    do_test 24.4 {
aec0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
aed0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63        PRAGMA cac
aee0: 68 65 5f 73 69 7a 65 20 3d 20 32 30 30 3b 0a 20  he_size = 200;. 
aef0: 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72       PRAGMA incr
af00: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a  emental_vacuum;.
af10: 20 20 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c        PRAGMA wal
af20: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20  _checkpoint;.   
af30: 20 7d 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65   }.    file size
af40: 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 5b 65 78   test.db.  } [ex
af50: 70 72 20 33 20 2a 20 31 30 32 34 5d 0a 0a 20 20  pr 3 * 1024]..  
af60: 23 20 57 41 4c 20 66 69 6c 65 20 6e 6f 77 20 63  # WAL file now c
af70: 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
af80: 20 66 72 61 6d 65 20 2d 20 74 68 65 20 6e 65 77   frame - the new
af90: 20 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 74   root page for t
afa0: 61 62 6c 65 20 74 31 2e 0a 20 20 23 20 49 74 20  able t1..  # It 
afb0: 77 6f 75 6c 64 20 62 65 20 74 77 6f 20 66 72 61  would be two fra
afc0: 6d 65 73 20 28 74 68 65 20 6e 65 77 20 72 6f 6f  mes (the new roo
afd0: 74 20 70 61 67 65 20 61 6e 64 20 61 20 70 61 64  t page and a pad
afe0: 64 69 6e 67 20 66 72 61 6d 65 29 20 69 66 20 74  ding frame) if t
aff0: 68 65 0a 20 20 23 20 5a 45 52 4f 5f 44 41 4d 41  he.  # ZERO_DAMA
b000: 47 45 20 66 6c 61 67 20 77 65 72 65 20 6e 6f 74  GE flag were not
b010: 20 73 65 74 2e 0a 20 20 64 6f 5f 74 65 73 74 20   set..  do_test 
b020: 32 34 2e 35 20 7b 0a 20 20 20 20 66 69 6c 65 20  24.5 {.    file 
b030: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
b040: 0a 20 20 7d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  .  } [wal_file_s
b050: 69 7a 65 20 31 20 31 30 32 34 5d 0a 7d 0a 0a 64  ize 1 1024].}..d
b060: 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 5f  b close.sqlite3_
b070: 73 68 75 74 64 6f 77 6e 0a 74 65 73 74 5f 73 71  shutdown.test_sq
b080: 6c 69 74 65 33 5f 6c 6f 67 0a 73 71 6c 69 74 65  lite3_log.sqlite
b090: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a 0a 23 20  3_initialize..# 
b0a0: 4d 61 6b 65 20 73 75 72 65 20 50 52 41 47 4d 41  Make sure PRAGMA
b0b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41   journal_mode=WA
b0c0: 4c 20 77 6f 72 6b 73 20 77 69 74 68 20 41 54 54  L works with ATT
b0d0: 41 43 48 45 44 20 64 61 74 61 62 61 73 65 73 20  ACHED databases 
b0e0: 69 6e 0a 23 20 61 6c 6c 20 6a 6f 75 72 6e 61 6c  in.# all journal
b0f0: 20 6d 6f 64 65 73 2e 0a 23 0a 66 6f 72 65 61 63   modes..#.foreac
b100: 68 20 6d 6f 64 65 20 7b 4f 46 46 20 4d 45 4d 4f  h mode {OFF MEMO
b110: 52 59 20 50 45 52 53 49 53 54 20 44 45 4c 45 54  RY PERSIST DELET
b120: 45 20 54 52 55 4e 43 41 54 45 20 57 41 4c 7d 20  E TRUNCATE WAL} 
b130: 7b 0a 20 20 64 65 6c 65 74 65 5f 66 69 6c 65 20  {.  delete_file 
b140: 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62  test.db test2.db
b150: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
b160: 73 74 2e 64 62 0a 20 20 64 6f 5f 74 65 73 74 20  st.db.  do_test 
b170: 77 61 6c 2d 32 35 2e 24 6d 6f 64 65 20 7b 0a 20  wal-25.$mode {. 
b180: 20 20 20 64 62 20 65 76 61 6c 20 22 50 52 41 47     db eval "PRAG
b190: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  MA journal_mode=
b1a0: 24 6d 6f 64 65 22 0a 20 20 20 20 64 62 20 65 76  $mode".    db ev
b1b0: 61 6c 20 7b 41 54 54 41 43 48 20 27 74 65 73 74  al {ATTACH 'test
b1c0: 32 2e 64 62 27 20 41 53 20 74 32 3b 20 50 52 41  2.db' AS t2; PRA
b1d0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
b1e0: 3d 57 41 4c 3b 7d 0a 20 20 7d 20 7b 77 61 6c 7d  =WAL;}.  } {wal}
b1f0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a 74  .  db close.}..t
b200: 65 73 74 5f 72 65 73 74 6f 72 65 5f 63 6f 6e 66  est_restore_conf
b210: 69 67 5f 70 61 67 65 63 61 63 68 65 0a 66 69 6e  ig_pagecache.fin
b220: 69 73 68 5f 74 65 73 74 0a                       ish_test.