/ Hex Artifact Content
Login

Artifact b934b757c4c3776b1e93140a9febc9ae068f9d90:


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 0a 70 72 6f 63 20 72 65 6f 70  urn }..proc reop
02f0: 65 6e 5f 64 62 20 7b 7d 20 7b 0a 20 20 63 61 74  en_db {} {.  cat
0300: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
0310: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
0320: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
0330: 6c 20 74 65 73 74 2e 64 62 2d 77 61 6c 2d 73 75  l test.db-wal-su
0340: 6d 6d 61 72 79 0a 20 20 73 71 6c 69 74 65 33 5f  mmary.  sqlite3_
0350: 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 7d  wal db test.db.}
0360: 0a 0a 73 65 74 20 3a 3a 62 6c 6f 62 63 6e 74 20  ..set ::blobcnt 
0370: 30 0a 70 72 6f 63 20 62 6c 6f 62 20 7b 6e 42 79  0.proc blob {nBy
0380: 74 65 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a 62  te} {.  incr ::b
0390: 6c 6f 62 63 6e 74 0a 20 20 72 65 74 75 72 6e 20  lobcnt.  return 
03a0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 73  [string range [s
03b0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 24 7b  tring repeat "${
03c0: 3a 3a 62 6c 6f 62 63 6e 74 7d 78 22 20 24 6e 42  ::blobcnt}x" $nB
03d0: 79 74 65 5d 20 31 20 24 6e 42 79 74 65 5d 0a 7d  yte] 1 $nByte].}
03e0: 0a 0a 70 72 6f 63 20 73 71 6c 69 74 65 33 5f 77  ..proc sqlite3_w
03f0: 61 6c 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76  al {args} {.  ev
0400: 61 6c 20 73 71 6c 69 74 65 33 20 24 61 72 67 73  al sqlite3 $args
0410: 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73  .  [lindex $args
0420: 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   0] eval { PRAGM
0430: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
0440: 30 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61  0 }.  [lindex $a
0450: 72 67 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52  rgs 0] eval { PR
0460: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
0470: 20 31 30 32 34 20 7d 0a 20 20 5b 6c 69 6e 64 65   1024 }.  [linde
0480: 78 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20  x $args 0] eval 
0490: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
04a0: 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20  _mode = wal }.  
04b0: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d  [lindex $args 0]
04c0: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 73   eval { PRAGMA s
04d0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72  ynchronous = nor
04e0: 6d 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20  mal }.  [lindex 
04f0: 24 61 72 67 73 20 30 5d 20 66 75 6e 63 74 69 6f  $args 0] functio
0500: 6e 20 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a 0a 70  n blob blob.}..p
0510: 72 6f 63 20 6c 6f 67 5f 64 65 6c 65 74 65 64 20  roc log_deleted 
0520: 7b 6c 6f 67 66 69 6c 65 7d 20 7b 0a 20 20 72 65  {logfile} {.  re
0530: 74 75 72 6e 20 5b 65 78 70 72 20 5b 66 69 6c 65  turn [expr [file
0540: 20 65 78 69 73 74 73 20 24 6c 6f 67 66 69 6c 65   exists $logfile
0550: 5d 3d 3d 30 5d 0a 7d 0a 0a 23 0a 23 20 54 68 65  ]==0].}..#.# The
0560: 73 65 20 61 72 65 20 27 77 61 72 6d 2d 62 6f 64  se are 'warm-bod
0570: 79 27 20 74 65 73 74 73 20 75 73 65 64 20 77 68  y' tests used wh
0580: 69 6c 65 20 64 65 76 65 6c 6f 70 69 6e 67 20 74  ile developing t
0590: 68 65 20 57 41 4c 20 63 6f 64 65 2e 20 54 68 65  he WAL code. The
05a0: 79 0a 23 20 73 65 72 76 65 20 74 6f 20 70 72 6f  y.# serve to pro
05b0: 76 65 20 74 68 61 74 20 61 20 66 65 77 20 72 65  ve that a few re
05c0: 61 6c 6c 79 20 73 69 6d 70 6c 65 20 63 61 73 65  ally simple case
05d0: 73 20 77 6f 72 6b 3a 0a 23 0a 23 20 77 61 6c 2d  s work:.#.# wal-
05e0: 31 2e 2a 3a 20 52 65 61 64 20 61 6e 64 20 77 72  1.*: Read and wr
05f0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
0600: 2e 0a 23 20 77 61 6c 2d 32 2e 2a 3a 20 54 65 73  ..# wal-2.*: Tes
0610: 74 20 4d 56 43 43 20 77 69 74 68 20 6f 6e 65 20  t MVCC with one 
0620: 72 65 61 64 65 72 2c 20 6f 6e 65 20 77 72 69 74  reader, one writ
0630: 65 72 2e 0a 23 20 77 61 6c 2d 33 2e 2a 3a 20 54  er..# wal-3.*: T
0640: 65 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  est transaction 
0650: 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d  rollback..# wal-
0660: 34 2e 2a 3a 20 54 65 73 74 20 73 61 76 65 70 6f  4.*: Test savepo
0670: 69 6e 74 2f 73 74 61 74 65 6d 65 6e 74 20 72 6f  int/statement ro
0680: 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 35 2e  llback..# wal-5.
0690: 2a 3a 20 54 65 73 74 20 74 68 65 20 74 65 6d 70  *: Test the temp
06a0: 20 64 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c   database..# wal
06b0: 2d 36 2e 2a 3a 20 54 65 73 74 20 63 72 65 61 74  -6.*: Test creat
06c0: 69 6e 67 20 64 61 74 61 62 61 73 65 73 20 77 69  ing databases wi
06d0: 74 68 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  th different pag
06e0: 65 20 73 69 7a 65 73 2e 0a 23 0a 23 0a 23 0a 64  e sizes..#.#.#.d
06f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e 31 20 7b  o_test wal-0.1 {
0700: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
0710: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
0720: 3d 20 30 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  = 0 }.  execsql 
0730: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
0740: 6e 6f 75 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a  nous = normal }.
0750: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
0760: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
0770: 3d 20 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c 7d 0a  = wal }.} {wal}.
0780: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e 32 20  do_test wal-0.2 
0790: 7b 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  {.  file size te
07a0: 73 74 2e 64 62 0a 7d 20 7b 31 30 32 34 7d 0a 0a  st.db.} {1024}..
07b0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 30 20  do_test wal-1.0 
07c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
07d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52     BEGIN;.    CR
07e0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
07f0: 20 62 29 3b 20 0a 20 20 7d 0a 20 20 6c 69 73 74   b); .  }.  list
0800: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
0810: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5c  st.db-journal] \
0820: 0a 20 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78  .       [file ex
0830: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
0840: 5d 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 5b  ]     \.       [
0850: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
0860: 62 5d 0a 7d 20 7b 30 20 31 20 31 30 32 34 7d 0a  b].} {0 1 1024}.
0870: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 31 20  do_test wal-1.1 
0880: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
0890: 49 54 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  IT.  list [file 
08a0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
08b0: 6f 75 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78  ournal] [file ex
08c0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
08d0: 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73  ].} {0 1}.do_tes
08e0: 74 20 77 61 6c 2d 31 2e 32 20 7b 0a 20 20 23 20  t wal-1.2 {.  # 
08f0: 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 74 77  There are now tw
0900: 6f 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  o pages in the l
0910: 6f 67 2e 0a 20 20 66 69 6c 65 20 73 69 7a 65 20  og..  file size 
0920: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 5b 77  test.db-wal.} [w
0930: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31  al_file_size 2 1
0940: 30 32 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  024]..do_test wa
0950: 6c 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  l-1.3 {.  execsq
0960: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0970: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
0980: 7d 0a 7d 20 7b 74 61 62 6c 65 20 74 31 20 74 31  }.} {table t1 t1
0990: 20 32 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45   2 {CREATE TABLE
09a0: 20 74 31 28 61 2c 20 62 29 7d 7d 0a 0a 64 6f 5f   t1(a, b)}}..do_
09b0: 74 65 73 74 20 77 61 6c 2d 31 2e 34 20 7b 0a 20  test wal-1.4 {. 
09c0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
09d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09e0: 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73  (1, 2) }.  execs
09f0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
0a00: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
0a10: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   }.  execsql { I
0a20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0a30: 4c 55 45 53 28 35 2c 20 36 29 20 7d 0a 20 20 65  LUES(5, 6) }.  e
0a40: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
0a50: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37  INTO t1 VALUES(7
0a60: 2c 20 38 29 20 7d 0a 20 20 65 78 65 63 73 71 6c  , 8) }.  execsql
0a70: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
0a80: 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20  1 VALUES(9, 10) 
0a90: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
0aa0: 77 61 6c 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63  wal-1.5 {.  exec
0ab0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0ac0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20  ROM t1 }.} {1 2 
0ad0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0ae0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0af0: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77  .1 {.  sqlite3_w
0b00: 61 6c 20 64 62 32 20 2e 2f 74 65 73 74 2e 64 62  al db2 ./test.db
0b10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47  .  execsql { BEG
0b20: 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN; SELECT * FRO
0b30: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
0b40: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
0b50: 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  10}..do_test wal
0b60: 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.2 {.  execsql
0b70: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
0b80: 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29  1 VALUES(11, 12)
0b90: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
0ba0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0bb0: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  }.} {1 2 3 4 5 6
0bc0: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d   7 8 9 10 11 12}
0bd0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0be0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
0bf0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0c00: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
0c10: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0c20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 34  .do_test wal-2.4
0c30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
0c40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0c50: 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20  LUES(13, 14) }. 
0c60: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
0c70: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
0c80: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0c90: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
0ca0: 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4}..do_test wal-
0cb0: 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.5 {.  execsql 
0cc0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0cd0: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20  t1 } db2.} {1 2 
0ce0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0cf0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0d00: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
0d10: 20 43 4f 4d 4d 49 54 3b 20 53 45 4c 45 43 54 20   COMMIT; SELECT 
0d20: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  * FROM t1 } db2.
0d30: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0d40: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
0d50: 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   14}..do_test wa
0d60: 6c 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  l-3.1 {.  execsq
0d70: 6c 20 7b 20 42 45 47 49 4e 3b 20 44 45 4c 45 54  l { BEGIN; DELET
0d80: 45 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78  E FROM t1 }.  ex
0d90: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
0da0: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a   FROM t1 }.} {}.
0db0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33 2e 32 20  do_test wal-3.2 
0dc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0dd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0de0: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20   db2.} {1 2 3 4 
0df0: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
0e00: 31 32 20 31 33 20 31 34 7d 0a 64 6f 5f 74 65 73  12 13 14}.do_tes
0e10: 74 20 77 61 6c 2d 33 2e 33 20 7b 0a 20 20 65 78  t wal-3.3 {.  ex
0e20: 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b  ecsql { ROLLBACK
0e30: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
0e40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0e50: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  }.} {1 2 3 4 5 6
0e60: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
0e70: 31 33 20 31 34 7d 0a 64 62 32 20 63 6c 6f 73 65  13 14}.db2 close
0e80: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 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 0a 23 20 54  ------------.# T
0ed0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
0ee0: 74 73 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74 65 73  ts, wal-4.*, tes
0ef0: 74 20 74 68 61 74 20 73 61 76 65 70 6f 69 6e 74  t that savepoint
0f00: 73 20 77 6f 72 6b 20 77 69 74 68 20 57 41 4c 20  s work with WAL 
0f10: 0a 23 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a  .# databases..#.
0f20: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 31 20  do_test wal-4.1 
0f30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0f40: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
0f50: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
0f60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0f70: 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
0f80: 27 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  ');.      SAVEPO
0f90: 49 4e 54 20 73 70 3b 0a 20 20 20 20 20 20 20 20  INT sp;.        
0fa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0fb0: 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
0fc0: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
0fd0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
0fe0: 20 7b 61 20 62 20 63 20 64 7d 0a 64 6f 5f 74 65   {a b c d}.do_te
0ff0: 73 74 20 77 61 6c 2d 34 2e 32 20 7b 0a 20 20 65  st wal-4.2 {.  e
1000: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 52  xecsql {.      R
1010: 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
1020: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1030: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20  OM t1;.  }.} {a 
1040: 62 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  b}.do_test wal-4
1050: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
1060: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
1070: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1080: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a 0a  1;.  }.} {a b}..
1090: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
10a0: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
10b0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
10c0: 2e 64 62 0a 20 20 64 62 20 66 75 6e 63 20 62 6c  .db.  db func bl
10d0: 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20 5b  ob blob.  list [
10e0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
10f0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b 66   * FROM t1 }] [f
1100: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
1110: 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20 30  -wal].} {{a b} 0
1120: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1130: 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.2 {.  execsql 
1140: 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73  { PRAGMA cache_s
1150: 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 65 78 65  ize = 10 }.  exe
1160: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1170: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
1180: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1190: 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62  O t2 VALUES(blob
11a0: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
11b0: 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54  );.    SAVEPOINT
11c0: 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   tr;.      INSER
11d0: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
11e0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
11f0: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f  (400) FROM t2; /
1200: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
1210: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
1220: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1230: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32  lob(400) FROM t2
1240: 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20  ; /*  4 */.     
1250: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1260: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1270: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1280: 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20   t2; /*  8 */.  
1290: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12a0: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
12b0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
12c0: 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f  ROM t2; /* 16 */
12d0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
12e0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
12f0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1300: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32  ) FROM t2; /* 32
1310: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
1320: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
1330: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1340: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a  400) FROM t1; /*
1350: 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    2 */.      INS
1360: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1370: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1380: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1390: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20   /*  4 */.      
13a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
13b0: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
13c0: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
13d0: 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20  t1; /*  8 */.   
13e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13f0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
1400: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1410: 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a  OM t1; /* 16 */.
1420: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1430: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
1440: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1450: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20   FROM t1; /* 32 
1460: 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  */.      SELECT 
1470: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
1480: 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f  ;.  }.} {32}.do_
1490: 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 33 20 7b  test wal-4.4.3 {
14a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c  .  execsql { ROL
14b0: 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20  LBACK TO tr }.} 
14c0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  {}.do_test wal-4
14d0: 2e 34 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67  .4.4 {.  set log
14e0: 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20  size [file size 
14f0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65  test.db-wal].  e
1500: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
1510: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1520: 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a  LUES('x', 'y');.
1530: 20 20 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a      RELEASE tr;.
1540: 20 20 7d 0a 20 20 65 78 70 72 20 7b 20 24 6c 6f    }.  expr { $lo
1550: 67 73 69 7a 65 20 3d 3d 20 5b 66 69 6c 65 20 73  gsize == [file s
1560: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
1570: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
1580: 20 77 61 6c 2d 34 2e 34 2e 35 20 7b 0a 20 20 65   wal-4.4.5 {.  e
1590: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
15a0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
15b0: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
15c0: 20 77 61 6c 2d 34 2e 34 2e 36 20 7b 0a 20 20 66   wal-4.4.6 {.  f
15d0: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62  orcecopy test.db
15e0: 20 74 65 73 74 32 2e 64 62 0a 20 20 66 6f 72 63   test2.db.  forc
15f0: 65 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61  ecopy test.db-wa
1600: 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  l test2.db-wal. 
1610: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
1620: 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  t2.db.  execsql 
1630: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
1640: 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c 45  ) FROM t2 ; SELE
1650: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1660: 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32   t1 } db2.} {1 2
1670: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1680: 34 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.7 {.  execsql 
1690: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
16a0: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d  ty_check } db2.}
16b0: 20 7b 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73 65 0a   {ok}.db2 close.
16c0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
16d0: 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64 62  .1 {.  reopen_db
16e0: 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62 20  .  db func blob 
16f0: 62 6c 6f 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  blob.  execsql {
1700: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
1710: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
1720: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1730: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
1740: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1750: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
1760: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
1770: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75   test.db.  db fu
1780: 6e 63 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c  nc blob blob.  l
1790: 69 73 74 20 5b 65 78 65 63 73 71 6c 20 7b 20 53  ist [execsql { S
17a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
17b0: 7d 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  }] [file size te
17c0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61  st.db-wal].} {{a
17d0: 20 62 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77   b} 0}.do_test w
17e0: 61 6c 2d 34 2e 35 2e 32 20 7b 0a 20 20 65 78 65  al-4.5.2 {.  exe
17f0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61  csql { PRAGMA ca
1800: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a  che_size = 10 }.
1810: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1820: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
1830: 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e  a, b);.    BEGIN
1840: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1850: 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62  O t2 VALUES(blob
1860: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1870: 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54  );.    SAVEPOINT
1880: 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   tr;.      INSER
1890: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
18a0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
18b0: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f  (400) FROM t2; /
18c0: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
18d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
18e0: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
18f0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32  lob(400) FROM t2
1900: 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20  ; /*  4 */.     
1910: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1920: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1930: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1940: 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20   t2; /*  8 */.  
1950: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1960: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
1970: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1980: 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f  ROM t2; /* 16 */
1990: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
19a0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
19b0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
19c0: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32  ) FROM t2; /* 32
19d0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
19e0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
19f0: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1a00: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a  400) FROM t1; /*
1a10: 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    2 */.      INS
1a20: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1a30: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1a40: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1a50: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20   /*  4 */.      
1a60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1a70: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1a80: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1a90: 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20  t1; /*  8 */.   
1aa0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1ab0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
1ac0: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1ad0: 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a  OM t1; /* 16 */.
1ae0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1af0: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
1b00: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1b10: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20   FROM t1; /* 32 
1b20: 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  */.      SELECT 
1b30: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
1b40: 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f  ;.  }.} {32}.do_
1b50: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 33 20 7b  test wal-4.5.3 {
1b60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c  .  execsql { ROL
1b70: 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20  LBACK TO tr }.} 
1b80: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  {}.do_test wal-4
1b90: 2e 35 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67  .5.4 {.  set log
1ba0: 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20  size [file size 
1bb0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65  test.db-wal].  e
1bc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
1bd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1be0: 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a  LUES('x', 'y');.
1bf0: 20 20 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a      RELEASE tr;.
1c00: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
1c10: 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73 69 7a    expr { $logsiz
1c20: 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a 65 20  e == [file size 
1c30: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d  test.db-wal] }.}
1c40: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   {1}.do_test wal
1c50: 2d 34 2e 35 2e 35 20 7b 0a 20 20 65 78 65 63 73  -4.5.5 {.  execs
1c60: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
1c70: 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53  t(*) FROM t2 ; S
1c80: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1c90: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 7d  ROM t1 }.} {1 2}
1ca0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
1cb0: 2e 36 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79  .6 {.  forcecopy
1cc0: 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64   test.db test2.d
1cd0: 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  b.  forcecopy te
1ce0: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e  st.db-wal test2.
1cf0: 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33  db-wal.  sqlite3
1d00: 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20   db2 test2.db.  
1d10: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
1d20: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1d30: 32 20 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  2 ; SELECT count
1d40: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  (*) FROM t1 } db
1d50: 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73  2.} {1 2}.do_tes
1d60: 74 20 77 61 6c 2d 34 2e 35 2e 37 20 7b 0a 20 20  t wal-4.5.7 {.  
1d70: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1d80: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
1d90: 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62   } db2.} {ok}.db
1da0: 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74  2 close..do_test
1db0: 20 77 61 6c 2d 34 2e 36 2e 31 20 7b 0a 20 20 65   wal-4.6.1 {.  e
1dc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
1dd0: 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  ETE FROM t2;.   
1de0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
1df0: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47 49  kpoint;.    BEGI
1e00: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
1e10: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
1e20: 77 27 2c 20 27 78 27 29 3b 0a 20 20 20 20 20 20  w', 'x');.      
1e30: 53 41 56 45 50 4f 49 4e 54 20 73 61 76 65 3b 0a  SAVEPOINT save;.
1e40: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
1e50: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 79  NTO t2 VALUES('y
1e60: 27 2c 20 27 7a 27 29 3b 0a 20 20 20 20 20 20 52  ', 'z');.      R
1e70: 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 61 76 65 3b  OLLBACK TO save;
1e80: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
1e90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
1ea0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a  ECT * FROM t2 }.
1eb0: 7d 20 7b 77 20 78 7d 0a 0a 0a 72 65 6f 70 65 6e  } {w x}...reopen
1ec0: 5f 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  _db.do_test wal-
1ed0: 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
1ee0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  {.    CREATE TEM
1ef0: 50 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  P TABLE t2(a, b)
1f00: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1f10: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
1f20: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
1f30: 65 73 74 20 77 61 6c 2d 35 2e 32 20 7b 0a 20 20  est wal-5.2 {.  
1f40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
1f50: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
1f60: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1f70: 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 45  (3, 4);.      SE
1f80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
1f90: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a    }.} {1 2 3 4}.
1fa0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 33 20  do_test wal-5.3 
1fb0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1fc0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20    ROLLBACK;.    
1fd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1fe0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f  ;.  }.} {1 2}.do
1ff0: 5f 74 65 73 74 20 77 61 6c 2d 35 2e 34 20 7b 0a  _test wal-5.4 {.
2000: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2010: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
2020: 45 20 74 33 28 78 20 55 4e 49 51 55 45 29 3b 0a  E t3(x UNIQUE);.
2030: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2040: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2050: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
2060: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2070: 74 33 20 56 41 4c 55 45 53 28 27 61 62 63 27 29  t3 VALUES('abc')
2080: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
2090: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
20a0: 33 20 56 41 4c 55 45 53 28 27 61 62 63 27 29 20  3 VALUES('abc') 
20b0: 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20 78  }.} {1 {column x
20c0: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d   is not unique}}
20d0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 35  .do_test wal-5.5
20e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
20f0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53     COMMIT;.    S
2100: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
2110: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d  .  }.} {1 2 3 4}
2120: 0a 64 62 20 63 6c 6f 73 65 0a 0a 66 6f 72 65 61  .db close..forea
2130: 63 68 20 73 65 63 74 6f 72 20 7b 35 31 32 20 34  ch sector {512 4
2140: 30 39 36 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33  096} {.  sqlite3
2150: 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76 69 63 65  _simulate_device
2160: 20 2d 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65   -sectorsize $se
2170: 63 74 6f 72 0a 20 20 66 6f 72 65 61 63 68 20 70  ctor.  foreach p
2180: 67 73 7a 20 7b 35 31 32 20 31 30 32 34 20 32 30  gsz {512 1024 20
2190: 34 38 20 34 30 39 36 7d 20 7b 0a 20 20 20 20 66  48 4096} {.    f
21a0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
21b0: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  db test.db-wal. 
21c0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 36     do_test wal-6
21d0: 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e 31  .$sector.$pgsz.1
21e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
21f0: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73   db test.db -vfs
2200: 20 64 65 76 73 79 6d 0a 20 20 20 20 20 20 65 78   devsym.      ex
2210: 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  ecsql ".        
2220: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
2230: 20 3d 20 24 70 67 73 7a 3b 0a 20 20 20 20 20 20   = $pgsz;.      
2240: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
2250: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cuum = 0;.      
2260: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
2270: 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20  _mode = wal;.   
2280: 20 20 20 22 0a 20 20 20 20 20 20 65 78 65 63 73     ".      execs
2290: 71 6c 20 22 0a 20 20 20 20 20 20 20 20 43 52 45  ql ".        CRE
22a0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
22b0: 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  b);.        INSE
22c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
22d0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 22  S(1, 2);.      "
22e0: 0a 20 20 20 20 20 20 64 62 20 63 6c 6f 73 65 0a  .      db close.
22f0: 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20        file size 
2300: 74 65 73 74 2e 64 62 0a 20 20 20 20 7d 20 5b 65  test.db.    } [e
2310: 78 70 72 20 24 70 67 73 7a 2a 32 5d 0a 20 20 0a  xpr $pgsz*2].  .
2320: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
2330: 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e  6.$sector.$pgsz.
2340: 32 20 7b 0a 20 20 20 20 20 20 6c 6f 67 5f 64 65  2 {.      log_de
2350: 6c 65 74 65 64 20 74 65 73 74 2e 64 62 2d 77 61  leted test.db-wa
2360: 6c 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d 0a  l.    } {1}.  }.
2370: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 37  }..do_test wal-7
2380: 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  .1 {.  forcedele
2390: 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  te test.db test.
23a0: 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33  db-wal.  sqlite3
23b0: 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a  _wal db test.db.
23c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
23d0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
23e0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
23f0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
2400: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
2410: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
2420: 20 32 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20   2);.  }.  list 
2430: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
2440: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
2450: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
2460: 69 73 74 20 31 30 32 34 20 5b 77 61 6c 5f 66 69  ist 1024 [wal_fi
2470: 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d  le_size 3 1024]]
2480: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 37 2e 32  .do_test wal-7.2
2490: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
24a0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
24b0: 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74 20 5b 66  oint }.  list [f
24c0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
24d0: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
24e0: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
24f0: 74 20 32 30 34 38 20 5b 77 61 6c 5f 66 69 6c 65  t 2048 [wal_file
2500: 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a 0a  _size 3 1024]]..
2510: 23 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20 74  # Execute some t
2520: 72 61 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20 61  ransactions in a
2530: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
2540: 74 6f 20 74 65 73 74 20 64 61 74 61 62 61 73 65  to test database
2550: 20 66 69 6c 65 0a 23 20 74 72 75 6e 63 61 74 69   file.# truncati
2560: 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  on..#.do_test wa
2570: 6c 2d 38 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e  l-8.1 {.  reopen
2580: 5f 64 62 0a 20 20 63 61 74 63 68 20 7b 20 64 62  _db.  catch { db
2590: 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f 72 63 65   close }.  force
25a0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74  delete test.db t
25b0: 65 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 73 71  est.db-wal..  sq
25c0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
25d0: 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 62  .  db function b
25e0: 6c 6f 62 20 62 6c 6f 62 0a 20 20 65 78 65 63 73  lob blob.  execs
25f0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
2600: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
2610: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
2620: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
2630: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
2640: 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 7d 20 7b 77  vacuum;.  }.} {w
2650: 61 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61  al 1}.do_test wa
2660: 6c 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  l-8.2 {.  execsq
2670: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
2680: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
2690: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
26a0: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53  E t1(x);.    INS
26b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
26c0: 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  ES(blob(900));. 
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 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
2710: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
2720: 3b 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f  ;       /*  4 */
2730: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2740: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2750: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2760: 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20      /*  8 */.   
2770: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2780: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2790: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
27a0: 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53  /* 16 */.    INS
27b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
27c0: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
27d0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33  M t1;       /* 3
27e0: 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  2 */.    INSERT 
27f0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
2800: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
2810: 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f  ;       /* 64 */
2820: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
2830: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a  checkpoint;.  }.
2840: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
2850: 2e 64 62 0a 7d 20 5b 65 78 70 72 20 36 38 2a 31  .db.} [expr 68*1
2860: 30 32 34 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  024].do_test wal
2870: 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.3 {.  execsql
2880: 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46   { .    DELETE F
2890: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77  ROM t1 WHERE row
28a0: 69 64 3c 35 34 3b 0a 20 20 20 20 50 52 41 47 4d  id<54;.    PRAGM
28b0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
28c0: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  ;.  }.  file siz
28d0: 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70  e test.db.} [exp
28e0: 72 20 31 34 2a 31 30 32 34 5d 0a 0a 23 20 52 75  r 14*1024]..# Ru
28f0: 6e 20 73 6f 6d 65 20 22 77 61 72 6d 2d 62 6f 64  n some "warm-bod
2900: 79 22 20 74 65 73 74 73 20 74 6f 20 65 6e 73 75  y" tests to ensu
2910: 72 65 20 74 68 61 74 20 6c 6f 67 2d 73 75 6d 6d  re that log-summ
2920: 61 72 79 20 66 69 6c 65 73 20 77 69 74 68 20 6d  ary files with m
2930: 6f 72 65 0a 23 20 74 68 61 6e 20 32 35 36 20 65  ore.# than 256 e
2940: 6e 74 72 69 65 73 20 28 6c 6f 67 20 73 75 6d 6d  ntries (log summ
2950: 61 72 69 65 73 20 74 68 61 74 20 63 6f 6e 74 61  aries that conta
2960: 69 6e 20 69 6e 64 65 78 20 62 6c 6f 63 6b 73 29  in index blocks)
2970: 20 77 6f 72 6b 20 4f 6b 2e 0a 23 0a 64 6f 5f 74   work Ok..#.do_t
2980: 65 73 74 20 77 61 6c 2d 39 2e 31 20 7b 0a 20 20  est wal-9.1 {.  
2990: 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63  reopen_db.  exec
29a0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
29b0: 20 63 61 63 68 65 5f 73 69 7a 65 3d 32 30 30 30   cache_size=2000
29c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
29d0: 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20  LE t1(x PRIMARY 
29e0: 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  KEY);.    INSERT
29f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2a00: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
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 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2a50: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2a60: 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20       /*  4 */.  
2a70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2a80: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2a90: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2aa0: 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e   /*  8 */.    IN
2ab0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2ac0: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2ad0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2ae0: 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  16 */.    INSERT
2af0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2b00: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2b10: 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a  1;       /* 32 *
2b20: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
2b30: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2b40: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2b50: 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20       /* 64 */.  
2b60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2b70: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2b80: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2b90: 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20 49   /* 128 */.    I
2ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2bb0: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
2bc0: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
2bd0: 20 32 35 36 20 2a 2f 0a 20 20 7d 0a 20 20 66 69   256 */.  }.  fi
2be0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
2bf0: 7d 20 31 30 32 34 0a 64 6f 5f 74 65 73 74 20 77  } 1024.do_test w
2c00: 61 6c 2d 39 2e 32 20 7b 0a 20 20 73 71 6c 69 74  al-9.2 {.  sqlit
2c10: 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e  e3_wal db2 test.
2c20: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52  db.  execsql {PR
2c30: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
2c40: 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
2c50: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39  }..do_test wal-9
2c60: 2e 33 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  .3 {.  forcedele
2c70: 74 65 20 74 65 73 74 32 2e 64 62 20 74 65 73 74  te test2.db test
2c80: 32 2e 64 62 2d 77 61 6c 0a 20 20 63 6f 70 79 5f  2.db-wal.  copy_
2c90: 66 69 6c 65 20 74 65 73 74 2e 64 62 20 74 65 73  file test.db tes
2ca0: 74 32 2e 64 62 0a 20 20 63 6f 70 79 5f 66 69 6c  t2.db.  copy_fil
2cb0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  e test.db-wal te
2cc0: 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c  st2.db-wal.  sql
2cd0: 69 74 65 33 5f 77 61 6c 20 64 62 33 20 74 65 73  ite3_wal db3 tes
2ce0: 74 32 2e 64 62 20 0a 20 20 65 78 65 63 73 71 6c  t2.db .  execsql
2cf0: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   {PRAGMA integri
2d00: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 33 0a 7d  ty_check } db3.}
2d10: 20 7b 6f 6b 7d 0a 64 62 33 20 63 6c 6f 73 65 0a   {ok}.db3 close.
2d20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e 34  .do_test wal-9.4
2d30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
2d40: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
2d50: 6f 69 6e 74 20 7d 0a 20 20 64 62 32 20 63 6c 6f  oint }.  db2 clo
2d60: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  se.  sqlite3_wal
2d70: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
2d80: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
2d90: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
2da0: 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 66 6f 72   db2.} {ok}..for
2db0: 65 61 63 68 20 68 61 6e 64 6c 65 20 7b 64 62 20  each handle {db 
2dc0: 64 62 32 20 64 62 33 7d 20 7b 20 63 61 74 63 68  db2 db3} { catch
2dd0: 20 7b 20 24 68 61 6e 64 6c 65 20 63 6c 6f 73 65   { $handle close
2de0: 20 7d 20 7d 0a 75 6e 73 65 74 20 68 61 6e 64 6c   } }.unset handl
2df0: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 23 20  -------------.# 
2e40: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2e50: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77  ock of tests - w
2e60: 61 6c 2d 31 30 2e 2a 20 2d 20 74 65 73 74 20 74  al-10.* - test t
2e70: 68 61 74 20 74 68 65 20 57 41 4c 20 6c 6f 63 6b  hat the WAL lock
2e80: 69 6e 67 20 0a 23 20 73 63 68 65 6d 65 20 77 6f  ing .# scheme wo
2e90: 72 6b 73 20 69 6e 20 73 69 6d 70 6c 65 20 63 61  rks in simple ca
2ea0: 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ses. This block 
2eb0: 6f 66 20 74 65 73 74 73 20 69 73 20 72 75 6e 20  of tests is run 
2ec0: 74 77 69 63 65 2e 20 4f 6e 63 65 0a 23 20 75 73  twice. Once.# us
2ed0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e  ing multiple con
2ee0: 6e 65 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  nections in the 
2ef0: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f 66  address space of
2f00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
2f10: 63 65 73 73 2c 0a 23 20 61 6e 64 20 6f 6e 63 65  cess,.# and once
2f20: 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 6e 65 63   with all connec
2f30: 74 69 6f 6e 73 20 65 78 63 65 70 74 20 6f 6e 65  tions except one
2f40: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 74 65   running in exte
2f50: 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 2e 0a  rnal processes..
2f60: 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74  #.do_multiclient
2f70: 5f 74 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23 20  _test tn {..  # 
2f80: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 64  Initialize the d
2f90: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 61  atabase schema a
2fa0: 6e 64 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 23  nd contents..  #
2fb0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
2fc0: 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  0.$tn.1 {.    ex
2fd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
2fe0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
2ff0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41 47   = 0;.      PRAG
3000: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
3010: 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 43 52 45  = wal;.      CRE
3020: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3030: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
3040: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3050: 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 53 45 4c  1, 2);.      SEL
3060: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
3070: 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 20 31 20     }.  } {wal 1 
3080: 32 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74  2}..  # Open a t
3090: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 77  ransaction and w
30a0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
30b0: 62 61 73 65 20 75 73 69 6e 67 20 5b 64 62 5d 2e  base using [db].
30c0: 20 43 68 65 63 6b 20 74 68 61 74 20 5b 64 62 32   Check that [db2
30d0: 5d 0a 20 20 23 20 69 73 20 73 74 69 6c 6c 20 61  ].  # is still a
30e0: 62 6c 65 20 74 6f 20 72 65 61 64 20 74 68 65 20  ble to read the 
30f0: 73 6e 61 70 73 68 6f 74 20 62 65 66 6f 72 65 20  snapshot before 
3100: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
3110: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 23 0a  was opened..  #.
3120: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3130: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65  .$tn.2 {.    exe
3140: 63 73 71 6c 20 7b 20 42 45 47 49 4e 3b 20 49 4e  csql { BEGIN; IN
3150: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3160: 55 45 53 28 33 2c 20 34 29 3b 20 7d 0a 20 20 20  UES(3, 4); }.   
3170: 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20   sql2 {SELECT * 
3180: 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20  FROM t1}.  } {1 
3190: 32 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64 62  2}..  # Have [db
31a0: 5d 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  ] commit the tra
31b0: 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20  nsaction. Check 
31c0: 74 68 61 74 20 5b 64 62 32 5d 20 69 73 20 6e 6f  that [db2] is no
31d0: 77 20 73 65 65 69 6e 67 20 74 68 65 20 0a 20 20  w seeing the .  
31e0: 23 20 6e 65 77 2c 20 75 70 64 61 74 65 64 20 73  # new, updated s
31f0: 6e 61 70 73 68 6f 74 2e 0a 20 20 23 0a 20 20 64  napshot..  #.  d
3200: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3210: 6e 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.3 {.    execsq
3220: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20  l { COMMIT }.   
3230: 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20   sql2 {SELECT * 
3240: 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20  FROM t1}.  } {1 
3250: 32 20 33 20 34 7d 0a 0a 20 20 23 20 48 61 76 65  2 3 4}..  # Have
3260: 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 72 65   [db2] open a re
3270: 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ad transaction. 
3280: 54 68 65 6e 20 77 72 69 74 65 20 74 6f 20 74 68  Then write to th
3290: 65 20 64 62 20 76 69 61 20 5b 64 62 5d 2e 20 43  e db via [db]. C
32a0: 68 65 63 6b 0a 20 20 23 20 74 68 61 74 20 5b 64  heck.  # that [d
32b0: 62 32 5d 20 69 73 20 73 74 69 6c 6c 20 73 65 65  b2] is still see
32c0: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
32d0: 20 73 6e 61 70 73 68 6f 74 2e 20 54 68 65 6e 20   snapshot. Then 
32e0: 72 65 61 64 20 77 69 74 68 20 5b 64 62 33 5d 2e  read with [db3].
32f0: 0a 20 20 23 20 5b 64 62 33 5d 20 73 68 6f 75 6c  .  # [db3] shoul
3300: 64 20 73 65 65 20 74 68 65 20 6e 65 77 6c 79 20  d see the newly 
3310: 63 6f 6d 6d 69 74 74 65 64 20 64 61 74 61 2e 0a  committed data..
3320: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
3330: 6c 2d 31 30 2e 24 74 6e 2e 34 20 7b 0a 20 20 20  l-10.$tn.4 {.   
3340: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20   sql2 { BEGIN ; 
3350: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3360: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a  }.  } {1 2 3 4}.
3370: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3380: 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 65 78 65  .$tn.5 {.    exe
3390: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
33a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
33b0: 36 29 3b 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b  6); }.    sql2 {
33c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
33d0: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a  }.  } {1 2 3 4}.
33e0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
33f0: 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 73 71 6c  .$tn.6 {.    sql
3400: 33 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  3 {SELECT * FROM
3410: 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20   t1}.  } {1 2 3 
3420: 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74  4 5 6}.  do_test
3430: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a   wal-10.$tn.7 {.
3440: 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a      sql2 COMMIT.
3450: 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76 65    } {}..  # Have
3460: 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 77 72   [db2] open a wr
3470: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
3480: 20 54 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   Then attempt to
3490: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 0a 20   write to the . 
34a0: 20 23 20 64 61 74 61 62 61 73 65 20 76 69 61 20   # database via 
34b0: 5b 64 62 5d 2e 20 54 68 69 73 20 73 68 6f 75 6c  [db]. This shoul
34c0: 64 20 66 61 69 6c 20 28 77 72 69 74 65 72 20 6c  d fail (writer l
34d0: 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
34e0: 74 61 69 6e 65 64 29 2e 0a 20 20 23 0a 20 20 23  tained)..  #.  #
34f0: 20 54 68 65 6e 20 6f 70 65 6e 20 61 20 72 65 61   Then open a rea
3500: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  d-transaction wi
3510: 74 68 20 5b 64 62 5d 2e 20 43 6f 6d 6d 69 74 20  th [db]. Commit 
3520: 74 68 65 20 5b 64 62 32 5d 20 74 72 61 6e 73 61  the [db2] transa
3530: 63 74 69 6f 6e 0a 20 20 23 20 74 6f 20 64 69 73  ction.  # to dis
3540: 6b 2e 20 56 65 72 69 66 79 20 74 68 61 74 20 5b  k. Verify that [
3550: 64 62 5d 20 73 74 69 6c 6c 20 63 61 6e 6e 6f 74  db] still cannot
3560: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61   write to the da
3570: 74 61 62 61 73 65 20 28 62 65 63 61 75 73 65 0a  tabase (because.
3580: 20 20 23 20 69 74 20 69 73 20 72 65 61 64 69 6e    # it is readin
3590: 67 20 61 6e 20 6f 6c 64 20 73 6e 61 70 73 68 6f  g an old snapsho
35a0: 74 29 2e 0a 20 20 23 0a 20 20 23 20 43 6c 6f 73  t)..  #.  # Clos
35b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 5b 64  e the current [d
35c0: 62 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  b] transaction. 
35d0: 4f 70 65 6e 20 61 20 6e 65 77 20 6f 6e 65 2e 20  Open a new one. 
35e0: 5b 64 62 5d 20 63 61 6e 20 6e 6f 77 20 77 72 69  [db] can now wri
35f0: 74 65 0a 20 20 23 20 74 6f 20 74 68 65 20 64 61  te.  # to the da
3600: 74 61 62 61 73 65 20 28 61 73 20 69 74 20 69 73  tabase (as it is
3610: 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 61 6e 64 20   not locked and 
3620: 5b 64 62 5d 20 69 73 20 72 65 61 64 69 6e 67 20  [db] is reading 
3630: 74 68 65 20 6c 61 74 65 73 74 0a 20 20 23 20 73  the latest.  # s
3640: 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20  napshot)..  #.  
3650: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3660: 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20  tn.7 {.    sql2 
3670: 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
3680: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37  INTO t1 VALUES(7
3690: 2c 20 38 29 20 3b 20 7d 0a 20 20 20 20 63 61 74  , 8) ; }.    cat
36a0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
36b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c  NTO t1 VALUES(9,
36c0: 20 31 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64   10) }.  } {1 {d
36d0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
36e0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  d}}.  do_test wa
36f0: 6c 2d 31 30 2e 24 74 6e 2e 38 20 7b 0a 20 20 20  l-10.$tn.8 {.   
3700: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
3710: 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   ; SELECT * FROM
3720: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3730: 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73   4 5 6}.  do_tes
3740: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 39 20 7b  t wal-10.$tn.9 {
3750: 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54  .    sql2 COMMIT
3760: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
3770: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3780: 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20  ALUES(9, 10) }. 
3790: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
37a0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
37b0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
37c0: 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .10 {.    execsq
37d0: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20  l { COMMIT }.   
37e0: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
37f0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
3800: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3810: 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a  VALUES(9, 10) }.
3820: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f      execsql { CO
3830: 4d 4d 49 54 20 7d 0a 20 20 20 20 65 78 65 63 73  MMIT }.    execs
3840: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
3850: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32  OM t1 }.  } {1 2
3860: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
3870: 30 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 72  0}..  # Open a r
3880: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
3890: 77 69 74 68 20 5b 64 62 32 5d 2e 20 43 68 65 63  with [db2]. Chec
38a0: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65 76  k that this prev
38b0: 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d 0a 20  ents [db] from. 
38c0: 20 23 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67   # checkpointing
38d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 42   the database. B
38e0: 75 74 20 6e 6f 74 20 66 72 6f 6d 20 77 72 69 74  ut not from writ
38f0: 69 6e 67 20 74 6f 20 69 74 2e 0a 20 20 23 0a 20  ing to it..  #. 
3900: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3910: 24 74 6e 2e 31 31 20 7b 0a 20 20 20 20 73 71 6c  $tn.11 {.    sql
3920: 32 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43  2 { BEGIN; SELEC
3930: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3940: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
3950: 20 38 20 39 20 31 30 7d 0a 20 20 64 6f 5f 74 65   8 9 10}.  do_te
3960: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 32  st wal-10.$tn.12
3970: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
3980: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
3990: 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b  ckpoint } .  } {
39a0: 30 20 7b 30 20 37 20 37 7d 7d 20 20 20 3b 23 20  0 {0 7 7}}   ;# 
39b0: 52 65 61 64 65 72 20 6e 6f 20 6c 6f 6e 67 65 72  Reader no longer
39c0: 20 62 6c 6f 63 6b 20 63 68 65 63 6b 70 6f 69 6e   block checkpoin
39d0: 74 73 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  ts.  do_test wal
39e0: 2d 31 30 2e 24 74 6e 2e 31 33 20 7b 0a 20 20 20  -10.$tn.13 {.   
39f0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
3a00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3a10: 28 31 31 2c 20 31 32 29 20 7d 0a 20 20 20 20 73  (11, 12) }.    s
3a20: 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  ql2 {SELECT * FR
3a30: 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20  OM t1}.  } {1 2 
3a40: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
3a50: 7d 0a 0a 20 20 23 20 57 72 69 74 65 72 73 20 64  }..  # Writers d
3a60: 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 63 68 65 63  o not block chec
3a70: 6b 70 6f 69 6e 74 73 20 61 6e 79 20 6d 6f 72 65  kpoints any more
3a80: 20 65 69 74 68 65 72 2e 0a 20 20 23 0a 20 20 64   either..  #.  d
3a90: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3aa0: 6e 2e 31 34 20 7b 0a 20 20 20 20 63 61 74 63 68  n.14 {.    catch
3ab0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
3ac0: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20  _checkpoint } . 
3ad0: 20 7d 20 7b 30 20 7b 30 20 38 20 37 7d 7d 0a 0a   } {0 {0 8 7}}..
3ae0: 20 20 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e    # The followin
3af0: 67 20 73 65 72 69 65 73 20 6f 66 20 74 65 73 74  g series of test
3b00: 20 63 61 73 65 73 20 75 73 65 64 20 74 6f 20 76   cases used to v
3b10: 65 72 69 66 79 20 61 6e 6f 74 68 65 72 20 62 6c  erify another bl
3b20: 6f 63 6b 69 6e 67 0a 20 20 23 20 63 61 73 65 20  ocking.  # case 
3b30: 69 6e 20 57 41 4c 20 2d 20 61 20 63 61 73 65 20  in WAL - a case 
3b40: 77 68 69 63 68 20 6e 6f 20 6c 6f 6e 67 65 72 20  which no longer 
3b50: 62 6c 6f 63 6b 73 2e 0a 20 20 23 0a 20 20 64 6f  blocks..  #.  do
3b60: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3b70: 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b  .15 {.    sql2 {
3b80: 20 43 4f 4d 4d 49 54 3b 20 42 45 47 49 4e 3b 20   COMMIT; BEGIN; 
3b90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3ba0: 3b 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  ; }.  } {1 2 3 4
3bb0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
3bc0: 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   12}.  do_test w
3bd0: 61 6c 2d 31 30 2e 24 74 6e 2e 31 36 20 7b 0a 20  al-10.$tn.16 {. 
3be0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52     catchsql { PR
3bf0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
3c00: 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 30 20 7b 30  int } .  } {0 {0
3c10: 20 38 20 38 7d 7d 0a 20 20 64 6f 5f 74 65 73 74   8 8}}.  do_test
3c20: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 37 20 7b   wal-10.$tn.17 {
3c30: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
3c40: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
3c50: 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 30 20 38  oint } .  } {0 8
3c60: 20 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61   8}.  do_test wa
3c70: 6c 2d 31 30 2e 24 74 6e 2e 31 38 20 7b 0a 20 20  l-10.$tn.18 {.  
3c80: 20 20 73 71 6c 33 20 7b 20 42 45 47 49 4e 3b 20    sql3 { BEGIN; 
3c90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3ca0: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3cb0: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
3cc0: 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  12}.  do_test wa
3cd0: 6c 2d 31 30 2e 24 74 6e 2e 31 39 20 7b 0a 20 20  l-10.$tn.19 {.  
3ce0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
3cf0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3d00: 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20 7d  ES(13, 14) }.  }
3d10: 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73   {0 {}}.  do_tes
3d20: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 30 20  t wal-10.$tn.20 
3d30: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
3d40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3d50: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3d60: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
3d70: 31 32 20 31 33 20 31 34 7d 0a 20 20 64 6f 5f 74  12 13 14}.  do_t
3d80: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
3d90: 31 20 7b 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d  1 {.    sql3 COM
3da0: 4d 49 54 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d  MIT.    sql2 COM
3db0: 4d 49 54 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  MIT.  } {}.  do_
3dc0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3dd0: 32 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  22 {.    execsql
3de0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
3df0: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3e00: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
3e10: 31 31 20 31 32 20 31 33 20 31 34 7d 0a 0a 20 20  11 12 13 14}..  
3e20: 23 20 41 6e 6f 74 68 65 72 20 73 65 72 69 65 73  # Another series
3e30: 20 6f 66 20 74 65 73 74 73 20 74 68 61 74 20 75   of tests that u
3e40: 73 65 64 20 74 6f 20 64 65 6d 6f 6e 73 74 72 61  sed to demonstra
3e50: 74 65 20 62 6c 6f 63 6b 69 6e 67 20 62 65 68 61  te blocking beha
3e60: 76 69 6f 72 0a 20 20 23 20 62 75 74 20 77 68 69  vior.  # but whi
3e70: 63 68 20 6e 6f 77 20 77 6f 72 6b 2e 0a 20 20 23  ch now work..  #
3e80: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3e90: 30 2e 24 74 6e 2e 32 33 20 7b 0a 20 20 20 20 65  0.$tn.23 {.    e
3ea0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
3eb0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
3ec0: 0a 20 20 7d 20 7b 30 20 39 20 39 7d 0a 20 20 64  .  } {0 9 9}.  d
3ed0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3ee0: 6e 2e 32 34 20 7b 0a 20 20 20 20 73 71 6c 32 20  n.24 {.    sql2 
3ef0: 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20  { BEGIN; SELECT 
3f00: 2a 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d  * FROM t1; }.  }
3f10: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3f20: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
3f30: 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  14}.  do_test wa
3f40: 6c 2d 31 30 2e 24 74 6e 2e 32 35 20 7b 0a 20 20  l-10.$tn.25 {.  
3f50: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
3f60: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
3f70: 74 20 7d 0a 20 20 7d 20 7b 30 20 39 20 39 7d 0a  t }.  } {0 9 9}.
3f80: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3f90: 2e 24 74 6e 2e 32 36 20 7b 0a 20 20 20 20 63 61  .$tn.26 {.    ca
3fa0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
3fb0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
3fc0: 35 2c 20 31 36 29 20 7d 0a 20 20 7d 20 7b 30 20  5, 16) }.  } {0 
3fd0: 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  {}}.  do_test wa
3fe0: 6c 2d 31 30 2e 24 74 6e 2e 32 37 20 7b 0a 20 20  l-10.$tn.27 {.  
3ff0: 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20    sql3 { INSERT 
4000: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
4010: 37 2c 20 31 38 29 20 7d 0a 20 20 7d 20 7b 7d 0a  7, 18) }.  } {}.
4020: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
4030: 2e 24 74 6e 2e 32 38 20 7b 0a 20 20 20 20 63 6f  .$tn.28 {.    co
4040: 64 65 33 20 7b 0a 20 20 20 20 20 20 73 65 74 20  de3 {.      set 
4050: 3a 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  ::STMT [sqlite3_
4060: 70 72 65 70 61 72 65 20 64 62 33 20 22 53 45 4c  prepare db3 "SEL
4070: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 2d  ECT * FROM t1" -
4080: 31 20 54 41 49 4c 5d 0a 20 20 20 20 20 20 73 71  1 TAIL].      sq
4090: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
40a0: 4d 54 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  MT.    }.    exe
40b0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
40c0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
40d0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
40e0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
40f0: 31 35 20 31 36 20 31 37 20 31 38 7d 0a 20 20 64  15 16 17 18}.  d
4100: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
4110: 6e 2e 32 39 20 7b 0a 20 20 20 20 65 78 65 63 73  n.29 {.    execs
4120: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
4130: 20 74 31 20 56 41 4c 55 45 53 28 31 39 2c 20 32   t1 VALUES(19, 2
4140: 30 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71  0) }.    catchsq
4150: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
4160: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
4170: 7b 30 20 7b 30 20 33 20 30 7d 7d 0a 20 20 64 6f  {0 {0 3 0}}.  do
4180: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4190: 2e 33 30 20 7b 0a 20 20 20 20 63 6f 64 65 33 20  .30 {.    code3 
41a0: 7b 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  { sqlite3_finali
41b0: 7a 65 20 24 3a 3a 53 54 4d 54 20 7d 0a 20 20 20  ze $::STMT }.   
41c0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
41d0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
41e0: 20 7d 0a 20 20 7d 20 7b 30 20 33 20 30 7d 0a 0a   }.  } {0 3 0}..
41f0: 20 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74    # At one point
4200: 2c 20 69 66 20 61 20 72 65 61 64 65 72 20 66 61  , if a reader fa
4210: 69 6c 65 64 20 74 6f 20 75 70 67 72 61 64 65 20  iled to upgrade 
4220: 74 6f 20 61 20 77 72 69 74 65 72 20 62 65 63 61  to a writer beca
4230: 75 73 65 20 69 74 0a 20 20 23 20 77 61 73 20 72  use it.  # was r
4240: 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e  eading an old sn
4250: 61 70 73 68 6f 74 2c 20 74 68 65 20 77 72 69 74  apshot, the writ
4260: 65 2d 6c 6f 63 6b 73 20 77 65 72 65 20 6e 6f 74  e-locks were not
4270: 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 2e   being released.
4280: 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20 74  .  # Test that t
4290: 68 69 73 20 62 75 67 20 68 61 73 20 62 65 65 6e  his bug has been
42a0: 20 66 69 78 65 64 2e 0a 20 20 23 0a 20 20 64 6f   fixed..  #.  do
42b0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
42c0: 2e 33 31 20 7b 0a 20 20 20 20 73 71 6c 32 20 43  .31 {.    sql2 C
42d0: 4f 4d 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71  OMMIT.    execsq
42e0: 6c 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45  l { BEGIN ; SELE
42f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
4300: 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52 54     sql2 { INSERT
4310: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4320: 32 31 2c 20 32 32 29 20 7d 0a 20 20 20 20 63 61  21, 22) }.    ca
4330: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
4340: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
4350: 33 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b 31 20  3, 24) }.  } {1 
4360: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
4370: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
4380: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 32 20 7b 0a  wal-10.$tn.32 {.
4390: 20 20 20 20 23 20 54 68 69 73 20 73 74 61 74 65      # This state
43a0: 6d 65 6e 74 20 77 6f 75 6c 64 20 66 61 69 6c 20  ment would fail 
43b0: 77 68 65 6e 20 74 68 65 20 62 75 67 20 77 61 73  when the bug was
43c0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 73 71   present..    sq
43d0: 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l2 { INSERT INTO
43e0: 20 74 31 20 56 41 4c 55 45 53 28 32 33 2c 20 32   t1 VALUES(23, 2
43f0: 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  4) }.  } {}.  do
4400: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4410: 2e 33 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .33 {.    execsq
4420: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
4430: 4d 20 74 31 20 3b 20 43 4f 4d 4d 49 54 20 7d 0a  M t1 ; COMMIT }.
4440: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
4450: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
4460: 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31  13 14 15 16 17 1
4470: 38 20 31 39 20 32 30 7d 0a 20 20 64 6f 5f 74 65  8 19 20}.  do_te
4480: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 34  st wal-10.$tn.34
4490: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
44a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
44b0: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
44c0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
44d0: 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36 20   12 13 14 15 16 
44e0: 31 37 20 31 38 20 31 39 20 32 30 20 32 31 20 32  17 18 19 20 21 2
44f0: 32 20 32 33 20 32 34 7d 0a 0a 20 20 23 20 54 65  2 23 24}..  # Te
4500: 73 74 20 74 68 61 74 20 69 66 20 61 20 63 68 65  st that if a che
4510: 63 6b 70 6f 69 6e 74 65 72 20 63 61 6e 6e 6f 74  ckpointer cannot
4520: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
4530: 69 72 65 64 20 6c 6f 63 6b 73 2c 20 69 74 0a 20  ired locks, it. 
4540: 20 23 20 72 65 6c 65 61 73 65 73 20 61 6c 6c 20   # releases all 
4550: 6c 6f 63 6b 73 20 62 65 66 6f 72 65 20 72 65 74  locks before ret
4560: 75 72 6e 69 6e 67 20 61 20 62 75 73 79 20 65 72  urning a busy er
4570: 72 6f 72 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  ror..  #.  do_te
4580: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 35  st wal-10.$tn.35
4590: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
45a0: 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46   .      DELETE F
45b0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
45c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
45d0: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
45e0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
45f0: 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
4600: 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  'd');.    }.    
4610: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47  sql2 {.      BEG
4620: 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  IN;.        SELE
4630: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
4640: 20 20 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64    }.  } {a b c d
4650: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4660: 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20 20  10.$tn.36 {.    
4670: 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d  catchsql { PRAGM
4680: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
4690: 20 7d 0a 20 20 7d 20 7b 30 20 7b 30 20 38 20 38   }.  } {0 {0 8 8
46a0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  }}.  do_test wal
46b0: 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20  -10.$tn.36 {.   
46c0: 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20 49   sql3 { INSERT I
46d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65  NTO t1 VALUES('e
46e0: 27 2c 20 27 66 27 29 20 7d 0a 20 20 20 20 73 71  ', 'f') }.    sq
46f0: 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l2 { SELECT * FR
4700: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 61 20 62  OM t1 }.  } {a b
4710: 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20   c d}.  do_test 
4720: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 37 20 7b 0a  wal-10.$tn.37 {.
4730: 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a      sql2 COMMIT.
4740: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
4750: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
4760: 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 39 20 39  int }.  } {0 9 9
4770: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
47c0: 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20  # This block of 
47d0: 74 65 73 74 73 2c 20 77 61 6c 2d 31 31 2e 2a 2c  tests, wal-11.*,
47e0: 20 74 65 73 74 20 74 68 61 74 20 6e 6f 74 68 69   test that nothi
47f0: 6e 67 20 67 6f 65 73 20 74 65 72 72 69 62 6c 79  ng goes terribly
4800: 20 77 72 6f 6e 67 0a 23 20 69 66 20 66 72 61 6d   wrong.# if fram
4810: 65 73 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  es must be writt
4820: 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  en to the log fi
4830: 6c 65 20 62 65 66 6f 72 65 20 61 20 74 72 61 6e  le before a tran
4840: 73 61 63 74 69 6f 6e 20 69 73 0a 23 20 63 6f 6d  saction is.# com
4850: 6d 69 74 74 65 64 20 28 69 6e 20 6f 72 64 65 72  mitted (in order
4860: 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f   to free up memo
4870: 72 79 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ry)..#.do_test w
4880: 61 6c 2d 31 31 2e 31 20 7b 0a 20 20 72 65 6f 70  al-11.1 {.  reop
4890: 65 6e 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20  en_db.  execsql 
48a0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
48b0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
48c0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
48d0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
48e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
48f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
4900: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
4910: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4920: 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20  db]/1024] [expr 
4930: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4940: 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20  db-wal]/1044].} 
4950: 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {1 3}.do_test wa
4960: 6c 2d 31 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  l-11.2 {.  execs
4970: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
4980: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c  checkpoint }.  l
4990: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
49a0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
49b0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
49c0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
49d0: 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c 65 5f  ist 3 [wal_file_
49e0: 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a 64 6f  size 3 1024]].do
49f0: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 33 20 7b  _test wal-11.3 {
4a00: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
4a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4a20: 45 53 28 20 62 6c 6f 62 28 39 30 30 29 20 29 20  ES( blob(900) ) 
4a30: 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  }.  list [expr [
4a40: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4a50: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
4a60: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4a70: 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f  .} [list 3 [wal_
4a80: 66 69 6c 65 5f 73 69 7a 65 20 34 20 31 30 32 34  file_size 4 1024
4a90: 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ]]..do_test wal-
4aa0: 31 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.4 {.  execsql
4ab0: 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20   { .    BEGIN;. 
4ac0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4ad0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
4ae0: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
4af0: 2d 2d 20 32 0a 20 20 20 20 20 20 49 4e 53 45 52  -- 2.      INSER
4b00: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4b10: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
4b20: 74 31 3b 20 20 20 2d 2d 20 34 0a 20 20 20 20 20  t1;   -- 4.     
4b30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4b40: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
4b50: 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 38   FROM t1;   -- 8
4b60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4b70: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
4b80: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
4b90: 20 20 2d 2d 20 31 36 0a 20 20 7d 0a 20 20 6c 69    -- 16.  }.  li
4ba0: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
4bb0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
4bc0: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
4bd0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
4be0: 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  st 3 [wal_file_s
4bf0: 69 7a 65 20 33 32 20 31 30 32 34 5d 5d 0a 64 6f  ize 32 1024]].do
4c00: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 35 20 7b  _test wal-11.5 {
4c10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
4c20: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
4c30: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
4c40: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
4c50: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 36  check;.  }.} {16
4c60: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   ok}.do_test wal
4c70: 2d 31 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  -11.6 {.  execsq
4c80: 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73 74 20  l COMMIT.  list 
4c90: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4ca0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
4cb0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4cc0: 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20  db-wal].} [list 
4cd0: 33 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  3 [wal_file_size
4ce0: 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65   41 1024]].do_te
4cf0: 73 74 20 77 61 6c 2d 31 31 2e 37 20 7b 0a 20 20  st wal-11.7 {.  
4d00: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53  execsql { .    S
4d10: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
4d20: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
4d30: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
4d40: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 36 20 6f 6b  ck;.  }.} {16 ok
4d50: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  }.do_test wal-11
4d60: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
4d70: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4d80: 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74 20  kpoint }.  list 
4d90: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4da0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
4db0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4dc0: 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20  db-wal].} [list 
4dd0: 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  37 [wal_file_siz
4de0: 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f 74  e 41 1024]].do_t
4df0: 65 73 74 20 77 61 6c 2d 31 31 2e 39 20 7b 0a 20  est wal-11.9 {. 
4e00: 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73 74   db close.  list
4e10: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
4e20: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
4e30: 20 5b 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74 65   [log_deleted te
4e40: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 33 37  st.db-wal].} {37
4e50: 20 31 7d 0a 73 71 6c 69 74 65 33 5f 77 61 6c 20   1}.sqlite3_wal 
4e60: 64 62 20 74 65 73 74 2e 64 62 0a 73 65 74 20 6e  db test.db.set n
4e70: 57 61 6c 20 33 39 0a 69 66 20 7b 5b 70 65 72 6d  Wal 39.if {[perm
4e80: 75 74 61 74 69 6f 6e 5d 3d 3d 22 6e 6f 6d 6d 61  utation]=="nomma
4e90: 70 22 7d 20 7b 73 65 74 20 6e 57 61 6c 20 33 37  p"} {set nWal 37
4ea0: 7d 0a 69 66 63 61 70 61 62 6c 65 20 21 6d 6d 61  }.ifcapable !mma
4eb0: 70 20 7b 73 65 74 20 6e 57 61 6c 20 33 37 7d 0a  p {set nWal 37}.
4ec0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31  do_test wal-11.1
4ed0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
4ee0: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
4ef0: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
4f00: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
4f10: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4f20: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
4f30: 4d 20 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20 20  M t1;   -- 32.  
4f40: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
4f50: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  (*) FROM t1;.  }
4f60: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4f70: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4f80: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
4f90: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
4fa0: 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f  } [list 37 [wal_
4fb0: 66 69 6c 65 5f 73 69 7a 65 20 24 6e 57 61 6c 20  file_size $nWal 
4fc0: 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77  1024]].do_test w
4fd0: 61 6c 2d 31 31 2e 31 31 20 7b 0a 20 20 65 78 65  al-11.11 {.  exe
4fe0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
4ff0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
5000: 4d 20 74 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t1;.    ROLLBA
5010: 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  CK;.    SELECT c
5020: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
5030: 0a 20 20 7d 0a 7d 20 7b 33 32 20 31 36 7d 0a 64  .  }.} {32 16}.d
5040: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 32  o_test wal-11.12
5050: 20 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   {.  list [expr 
5060: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5070: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
5080: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
5090: 5d 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61  ].} [list 37 [wa
50a0: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 24 6e 57 61  l_file_size $nWa
50b0: 6c 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74  l 1024]].do_test
50c0: 20 77 61 6c 2d 31 31 2e 31 33 20 7b 0a 20 20 65   wal-11.13 {.  e
50d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
50e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
50f0: 45 53 28 20 62 6c 6f 62 28 39 30 30 29 20 29 3b  ES( blob(900) );
5100: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
5110: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
5120: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
5130: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
5140: 7b 31 37 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  {17 ok}.do_test 
5150: 77 61 6c 2d 31 31 2e 31 34 20 7b 0a 20 20 6c 69  wal-11.14 {.  li
5160: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
5170: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
5180: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
5190: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
51a0: 73 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f  st 37 [wal_file_
51b0: 73 69 7a 65 20 24 6e 57 61 6c 20 31 30 32 34 5d  size $nWal 1024]
51c0: 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ]...#-----------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5210: 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74   This block of t
5220: 65 73 74 73 2c 20 77 61 6c 2d 31 32 2e 2a 2c 20  ests, wal-12.*, 
5230: 74 65 73 74 73 20 74 68 65 20 66 69 78 20 66 6f  tests the fix fo
5240: 72 20 61 20 70 72 6f 62 6c 65 6d 20 74 68 61 74  r a problem that
5250: 20 0a 23 20 63 6f 75 6c 64 20 6f 63 63 75 72 20   .# could occur 
5260: 69 66 20 61 20 6c 6f 67 20 74 68 61 74 20 69 73  if a log that is
5270: 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 20   a prefix of an 
5280: 6f 6c 64 65 72 20 6c 6f 67 20 69 73 20 77 72 69  older log is wri
5290: 74 74 65 6e 20 0a 23 20 69 6e 74 6f 20 61 20 72  tten .# into a r
52a0: 65 75 73 65 64 20 6c 6f 67 20 66 69 6c 65 2e 0a  eused log file..
52b0: 23 0a 72 65 6f 70 65 6e 5f 64 62 0a 64 6f 5f 74  #.reopen_db.do_t
52c0: 65 73 74 20 77 61 6c 2d 31 32 2e 31 20 7b 0a 20  est wal-12.1 {. 
52d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
52e0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
52f0: 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41  = 1024;.    CREA
5300: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
5310: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
5320: 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 0a 20 20  BLE t2(x, y);.  
5330: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5340: 20 56 41 4c 55 45 53 28 27 41 27 2c 20 31 29 3b   VALUES('A', 1);
5350: 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70  .  }.  list [exp
5360: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
5370: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c  t.db]/1024] [fil
5380: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
5390: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31 20 5b 77  al].} [list 1 [w
53a0: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 35 20 31  al_file_size 5 1
53b0: 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61  024]].do_test wa
53c0: 6c 2d 31 32 2e 32 20 7b 0a 20 20 64 62 20 63 6c  l-12.2 {.  db cl
53d0: 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ose.  sqlite3 db
53e0: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
53f0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
5400: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f  synchronous = no
5410: 72 6d 61 6c 3b 0a 20 20 20 20 55 50 44 41 54 45  rmal;.    UPDATE
5420: 20 74 31 20 53 45 54 20 79 20 3d 20 30 20 57 48   t1 SET y = 0 WH
5430: 45 52 45 20 78 20 3d 20 27 41 27 3b 0a 20 20 7d  ERE x = 'A';.  }
5440: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
5450: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5460: 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20 5b 66  ]/1024] [expr [f
5470: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5480: 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20 7b 33  -wal]/1044].} {3
5490: 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   1}.do_test wal-
54a0: 31 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  12.3 {.  execsql
54b0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
54c0: 32 20 56 41 4c 55 45 53 28 27 42 27 2c 20 31 29  2 VALUES('B', 1)
54d0: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
54e0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
54f0: 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20  db]/1024] [expr 
5500: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5510: 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20  db-wal]/1044].} 
5520: 7b 33 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {3 2}.do_test wa
5530: 6c 2d 31 32 2e 34 20 7b 0a 20 20 66 6f 72 63 65  l-12.4 {.  force
5540: 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74 65 73  copy test.db tes
5550: 74 32 2e 64 62 0a 20 20 66 6f 72 63 65 63 6f 70  t2.db.  forcecop
5560: 79 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  y test.db-wal te
5570: 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c  st2.db-wal.  sql
5580: 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73  ite3_wal db2 tes
5590: 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  t2.db.  execsql 
55a0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
55b0: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 42 20 31 7d  t2 } db2.} {B 1}
55c0: 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65  .db2 close.do_te
55d0: 73 74 20 77 61 6c 2d 31 32 2e 35 20 7b 0a 20 20  st wal-12.5 {.  
55e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
55f0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
5600: 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54 45 20  int;.    UPDATE 
5610: 74 32 20 53 45 54 20 79 20 3d 20 32 20 57 48 45  t2 SET y = 2 WHE
5620: 52 45 20 78 20 3d 20 27 42 27 3b 20 0a 20 20 20  RE x = 'B'; .   
5630: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
5640: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41  kpoint;.    UPDA
5650: 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 31 20  TE t1 SET y = 1 
5660: 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b 0a 20  WHERE x = 'A';. 
5670: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
5680: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50  eckpoint;.    UP
5690: 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20  DATE t1 SET y = 
56a0: 30 20 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b  0 WHERE x = 'A';
56b0: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
56c0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
56d0: 74 32 20 7d 0a 7d 20 7b 42 20 32 7d 0a 64 6f 5f  t2 }.} {B 2}.do_
56e0: 74 65 73 74 20 77 61 6c 2d 31 32 2e 36 20 7b 0a  test wal-12.6 {.
56f0: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
5700: 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66  .db test2.db.  f
5710: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62  orcecopy test.db
5720: 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61  -wal test2.db-wa
5730: 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20  l.  sqlite3_wal 
5740: 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65  db2 test2.db.  e
5750: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
5760: 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a  * FROM t2 } db2.
5770: 7d 20 7b 42 20 32 7d 0a 64 62 32 20 63 6c 6f 73  } {B 2}.db2 clos
5780: 65 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d  e.db close..#---
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6c 61  ------.# Test la
57e0: 72 67 65 20 6c 6f 67 20 73 75 6d 6d 61 72 69 65  rge log summarie
57f0: 73 2e 0a 23 0a 23 20 49 6e 20 74 68 69 73 20 63  s..#.# In this c
5800: 61 73 65 20 22 6c 61 72 67 65 22 20 75 73 75 61  ase "large" usua
5810: 6c 6c 79 20 6d 65 61 6e 73 20 61 20 6c 6f 67 20  lly means a log 
5820: 66 69 6c 65 20 74 68 61 74 20 72 65 71 75 69 72  file that requir
5830: 65 73 20 61 20 77 61 6c 2d 69 6e 64 65 78 0a 23  es a wal-index.#
5840: 20 6d 61 70 70 69 6e 67 20 6c 61 72 67 65 72 20   mapping larger 
5850: 74 68 61 6e 20 36 34 4b 42 20 28 74 68 65 20 64  than 64KB (the d
5860: 65 66 61 75 6c 74 20 69 6e 69 74 69 61 6c 20 61  efault initial a
5870: 6c 6c 6f 63 61 74 69 6f 6e 29 2e 20 41 20 36 34  llocation). A 64
5880: 4b 42 20 77 61 6c 2d 69 6e 64 65 78 0a 23 20 69  KB wal-index.# i
5890: 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66  s large enough f
58a0: 6f 72 20 61 20 6c 6f 67 20 66 69 6c 65 20 74 68  or a log file th
58b0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 70 70 72  at contains appr
58c0: 6f 78 69 6d 61 74 65 6c 79 20 31 33 31 30 30 20  oximately 13100 
58d0: 66 72 61 6d 65 73 2e 0a 23 20 53 6f 20 74 68 65  frames..# So the
58e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
58f0: 20 63 72 65 61 74 65 20 6c 6f 67 73 20 63 6f 6e   create logs con
5900: 74 61 69 6e 69 6e 67 20 61 74 20 6c 65 61 73 74  taining at least
5910: 20 74 68 69 73 20 6d 61 6e 79 20 66 72 61 6d 65   this many frame
5920: 73 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e 31 2e  s..#.# wal-13.1.
5930: 2a 3a 20 54 68 69 73 20 74 65 73 74 20 63 61 73  *: This test cas
5940: 65 20 63 72 65 61 74 65 73 20 61 20 76 65 72 79  e creates a very
5950: 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c 65 20   large log file 
5960: 77 69 74 68 69 6e 20 74 68 65 0a 23 20 20 20 20  within the.#    
5970: 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73 79           file-sy
5980: 73 74 65 6d 20 28 61 72 6f 75 6e 64 20 32 30 30  stem (around 200
5990: 4d 42 29 2e 20 54 68 65 20 6c 6f 67 20 66 69 6c  MB). The log fil
59a0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
59b0: 69 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  in.#            
59c0: 20 61 6e 79 20 76 61 6c 69 64 20 66 72 61 6d 65   any valid frame
59d0: 73 2e 20 54 65 73 74 20 74 68 61 74 20 74 68 65  s. Test that the
59e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
59f0: 61 6e 20 73 74 69 6c 6c 20 62 65 0a 23 20 20 20  an still be.#   
5a00: 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 65 64            opened
5a10: 20 61 6e 64 20 71 75 65 72 69 65 64 2c 20 61 6e   and queried, an
5a20: 64 20 74 68 61 74 20 74 68 65 20 69 6e 76 61 6c  d that the inval
5a30: 69 64 20 6c 6f 67 20 66 69 6c 65 20 63 61 75 73  id log file caus
5a40: 65 73 20 6e 6f 20 0a 23 20 20 20 20 20 20 20 20  es no .#        
5a50: 20 20 20 20 20 70 72 6f 62 6c 65 6d 73 2e 0a 23       problems..#
5a60: 0a 23 20 77 61 6c 2d 31 33 2e 32 2e 2a 3a 20 54  .# wal-13.2.*: T
5a70: 65 73 74 20 74 68 61 74 20 61 20 70 72 6f 63 65  est that a proce
5a80: 73 73 20 6d 61 79 20 63 72 65 61 74 65 20 61 20  ss may create a 
5a90: 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c 65 20 61  large log file a
5aa0: 6e 64 20 71 75 65 72 79 0a 23 20 20 20 20 20 20  nd query.#      
5ab0: 20 20 20 20 20 20 20 74 68 65 20 64 61 74 61 62         the datab
5ac0: 61 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74  ase (including t
5ad0: 68 65 20 6c 6f 67 20 66 69 6c 65 20 74 68 61 74  he log file that
5ae0: 20 69 74 20 69 74 73 65 6c 66 20 63 72 65 61 74   it itself creat
5af0: 65 64 29 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e  ed)..#.# wal-13.
5b00: 33 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69  3.*: Test that i
5b10: 66 20 61 20 76 65 72 79 20 6c 61 72 67 65 20 6c  f a very large l
5b20: 6f 67 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  og file is creat
5b30: 65 64 2c 20 61 6e 64 20 74 68 65 6e 20 61 0a 23  ed, and then a.#
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 63               sec
5b50: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ond connection i
5b60: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  s opened on the 
5b70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
5b80: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 0a 23 20  t is possible.# 
5b90: 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20 71              to q
5ba0: 75 65 72 79 20 74 68 65 20 64 61 74 61 62 61 73  uery the databas
5bb0: 65 20 28 61 6e 64 20 74 68 65 20 76 65 72 79 20  e (and the very 
5bc0: 6c 61 72 67 65 20 6c 6f 67 29 20 75 73 69 6e 67  large log) using
5bd0: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
5be0: 20 20 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63     second connec
5bf0: 74 69 6f 6e 2e 0a 23 0a 23 20 77 61 6c 2d 31 33  tion..#.# wal-13
5c00: 2e 34 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20  .4.*: Same test 
5c10: 61 73 20 77 61 6c 2d 31 33 2e 33 2e 2a 2e 20 45  as wal-13.3.*. E
5c20: 78 63 65 70 74 20 69 6e 20 74 68 69 73 20 63 61  xcept in this ca
5c30: 73 65 20 74 68 65 20 73 65 63 6f 6e 64 0a 23 20  se the second.# 
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e              conn
5c50: 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  ection is opened
5c60: 20 62 79 20 61 6e 20 65 78 74 65 72 6e 61 6c 20   by an external 
5c70: 70 72 6f 63 65 73 73 2e 0a 23 0a 64 6f 5f 74 65  process..#.do_te
5c80: 73 74 20 77 61 6c 2d 31 33 2e 31 2e 31 20 7b 0a  st wal-13.1.1 {.
5c90: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69    list [file exi
5ca0: 73 74 73 20 74 65 73 74 2e 64 62 5d 20 5b 66 69  sts test.db] [fi
5cb0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
5cc0: 62 2d 77 61 6c 5d 0a 7d 20 7b 31 20 30 7d 0a 64  b-wal].} {1 0}.d
5cd0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e  o_test wal-13.1.
5ce0: 32 20 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f 70  2 {.  set fd [op
5cf0: 65 6e 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 77  en test.db-wal w
5d00: 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65 78  ].  seek $fd [ex
5d10: 70 72 20 32 30 30 2a 31 30 32 34 2a 31 30 32 34  pr 200*1024*1024
5d20: 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22 22 0a  ].  puts $fd "".
5d30: 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 73 71    close $fd.  sq
5d40: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
5d50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
5d60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a  ECT * FROM t2 }.
5d70: 7d 20 7b 42 20 32 7d 0a 62 72 65 61 6b 70 6f 69  } {B 2}.breakpoi
5d80: 6e 74 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  nt.do_test wal-1
5d90: 33 2e 31 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f  3.1.3 {.  db clo
5da0: 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  se.  file exists
5db0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 7b   test.db-wal.} {
5dc0: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  0}..do_test wal-
5dd0: 31 33 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74  13.2.1 {.  sqlit
5de0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
5df0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
5e00: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
5e10: 32 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  2 }.} {1}.do_tes
5e20: 74 20 77 61 6c 2d 31 33 2e 32 2e 32 20 7b 0a 20  t wal-13.2.2 {. 
5e30: 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f   db function blo
5e40: 62 20 62 6c 6f 62 0a 20 20 66 6f 72 20 7b 73 65  b blob.  for {se
5e50: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 36 7d  t i 0} {$i < 16}
5e60: 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20   {incr i} {.    
5e70: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
5e80: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
5e90: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
5ea0: 34 30 30 29 20 46 52 4f 4d 20 74 32 20 7d 0a 20  400) FROM t2 }. 
5eb0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
5ec0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
5ed0: 52 4f 4d 20 74 32 20 7d 0a 7d 20 5b 65 78 70 72  ROM t2 }.} [expr
5ee0: 20 69 6e 74 28 70 6f 77 28 32 2c 20 31 36 29 29   int(pow(2, 16))
5ef0: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33  ].do_test wal-13
5f00: 2e 32 2e 33 20 7b 0a 20 20 65 78 70 72 20 5b 66  .2.3 {.  expr [f
5f10: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5f20: 2d 77 61 6c 5d 20 3e 20 5b 77 61 6c 5f 66 69 6c  -wal] > [wal_fil
5f30: 65 5f 73 69 7a 65 20 33 33 30 30 30 20 31 30 32  e_size 33000 102
5f40: 34 5d 0a 7d 20 31 0a 0a 64 6f 5f 6d 75 6c 74 69  4].} 1..do_multi
5f50: 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
5f60: 0a 20 20 69 6e 63 72 20 74 6e 20 32 0a 0a 20 20  .  incr tn 2..  
5f70: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24  do_test wal-13.$
5f80: 74 6e 2e 30 20 7b 0a 20 20 20 20 73 71 6c 31 20  tn.0 {.    sql1 
5f90: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a  {.      PRAGMA j
5fa0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
5fb0: 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  L;.      CREATE 
5fc0: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
5fd0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5fe0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
5ff0: 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20 7d 0a  lob(800);.    }.
6000: 20 20 20 20 73 71 6c 31 20 7b 20 53 45 4c 45 43      sql1 { SELEC
6010: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
6020: 74 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 20 20  t1 }.  } {1}..  
6030: 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b  for {set ii 1} {
6040: 24 69 69 3c 31 36 7d 20 7b 69 6e 63 72 20 69 69  $ii<16} {incr ii
6050: 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  } {.    do_test 
6060: 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e 61  wal-13.$tn.$ii.a
6070: 20 7b 0a 20 20 20 20 20 20 73 71 6c 32 20 7b 20   {.      sql2 { 
6080: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
6090: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
60a0: 28 38 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a  (800) FROM t1 }.
60b0: 20 20 20 20 20 20 73 71 6c 32 20 7b 20 53 45 4c        sql2 { SEL
60c0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
60d0: 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78  M t1 }.    } [ex
60e0: 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20  pr (1<<$ii)].   
60f0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e   do_test wal-13.
6100: 24 74 6e 2e 24 69 69 2e 62 20 7b 0a 20 20 20 20  $tn.$ii.b {.    
6110: 20 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20    sql1 { SELECT 
6120: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
6130: 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 28   }.    } [expr (
6140: 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f 5f  1<<$ii)].    do_
6150: 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e  test wal-13.$tn.
6160: 24 69 69 2e 63 20 7b 0a 20 20 20 20 20 20 73 71  $ii.c {.      sq
6170: 6c 31 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  l1 { SELECT coun
6180: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20  t(*) FROM t1 }. 
6190: 20 20 20 7d 20 5b 65 78 70 72 20 28 31 3c 3c 24     } [expr (1<<$
61a0: 69 69 29 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74  ii)].    do_test
61b0: 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e   wal-13.$tn.$ii.
61c0: 64 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b  d {.      sql1 {
61d0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
61e0: 79 5f 63 68 65 63 6b 20 7d 0a 20 20 20 20 7d 20  y_check }.    } 
61f0: 7b 6f 6b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  {ok}.  }.}..#---
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6240: 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 61  ------.# Check a
6250: 20 66 75 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20   fun corruption 
6260: 63 61 73 65 20 68 61 73 20 62 65 65 6e 20 66 69  case has been fi
6270: 78 65 64 2e 0a 23 0a 23 20 54 68 65 20 70 72 6f  xed..#.# The pro
6280: 62 6c 65 6d 20 77 61 73 20 74 68 61 74 20 61 66  blem was that af
6290: 74 65 72 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  ter performing a
62a0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 75 73 69 6e   checkpoint usin
62b0: 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 23  g a connection.#
62c0: 20 74 68 61 74 20 68 61 64 20 61 6e 20 6f 75 74   that had an out
62d0: 2d 6f 66 2d 64 61 74 65 20 70 61 67 65 72 2d 63  -of-date pager-c
62e0: 61 63 68 65 2c 20 74 68 65 20 6e 65 78 74 20 74  ache, the next t
62f0: 69 6d 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ime the connecti
6300: 6f 6e 20 77 61 73 0a 23 20 75 73 65 64 20 69 74  on was.# used it
6310: 20 64 69 64 20 6e 6f 74 20 72 65 61 6c 69 7a 65   did not realize
6320: 20 74 68 65 20 63 61 63 68 65 20 77 61 73 20 6f   the cache was o
6330: 75 74 2d 6f 66 2d 64 61 74 65 20 61 6e 64 20 70  ut-of-date and p
6340: 72 6f 63 65 65 64 65 64 20 74 6f 0a 23 20 6f 70  roceeded to.# op
6350: 65 72 61 74 65 20 77 69 74 68 20 61 6e 20 69 6e  erate with an in
6360: 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65  consistent cache
6370: 2e 20 4c 65 61 64 69 6e 67 20 74 6f 20 63 6f 72  . Leading to cor
6380: 72 75 70 74 69 6f 6e 2e 0a 23 0a 63 61 74 63 68  ruption..#.catch
6390: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 63 61   { db close }.ca
63a0: 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20  tch { db2 close 
63b0: 7d 0a 63 61 74 63 68 20 7b 20 64 62 33 20 63 6c  }.catch { db3 cl
63c0: 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65 6c 65 74  ose }.forcedelet
63d0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
63e0: 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20 64 62  b-wal.sqlite3 db
63f0: 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33   test.db.sqlite3
6400: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 64 6f 5f   db2 test.db.do_
6410: 74 65 73 74 20 77 61 6c 2d 31 34 20 7b 0a 20 20  test wal-14 {.  
6420: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
6430: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6440: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45  e = WAL;.    CRE
6450: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
6460: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
6470: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6480: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
6490: 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d  blob(10), random
64a0: 62 6c 6f 62 28 31 30 30 29 29 3b 0a 20 20 20 20  blob(100));.    
64b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
64c0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
64d0: 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  (10), randomblob
64e0: 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (100) FROM t1;. 
64f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6500: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
6510: 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62  lob(10), randomb
6520: 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31  lob(100) FROM t1
6530: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6540: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
6550: 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64  omblob(10), rand
6560: 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d  omblob(100) FROM
6570: 20 74 31 3b 0a 20 20 7d 0a 0a 20 20 64 62 32 20   t1;.  }..  db2 
6580: 65 76 61 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45  eval { .    INSE
6590: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
65a0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29  T randomblob(10)
65b0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
65c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
65d0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
65e0: 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e  domblob(10), ran
65f0: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20  domblob(100);.  
6600: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6610: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6620: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
6630: 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53  ob(100);.    INS
6640: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
6650: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  CT randomblob(10
6660: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
6670: 30 29 3b 0a 20 20 7d 0a 0a 20 20 23 20 41 66 74  0);.  }..  # Aft
6680: 65 72 20 65 78 65 63 75 74 69 6e 67 20 74 68 65  er executing the
6690: 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65   "PRAGMA wal_che
66a0: 63 6b 70 6f 69 6e 74 22 2c 20 63 6f 6e 6e 65 63  ckpoint", connec
66b0: 74 69 6f 6e 20 5b 64 62 5d 20 77 61 73 20 62 65  tion [db] was be
66c0: 69 6e 67 0a 20 20 23 20 6c 65 66 74 20 77 69 74  ing.  # left wit
66d0: 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  h an inconsisten
66e0: 74 20 63 61 63 68 65 2e 20 52 75 6e 6e 69 6e 67  t cache. Running
66f0: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
6700: 58 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 23 20  X statement.  # 
6710: 69 6e 20 74 68 69 73 20 73 74 61 74 65 20 6c 65  in this state le
6720: 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
6730: 72 72 75 70 74 69 6f 6e 2e 0a 20 20 63 61 74 63  rruption..  catc
6740: 68 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  hsql { .    PRAG
6750: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
6760: 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  t;.    CREATE IN
6770: 44 45 58 20 69 31 20 6f 6e 20 74 31 28 62 29 3b  DEX i1 on t1(b);
6780: 0a 20 20 7d 0a 20 20 20 0a 20 20 64 62 32 20 65  .  }.   .  db2 e
6790: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  val { PRAGMA int
67a0: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 7d  egrity_check }.}
67b0: 20 7b 6f 6b 7d 0a 0a 63 61 74 63 68 20 7b 20 64   {ok}..catch { d
67c0: 62 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20  b close }.catch 
67d0: 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 0a 23  { db2 close }..#
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
6830: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
6840: 6f 66 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31  of tests - wal-1
6850: 35 2e 2a 20 2d 20 66 6f 63 75 73 20 6f 6e 20 74  5.* - focus on t
6860: 65 73 74 69 6e 67 20 74 68 65 20 0a 23 20 69 6d  esting the .# im
6870: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
6880: 74 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  the sqlite3_wal_
6890: 63 68 65 63 6b 70 6f 69 6e 74 28 29 20 69 6e 74  checkpoint() int
68a0: 65 72 66 61 63 65 2e 0a 23 0a 66 6f 72 63 65 64  erface..#.forced
68b0: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65  elete test.db te
68c0: 73 74 2e 64 62 2d 77 61 6c 0a 73 71 6c 69 74 65  st.db-wal.sqlite
68d0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f  3 db test.db.do_
68e0: 74 65 73 74 20 77 61 6c 2d 31 35 2e 31 20 7b 0a  test wal-15.1 {.
68f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6900: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
6910: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47  um = 0;.    PRAG
6920: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
6930: 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  024;.    PRAGMA 
6940: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
6950: 41 4c 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  AL;.  }.  execsq
6960: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
6970: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
6980: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6990: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
69a0: 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74    }.} {}..# Test
69b0: 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69   that an error i
69c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
69d0: 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
69e0: 69 73 20 6e 6f 74 20 72 65 63 6f 67 6e 69 7a 65  is not recognize
69f0: 64 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  d.#.do_test wal-
6a00: 31 35 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74  15.2.1 {.  sqlit
6a10: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
6a20: 74 20 64 62 20 61 75 78 0a 7d 20 7b 53 51 4c 49  t db aux.} {SQLI
6a30: 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73  TE_ERROR}.do_tes
6a40: 74 20 77 61 6c 2d 31 35 2e 32 2e 32 20 7b 0a 20  t wal-15.2.2 {. 
6a50: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
6a60: 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52   db.} {SQLITE_ER
6a70: 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  ROR}.do_test wal
6a80: 2d 31 35 2e 32 2e 33 20 7b 0a 20 20 73 71 6c 69  -15.2.3 {.  sqli
6a90: 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20  te3_errmsg db.} 
6aa0: 7b 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73  {unknown databas
6ab0: 65 3a 20 61 75 78 7d 0a 0a 23 20 54 65 73 74 20  e: aux}..# Test 
6ac0: 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69 73  that an error is
6ad0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 20   returned if an 
6ae0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
6af0: 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 0a 23 20  to checkpoint.# 
6b00: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
6b10: 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   is open on the 
6b20: 64 61 74 61 62 61 73 65 2e 0a 23 0a 64 6f 5f 74  database..#.do_t
6b30: 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e 31 20 7b  est wal-15.3.1 {
6b40: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
6b50: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
6b60: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6b70: 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 73  S(3, 4);.  }.  s
6b80: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
6b90: 70 6f 69 6e 74 20 64 62 20 6d 61 69 6e 0a 7d 20  point db main.} 
6ba0: 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a  {SQLITE_LOCKED}.
6bb0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 33  do_test wal-15.3
6bc0: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .2 {.  sqlite3_e
6bd0: 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c  rrcode db.} {SQL
6be0: 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74  ITE_LOCKED}.do_t
6bf0: 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e 33 20 7b  est wal-15.3.3 {
6c00: 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  .  sqlite3_errms
6c10: 67 20 64 62 0a 7d 20 7b 64 61 74 61 62 61 73 65  g db.} {database
6c20: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
6c30: 7d 0a 0a 23 20 45 61 72 6c 69 65 72 20 76 65 72  }..# Earlier ver
6c40: 73 69 6f 6e 73 20 72 65 74 75 72 6e 65 64 20 61  sions returned a
6c50: 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
6c60: 6e 65 64 20 69 66 20 74 68 65 20 64 62 20 63 61  ned if the db ca
6c70: 6e 6e 6f 74 20 62 65 20 0a 23 20 63 68 65 63 6b  nnot be .# check
6c80: 70 6f 69 6e 74 65 64 20 62 65 63 61 75 73 65 20  pointed because 
6c90: 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
6ca0: 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74   another connect
6cb0: 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 0a  ion. Check that.
6cc0: 23 20 74 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e  # this is no lon
6cd0: 67 65 72 20 74 68 65 20 63 61 73 65 2e 0a 23 0a  ger the case..#.
6ce0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
6cf0: 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  .db.do_test wal-
6d00: 31 35 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  15.4.1 {.  execs
6d10: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
6d20: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
6d30: 4d 20 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20  M t1;.  } db2.} 
6d40: 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {1 2}.do_test wa
6d50: 6c 2d 31 35 2e 34 2e 32 20 7b 0a 20 20 65 78 65  l-15.4.2 {.  exe
6d60: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  csql { COMMIT }.
6d70: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
6d80: 65 63 6b 70 6f 69 6e 74 20 64 62 0a 7d 20 7b 53  eckpoint db.} {S
6d90: 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73  QLITE_OK}.do_tes
6da0: 74 20 77 61 6c 2d 31 35 2e 34 2e 33 20 7b 0a 20  t wal-15.4.3 {. 
6db0: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20   sqlite3_errmsg 
6dc0: 64 62 0a 7d 20 7b 6e 6f 74 20 61 6e 20 65 72 72  db.} {not an err
6dd0: 6f 72 7d 0a 0a 23 20 41 66 74 65 72 20 5b 64 62  or}..# After [db
6de0: 32 5d 20 64 72 6f 70 73 20 69 74 73 20 6c 6f 63  2] drops its loc
6df0: 6b 2c 20 5b 64 62 5d 20 6d 61 79 20 63 68 65 63  k, [db] may chec
6e00: 6b 70 6f 69 6e 74 20 74 68 65 20 64 62 2e 0a 23  kpoint the db..#
6e10: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
6e20: 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.4 {.  execsql 
6e30: 7b 20 43 4f 4d 4d 49 54 20 7d 20 64 62 32 0a 20  { COMMIT } db2. 
6e40: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
6e50: 63 6b 70 6f 69 6e 74 20 64 62 0a 7d 20 7b 53 51  ckpoint db.} {SQ
6e60: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
6e70: 20 77 61 6c 2d 31 35 2e 34 2e 35 20 7b 0a 20 20   wal-15.4.5 {.  
6e80: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64  sqlite3_errmsg d
6e90: 62 0a 7d 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f  b.} {not an erro
6ea0: 72 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  r}.do_test wal-1
6eb0: 35 2e 34 2e 36 20 7b 0a 20 20 66 69 6c 65 20 73  5.4.6 {.  file s
6ec0: 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65  ize test.db.} [e
6ed0: 78 70 72 20 31 30 32 34 2a 32 5d 0a 0a 63 61 74  xpr 1024*2]..cat
6ee0: 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d  ch { db2 close }
6ef0: 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73  .catch { db clos
6f00: 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e }..#----------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6f50: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
6f60: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
6f70: 20 77 61 6c 2d 31 36 2e 2a 20 2d 20 74 65 73 74   wal-16.* - test
6f80: 20 74 68 61 74 20 69 66 20 61 20 4e 55 4c 4c 20   that if a NULL 
6f90: 70 6f 69 6e 74 65 72 20 6f 72 0a 23 20 61 6e 20  pointer or.# an 
6fa0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20  empty string is 
6fb0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
6fc0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66  cond argument of
6fd0: 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f   the wal_checkpo
6fe0: 69 6e 74 28 29 0a 23 20 41 50 49 2c 20 61 6e 20  int().# API, an 
6ff0: 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
7000: 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6c  to checkpoint al
7010: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
7020: 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20  ases..#.foreach 
7030: 7b 74 6e 20 63 6b 70 74 5f 63 6d 64 20 63 6b 70  {tn ckpt_cmd ckp
7040: 74 5f 72 65 73 20 63 6b 70 74 5f 6d 61 69 6e 20  t_res ckpt_main 
7050: 63 6b 70 74 5f 61 75 78 7d 20 7b 0a 20 20 31 20  ckpt_aux} {.  1 
7060: 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65  {sqlite3_wal_che
7070: 63 6b 70 6f 69 6e 74 20 64 62 7d 20 20 20 20 20  ckpoint db}     
7080: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
7090: 4f 4b 20 20 20 20 20 31 20 31 0a 20 20 32 20 7b  OK     1 1.  2 {
70a0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
70b0: 6b 70 6f 69 6e 74 20 64 62 20 22 22 7d 20 20 20  kpoint db ""}   
70c0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
70d0: 4b 20 20 20 20 20 31 20 31 0a 20 20 33 20 7b 64  K     1 1.  3 {d
70e0: 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 77  b eval "PRAGMA w
70f0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20  al_checkpoint"} 
7100: 20 20 20 20 20 20 20 7b 30 20 31 30 20 31 30 7d         {0 10 10}
7110: 20 20 20 20 20 31 20 31 0a 0a 20 20 34 20 7b 73       1 1..  4 {s
7120: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
7130: 70 6f 69 6e 74 20 64 62 20 6d 61 69 6e 7d 20 20  point db main}  
7140: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
7150: 20 20 20 20 20 31 20 30 0a 20 20 35 20 7b 73 71       1 0.  5 {sq
7160: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
7170: 6f 69 6e 74 20 64 62 20 61 75 78 7d 20 20 20 20  oint db aux}    
7180: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20        SQLITE_OK 
7190: 20 20 20 20 30 20 31 0a 20 20 36 20 7b 73 71 6c      0 1.  6 {sql
71a0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
71b0: 69 6e 74 20 64 62 20 74 65 6d 70 7d 20 20 20 20  int db temp}    
71c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20       SQLITE_OK  
71d0: 20 20 20 30 20 30 0a 20 20 37 20 7b 64 62 20 65     0 0.  7 {db e
71e0: 76 61 6c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e  val "PRAGMA main
71f0: 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22  .wal_checkpoint"
7200: 7d 20 20 20 7b 30 20 31 30 20 31 30 7d 20 20 20  }   {0 10 10}   
7210: 20 20 31 20 30 0a 20 20 38 20 7b 64 62 20 65 76    1 0.  8 {db ev
7220: 61 6c 20 22 50 52 41 47 4d 41 20 61 75 78 2e 77  al "PRAGMA aux.w
7230: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20  al_checkpoint"} 
7240: 20 20 20 7b 30 20 31 33 20 31 33 7d 20 20 20 20     {0 13 13}    
7250: 20 30 20 31 0a 20 20 39 20 7b 64 62 20 65 76 61   0 1.  9 {db eva
7260: 6c 20 22 50 52 41 47 4d 41 20 74 65 6d 70 2e 77  l "PRAGMA temp.w
7270: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20  al_checkpoint"} 
7280: 20 20 7b 30 20 2d 31 20 2d 31 7d 20 20 20 20 20    {0 -1 -1}     
7290: 30 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  0 0.} {.  do_tes
72a0: 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 31 20 7b  t wal-16.$tn.1 {
72b0: 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .    forcedelete
72c0: 20 74 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e   test2.db test2.
72d0: 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d  db-wal test2.db-
72e0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 66 6f 72 63  journal.    forc
72f0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
7300: 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74  test.db-wal test
7310: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 0a 20 20 20  .db-journal..   
7320: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
7330: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
7340: 7b 0a 20 20 20 20 20 20 41 54 54 41 43 48 20 27  {.      ATTACH '
7350: 74 65 73 74 32 2e 64 62 27 20 41 53 20 61 75 78  test2.db' AS aux
7360: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
7370: 61 69 6e 2e 61 75 74 6f 5f 76 61 63 75 75 6d 20  ain.auto_vacuum 
7380: 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  = 0;.      PRAGM
7390: 41 20 61 75 78 2e 61 75 74 6f 5f 76 61 63 75 75  A aux.auto_vacuu
73a0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41  m = 0;.      PRA
73b0: 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c  GMA main.journal
73c0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
73d0: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f     PRAGMA aux.jo
73e0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
73f0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
7400: 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ain.synchronous 
7410: 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20  = NORMAL;.      
7420: 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68  PRAGMA aux.synch
7430: 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b  ronous = NORMAL;
7440: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 20  .    }.  } {wal 
7450: 77 61 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  wal}..  do_test 
7460: 77 61 6c 2d 31 36 2e 24 74 6e 2e 32 20 7b 0a 20  wal-16.$tn.2 {. 
7470: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
7480: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7490: 6d 61 69 6e 2e 74 31 28 61 2c 20 62 2c 20 50 52  main.t1(a, b, PR
74a0: 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29  IMARY KEY(a, b))
74b0: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
74c0: 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62  ABLE aux.t2(a, b
74d0: 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c  , PRIMARY KEY(a,
74e0: 20 62 29 29 3b 0a 0a 20 20 20 20 20 20 49 4e 53   b));..      INS
74f0: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
7500: 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(1, randomblob
7510: 28 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49  (1000));.      I
7520: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
7530: 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(2, randombl
7540: 6f 62 28 31 30 30 30 29 29 3b 0a 20 20 20 20 20  ob(1000));.     
7550: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
7560: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
7570: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 6c  ;.    }.  .    l
7580: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
7590: 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69  est.db] [file si
75a0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
75b0: 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20    } [list [expr 
75c0: 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c  1*1024] [wal_fil
75d0: 65 5f 73 69 7a 65 20 31 30 20 31 30 32 34 5d 5d  e_size 10 1024]]
75e0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
75f0: 36 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 6c 69  6.$tn.3 {.    li
7600: 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  st [file size te
7610: 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69  st2.db] [file si
7620: 7a 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 5d  ze test2.db-wal]
7630: 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72  .  } [list [expr
7640: 20 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69   1*1024] [wal_fi
7650: 6c 65 5f 73 69 7a 65 20 31 33 20 31 30 32 34 5d  le_size 13 1024]
7660: 5d 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 77  ].  .  do_test w
7670: 61 6c 2d 31 36 2e 24 74 6e 2e 34 20 5b 6c 69 73  al-16.$tn.4 [lis
7680: 74 20 65 76 61 6c 20 24 63 6b 70 74 5f 63 6d 64  t eval $ckpt_cmd
7690: 5d 20 24 63 6b 70 74 5f 72 65 73 0a 20 20 0a 20  ] $ckpt_res.  . 
76a0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e   do_test wal-16.
76b0: 24 74 6e 2e 35 20 7b 0a 20 20 20 20 6c 69 73 74  $tn.5 {.    list
76c0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
76d0: 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  .db] [file size 
76e0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d  test.db-wal].  }
76f0: 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 28 24 63   [list [expr ($c
7700: 6b 70 74 5f 6d 61 69 6e 20 3f 20 37 20 3a 20 31  kpt_main ? 7 : 1
7710: 29 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c  )*1024] [wal_fil
7720: 65 5f 73 69 7a 65 20 31 30 20 31 30 32 34 5d 5d  e_size 10 1024]]
7730: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..  do_test wal-
7740: 31 36 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 6c  16.$tn.6 {.    l
7750: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
7760: 65 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73  est2.db] [file s
7770: 69 7a 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  ize test2.db-wal
7780: 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70  ].  } [list [exp
7790: 72 20 28 24 63 6b 70 74 5f 61 75 78 20 3f 20 37  r ($ckpt_aux ? 7
77a0: 20 3a 20 31 29 2a 31 30 32 34 5d 20 5b 77 61 6c   : 1)*1024] [wal
77b0: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 33 20 31 30  _file_size 13 10
77c0: 32 34 5d 5d 0a 0a 20 20 63 61 74 63 68 20 7b 20  24]]..  catch { 
77d0: 64 62 20 63 6c 6f 73 65 20 7d 0a 7d 0a 0a 23 2d  db close }.}..#-
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
7830: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d  ollowing tests -
7840: 20 77 61 6c 2d 31 37 2e 2a 20 2d 20 61 74 74 65   wal-17.* - atte
7850: 6d 70 74 20 74 6f 20 76 65 72 69 66 79 20 74 68  mpt to verify th
7860: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a 23  at the correct.#
7870: 20 6e 75 6d 62 65 72 20 6f 66 20 22 70 61 64 64   number of "padd
7880: 69 6e 67 22 20 66 72 61 6d 65 73 20 61 72 65 20  ing" frames are 
7890: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
78a0: 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20  log file when a 
78b0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 69 73  transaction.# is
78c0: 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 73 79   committed in sy
78d0: 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 6d  nchronous=FULL m
78e0: 6f 64 65 2e 0a 23 20 0a 23 20 44 6f 20 74 68 69  ode..# .# Do thi
78f0: 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20  s by creating a 
7900: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 75 73  database that us
7910: 65 73 20 35 31 32 20 62 79 74 65 20 70 61 67 65  es 512 byte page
7920: 73 2e 20 54 68 65 6e 20 77 72 69 74 69 6e 67 0a  s. Then writing.
7930: 23 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  # a transaction 
7940: 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 31 37  that modifies 17
7950: 31 20 70 61 67 65 73 2e 20 49 6e 20 73 79 6e 63  1 pages. In sync
7960: 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 6d  hronous=NORMAL m
7970: 6f 64 65 2c 20 74 68 69 73 0a 23 20 70 72 6f 64  ode, this.# prod
7980: 75 63 65 73 20 61 20 6c 6f 67 20 66 69 6c 65 20  uces a log file 
7990: 6f 66 3a 0a 23 0a 23 20 20 20 33 32 20 2b 20 28  of:.#.#   32 + (
79a0: 32 34 2b 35 31 32 29 2a 31 37 31 20 3d 20 39 30  24+512)*171 = 90
79b0: 33 31 32 20 62 79 74 65 73 2e 0a 23 0a 23 20 53  312 bytes..#.# S
79c0: 6c 69 67 68 74 6c 79 20 6c 61 72 67 65 72 20 74  lightly larger t
79d0: 68 61 6e 20 31 31 2a 38 31 39 32 20 3d 20 39 30  han 11*8192 = 90
79e0: 31 31 32 20 62 79 74 65 73 2e 0a 23 0a 23 20 52  112 bytes..#.# R
79f0: 75 6e 20 74 68 65 20 74 65 73 74 20 75 73 69 6e  un the test usin
7a00: 67 20 76 61 72 69 6f 75 73 20 64 69 66 66 65 72  g various differ
7a10: 65 6e 74 20 73 65 63 74 6f 72 2d 73 69 7a 65 73  ent sector-sizes
7a20: 2e 20 49 6e 20 65 61 63 68 20 63 61 73 65 2c 20  . In each case, 
7a30: 74 68 65 0a 23 20 57 41 4c 20 63 6f 64 65 20 73  the.# WAL code s
7a40: 68 6f 75 6c 64 20 77 72 69 74 65 20 74 68 65 20  hould write the 
7a50: 39 30 33 30 30 20 62 79 74 65 73 20 6f 66 20 6c  90300 bytes of l
7a60: 6f 67 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  og file containi
7a70: 6e 67 20 74 68 65 20 0a 23 20 74 72 61 6e 73 61  ng the .# transa
7a80: 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 70 70 65  ction, then appe
7a90: 6e 64 20 61 73 20 6d 61 79 20 66 72 61 6d 65 73  nd as may frames
7aa0: 20 61 73 20 61 72 65 20 72 65 71 75 69 72 65 64   as are required
7ab0: 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 0a 23   to extend the.#
7ac0: 20 6c 6f 67 20 66 69 6c 65 20 73 6f 20 74 68 61   log file so tha
7ad0: 74 20 6e 6f 20 70 61 72 74 20 6f 66 20 74 68 65  t no part of the
7ae0: 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
7af0: 6e 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  n will be writte
7b00: 6e 20 69 6e 74 6f 0a 23 20 61 20 64 69 73 6b 2d  n into.# a disk-
7b10: 73 65 63 74 6f 72 20 75 73 65 64 20 62 79 20 74  sector used by t
7b20: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 75 73 74 20  ransaction just 
7b30: 63 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a 73 65 74  committed..#.set
7b40: 20 6f 6c 64 5f 70 65 6e 64 69 6e 67 5f 62 79 74   old_pending_byt
7b50: 65 20 5b 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  e [sqlite3_test_
7b60: 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f  control_pending_
7b70: 62 79 74 65 20 30 78 31 30 30 30 30 30 30 30 5d  byte 0x10000000]
7b80: 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73  .catch { db clos
7b90: 65 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  e }.foreach {tn 
7ba0: 73 65 63 74 6f 72 73 69 7a 65 20 6c 6f 67 73 69  sectorsize logsi
7bb0: 7a 65 7d 20 22 0a 20 20 31 20 20 20 31 32 38 20  ze} ".  1   128 
7bc0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
7bd0: 31 37 32 20 35 31 32 5d 0a 20 20 32 20 20 20 32  172 512].  2   2
7be0: 35 36 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69  56  [wal_file_si
7bf0: 7a 65 20 31 37 32 20 35 31 32 5d 0a 20 20 33 20  ze 172 512].  3 
7c00: 20 20 35 31 32 20 20 5b 77 61 6c 5f 66 69 6c 65    512  [wal_file
7c10: 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d 20 0a  _size 172 512] .
7c20: 20 20 34 20 20 31 30 32 34 20 20 5b 77 61 6c 5f    4  1024  [wal_
7c30: 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35 31  file_size 172 51
7c40: 32 5d 0a 20 20 35 20 20 32 30 34 38 20 20 5b 77  2].  5  2048  [w
7c50: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32  al_file_size 172
7c60: 20 35 31 32 5d 0a 20 20 36 20 20 34 30 39 36 20   512].  6  4096 
7c70: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
7c80: 31 37 36 20 35 31 32 5d 0a 20 20 37 20 20 38 31  176 512].  7  81
7c90: 39 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69  92  [wal_file_si
7ca0: 7a 65 20 31 38 34 20 35 31 32 5d 0a 22 20 7b 0a  ze 184 512]." {.
7cb0: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
7cc0: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
7cd0: 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  l test.db-journa
7ce0: 6c 0a 20 20 73 71 6c 69 74 65 33 5f 73 69 6d 75  l.  sqlite3_simu
7cf0: 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 73 65 63  late_device -sec
7d00: 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 73  torsize $sectors
7d10: 69 7a 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ize.  sqlite3 db
7d20: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 64 65   test.db -vfs de
7d30: 76 73 79 6d 0a 0a 20 20 64 6f 5f 74 65 73 74 20  vsym..  do_test 
7d40: 77 61 6c 2d 31 37 2e 24 74 6e 2e 31 20 7b 0a 20  wal-17.$tn.1 {. 
7d50: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
7d60: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
7d70: 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  acuum = 0;.     
7d80: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
7d90: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50  e = 512;.      P
7da0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
7db0: 20 3d 20 2d 32 30 30 30 3b 0a 20 20 20 20 20 20   = -2000;.      
7dc0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
7dd0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20  ode = WAL;.     
7de0: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
7df0: 6f 75 73 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20  ous = FULL;.    
7e00: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  }.    execsql {.
7e10: 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20        BEGIN;.   
7e20: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7e30: 74 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t(x);.    }.    
7e40: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
7e50: 69 3c 31 36 36 7d 20 7b 69 6e 63 72 20 69 7d 20  i<166} {incr i} 
7e60: 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  {.      execsql 
7e70: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 20  { INSERT INTO t 
7e80: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
7e90: 62 28 34 30 30 29 29 20 7d 0a 20 20 20 20 7d 0a  b(400)) }.    }.
7ea0: 20 20 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d      execsql COMM
7eb0: 49 54 0a 0a 20 20 20 20 66 69 6c 65 20 73 69 7a  IT..    file siz
7ec0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20  e test.db-wal.  
7ed0: 7d 20 24 6c 6f 67 73 69 7a 65 0a 0a 20 20 64 6f  } $logsize..  do
7ee0: 5f 74 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e  _test wal-17.$tn
7ef0: 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65 20 73 69  .2 {.    file si
7f00: 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 35  ze test.db.  } 5
7f10: 31 32 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  12..  do_test wa
7f20: 6c 2d 31 37 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  l-17.$tn.3 {.   
7f30: 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 66 69   db close.    fi
7f40: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
7f50: 20 20 7d 20 5b 65 78 70 72 20 35 31 32 2a 31 37    } [expr 512*17
7f60: 31 5d 0a 7d 0a 73 71 6c 69 74 65 33 5f 74 65 73  1].}.sqlite3_tes
7f70: 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e  t_control_pendin
7f80: 67 5f 62 79 74 65 20 24 6f 6c 64 5f 70 65 6e 64  g_byte $old_pend
7f90: 69 6e 67 5f 62 79 74 65 0a 0a 23 2d 2d 2d 2d 2d  ing_byte..#-----
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 74 65 73 74  ----.# This test
7ff0: 20 2d 20 77 61 6c 2d 31 38 2e 2a 20 2d 20 76 65   - wal-18.* - ve
8000: 72 69 66 69 65 73 20 61 20 63 6f 75 70 6c 65 20  rifies a couple 
8010: 6f 66 20 73 70 65 63 69 66 69 63 20 63 6f 6e 64  of specific cond
8020: 69 74 69 6f 6e 73 20 74 68 61 74 0a 23 20 6d 61  itions that.# ma
8030: 79 20 62 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  y be encountered
8040: 20 77 68 69 6c 65 20 72 65 63 6f 76 65 72 69 6e   while recoverin
8050: 67 20 61 20 6c 6f 67 20 66 69 6c 65 20 61 72 65  g a log file are
8060: 20 68 61 6e 64 6c 65 64 20 63 6f 72 72 65 63 74   handled correct
8070: 6c 79 3a 0a 23 0a 23 20 20 20 77 61 6c 2d 31 38  ly:.#.#   wal-18
8080: 2e 31 2e 2a 20 57 68 65 6e 20 74 68 65 20 66 69  .1.* When the fi
8090: 72 73 74 20 33 32 2d 62 69 74 73 20 6f 66 20 61  rst 32-bits of a
80a0: 20 66 72 61 6d 65 20 63 68 65 63 6b 73 75 6d 20   frame checksum 
80b0: 69 73 20 63 6f 72 72 65 63 74 20 62 75 74 20 0a  is correct but .
80c0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  #              t
80d0: 68 65 20 73 65 63 6f 6e 64 20 33 32 2d 62 69 74  he second 32-bit
80e0: 73 20 61 72 65 20 66 61 6c 73 65 2c 20 61 6e 64  s are false, and
80f0: 0a 23 0a 23 20 20 20 77 61 6c 2d 31 38 2e 32 2e  .#.#   wal-18.2.
8100: 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 2d  * When the page-
8110: 73 69 7a 65 20 66 69 65 6c 64 20 74 68 61 74 20  size field that 
8120: 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
8130: 61 72 74 20 6f 66 20 61 20 6c 6f 67 0a 23 20 20  art of a log.#  
8140: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
8150: 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 32   is a power of 2
8160: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31 36   greater than 16
8170: 33 38 34 20 6f 72 20 73 6d 61 6c 6c 65 72 20 74  384 or smaller t
8180: 68 61 6e 20 35 31 32 2e 0a 23 0a 66 6f 72 63 65  han 512..#.force
8190: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74  delete test.db t
81a0: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e  est.db-wal test.
81b0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65  db-journal.do_te
81c0: 73 74 20 77 61 6c 2d 31 38 2e 30 20 7b 0a 20 20  st wal-18.0 {.  
81d0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
81e0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
81f0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
8200: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
8210: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
8220: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47  um = 0;.    PRAG
8230: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8240: 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d  = WAL;.    PRAGM
8250: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
8260: 4f 46 46 3b 0a 0a 20 20 20 20 43 52 45 41 54 45  OFF;..    CREATE
8270: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20   TABLE t1(a, b, 
8280: 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20  UNIQUE(a, b));. 
8290: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
82a0: 31 20 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a  1 VALUES(0, 0);.
82b0: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
82c0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 0a 20 20 20 20  heckpoint;..    
82d0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
82e0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 20 20 20 20  ALUES(1, 2);    
82f0: 20 20 20 20 20 20 2d 2d 20 66 72 61 6d 65 73 20        -- frames 
8300: 31 20 61 6e 64 20 32 0a 20 20 20 20 49 4e 53 45  1 and 2.    INSE
8310: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8320: 53 28 33 2c 20 34 29 3b 20 20 20 20 20 20 20 20  S(3, 4);        
8330: 20 20 2d 2d 20 66 72 61 6d 65 73 20 33 20 61 6e    -- frames 3 an
8340: 64 20 34 0a 20 20 20 20 49 4e 53 45 52 54 20 49  d 4.    INSERT I
8350: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
8360: 20 36 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d   6);          --
8370: 20 66 72 61 6d 65 73 20 35 20 61 6e 64 20 36 0a   frames 5 and 6.
8380: 20 20 7d 0a 0a 20 20 66 6f 72 63 65 63 6f 70 79    }..  forcecopy
8390: 20 74 65 73 74 2e 64 62 20 74 65 73 74 58 2e 64   test.db testX.d
83a0: 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  b.  forcecopy te
83b0: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 58 2e  st.db-wal testX.
83c0: 64 62 2d 77 61 6c 0a 20 20 64 62 20 63 6c 6f 73  db-wal.  db clos
83d0: 65 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73  e.  list [file s
83e0: 69 7a 65 20 74 65 73 74 58 2e 64 62 5d 20 5b 66  ize testX.db] [f
83f0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 58 2e 64  ile size testX.d
8400: 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 5b  b-wal].} [list [
8410: 65 78 70 72 20 33 2a 31 30 32 34 5d 20 5b 77 61  expr 3*1024] [wa
8420: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 36 20 31 30  l_file_size 6 10
8430: 32 34 5d 5d 0a 0a 75 6e 73 65 74 20 2d 6e 6f 63  24]]..unset -noc
8440: 6f 6d 70 6c 61 69 6e 20 6e 46 72 61 6d 65 20 72  omplain nFrame r
8450: 65 73 75 6c 74 0a 66 6f 72 65 61 63 68 20 7b 6e  esult.foreach {n
8460: 46 72 61 6d 65 20 72 65 73 75 6c 74 7d 20 7b 0a  Frame result} {.
8470: 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
8480: 7b 30 20 30 7d 0a 20 20 20 20 20 20 20 20 20 31  {0 0}.         1
8490: 20 20 20 20 20 20 7b 30 20 30 7d 0a 20 20 20 20        {0 0}.    
84a0: 20 20 20 20 20 32 20 20 20 20 20 20 7b 30 20 30       2      {0 0
84b0: 20 31 20 32 7d 0a 20 20 20 20 20 20 20 20 20 33   1 2}.         3
84c0: 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 7d 0a        {0 0 1 2}.
84d0: 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
84e0: 7b 30 20 30 20 31 20 32 20 33 20 34 7d 0a 20 20  {0 0 1 2 3 4}.  
84f0: 20 20 20 20 20 20 20 35 20 20 20 20 20 20 7b 30         5      {0
8500: 20 30 20 31 20 32 20 33 20 34 7d 0a 20 20 20 20   0 1 2 3 4}.    
8510: 20 20 20 20 20 36 20 20 20 20 20 20 7b 30 20 30       6      {0 0
8520: 20 31 20 32 20 33 20 34 20 35 20 36 7d 0a 7d 20   1 2 3 4 5 6}.} 
8530: 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  {.  do_test wal-
8540: 31 38 2e 31 2e 24 6e 46 72 61 6d 65 20 7b 0a 20  18.1.$nFrame {. 
8550: 20 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73     forcecopy tes
8560: 74 58 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20  tX.db test.db.  
8570: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
8580: 58 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  X.db-wal test.db
8590: 2d 77 61 6c 0a 0a 20 20 20 20 68 65 78 69 6f 5f  -wal..    hexio_
85a0: 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 77 61  write test.db-wa
85b0: 6c 20 5b 65 78 70 72 20 32 34 20 2b 20 24 6e 46  l [expr 24 + $nF
85c0: 72 61 6d 65 2a 28 32 34 2b 31 30 32 34 29 20 2b  rame*(24+1024) +
85d0: 20 32 30 5d 20 30 30 30 30 30 30 30 30 0a 0a 20   20] 00000000.. 
85e0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
85f0: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
8600: 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43  l { .      SELEC
8610: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
8620: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
8630: 69 74 79 5f 63 68 65 63 6b 3b 20 0a 20 20 20 20  ity_check; .    
8640: 7d 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20 24 72  }.  } [concat $r
8650: 65 73 75 6c 74 20 6f 6b 5d 0a 20 20 64 62 20 63  esult ok].  db c
8660: 6c 6f 73 65 0a 7d 20 0a 0a 70 72 6f 63 20 72 61  lose.} ..proc ra
8670: 6e 64 6f 6d 62 6c 6f 62 20 7b 70 67 73 7a 7d 20  ndomblob {pgsz} 
8680: 7b 0a 20 20 73 71 6c 69 74 65 33 20 72 62 64 62  {.  sqlite3 rbdb
8690: 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 73 65 74 20   :memory:.  set 
86a0: 62 6c 6f 62 20 5b 72 62 64 62 20 6f 6e 65 20 7b  blob [rbdb one {
86b0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
86c0: 62 28 24 70 67 73 7a 29 7d 5d 0a 20 20 72 62 64  b($pgsz)}].  rbd
86d0: 62 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 62 6c  b close.  set bl
86e0: 6f 62 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67 63 6b  ob.}..proc logck
86f0: 73 75 6d 20 7b 63 6b 76 31 20 63 6b 76 32 20 62  sum {ckv1 ckv2 b
8700: 6c 6f 62 7d 20 7b 0a 20 20 75 70 76 61 72 20 24  lob} {.  upvar $
8710: 63 6b 76 31 20 63 31 0a 20 20 75 70 76 61 72 20  ckv1 c1.  upvar 
8720: 24 63 6b 76 32 20 63 32 0a 0a 20 20 23 20 53 69  $ckv2 c2..  # Si
8730: 6e 63 65 20 74 68 65 20 6d 61 67 69 63 20 6e 75  nce the magic nu
8740: 6d 62 65 72 20 61 74 20 74 68 65 20 73 74 61 72  mber at the star
8750: 74 20 6f 66 20 74 68 65 20 2d 77 61 6c 20 66 69  t of the -wal fi
8760: 6c 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 23  le header is.  #
8770: 20 39 33 31 30 37 31 36 31 38 20 74 68 61 74 20   931071618 that 
8780: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
8790: 68 65 20 63 6f 6e 74 65 6e 74 20 73 68 6f 75 6c  he content shoul
87a0: 64 20 61 6c 77 61 79 73 20 62 65 20 72 65 61 64  d always be read
87b0: 20 61 73 0a 20 20 23 20 6c 69 74 74 6c 65 2d 65   as.  # little-e
87c0: 6e 64 69 61 6e 2e 0a 20 20 23 20 0a 20 20 73 65  ndian..  # .  se
87d0: 74 20 73 63 61 6e 70 61 74 74 65 72 6e 20 69 2a  t scanpattern i*
87e0: 0a 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20  ..  binary scan 
87f0: 24 62 6c 6f 62 20 24 73 63 61 6e 70 61 74 74 65  $blob $scanpatte
8800: 72 6e 20 76 61 6c 75 65 73 0a 20 20 66 6f 72 65  rn values.  fore
8810: 61 63 68 20 7b 76 31 20 76 32 7d 20 24 76 61 6c  ach {v1 v2} $val
8820: 75 65 73 20 7b 0a 20 20 20 20 73 65 74 20 63 31  ues {.    set c1
8830: 20 5b 65 78 70 72 20 7b 28 24 63 31 20 2b 20 24   [expr {($c1 + $
8840: 76 31 20 2b 20 24 63 32 29 26 30 78 46 46 46 46  v1 + $c2)&0xFFFF
8850: 46 46 46 46 7d 5d 0a 20 20 20 20 73 65 74 20 63  FFFF}].    set c
8860: 32 20 5b 65 78 70 72 20 7b 28 24 63 32 20 2b 20  2 [expr {($c2 + 
8870: 24 76 32 20 2b 20 24 63 31 29 26 30 78 46 46 46  $v2 + $c1)&0xFFF
8880: 46 46 46 46 46 7d 5d 0a 20 20 7d 0a 7d 0a 0a 66  FFFFF}].  }.}..f
8890: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62  orcecopy test.db
88a0: 20 74 65 73 74 58 2e 64 62 0a 66 6f 72 65 61 63   testX.db.foreac
88b0: 68 20 7b 74 6e 20 70 67 73 7a 20 77 6f 72 6b 73  h {tn pgsz works
88c0: 7d 20 7b 20 0a 20 20 31 20 20 20 20 31 32 38 20  } { .  1    128 
88d0: 20 20 20 30 0a 20 20 32 20 20 20 20 32 35 36 20     0.  2    256 
88e0: 20 20 20 30 0a 20 20 33 20 20 20 20 35 31 32 20     0.  3    512 
88f0: 20 20 20 31 0a 20 20 34 20 20 20 31 30 32 34 20     1.  4   1024 
8900: 20 20 20 31 0a 20 20 35 20 20 20 32 30 34 38 20     1.  5   2048 
8910: 20 20 20 31 0a 20 20 36 20 20 20 34 30 39 36 20     1.  6   4096 
8920: 20 20 20 31 0a 20 20 37 20 20 20 38 31 39 32 20     1.  7   8192 
8930: 20 20 20 31 0a 20 20 38 20 20 31 36 33 38 34 20     1.  8  16384 
8940: 20 20 20 31 0a 20 20 39 20 20 33 32 37 36 38 20     1.  9  32768 
8950: 20 20 20 31 0a 20 31 30 20 20 36 35 35 33 36 20     1. 10  65536 
8960: 20 20 20 31 0a 20 31 31 20 31 33 31 30 37 32 20     1. 11 131072 
8970: 20 20 20 30 0a 20 31 31 20 20 20 31 30 31 36 20     0. 11   1016 
8980: 20 20 20 30 0a 7d 20 7b 0a 0a 20 20 69 66 20 7b     0.} {..  if {
8990: 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  $::SQLITE_MAX_PA
89a0: 47 45 5f 53 49 5a 45 20 3c 20 24 70 67 73 7a 7d  GE_SIZE < $pgsz}
89b0: 20 7b 0a 20 20 20 20 73 65 74 20 77 6f 72 6b 73   {.    set works
89c0: 20 30 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b 73   0.  }..  for {s
89d0: 65 74 20 70 67 20 31 7d 20 7b 24 70 67 20 3c 3d  et pg 1} {$pg <=
89e0: 20 33 7d 20 7b 69 6e 63 72 20 70 67 7d 20 7b 0a   3} {incr pg} {.
89f0: 20 20 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65      forcecopy te
8a00: 73 74 58 2e 64 62 20 74 65 73 74 2e 64 62 0a 20  stX.db test.db. 
8a10: 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74     forcedelete t
8a20: 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 0a 20 20  est.db-wal.  .  
8a30: 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20 74    # Check that t
8a40: 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77 20  he database now 
8a50: 65 78 69 73 74 73 20 61 6e 64 20 63 6f 6e 73 69  exists and consi
8a60: 73 74 73 20 6f 66 20 74 68 72 65 65 20 70 61 67  sts of three pag
8a70: 65 73 2e 20 41 6e 64 0a 20 20 20 20 23 20 74 68  es. And.    # th
8a80: 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61  at there is no a
8a90: 73 73 6f 63 69 61 74 65 64 20 77 61 6c 20 66 69  ssociated wal fi
8aa0: 6c 65 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f  le..    #.    do
8ab0: 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24  _test wal-18.2.$
8ac0: 74 6e 2e 24 70 67 2e 31 20 7b 20 66 69 6c 65 20  tn.$pg.1 { file 
8ad0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
8ae0: 61 6c 20 7d 20 30 0a 20 20 20 20 64 6f 5f 74 65  al } 0.    do_te
8af0: 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e  st wal-18.2.$tn.
8b00: 24 70 67 2e 32 20 7b 20 66 69 6c 65 20 65 78 69  $pg.2 { file exi
8b10: 73 74 73 20 74 65 73 74 2e 64 62 20 7d 20 31 0a  sts test.db } 1.
8b20: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
8b30: 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 33 20 7b  18.2.$tn.$pg.3 {
8b40: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
8b50: 64 62 20 7d 20 5b 65 78 70 72 20 31 30 32 34 2a  db } [expr 1024*
8b60: 33 5d 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73  3].  .    do_tes
8b70: 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24  t wal-18.2.$tn.$
8b80: 70 67 2e 34 20 7b 0a 0a 20 20 20 20 20 20 23 20  pg.4 {..      # 
8b90: 43 72 65 61 74 65 20 61 20 77 61 6c 20 66 69 6c  Create a wal fil
8ba0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
8bb0: 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 28  a single frame (
8bc0: 64 61 74 61 62 61 73 65 20 70 61 67 65 0a 20 20  database page.  
8bd0: 20 20 20 20 23 20 6e 75 6d 62 65 72 20 24 70 67      # number $pg
8be0: 29 20 77 69 74 68 20 74 68 65 20 63 6f 6d 6d 69  ) with the commi
8bf0: 74 20 66 6c 61 67 20 73 65 74 2e 20 54 68 65 20  t flag set. The 
8c00: 66 72 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69  frame checksum i
8c10: 73 0a 20 20 20 20 20 20 23 20 63 6f 72 72 65 63  s.      # correc
8c20: 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65  t, but the conte
8c30: 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  nts of the datab
8c40: 61 73 65 20 70 61 67 65 20 61 72 65 20 63 6f 72  ase page are cor
8c50: 72 75 70 74 2e 0a 20 20 20 20 20 20 23 0a 20 20  rupt..      #.  
8c60: 20 20 20 20 23 20 54 68 65 20 70 61 67 65 2d 73      # The page-s
8c70: 69 7a 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 66  ize in the log f
8c80: 69 6c 65 20 68 65 61 64 65 72 20 69 73 20 73 65  ile header is se
8c90: 74 20 74 6f 20 24 70 67 73 7a 2e 20 49 66 20 74  t to $pgsz. If t
8ca0: 68 65 0a 20 20 20 20 20 20 23 20 57 41 4c 20 63  he.      # WAL c
8cb0: 6f 64 65 20 63 6f 6e 73 69 64 65 72 73 20 24 70  ode considers $p
8cc0: 67 73 7a 20 74 6f 20 62 65 20 61 20 76 61 6c 69  gsz to be a vali
8cd0: 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  d SQLite databas
8ce0: 65 20 66 69 6c 65 20 70 61 67 65 2d 73 69 7a 65  e file page-size
8cf0: 2c 0a 20 20 20 20 20 20 23 20 74 68 65 20 64 61  ,.      # the da
8d00: 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 63  tabase will be c
8d10: 6f 72 72 75 70 74 20 28 62 65 63 61 75 73 65 20  orrupt (because 
8d20: 74 68 65 20 67 61 72 62 61 67 65 20 66 72 61 6d  the garbage fram
8d30: 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20  e contents.     
8d40: 20 23 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74   # will be treat
8d50: 65 64 20 61 73 20 76 61 6c 69 64 20 63 6f 6e 74  ed as valid cont
8d60: 65 6e 74 29 2e 20 49 66 20 24 70 67 73 7a 20 69  ent). If $pgsz i
8d70: 73 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 73  s invalid (too s
8d80: 6d 61 6c 6c 0a 20 20 20 20 20 20 23 20 6f 72 20  mall.      # or 
8d90: 74 6f 6f 20 6c 61 72 67 65 29 2c 20 74 68 65 20  too large), the 
8da0: 64 62 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  db will not be c
8db0: 6f 72 72 75 70 74 20 61 73 20 74 68 65 20 6c 6f  orrupt as the lo
8dc0: 67 20 66 69 6c 65 20 77 69 6c 6c 0a 20 20 20 20  g file will.    
8dd0: 20 20 23 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a    # be ignored..
8de0: 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 73 65        #.      se
8df0: 74 20 77 61 6c 68 64 72 20 5b 62 69 6e 61 72 79  t walhdr [binary
8e00: 20 66 6f 72 6d 61 74 20 49 49 49 49 49 49 20 39   format IIIIII 9
8e10: 33 31 30 37 31 36 31 38 20 33 30 30 37 30 30 30  31071618 3007000
8e20: 20 24 70 67 73 7a 20 31 32 33 34 20 32 32 20 32   $pgsz 1234 22 2
8e30: 33 5d 0a 20 20 20 20 20 20 73 65 74 20 66 72 61  3].      set fra
8e40: 6d 65 62 6f 64 79 20 5b 72 61 6e 64 6f 6d 62 6c  mebody [randombl
8e50: 6f 62 20 24 70 67 73 7a 5d 0a 20 20 20 20 20 20  ob $pgsz].      
8e60: 73 65 74 20 66 72 61 6d 65 68 64 72 20 20 5b 62  set framehdr  [b
8e70: 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49 49  inary format III
8e80: 49 20 24 70 67 20 35 20 32 32 20 32 33 5d 0a 20  I $pg 5 22 23]. 
8e90: 20 20 20 20 20 73 65 74 20 63 31 20 30 0a 20 20       set c1 0.  
8ea0: 20 20 20 20 73 65 74 20 63 32 20 30 0a 20 20 20      set c2 0.   
8eb0: 20 20 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63     logcksum c1 c
8ec0: 32 20 24 77 61 6c 68 64 72 0a 0a 20 20 20 20 20  2 $walhdr..     
8ed0: 20 61 70 70 65 6e 64 20 77 61 6c 68 64 72 20 5b   append walhdr [
8ee0: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49  binary format II
8ef0: 20 24 63 31 20 24 63 32 5d 0a 20 20 20 20 20 20   $c1 $c2].      
8f00: 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20 5b  logcksum c1 c2 [
8f10: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66 72  string range $fr
8f20: 61 6d 65 68 64 72 20 30 20 37 5d 0a 20 20 20 20  amehdr 0 7].    
8f30: 20 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32    logcksum c1 c2
8f40: 20 24 66 72 61 6d 65 62 6f 64 79 0a 20 20 20 20   $framebody.    
8f50: 20 20 73 65 74 20 66 72 61 6d 65 68 64 72 20 5b    set framehdr [
8f60: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49  binary format II
8f70: 49 49 49 49 20 24 70 67 20 35 20 32 32 20 32 33  IIII $pg 5 22 23
8f80: 20 24 63 31 20 24 63 32 5d 0a 0a 20 20 20 20 20   $c1 $c2]..     
8f90: 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65   set fd [open te
8fa0: 73 74 2e 64 62 2d 77 61 6c 20 77 5d 0a 20 20 20  st.db-wal w].   
8fb0: 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66     fconfigure $f
8fc0: 64 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61  d -encoding bina
8fd0: 72 79 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ry -translation 
8fe0: 62 69 6e 61 72 79 0a 20 20 20 20 20 20 70 75 74  binary.      put
8ff0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64  s -nonewline $fd
9000: 20 24 77 61 6c 68 64 72 0a 20 20 20 20 20 20 70   $walhdr.      p
9010: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
9020: 66 64 20 24 66 72 61 6d 65 68 64 72 0a 20 20 20  fd $framehdr.   
9030: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
9040: 6e 65 20 24 66 64 20 24 66 72 61 6d 65 62 6f 64  ne $fd $framebod
9050: 79 0a 20 20 20 20 20 20 63 6c 6f 73 65 20 24 66  y.      close $f
9060: 64 0a 20 20 0a 20 20 20 20 20 20 66 69 6c 65 20  d.  .      file 
9070: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
9080: 0a 20 20 20 20 7d 20 5b 77 61 6c 5f 66 69 6c 65  .    } [wal_file
9090: 5f 73 69 7a 65 20 31 20 24 70 67 73 7a 5d 0a 20  _size 1 $pgsz]. 
90a0: 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61   .    do_test wa
90b0: 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 35  l-18.2.$tn.$pg.5
90c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
90d0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20   db test.db.    
90e0: 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68 20    set rc [catch 
90f0: 7b 20 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d 41  { db one {PRAGMA
9100: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
9110: 7d 20 7d 20 6d 73 67 5d 0a 20 20 20 20 20 20 65  } } msg].      e
9120: 78 70 72 20 7b 20 24 72 63 21 3d 30 20 7c 7c 20  xpr { $rc!=0 || 
9130: 24 6d 73 67 21 3d 22 6f 6b 22 20 7d 0a 20 20 20  $msg!="ok" }.   
9140: 20 7d 20 24 77 6f 72 6b 73 0a 20 20 0a 20 20 20   } $works.  .   
9150: 20 64 62 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a   db close.  }.}.
9160: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
9170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
91b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
91c0: 20 2d 20 77 61 6c 2d 31 39 2e 2a 20 2d 20 66 69   - wal-19.* - fi
91d0: 78 65 73 20 61 20 62 75 67 20 74 68 61 74 20 77  xes a bug that w
91e0: 61 73 20 70 72 65 73 65 6e 74 20 64 75 72 69 6e  as present durin
91f0: 67 0a 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e  g.# development.
9200: 0a 23 0a 23 20 57 68 65 6e 20 61 20 64 61 74 61  .#.# When a data
9210: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
9220: 69 6e 20 57 41 4c 20 6d 6f 64 65 20 69 73 20 63  in WAL mode is c
9230: 6c 6f 73 65 64 2c 20 69 74 20 61 74 74 65 6d 70  losed, it attemp
9240: 74 73 20 61 6e 0a 23 20 45 58 43 4c 55 53 49 56  ts an.# EXCLUSIV
9250: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
9260: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20  tabase file. If 
9270: 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  the lock is obta
9280: 69 6e 65 64 2c 20 74 68 65 0a 23 20 63 6f 6e 6e  ined, the.# conn
9290: 65 63 74 69 6f 6e 20 6b 6e 6f 77 73 20 74 68 61  ection knows tha
92a0: 74 20 69 74 20 69 73 20 74 68 65 20 6c 61 73 74  t it is the last
92b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 64   connection to d
92c0: 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 0a 23  isconnect from.#
92d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 73   the database, s
92e0: 6f 20 69 74 20 72 75 6e 73 20 61 20 63 68 65 63  o it runs a chec
92f0: 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e  kpoint operation
9300: 2e 20 54 68 65 20 62 75 67 20 77 61 73 20 74 68  . The bug was th
9310: 61 74 0a 23 20 74 68 65 20 63 6f 6e 6e 65 63 74  at.# the connect
9320: 69 6f 6e 20 77 61 73 20 6e 6f 74 20 75 70 64 61  ion was not upda
9330: 74 69 6e 67 20 69 74 73 20 70 72 69 76 61 74 65  ting its private
9340: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 77 61 6c   copy of the wal
9350: 2d 69 6e 64 65 78 20 0a 23 20 68 65 61 64 65 72  -index .# header
9360: 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f   before doing so
9370: 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69  , meaning that i
9380: 74 20 63 6f 75 6c 64 20 63 68 65 63 6b 70 6f 69  t could checkpoi
9390: 6e 74 20 61 6e 20 6f 6c 64 0a 23 20 73 6e 61 70  nt an old.# snap
93a0: 73 68 6f 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  shot..#.do_test 
93b0: 77 61 6c 2d 31 39 2e 31 20 7b 0a 20 20 66 6f 72  wal-19.1 {.  for
93c0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
93d0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
93e0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73  t.db-journal.  s
93f0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
9400: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  b.  sqlite3 db2 
9410: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
9420: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
9430: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
9440: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
9450: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
9460: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9470: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
9480: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9490: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
94a0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
94b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
94c0: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
94d0: 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  4}.do_test wal-1
94e0: 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
94f0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
9500: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36  O t1 VALUES(5, 6
9510: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
9520: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
9530: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f  1 2 3 4 5 6}.do_
9540: 74 65 73 74 20 77 61 6c 2d 31 39 2e 33 20 7b 0a  test wal-19.3 {.
9550: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32    db close.  db2
9560: 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78   close.  file ex
9570: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
9580: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {0}.do_test w
9590: 61 6c 2d 31 39 2e 34 20 7b 0a 20 20 23 20 57 68  al-19.4 {.  # Wh
95a0: 65 6e 20 74 68 65 20 62 75 67 20 77 61 73 20 70  en the bug was p
95b0: 72 65 73 65 6e 74 2c 20 74 68 65 20 66 6f 6c 6c  resent, the foll
95c0: 6f 77 69 6e 67 20 77 61 73 20 72 65 74 75 72 6e  owing was return
95d0: 69 6e 67 20 7b 31 20 32 20 33 20 34 7d 20 6f 6e  ing {1 2 3 4} on
95e0: 6c 79 2c 0a 20 20 23 20 61 73 20 5b 64 62 32 5d  ly,.  # as [db2]
95f0: 20 68 61 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64   had an out-of-d
9600: 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ate copy of the 
9610: 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72  wal-index header
9620: 20 77 68 65 6e 20 69 74 20 77 61 73 0a 20 20 23   when it was.  #
9630: 20 63 6c 6f 73 65 64 2e 0a 20 20 23 0a 20 20 73   closed..  #.  s
9640: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
9650: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
9660: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
9670: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d  .} {1 2 3 4 5 6}
9680: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
96a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
96b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
96c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
96d0: 68 69 73 20 74 65 73 74 20 2d 20 77 61 6c 2d 32  his test - wal-2
96e0: 30 2e 2a 20 2d 20 75 73 65 73 20 74 77 6f 20 63  0.* - uses two c
96f0: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 4f 6e 65 20  onnections. One 
9700: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
9710: 61 6e 64 0a 23 20 74 68 65 20 6f 74 68 65 72 20  and.# the other 
9720: 69 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70  in an external p
9730: 72 6f 63 65 73 73 2e 20 54 68 65 20 70 72 6f 63  rocess. The proc
9740: 65 64 75 72 65 20 69 73 3a 0a 23 0a 23 20 20 20  edure is:.#.#   
9750: 31 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74  1. Using connect
9760: 69 6f 6e 20 31 2c 20 63 72 65 61 74 65 20 74 68  ion 1, create th
9770: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
9780: 61 2e 0a 23 0a 23 20 20 20 32 2e 20 55 73 69 6e  a..#.#   2. Usin
9790: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 28  g connection 2 (
97a0: 69 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70  in an external p
97b0: 72 6f 63 65 73 73 29 2c 20 61 64 64 20 73 6f 20  rocess), add so 
97c0: 6d 75 63 68 0a 23 20 20 20 20 20 20 64 61 74 61  much.#      data
97d0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
97e0: 20 77 69 74 68 6f 75 74 20 63 68 65 63 6b 70 6f   without checkpo
97f0: 69 6e 74 69 6e 67 20 74 68 61 74 20 61 20 77 61  inting that a wa
9800: 6c 2d 69 6e 64 65 78 20 0a 23 20 20 20 20 20 20  l-index .#      
9810: 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34 4b 42  larger than 64KB
9820: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 23 0a   is required..#.
9830: 23 20 20 20 33 2e 20 55 73 69 6e 67 20 63 6f 6e  #   3. Using con
9840: 6e 65 63 74 69 6f 6e 20 31 2c 20 63 68 65 63 6b  nection 1, check
9850: 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61  point the databa
9860: 73 65 2e 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  se. Make sure al
9870: 6c 0a 23 20 20 20 20 20 20 74 68 65 20 64 61 74  l.#      the dat
9880: 61 20 69 73 20 70 72 65 73 65 6e 74 20 61 6e 64  a is present and
9890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
98a0: 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e 0a 23 0a   not corrupt..#.
98b0: 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20  # At one point, 
98c0: 53 51 4c 69 74 65 20 77 61 73 20 66 61 69 6c 69  SQLite was faili
98d0: 6e 67 20 74 6f 20 67 72 6f 77 20 74 68 65 20 6d  ng to grow the m
98e0: 61 70 70 69 6e 67 20 6f 66 20 74 68 65 20 77 61  apping of the wa
98f0: 6c 2d 69 6e 64 65 78 0a 23 20 66 69 6c 65 20 69  l-index.# file i
9900: 6e 20 73 74 65 70 20 33 20 61 6e 64 20 74 68 65  n step 3 and the
9910: 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 61 73 20   checkpoint was 
9920: 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
9930: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a  atabase file..#.
9940: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 31  do_test wal-20.1
9950: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63   {.  catch {db c
9960: 6c 6f 73 65 7d 0a 20 20 66 6f 72 63 65 64 65 6c  lose}.  forcedel
9970: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
9980: 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d  .db-wal test.db-
9990: 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65  journal.  sqlite
99a0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
99b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
99c0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
99d0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41   = WAL;.    CREA
99e0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
99f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9a00: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
9a10: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
9a20: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
9a30: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
9a40: 77 61 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77  wal 1}.do_test w
9a50: 61 6c 2d 32 30 2e 32 20 7b 0a 20 20 73 65 74 20  al-20.2 {.  set 
9a60: 3a 3a 62 75 64 64 79 20 5b 6c 61 75 6e 63 68 5f  ::buddy [launch_
9a70: 74 65 73 74 66 69 78 74 75 72 65 5d 0a 20 20 74  testfixture].  t
9a80: 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a 62 75  estfixture $::bu
9a90: 64 64 79 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  ddy {.    sqlite
9aa0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
9ab0: 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   db transaction 
9ac0: 7b 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20  { db eval {.    
9ad0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74    PRAGMA wal_aut
9ae0: 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 30 3b  ocheckpoint = 0;
9af0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9b00: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
9b10: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
9b20: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 32  M t1;       /* 2
9b30: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9b40: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
9b50: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
9b60: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
9b70: 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  * 4 */.      INS
9b80: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9b90: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9ba0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9bb0: 20 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 20 20    /* 8 */.      
9bc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
9bd0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
9be0: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
9bf0: 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20       /* 16 */.  
9c00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9c10: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9c20: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
9c30: 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a  1;       /* 32 *
9c40: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9c50: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9c60: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9c70: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9c80: 36 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  64 */.      INSE
9c90: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
9ca0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
9cb0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
9cc0: 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20 20   /* 128 */.     
9cd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9ce0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9cf0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9d00: 20 20 20 20 20 20 2f 2a 20 32 35 36 20 2a 2f 0a        /* 256 */.
9d10: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9d20: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9d30: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9d40: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 35 31   t1;       /* 51
9d50: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
9d60: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9d70: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9d80: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9d90: 2f 2a 20 31 30 32 34 20 2a 2f 0a 20 20 20 20 20  /* 1024 */.     
9da0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9db0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9dc0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9dd0: 20 20 20 20 20 20 2f 2a 20 32 30 34 38 20 2a 2f        /* 2048 */
9de0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9df0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
9e00: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
9e10: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 34  M t1;       /* 4
9e20: 30 39 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  096 */.      INS
9e30: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9e40: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9e50: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9e60: 20 20 2f 2a 20 38 31 39 32 20 2a 2f 0a 20 20 20    /* 8192 */.   
9e70: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9e80: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
9e90: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
9ea0: 3b 20 20 20 20 20 20 20 2f 2a 20 31 36 33 38 34  ;       /* 16384
9eb0: 20 2a 2f 0a 20 20 20 20 7d 20 7d 0a 20 20 7d 0a   */.    } }.  }.
9ec0: 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61  } {0}.do_test wa
9ed0: 6c 2d 32 30 2e 33 20 7b 0a 20 20 63 6c 6f 73 65  l-20.3 {.  close
9ee0: 20 24 3a 3a 62 75 64 64 79 0a 20 20 65 78 65 63   $::buddy.  exec
9ef0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
9f00: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20  _checkpoint }.  
9f10: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
9f20: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
9f30: 31 20 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 64 6f  1 }.} {16384}.do
9f40: 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 34 20 7b  _test wal-20.4 {
9f50: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
9f60: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
9f70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
9f80: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
9f90: 4d 20 74 31 20 7d 0a 7d 20 7b 31 36 33 38 34 7d  M t1 }.} {16384}
9fa0: 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b  .integrity_check
9fb0: 20 77 61 6c 2d 32 30 2e 35 0a 0a 63 61 74 63 68   wal-20.5..catch
9fc0: 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63   { db2 close }.c
9fd0: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
9fe0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
9ff0: 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d  1.1 {.  faultsim
a000: 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70  _delete_and_reop
a010: 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  en.  execsql { .
a020: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
a030: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
a040: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a050: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
a060: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
a070: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49  UES(1, 2);.    I
a080: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
a090: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20  LUES(3, 4);.    
a0a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
a0b0: 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20  ALUES(5, 6);.   
a0c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
a0d0: 56 41 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20  VALUES(7, 8);.  
a0e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a0f0: 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 3b 0a   VALUES(9, 10);.
a100: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a110: 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32  t1 VALUES(11, 12
a120: 29 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64  );.  }.} {wal}.d
a130: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 32 20  o_test wal-21.2 
a140: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
a150: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
a160: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50  size = 10;.    P
a170: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
a180: 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e 3b  oint;.    BEGIN;
a190: 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54  .      SAVEPOINT
a1a0: 20 73 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45   s;.        INSE
a1b0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
a1c0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
a1d0: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  ), randomblob(90
a1e0: 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  0) FROM t1;.    
a1f0: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 3b    ROLLBACK TO s;
a200: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
a210: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
a220: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
a230: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
a240: 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 64   8 9 10 11 12}.d
a250: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 33 20  o_test wal-21.3 
a260: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
a270: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
a280: 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 23  heck }.} {ok}..#
a290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74  ---------.# Test
a2e0: 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69   reading and wri
a2f0: 74 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65  ting of database
a300: 73 20 77 69 74 68 20 64 69 66 66 65 72 65 6e 74  s with different
a310: 20 70 61 67 65 2d 73 69 7a 65 73 2e 0a 23 0a 66   page-sizes..#.f
a320: 6f 72 65 61 63 68 20 70 67 73 7a 20 7b 35 31 32  oreach pgsz {512
a330: 20 31 30 32 34 20 32 30 34 38 20 34 30 39 36 20   1024 2048 4096 
a340: 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38  8192 16384 32768
a350: 20 36 35 35 33 36 7d 20 7b 0a 20 20 64 6f 5f 6d   65536} {.  do_m
a360: 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20  ulticlient_test 
a370: 74 6e 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b  tn [string map [
a380: 6c 69 73 74 20 25 50 47 53 5a 25 20 24 70 67 73  list %PGSZ% $pgs
a390: 7a 5d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  z] {.    do_test
a3a0: 20 77 61 6c 2d 32 32 2e 25 50 47 53 5a 25 2e 24   wal-22.%PGSZ%.$
a3b0: 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c  tn.1 {.      sql
a3c0: 31 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47  1 {.        PRAG
a3d0: 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a  MA main.page_siz
a3e0: 65 20 3d 20 25 50 47 53 5a 25 3b 0a 20 20 20 20  e = %PGSZ%;.    
a3f0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
a400: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
a410: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
a420: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
a430: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
a440: 42 4c 45 20 74 31 28 78 20 55 4e 49 51 55 45 29  BLE t1(x UNIQUE)
a450: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
a460: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a470: 72 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b  randomblob(800);
a480: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
a490: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
a4a0: 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a  andomblob(800);.
a4b0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
a4c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
a4d0: 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20  ndomblob(800);. 
a4e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61       }.    } {wa
a4f0: 6c 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77  l}.    do_test w
a500: 61 6c 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e  al-22.%PGSZ%.$tn
a510: 2e 32 20 7b 20 73 71 6c 32 20 7b 20 50 52 41 47  .2 { sql2 { PRAG
a520: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
a530: 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20  ck } } {ok}.    
a540: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 32 2e 25  do_test wal-22.%
a550: 50 47 53 5a 25 2e 24 74 6e 2e 33 20 7b 0a 20 20  PGSZ%.$tn.3 {.  
a560: 20 20 20 20 73 71 6c 31 20 7b 50 52 41 47 4d 41      sql1 {PRAGMA
a570: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 7d   wal_checkpoint}
a580: 0a 20 20 20 20 20 20 65 78 70 72 20 7b 5b 66 69  .      expr {[fi
a590: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
a5a0: 20 25 20 25 50 47 53 5a 25 7d 0a 20 20 20 20 7d   % %PGSZ%}.    }
a5b0: 20 7b 30 7d 0a 20 20 7d 5d 0a 7d 0a 0a 23 2d 2d   {0}.  }].}..#--
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a600: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74  -------.# Test t
a610: 68 61 74 20 77 68 65 6e 20 31 20 6f 72 20 6d 6f  hat when 1 or mo
a620: 72 65 20 70 61 67 65 73 20 61 72 65 20 72 65 63  re pages are rec
a630: 6f 76 65 72 65 64 20 66 72 6f 6d 20 61 20 57 41  overed from a WA
a640: 4c 20 66 69 6c 65 2c 20 0a 23 20 73 71 6c 69 74  L file, .# sqlit
a650: 65 33 5f 6c 6f 67 28 29 20 69 73 20 69 6e 76 6f  e3_log() is invo
a660: 6b 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  ked to report th
a670: 69 73 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a  is to the user..
a680: 23 0a 69 66 63 61 70 61 62 6c 65 20 63 75 72 64  #.ifcapable curd
a690: 69 72 20 7b 0a 20 20 73 65 74 20 77 61 6c 66 69  ir {.  set walfi
a6a0: 6c 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e  le [file nativen
a6b0: 61 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b  ame [file join [
a6c0: 67 65 74 5f 70 77 64 5d 20 74 65 73 74 2e 64 62  get_pwd] test.db
a6d0: 2d 77 61 6c 5d 5d 0a 7d 20 65 6c 73 65 20 7b 0a  -wal]].} else {.
a6e0: 20 20 73 65 74 20 77 61 6c 66 69 6c 65 20 74 65    set walfile te
a6f0: 73 74 2e 64 62 2d 77 61 6c 0a 7d 0a 63 61 74 63  st.db-wal.}.catc
a700: 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72  h {db close}.for
a710: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
a720: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e  .do_test wal-23.
a730: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a740: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a750: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a760: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a770: 28 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47  (a, b);.    PRAG
a780: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
a790: 3d 20 57 41 4c 3b 0a 20 20 20 20 49 4e 53 45 52  = WAL;.    INSER
a7a0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a7b0: 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45  (1, 2);.    INSE
a7c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
a7d0: 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 66  S(3, 4);.  }.  f
a7e0: 61 75 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64  aultsim_save_and
a7f0: 5f 63 6c 6f 73 65 0a 0a 20 20 73 71 6c 69 74 65  _close..  sqlite
a800: 33 5f 73 68 75 74 64 6f 77 6e 0a 20 20 74 65 73  3_shutdown.  tes
a810: 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20 5b 6c  t_sqlite3_log [l
a820: 69 73 74 20 6c 61 70 70 65 6e 64 20 3a 3a 6c 6f  ist lappend ::lo
a830: 67 5d 0a 20 20 73 65 74 20 3a 3a 6c 6f 67 20 5b  g].  set ::log [
a840: 6c 69 73 74 5d 0a 20 20 73 71 6c 69 74 65 33 20  list].  sqlite3 
a850: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
a860: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
a870: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
a880: 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61   3 4}.do_test wa
a890: 6c 2d 32 33 2e 32 20 7b 20 73 65 74 20 3a 3a 6c  l-23.2 { set ::l
a8a0: 6f 67 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74  og } {}..do_test
a8b0: 20 77 61 6c 2d 32 33 2e 33 20 7b 0a 20 20 64 62   wal-23.3 {.  db
a8c0: 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 3a 3a 6c   close.  set ::l
a8d0: 6f 67 20 5b 6c 69 73 74 5d 0a 20 20 66 61 75 6c  og [list].  faul
a8e0: 74 73 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64  tsim_restore_and
a8f0: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
a900: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
a910: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
a920: 34 7d 0a 73 65 74 20 6e 50 61 67 65 20 5b 65 78  4}.set nPage [ex
a930: 70 72 20 32 2b 24 41 55 54 4f 56 41 43 55 55 4d  pr 2+$AUTOVACUUM
a940: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33  ].do_test wal-23
a950: 2e 34 20 7b 20 0a 20 20 73 65 74 20 3a 3a 6c 6f  .4 { .  set ::lo
a960: 67 20 0a 7d 20 5b 6c 69 73 74 20 53 51 4c 49 54  g .} [list SQLIT
a970: 45 5f 4f 4b 20 22 52 65 63 6f 76 65 72 65 64 20  E_OK "Recovered 
a980: 24 6e 50 61 67 65 20 66 72 61 6d 65 73 20 66 72  $nPage frames fr
a990: 6f 6d 20 57 41 4c 20 66 69 6c 65 20 24 77 61 6c  om WAL file $wal
a9a0: 66 69 6c 65 22 5d 0a 0a 0a 69 66 63 61 70 61 62  file"]...ifcapab
a9b0: 6c 65 20 61 75 74 6f 76 61 63 75 75 6d 20 7b 0a  le autovacuum {.
a9c0: 20 20 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 74    # This block t
a9d0: 65 73 74 73 20 74 68 61 74 20 69 66 20 74 68 65  ests that if the
a9e0: 20 73 69 7a 65 20 6f 66 20 61 20 64 61 74 61 62   size of a datab
a9f0: 61 73 65 20 69 73 20 72 65 64 75 63 65 64 20 62  ase is reduced b
aa00: 79 20 61 20 0a 20 20 23 20 74 72 61 6e 73 61 63  y a .  # transac
aa10: 74 69 6f 6e 20 28 62 65 63 61 75 73 65 20 6f 66  tion (because of
aa20: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
aa30: 6f 72 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  or auto-vacuum),
aa40: 20 74 68 61 74 20 6e 6f 0a 20 20 23 20 64 61 74   that no.  # dat
aa50: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
aa60: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 66 6f 72  the WAL file for
aa70: 20 74 68 65 20 74 72 75 6e 63 61 74 65 64 20 70   the truncated p
aa80: 61 67 65 73 20 61 73 20 70 61 72 74 0a 20 20 23  ages as part.  #
aa90: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 69 74 2e 20   of the commit. 
aaa0: 65 2e 67 2e 20 69 66 20 61 20 74 72 61 6e 73 61  e.g. if a transa
aab0: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
aac0: 65 20 73 69 7a 65 20 6f 66 20 61 20 64 61 74 61  e size of a data
aad0: 62 61 73 65 0a 20 20 23 20 74 6f 20 4e 20 70 61  base.  # to N pa
aae0: 67 65 73 2c 20 64 61 74 61 20 66 6f 72 20 70 61  ges, data for pa
aaf0: 67 65 20 4e 2b 31 20 73 68 6f 75 6c 64 20 6e 6f  ge N+1 should no
ab00: 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
ab10: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 0a 20 20  the WAL file .  
ab20: 23 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  # when committin
ab30: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
ab40: 6e 2e 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  n. At one point 
ab50: 73 75 63 68 20 64 61 74 61 20 77 61 73 20 62 65  such data was be
ab60: 69 6e 67 20 0a 20 20 23 20 77 72 69 74 74 65 6e  ing .  # written
ab70: 2e 0a 20 20 23 0a 20 20 63 61 74 63 68 20 7b 64  ..  #.  catch {d
ab80: 62 20 63 6c 6f 73 65 7d 0a 20 20 66 6f 72 63 65  b close}.  force
ab90: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20  delete test.db. 
aba0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
abb0: 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  .db.  do_execsql
abc0: 5f 74 65 73 74 20 32 34 2e 31 20 7b 0a 20 20 20  _test 24.1 {.   
abd0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
abe0: 75 75 6d 20 3d 20 32 3b 0a 20 20 20 20 50 52 41  uum = 2;.    PRA
abf0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
ac00: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47   = WAL;.    PRAG
ac10: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
ac20: 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
ac30: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
ac40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ac50: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
ac60: 62 28 35 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  b(5000));.    IN
ac70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
ac80: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
ac90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
aca0: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
acb0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
acc0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
acd0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
ace0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
acf0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
ad00: 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73  } {wal}.  do_tes
ad10: 74 20 32 34 2e 32 20 7b 20 0a 20 20 20 20 65 78  t 24.2 { .    ex
ad20: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45  ecsql {.      DE
ad30: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
ad40: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
ad50: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 7d  heckpoint;.    }
ad60: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
ad70: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
ad80: 74 2e 64 62 0a 20 20 20 20 66 69 6c 65 20 65 78  t.db.    file ex
ad90: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
ada0: 0a 20 20 7d 20 30 0a 20 20 64 6f 5f 74 65 73 74  .  } 0.  do_test
adb0: 20 32 34 2e 33 20 7b 0a 20 20 20 20 66 69 6c 65   24.3 {.    file
adc0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
add0: 7d 20 5b 65 78 70 72 20 38 34 20 2a 20 31 30 32  } [expr 84 * 102
ade0: 34 5d 0a 20 20 64 6f 5f 74 65 73 74 20 32 34 2e  4].  do_test 24.
adf0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
ae00: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
ae10: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30 30  cache_size = 200
ae20: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69  ;.      PRAGMA i
ae30: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
ae40: 6d 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  m;.      PRAGMA 
ae50: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
ae60: 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73      }.    file s
ae70: 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20  ize test.db.  } 
ae80: 5b 65 78 70 72 20 33 20 2a 20 31 30 32 34 5d 0a  [expr 3 * 1024].
ae90: 0a 20 20 23 20 57 41 4c 20 66 69 6c 65 20 6e 6f  .  # WAL file no
aea0: 77 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  w contains a sin
aeb0: 67 6c 65 20 66 72 61 6d 65 20 2d 20 74 68 65 20  gle frame - the 
aec0: 6e 65 77 20 72 6f 6f 74 20 70 61 67 65 20 66 6f  new root page fo
aed0: 72 20 74 61 62 6c 65 20 74 31 2e 0a 20 20 23 20  r table t1..  # 
aee0: 49 74 20 77 6f 75 6c 64 20 62 65 20 74 77 6f 20  It would be two 
aef0: 66 72 61 6d 65 73 20 28 74 68 65 20 6e 65 77 20  frames (the new 
af00: 72 6f 6f 74 20 70 61 67 65 20 61 6e 64 20 61 20  root page and a 
af10: 70 61 64 64 69 6e 67 20 66 72 61 6d 65 29 20 69  padding frame) i
af20: 66 20 74 68 65 0a 20 20 23 20 5a 45 52 4f 5f 44  f the.  # ZERO_D
af30: 41 4d 41 47 45 20 66 6c 61 67 20 77 65 72 65 20  AMAGE flag were 
af40: 6e 6f 74 20 73 65 74 2e 0a 20 20 64 6f 5f 74 65  not set..  do_te
af50: 73 74 20 32 34 2e 35 20 7b 0a 20 20 20 20 66 69  st 24.5 {.    fi
af60: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
af70: 77 61 6c 0a 20 20 7d 20 5b 77 61 6c 5f 66 69 6c  wal.  } [wal_fil
af80: 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 7d  e_size 1 1024].}
af90: 0a 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74  ..db close.sqlit
afa0: 65 33 5f 73 68 75 74 64 6f 77 6e 0a 74 65 73 74  e3_shutdown.test
afb0: 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 0a 73 71 6c  _sqlite3_log.sql
afc0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a  ite3_initialize.
afd0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.