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

Artifact 83635d428b0a3fe883939cedbaedf29e13a5affd:


0000: 23 20 32 30 31 30 20 41 70 72 69 6c 20 31 33 0a  # 2010 April 13.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f  .  The.# focus o
01b0: 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74  f this file is t
01c0: 65 73 74 69 6e 67 20 74 68 65 20 6f 70 65 72 61  esting the opera
01d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
01e0: 61 72 79 20 69 6e 0a 23 20 22 50 52 41 47 4d 41  ary in.# "PRAGMA
01f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41   journal_mode=WA
0200: 4c 22 20 6d 6f 64 65 2e 0a 23 0a 0a 73 65 74 20  L" mode..#..set 
0210: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0220: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0230: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0240: 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20  ster.tcl.source 
0250: 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f  $testdir/lock_co
0260: 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20  mmon.tcl.source 
0270: 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f  $testdir/malloc_
0280: 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63  common.tcl.sourc
0290: 65 20 24 74 65 73 74 64 69 72 2f 77 61 6c 5f 63  e $testdir/wal_c
02a0: 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 74  ommon.tcl..set t
02b0: 65 73 74 70 72 65 66 69 78 20 77 61 6c 0a 0a 69  estprefix wal..i
02c0: 66 63 61 70 61 62 6c 65 20 21 77 61 6c 20 7b 66  fcapable !wal {f
02d0: 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74  inish_test ; ret
02e0: 75 72 6e 20 7d 0a 69 66 20 7b 20 21 5b 77 61 6c  urn }.if { ![wal
02f0: 5f 69 73 5f 6f 6b 5d 20 7d 20 7b 0a 20 20 66 69  _is_ok] } {.  fi
0300: 6e 69 73 68 5f 74 65 73 74 20 0a 20 20 72 65 74  nish_test .  ret
0310: 75 72 6e 20 0a 7d 0a 74 65 73 74 5f 73 65 74 5f  urn .}.test_set_
0320: 63 6f 6e 66 69 67 5f 70 61 67 65 63 61 63 68 65  config_pagecache
0330: 20 30 20 30 0a 0a 70 72 6f 63 20 72 65 6f 70 65   0 0..proc reope
0340: 6e 5f 64 62 20 7b 7d 20 7b 0a 20 20 63 61 74 63  n_db {} {.  catc
0350: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20  h { db close }. 
0360: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
0370: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
0380: 20 74 65 73 74 2e 64 62 2d 77 61 6c 2d 73 75 6d   test.db-wal-sum
0390: 6d 61 72 79 0a 20 20 73 71 6c 69 74 65 33 5f 77  mary.  sqlite3_w
03a0: 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 7d 0a  al db test.db.}.
03b0: 0a 73 65 74 20 3a 3a 62 6c 6f 62 63 6e 74 20 30  .set ::blobcnt 0
03c0: 0a 70 72 6f 63 20 62 6c 6f 62 20 7b 6e 42 79 74  .proc blob {nByt
03d0: 65 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a 62 6c  e} {.  incr ::bl
03e0: 6f 62 63 6e 74 0a 20 20 72 65 74 75 72 6e 20 5b  obcnt.  return [
03f0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 73 74  string range [st
0400: 72 69 6e 67 20 72 65 70 65 61 74 20 22 24 7b 3a  ring repeat "${:
0410: 3a 62 6c 6f 62 63 6e 74 7d 78 22 20 24 6e 42 79  :blobcnt}x" $nBy
0420: 74 65 5d 20 31 20 24 6e 42 79 74 65 5d 0a 7d 0a  te] 1 $nByte].}.
0430: 0a 70 72 6f 63 20 73 71 6c 69 74 65 33 5f 77 61  .proc sqlite3_wa
0440: 6c 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61  l {args} {.  eva
0450: 6c 20 73 71 6c 69 74 65 33 20 24 61 72 67 73 0a  l sqlite3 $args.
0460: 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20    [lindex $args 
0470: 30 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  0] eval { PRAGMA
0480: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30   auto_vacuum = 0
0490: 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72   }.  [lindex $ar
04a0: 67 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41  gs 0] eval { PRA
04b0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
04c0: 31 30 32 34 20 7d 0a 20 20 5b 6c 69 6e 64 65 78  1024 }.  [lindex
04d0: 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b   $args 0] eval {
04e0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
04f0: 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20 5b  mode = wal }.  [
0500: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20  lindex $args 0] 
0510: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 73 79  eval { PRAGMA sy
0520: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d  nchronous = norm
0530: 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24  al }.  [lindex $
0540: 61 72 67 73 20 30 5d 20 66 75 6e 63 74 69 6f 6e  args 0] function
0550: 20 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a 0a 70 72   blob blob.}..pr
0560: 6f 63 20 6c 6f 67 5f 64 65 6c 65 74 65 64 20 7b  oc log_deleted {
0570: 6c 6f 67 66 69 6c 65 7d 20 7b 0a 20 20 72 65 74  logfile} {.  ret
0580: 75 72 6e 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  urn [expr [file 
0590: 65 78 69 73 74 73 20 24 6c 6f 67 66 69 6c 65 5d  exists $logfile]
05a0: 3d 3d 30 5d 0a 7d 0a 0a 23 0a 23 20 54 68 65 73  ==0].}..#.# Thes
05b0: 65 20 61 72 65 20 27 77 61 72 6d 2d 62 6f 64 79  e are 'warm-body
05c0: 27 20 74 65 73 74 73 20 75 73 65 64 20 77 68 69  ' tests used whi
05d0: 6c 65 20 64 65 76 65 6c 6f 70 69 6e 67 20 74 68  le developing th
05e0: 65 20 57 41 4c 20 63 6f 64 65 2e 20 54 68 65 79  e WAL code. They
05f0: 0a 23 20 73 65 72 76 65 20 74 6f 20 70 72 6f 76  .# serve to prov
0600: 65 20 74 68 61 74 20 61 20 66 65 77 20 72 65 61  e that a few rea
0610: 6c 6c 79 20 73 69 6d 70 6c 65 20 63 61 73 65 73  lly simple cases
0620: 20 77 6f 72 6b 3a 0a 23 0a 23 20 77 61 6c 2d 31   work:.#.# wal-1
0630: 2e 2a 3a 20 52 65 61 64 20 61 6e 64 20 77 72 69  .*: Read and wri
0640: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  te the database.
0650: 0a 23 20 77 61 6c 2d 32 2e 2a 3a 20 54 65 73 74  .# wal-2.*: Test
0660: 20 4d 56 43 43 20 77 69 74 68 20 6f 6e 65 20 72   MVCC with one r
0670: 65 61 64 65 72 2c 20 6f 6e 65 20 77 72 69 74 65  eader, one write
0680: 72 2e 0a 23 20 77 61 6c 2d 33 2e 2a 3a 20 54 65  r..# wal-3.*: Te
0690: 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  st transaction r
06a0: 6f 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 34  ollback..# wal-4
06b0: 2e 2a 3a 20 54 65 73 74 20 73 61 76 65 70 6f 69  .*: Test savepoi
06c0: 6e 74 2f 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  nt/statement rol
06d0: 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 35 2e 2a  lback..# wal-5.*
06e0: 3a 20 54 65 73 74 20 74 68 65 20 74 65 6d 70 20  : Test the temp 
06f0: 64 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c 2d  database..# wal-
0700: 36 2e 2a 3a 20 54 65 73 74 20 63 72 65 61 74 69  6.*: Test creati
0710: 6e 67 20 64 61 74 61 62 61 73 65 73 20 77 69 74  ng databases wit
0720: 68 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  h different page
0730: 20 73 69 7a 65 73 2e 0a 23 0a 23 0a 23 0a 64 6f   sizes..#.#.#.do
0740: 5f 74 65 73 74 20 77 61 6c 2d 30 2e 31 20 7b 0a  _test wal-0.1 {.
0750: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
0760: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
0770: 20 30 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b   0 }.  execsql {
0780: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
0790: 6f 75 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a 20  ous = normal }. 
07a0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
07b0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
07c0: 20 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64   wal }.} {wal}.d
07d0: 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e 32 20 7b  o_test wal-0.2 {
07e0: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
07f0: 74 2e 64 62 0a 7d 20 7b 31 30 32 34 7d 0a 0a 64  t.db.} {1024}..d
0800: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 30 20 7b  o_test wal-1.0 {
0810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
0820: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45    BEGIN;.    CRE
0830: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
0840: 62 29 3b 20 0a 20 20 7d 0a 20 20 6c 69 73 74 20  b); .  }.  list 
0850: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
0860: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5c 0a  t.db-journal] \.
0870: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78 69         [file exi
0880: 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  sts test.db-wal]
0890: 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 5b 66       \.       [f
08a0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
08b0: 5d 0a 7d 20 7b 30 20 31 20 31 30 32 34 7d 0a 64  ].} {0 1 1024}.d
08c0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 31 20 7b  o_test wal-1.1 {
08d0: 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49  .  execsql COMMI
08e0: 54 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65  T.  list [file e
08f0: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
0900: 75 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69  urnal] [file exi
0910: 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  sts test.db-wal]
0920: 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {0 1}.do_test
0930: 20 77 61 6c 2d 31 2e 32 20 7b 0a 20 20 23 20 54   wal-1.2 {.  # T
0940: 68 65 72 65 20 61 72 65 20 6e 6f 77 20 74 77 6f  here are now two
0950: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 6f   pages in the lo
0960: 67 2e 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74  g..  file size t
0970: 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 5b 77 61  est.db-wal.} [wa
0980: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30  l_file_size 2 10
0990: 32 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  24]..do_test wal
09a0: 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.3 {.  execsql
09b0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
09c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d   sqlite_master }
09d0: 0a 7d 20 7b 74 61 62 6c 65 20 74 31 20 74 31 20  .} {table t1 t1 
09e0: 32 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20  2 {CREATE TABLE 
09f0: 74 31 28 61 2c 20 62 29 7d 7d 0a 0a 64 6f 5f 74  t1(a, b)}}..do_t
0a00: 65 73 74 20 77 61 6c 2d 31 2e 34 20 7b 0a 20 20  est wal-1.4 {.  
0a10: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0a20: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0a30: 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71  1, 2) }.  execsq
0a40: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
0a50: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20  t1 VALUES(3, 4) 
0a60: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  }.  execsql { IN
0a70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0a80: 55 45 53 28 35 2c 20 36 29 20 7d 0a 20 20 65 78  UES(5, 6) }.  ex
0a90: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
0aa0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c  NTO t1 VALUES(7,
0ab0: 20 38 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   8) }.  execsql 
0ac0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0ad0: 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d   VALUES(9, 10) }
0ae0: 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  .} {}..do_test w
0af0: 61 6c 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  al-1.5 {.  execs
0b00: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0b10: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33  OM t1 }.} {1 2 3
0b20: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d   4 5 6 7 8 9 10}
0b30: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0b40: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  1 {.  sqlite3_wa
0b50: 6c 20 64 62 32 20 2e 2f 74 65 73 74 2e 64 62 0a  l db2 ./test.db.
0b60: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
0b70: 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N; SELECT * FROM
0b80: 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32   t1 } db2.} {1 2
0b90: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0ba0: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  0}..do_test wal-
0bb0: 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.2 {.  execsql 
0bc0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0bd0: 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20   VALUES(11, 12) 
0be0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
0bf0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0c00: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
0c10: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a  7 8 9 10 11 12}.
0c20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 33  .do_test wal-2.3
0c30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
0c40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0c50: 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34  } db2.} {1 2 3 4
0c60: 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 0a   5 6 7 8 9 10}..
0c70: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 34 20  do_test wal-2.4 
0c80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
0c90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0ca0: 55 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20  UES(13, 14) }.  
0cb0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
0cc0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b   * FROM t1 }.} {
0cd0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
0ce0: 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34  9 10 11 12 13 14
0cf0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0d00: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
0d10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0d20: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33  1 } db2.} {1 2 3
0d30: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d   4 5 6 7 8 9 10}
0d40: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0d50: 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  6 {.  execsql { 
0d60: 43 4f 4d 4d 49 54 3b 20 53 45 4c 45 43 54 20 2a  COMMIT; SELECT *
0d70: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d   FROM t1 } db2.}
0d80: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
0d90: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
0da0: 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  14}..do_test wal
0db0: 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -3.1 {.  execsql
0dc0: 20 7b 20 42 45 47 49 4e 3b 20 44 45 4c 45 54 45   { BEGIN; DELETE
0dd0: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65   FROM t1 }.  exe
0de0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0df0: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a 64  FROM t1 }.} {}.d
0e00: 6f 5f 74 65 73 74 20 77 61 6c 2d 33 2e 32 20 7b  o_test wal-3.2 {
0e10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0e20: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
0e30: 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35  db2.} {1 2 3 4 5
0e40: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
0e50: 32 20 31 33 20 31 34 7d 0a 64 6f 5f 74 65 73 74  2 13 14}.do_test
0e60: 20 77 61 6c 2d 33 2e 33 20 7b 0a 20 20 65 78 65   wal-3.3 {.  exe
0e70: 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20  csql { ROLLBACK 
0e80: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
0e90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0ea0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
0eb0: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
0ec0: 33 20 31 34 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  3 14}.db2 close.
0ed0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
0f20: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
0f30: 73 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74 65 73 74  s, wal-4.*, test
0f40: 20 74 68 61 74 20 73 61 76 65 70 6f 69 6e 74 73   that savepoints
0f50: 20 77 6f 72 6b 20 77 69 74 68 20 57 41 4c 20 0a   work with WAL .
0f60: 23 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 64  # databases..#.d
0f70: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 31 20 7b  o_test wal-4.1 {
0f80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0f90: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b   DELETE FROM t1;
0fa0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
0fb0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0fc0: 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27   VALUES('a', 'b'
0fd0: 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49  );.      SAVEPOI
0fe0: 4e 54 20 73 70 3b 0a 20 20 20 20 20 20 20 20 49  NT sp;.        I
0ff0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1000: 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a  LUES('c', 'd');.
1010: 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a          SELECT *
1020: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
1030: 7b 61 20 62 20 63 20 64 7d 0a 64 6f 5f 74 65 73  {a b c d}.do_tes
1040: 74 20 77 61 6c 2d 34 2e 32 20 7b 0a 20 20 65 78  t wal-4.2 {.  ex
1050: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 52 4f  ecsql {.      RO
1060: 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20  LLBACK TO sp;.  
1070: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1080: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62  M t1;.  }.} {a b
1090: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
10a0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
10b0: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
10c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
10d0: 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a 0a 64  ;.  }.} {a b}..d
10e0: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 31  o_test wal-4.4.1
10f0: 20 7b 0a 20 20 69 66 63 61 70 61 62 6c 65 20 65   {.  ifcapable e
1100: 6e 61 62 6c 65 5f 70 65 72 73 69 73 74 5f 77 61  nable_persist_wa
1110: 6c 20 7b 0a 20 20 20 20 66 69 6c 65 5f 63 6f 6e  l {.    file_con
1120: 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
1130: 20 64 62 20 30 0a 20 20 7d 0a 20 20 64 62 20 63   db 0.  }.  db c
1140: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64  lose.  sqlite3 d
1150: 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66  b test.db.  db f
1160: 75 6e 63 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20  unc blob blob.  
1170: 6c 69 73 74 20 5b 65 78 65 63 73 71 6c 20 7b 20  list [execsql { 
1180: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
1190: 20 7d 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74   }] [file size t
11a0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b  est.db-wal].} {{
11b0: 61 20 62 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20  a b} 0}.do_test 
11c0: 77 61 6c 2d 34 2e 34 2e 32 20 7b 0a 20 20 65 78  wal-4.4.2 {.  ex
11d0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63  ecsql { PRAGMA c
11e0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d  ache_size = 10 }
11f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1200: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1210: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
1220: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1230: 53 28 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  S(blob(400), blo
1240: 62 28 34 30 30 29 29 3b 0a 20 20 20 20 53 41 56  b(400));.    SAV
1250: 45 50 4f 49 4e 54 20 74 72 3b 0a 20 20 20 20 20  EPOINT tr;.     
1260: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1270: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1280: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1290: 20 74 32 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20 20   t2; /*  2 */.  
12a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12b0: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
12c0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
12d0: 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 34 20 2a 2f  ROM t2; /*  4 */
12e0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
12f0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
1300: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1310: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 38  ) FROM t2; /*  8
1320: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
1330: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
1340: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1350: 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a  400) FROM t2; /*
1360: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
1370: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
1380: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1390: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b  ob(400) FROM t2;
13a0: 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20   /* 32 */.      
13b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
13c0: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
13d0: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
13e0: 74 31 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20  t1; /*  2 */.   
13f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1400: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
1410: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1420: 4f 4d 20 74 31 3b 20 2f 2a 20 20 34 20 2a 2f 0a  OM t1; /*  4 */.
1430: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1440: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
1450: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1460: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 38 20   FROM t1; /*  8 
1470: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
1480: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
1490: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
14a0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20  00) FROM t1; /* 
14b0: 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  16 */.      INSE
14c0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
14d0: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
14e0: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(400) FROM t1; 
14f0: 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 53  /* 32 */.      S
1500: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1510: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 33  ROM t2;.  }.} {3
1520: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  2}.do_test wal-4
1530: 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.3 {.  execsql
1540: 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74   { ROLLBACK TO t
1550: 72 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  r }.} {}.do_test
1560: 20 77 61 6c 2d 34 2e 34 2e 34 20 7b 0a 20 20 73   wal-4.4.4 {.  s
1570: 65 74 20 6c 6f 67 73 69 7a 65 20 5b 66 69 6c 65  et logsize [file
1580: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
1590: 6c 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  l].  execsql {. 
15a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
15b0: 20 74 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20   t1 VALUES('x', 
15c0: 27 79 27 29 3b 0a 20 20 20 20 52 45 4c 45 41 53  'y');.    RELEAS
15d0: 45 20 74 72 3b 0a 20 20 7d 0a 20 20 65 78 70 72  E tr;.  }.  expr
15e0: 20 7b 20 24 6c 6f 67 73 69 7a 65 20 3d 3d 20 5b   { $logsize == [
15f0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
1600: 62 2d 77 61 6c 5d 20 7d 0a 7d 20 7b 31 7d 0a 64  b-wal] }.} {1}.d
1610: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 35  o_test wal-4.4.5
1620: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   {.  execsql { S
1630: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1640: 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 31 7d 0a 64  ROM t2 }.} {1}.d
1650: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 36  o_test wal-4.4.6
1660: 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74   {.  forcecopy t
1670: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
1680: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
1690: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
16a0: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64  -wal.  sqlite3 d
16b0: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78  b2 test2.db.  ex
16c0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
16d0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
16e0: 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ; SELECT count(*
16f0: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
1700: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
1710: 77 61 6c 2d 34 2e 34 2e 37 20 7b 0a 20 20 65 78  wal-4.4.7 {.  ex
1720: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
1730: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
1740: 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20   db2.} {ok}.db2 
1750: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
1760: 61 6c 2d 34 2e 35 2e 31 20 7b 0a 20 20 72 65 6f  al-4.5.1 {.  reo
1770: 70 65 6e 5f 64 62 0a 20 20 69 66 63 61 70 61 62  pen_db.  ifcapab
1780: 6c 65 20 65 6e 61 62 6c 65 5f 70 65 72 73 69 73  le enable_persis
1790: 74 5f 77 61 6c 20 7b 0a 20 20 20 20 66 69 6c 65  t_wal {.    file
17a0: 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74  _control_persist
17b0: 5f 77 61 6c 20 64 62 20 30 0a 20 20 7d 0a 20 20  _wal db 0.  }.  
17c0: 64 62 20 66 75 6e 63 20 62 6c 6f 62 20 62 6c 6f  db func blob blo
17d0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
17e0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
17f0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
1800: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
1810: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
1820: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1830: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d  S('a', 'b');.  }
1840: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
1850: 73 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63 20  st.db.  db func 
1860: 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73 74  blob blob.  list
1870: 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45   [execsql { SELE
1880: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20  CT * FROM t1 }] 
1890: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
18a0: 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d  db-wal].} {{a b}
18b0: 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   0}.do_test wal-
18c0: 34 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  4.5.2 {.  execsq
18d0: 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65  l { PRAGMA cache
18e0: 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 65  _size = 10 }.  e
18f0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
1900: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
1910: 62 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  b);.    BEGIN;. 
1920: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1930: 32 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34 30  2 VALUES(blob(40
1940: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b 0a  0), blob(400));.
1950: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 72      SAVEPOINT tr
1960: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1970: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c  NTO t2 SELECT bl
1980: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1990: 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20  0) FROM t2; /*  
19a0: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
19b0: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
19c0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
19d0: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f  (400) FROM t2; /
19e0: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
19f0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
1a00: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1a10: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32  lob(400) FROM t2
1a20: 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20  ; /*  8 */.     
1a30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1a40: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1a50: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1a60: 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20   t2; /* 16 */.  
1a70: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1a80: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
1a90: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1aa0: 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a 2f  ROM t2; /* 32 */
1ab0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1ac0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
1ad0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1ae0: 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 32  ) FROM t1; /*  2
1af0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
1b00: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
1b10: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1b20: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a  400) FROM t1; /*
1b30: 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    4 */.      INS
1b40: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1b50: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1b60: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1b70: 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20 20   /*  8 */.      
1b80: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1b90: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1ba0: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1bb0: 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20  t1; /* 16 */.   
1bc0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1bd0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
1be0: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1bf0: 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f 0a  OM t1; /* 32 */.
1c00: 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
1c10: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a 20  nt(*) FROM t2;. 
1c20: 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65 73   }.} {32}.do_tes
1c30: 74 20 77 61 6c 2d 34 2e 35 2e 33 20 7b 0a 20 20  t wal-4.5.3 {.  
1c40: 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41  execsql { ROLLBA
1c50: 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d 0a  CK TO tr }.} {}.
1c60: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e  do_test wal-4.5.
1c70: 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69 7a  4 {.  set logsiz
1c80: 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  e [file size tes
1c90: 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65 63  t.db-wal].  exec
1ca0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45  sql {.      INSE
1cb0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
1cc0: 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20 20  S('x', 'y');.   
1cd0: 20 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20 20   RELEASE tr;.   
1ce0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65   COMMIT;.  }.  e
1cf0: 78 70 72 20 7b 20 24 6c 6f 67 73 69 7a 65 20 3d  xpr { $logsize =
1d00: 3d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  = [file size tes
1d10: 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d 20 7b 31  t.db-wal] }.} {1
1d20: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1d30: 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.5 {.  execsql 
1d40: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
1d50: 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c 45  ) FROM t2 ; SELE
1d60: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1d70: 20 74 31 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f   t1 }.} {1 2}.do
1d80: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 36 20  _test wal-4.5.6 
1d90: 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  {.  forcecopy te
1da0: 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20  st.db test2.db. 
1db0: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
1dc0: 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d  db-wal test2.db-
1dd0: 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62  wal.  sqlite3 db
1de0: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65  2 test2.db.  exe
1df0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
1e00: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b  unt(*) FROM t2 ;
1e10: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1e20: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d   FROM t1 } db2.}
1e30: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77   {1 2}.do_test w
1e40: 61 6c 2d 34 2e 35 2e 37 20 7b 0a 20 20 65 78 65  al-4.5.7 {.  exe
1e50: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
1e60: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
1e70: 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20 63  db2.} {ok}.db2 c
1e80: 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77 61  lose..do_test wa
1e90: 6c 2d 34 2e 36 2e 31 20 7b 0a 20 20 65 78 65 63  l-4.6.1 {.  exec
1ea0: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
1eb0: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 50 52   FROM t2;.    PR
1ec0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
1ed0: 69 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  int;.    BEGIN;.
1ee0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1ef0: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 77 27 2c  O t2 VALUES('w',
1f00: 20 27 78 27 29 3b 0a 20 20 20 20 20 20 53 41 56   'x');.      SAV
1f10: 45 50 4f 49 4e 54 20 73 61 76 65 3b 0a 20 20 20  EPOINT save;.   
1f20: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1f30: 20 74 32 20 56 41 4c 55 45 53 28 27 79 27 2c 20   t2 VALUES('y', 
1f40: 27 7a 27 29 3b 0a 20 20 20 20 20 20 52 4f 4c 4c  'z');.      ROLL
1f50: 42 41 43 4b 20 54 4f 20 73 61 76 65 3b 0a 20 20  BACK TO save;.  
1f60: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
1f70: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
1f80: 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b   * FROM t2 }.} {
1f90: 77 20 78 7d 0a 0a 0a 72 65 6f 70 65 6e 5f 64 62  w x}...reopen_db
1fa0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 31  .do_test wal-5.1
1fb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1fc0: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54     CREATE TEMP T
1fd0: 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20  ABLE t2(a, b);. 
1fe0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1ff0: 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  2 VALUES(1, 2);.
2000: 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74    }.} {}.do_test
2010: 20 77 61 6c 2d 35 2e 32 20 7b 0a 20 20 65 78 65   wal-5.2 {.  exe
2020: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
2030: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
2040: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c  NTO t2 VALUES(3,
2050: 20 34 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43   4);.      SELEC
2060: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
2070: 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f  .} {1 2 3 4}.do_
2080: 74 65 73 74 20 77 61 6c 2d 35 2e 33 20 7b 0a 20  test wal-5.3 {. 
2090: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52   execsql {.    R
20a0: 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c  OLLBACK;.    SEL
20b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20  ECT * FROM t2;. 
20c0: 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65   }.} {1 2}.do_te
20d0: 73 74 20 77 61 6c 2d 35 2e 34 20 7b 0a 20 20 65  st wal-5.4 {.  e
20e0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
20f0: 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74  ATE TEMP TABLE t
2100: 33 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20 20  3(x UNIQUE);.   
2110: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
2120: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
2130: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 20  UES(3, 4);.     
2140: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
2150: 56 41 4c 55 45 53 28 27 61 62 63 27 29 3b 0a 20  VALUES('abc');. 
2160: 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20   }.  catchsql { 
2170: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56  INSERT INTO t3 V
2180: 41 4c 55 45 53 28 27 61 62 63 27 29 20 7d 0a 7d  ALUES('abc') }.}
2190: 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e 73   {1 {UNIQUE cons
21a0: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20 74  traint failed: t
21b0: 33 2e 78 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 61  3.x}}.do_test wa
21c0: 6c 2d 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  l-5.5 {.  execsq
21d0: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  l {.    COMMIT;.
21e0: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
21f0: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  M t2;.  }.} {1 2
2200: 20 33 20 34 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a   3 4}.db close..
2210: 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 20 7b  foreach sector {
2220: 35 31 32 20 34 30 39 36 7d 20 7b 0a 20 20 73 71  512 4096} {.  sq
2230: 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f 64  lite3_simulate_d
2240: 65 76 69 63 65 20 2d 73 65 63 74 6f 72 73 69 7a  evice -sectorsiz
2250: 65 20 24 73 65 63 74 6f 72 0a 20 20 66 6f 72 65  e $sector.  fore
2260: 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31 30  ach pgsz {512 10
2270: 32 34 20 32 30 34 38 20 34 30 39 36 7d 20 7b 0a  24 2048 4096} {.
2280: 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20      forcedelete 
2290: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
22a0: 77 61 6c 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  wal.    do_test 
22b0: 77 61 6c 2d 36 2e 24 73 65 63 74 6f 72 2e 24 70  wal-6.$sector.$p
22c0: 67 73 7a 2e 31 20 7b 0a 20 20 20 20 20 20 73 71  gsz.1 {.      sq
22d0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
22e0: 20 2d 76 66 73 20 64 65 76 73 79 6d 0a 20 20 20   -vfs devsym.   
22f0: 20 20 20 69 66 63 61 70 61 62 6c 65 20 65 6e 61     ifcapable ena
2300: 62 6c 65 5f 70 65 72 73 69 73 74 5f 77 61 6c 20  ble_persist_wal 
2310: 7b 0a 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63  {.        file_c
2320: 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77  ontrol_persist_w
2330: 61 6c 20 64 62 20 30 0a 20 20 20 20 20 20 7d 0a  al db 0.      }.
2340: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a        execsql ".
2350: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 70          PRAGMA p
2360: 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 67 73 7a  age_size = $pgsz
2370: 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  ;.        PRAGMA
2380: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30   auto_vacuum = 0
2390: 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  ;.        PRAGMA
23a0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
23b0: 77 61 6c 3b 0a 20 20 20 20 20 20 22 0a 20 20 20  wal;.      ".   
23c0: 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20     execsql ".   
23d0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
23e0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
23f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2400: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
2410: 0a 20 20 20 20 20 20 22 0a 20 20 20 20 20 20 64  .      ".      d
2420: 62 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 66 69  b close.      fi
2430: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
2440: 20 20 20 20 7d 20 5b 65 78 70 72 20 24 70 67 73      } [expr $pgs
2450: 7a 2a 32 5d 0a 20 20 0a 20 20 20 20 64 6f 5f 74  z*2].  .    do_t
2460: 65 73 74 20 77 61 6c 2d 36 2e 24 73 65 63 74 6f  est wal-6.$secto
2470: 72 2e 24 70 67 73 7a 2e 32 20 7b 0a 20 20 20 20  r.$pgsz.2 {.    
2480: 20 20 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74 65    log_deleted te
2490: 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20 7d 20  st.db-wal.    } 
24a0: 7b 31 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65  {1}.  }.}..do_te
24b0: 73 74 20 77 61 6c 2d 37 2e 31 20 7b 0a 20 20 66  st wal-7.1 {.  f
24c0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
24d0: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  db test.db-wal. 
24e0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20   sqlite3_wal db 
24f0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
2500: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
2510: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
2520: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2530: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
2540: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2550: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
2560: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69  .  list [file si
2570: 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c  ze test.db] [fil
2580: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
2590: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31 30 32 34  al].} [list 1024
25a0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
25b0: 33 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74  3 1024]].do_test
25c0: 20 77 61 6c 2d 37 2e 32 20 7b 0a 20 20 65 78 65   wal-7.2 {.  exe
25d0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
25e0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
25f0: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
2600: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20   test.db] [file 
2610: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
2620: 5d 0a 7d 20 5b 6c 69 73 74 20 32 30 34 38 20 5b  ].} [list 2048 [
2630: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20  wal_file_size 3 
2640: 31 30 32 34 5d 5d 0a 0a 23 20 45 78 65 63 75 74  1024]]..# Execut
2650: 65 20 73 6f 6d 65 20 74 72 61 6e 73 61 63 74 69  e some transacti
2660: 6f 6e 73 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ons in auto-vacu
2670: 75 6d 20 6d 6f 64 65 20 74 6f 20 74 65 73 74 20  um mode to test 
2680: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
2690: 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 23 0a 64 6f  truncation..#.do
26a0: 5f 74 65 73 74 20 77 61 6c 2d 38 2e 31 20 7b 0a  _test wal-8.1 {.
26b0: 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 63 61    reopen_db.  ca
26c0: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
26d0: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
26e0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
26f0: 61 6c 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  al..  sqlite3 db
2700: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75   test.db.  db fu
2710: 6e 63 74 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f 62  nction blob blob
2720: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2730: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
2740: 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 50 52 41  uum = 1;.    PRA
2750: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
2760: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 50 52 41 47   = wal;.    PRAG
2770: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3b 0a  MA auto_vacuum;.
2780: 20 20 7d 0a 7d 20 7b 77 61 6c 20 31 7d 0a 64 6f    }.} {wal 1}.do
2790: 5f 74 65 73 74 20 77 61 6c 2d 38 2e 32 20 7b 0a  _test wal-8.2 {.
27a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
27b0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
27c0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
27d0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
27e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
27f0: 20 74 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28   t1 VALUES(blob(
2800: 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  900));.    INSER
2810: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2820: 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20  (blob(900));.   
2830: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2840: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2850: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
2860: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53  /*  4 */.    INS
2870: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2880: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
2890: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 20  M t1;       /*  
28a0: 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  8 */.    INSERT 
28b0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
28c0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
28d0: 3b 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f  ;       /* 16 */
28e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
28f0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2900: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2910: 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20      /* 32 */.   
2920: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2930: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2940: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
2950: 2f 2a 20 36 34 20 2a 2f 0a 20 20 20 20 50 52 41  /* 64 */.    PRA
2960: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
2970: 6e 74 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  nt;.  }.  file s
2980: 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65  ize test.db.} [e
2990: 78 70 72 20 36 38 2a 31 30 32 34 5d 0a 64 6f 5f  xpr 68*1024].do_
29a0: 74 65 73 74 20 77 61 6c 2d 38 2e 33 20 7b 0a 20  test wal-8.3 {. 
29b0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
29c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
29d0: 48 45 52 45 20 72 6f 77 69 64 3c 35 34 3b 0a 20  HERE rowid<54;. 
29e0: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
29f0: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20  eckpoint;.  }.  
2a00: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
2a10: 62 0a 7d 20 5b 65 78 70 72 20 31 34 2a 31 30 32  b.} [expr 14*102
2a20: 34 5d 0a 0a 23 20 52 75 6e 20 73 6f 6d 65 20 22  4]..# Run some "
2a30: 77 61 72 6d 2d 62 6f 64 79 22 20 74 65 73 74 73  warm-body" tests
2a40: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
2a50: 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66 69 6c 65  log-summary file
2a60: 73 20 77 69 74 68 20 6d 6f 72 65 0a 23 20 74 68  s with more.# th
2a70: 61 6e 20 32 35 36 20 65 6e 74 72 69 65 73 20 28  an 256 entries (
2a80: 6c 6f 67 20 73 75 6d 6d 61 72 69 65 73 20 74 68  log summaries th
2a90: 61 74 20 63 6f 6e 74 61 69 6e 20 69 6e 64 65 78  at contain index
2aa0: 20 62 6c 6f 63 6b 73 29 20 77 6f 72 6b 20 4f 6b   blocks) work Ok
2ab0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..#.do_test wal-
2ac0: 39 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64  9.1 {.  reopen_d
2ad0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
2ae0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
2af0: 69 7a 65 3d 32 30 30 30 3b 0a 20 20 20 20 43 52  ize=2000;.    CR
2b00: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 20  EATE TABLE t1(x 
2b10: 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20  PRIMARY KEY);.  
2b20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2b30: 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30 30   VALUES(blob(900
2b40: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
2b50: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 62 6c  NTO t1 VALUES(bl
2b60: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e  ob(900));.    IN
2b70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2b80: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2b90: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2ba0: 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   4 */.    INSERT
2bb0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2bc0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2bd0: 31 3b 20 20 20 20 20 20 20 2f 2a 20 20 38 20 2a  1;       /*  8 *
2be0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
2bf0: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2c00: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2c10: 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20       /* 16 */.  
2c20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2c30: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2c40: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2c50: 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e   /* 32 */.    IN
2c60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2c70: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2c80: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2c90: 36 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  64 */.    INSERT
2ca0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2cb0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2cc0: 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20  1;       /* 128 
2cd0: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
2ce0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
2cf0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
2d00: 20 20 20 20 20 20 2f 2a 20 32 35 36 20 2a 2f 0a        /* 256 */.
2d10: 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20    }.  file size 
2d20: 74 65 73 74 2e 64 62 0a 7d 20 31 30 32 34 0a 64  test.db.} 1024.d
2d30: 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e 32 20 7b  o_test wal-9.2 {
2d40: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
2d50: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
2d60: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74  csql {PRAGMA int
2d70: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64  egrity_check } d
2d80: 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65  b2.} {ok}..do_te
2d90: 73 74 20 77 61 6c 2d 39 2e 33 20 7b 0a 20 20 66  st wal-9.3 {.  f
2da0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 32  orcedelete test2
2db0: 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  .db test2.db-wal
2dc0: 0a 20 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73  .  copy_file tes
2dd0: 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20  t.db test2.db.  
2de0: 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64  copy_file test.d
2df0: 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77  b-wal test2.db-w
2e00: 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  al.  sqlite3_wal
2e10: 20 64 62 33 20 74 65 73 74 32 2e 64 62 20 0a 20   db3 test2.db . 
2e20: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
2e30: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
2e40: 20 7d 20 64 62 33 0a 7d 20 7b 6f 6b 7d 0a 64 62   } db3.} {ok}.db
2e50: 33 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74  3 close..do_test
2e60: 20 77 61 6c 2d 39 2e 34 20 7b 0a 20 20 65 78 65   wal-9.4 {.  exe
2e70: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
2e80: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
2e90: 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 73 71 6c   db2 close.  sql
2ea0: 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73  ite3_wal db2 tes
2eb0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
2ec0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
2ed0: 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b  _check } db2.} {
2ee0: 6f 6b 7d 0a 0a 66 6f 72 65 61 63 68 20 68 61 6e  ok}..foreach han
2ef0: 64 6c 65 20 7b 64 62 20 64 62 32 20 64 62 33 7d  dle {db db2 db3}
2f00: 20 7b 20 63 61 74 63 68 20 7b 20 24 68 61 6e 64   { catch { $hand
2f10: 6c 65 20 63 6c 6f 73 65 20 7d 20 7d 0a 75 6e 73  le close } }.uns
2f20: 65 74 20 68 61 6e 64 6c 65 0a 0a 23 2d 2d 2d 2d  et handle..#----
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
2f80: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74  owing block of t
2f90: 65 73 74 73 20 2d 20 77 61 6c 2d 31 30 2e 2a 20  ests - wal-10.* 
2fa0: 2d 20 74 65 73 74 20 74 68 61 74 20 74 68 65 20  - test that the 
2fb0: 57 41 4c 20 6c 6f 63 6b 69 6e 67 20 0a 23 20 73  WAL locking .# s
2fc0: 63 68 65 6d 65 20 77 6f 72 6b 73 20 69 6e 20 73  cheme works in s
2fd0: 69 6d 70 6c 65 20 63 61 73 65 73 2e 20 54 68 69  imple cases. Thi
2fe0: 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  s block of tests
2ff0: 20 69 73 20 72 75 6e 20 74 77 69 63 65 2e 20 4f   is run twice. O
3000: 6e 63 65 0a 23 20 75 73 69 6e 67 20 6d 75 6c 74  nce.# using mult
3010: 69 70 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  iple connections
3020: 20 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20   in the address 
3030: 73 70 61 63 65 20 6f 66 20 74 68 65 20 63 75 72  space of the cur
3040: 72 65 6e 74 20 70 72 6f 63 65 73 73 2c 0a 23 20  rent process,.# 
3050: 61 6e 64 20 6f 6e 63 65 20 77 69 74 68 20 61 6c  and once with al
3060: 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 65 78  l connections ex
3070: 63 65 70 74 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  cept one running
3080: 20 69 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f   in external pro
3090: 63 65 73 73 65 73 2e 0a 23 0a 64 6f 5f 6d 75 6c  cesses..#.do_mul
30a0: 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
30b0: 20 7b 0a 0a 20 20 23 20 49 6e 69 74 69 61 6c 69   {..  # Initiali
30c0: 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
30d0: 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65  schema and conte
30e0: 6e 74 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  nts..  #.  do_te
30f0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 20  st wal-10.$tn.1 
3100: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
3110: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74        PRAGMA aut
3120: 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20  o_vacuum = 0;.  
3130: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
3140: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
3150: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
3160: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3170: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3180: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
3190: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
31a0: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t1;.    }.  }
31b0: 20 7b 77 61 6c 20 31 20 32 7d 0a 0a 20 20 23 20   {wal 1 2}..  # 
31c0: 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  Open a transacti
31d0: 6f 6e 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20  on and write to 
31e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
31f0: 6e 67 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 74  ng [db]. Check t
3200: 68 61 74 20 5b 64 62 32 5d 0a 20 20 23 20 69 73  hat [db2].  # is
3210: 20 73 74 69 6c 6c 20 61 62 6c 65 20 74 6f 20 72   still able to r
3220: 65 61 64 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ead the snapshot
3230: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
3240: 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
3250: 65 64 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  ed..  #.  do_tes
3260: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 20 7b  t wal-10.$tn.2 {
3270: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42  .    execsql { B
3280: 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
3290: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
32a0: 29 3b 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53  ); }.    sql2 {S
32b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
32c0: 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 23 20  .  } {1 2}..  # 
32d0: 48 61 76 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74  Have [db] commit
32e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
32f0: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 5b 64 62  . Check that [db
3300: 32 5d 20 69 73 20 6e 6f 77 20 73 65 65 69 6e 67  2] is now seeing
3310: 20 74 68 65 20 0a 20 20 23 20 6e 65 77 2c 20 75   the .  # new, u
3320: 70 64 61 74 65 64 20 73 6e 61 70 73 68 6f 74 2e  pdated snapshot.
3330: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
3340: 61 6c 2d 31 30 2e 24 74 6e 2e 33 20 7b 0a 20 20  al-10.$tn.3 {.  
3350: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
3360: 49 54 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53  IT }.    sql2 {S
3370: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
3380: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a  .  } {1 2 3 4}..
3390: 20 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f    # Have [db2] o
33a0: 70 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  pen a read trans
33b0: 61 63 74 69 6f 6e 2e 20 54 68 65 6e 20 77 72 69  action. Then wri
33c0: 74 65 20 74 6f 20 74 68 65 20 64 62 20 76 69 61  te to the db via
33d0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 0a 20 20 23   [db]. Check.  #
33e0: 20 74 68 61 74 20 5b 64 62 32 5d 20 69 73 20 73   that [db2] is s
33f0: 74 69 6c 6c 20 73 65 65 69 6e 67 20 74 68 65 20  till seeing the 
3400: 6f 72 69 67 69 6e 61 6c 20 73 6e 61 70 73 68 6f  original snapsho
3410: 74 2e 20 54 68 65 6e 20 72 65 61 64 20 77 69 74  t. Then read wit
3420: 68 20 5b 64 62 33 5d 2e 0a 20 20 23 20 5b 64 62  h [db3]..  # [db
3430: 33 5d 20 73 68 6f 75 6c 64 20 73 65 65 20 74 68  3] should see th
3440: 65 20 6e 65 77 6c 79 20 63 6f 6d 6d 69 74 74 65  e newly committe
3450: 64 20 64 61 74 61 2e 0a 20 20 23 0a 20 20 64 6f  d data..  #.  do
3460: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3470: 2e 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .4 {.    sql2 { 
3480: 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a  BEGIN ; SELECT *
3490: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
34a0: 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   2 3 4}.  do_tes
34b0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 35 20 7b  t wal-10.$tn.5 {
34c0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
34d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
34e0: 4c 55 45 53 28 35 2c 20 36 29 3b 20 7d 0a 20 20  LUES(5, 6); }.  
34f0: 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a    sql2 {SELECT *
3500: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
3510: 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   2 3 4}.  do_tes
3520: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 36 20 7b  t wal-10.$tn.6 {
3530: 0a 20 20 20 20 73 71 6c 33 20 7b 53 45 4c 45 43  .    sql3 {SELEC
3540: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d  T * FROM t1}.  }
3550: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20   {1 2 3 4 5 6}. 
3560: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3570: 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32  $tn.7 {.    sql2
3580: 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 0a   COMMIT.  } {}..
3590: 20 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f    # Have [db2] o
35a0: 70 65 6e 20 61 20 77 72 69 74 65 20 74 72 61 6e  pen a write tran
35b0: 73 61 63 74 69 6f 6e 2e 20 54 68 65 6e 20 61 74  saction. Then at
35c0: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
35d0: 6f 20 74 68 65 20 0a 20 20 23 20 64 61 74 61 62  o the .  # datab
35e0: 61 73 65 20 76 69 61 20 5b 64 62 5d 2e 20 54 68  ase via [db]. Th
35f0: 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 20 28  is should fail (
3600: 77 72 69 74 65 72 20 6c 6f 63 6b 20 63 61 6e 6e  writer lock cann
3610: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 29 2e  ot be obtained).
3620: 0a 20 20 23 0a 20 20 23 20 54 68 65 6e 20 6f 70  .  #.  # Then op
3630: 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
3640: 63 74 69 6f 6e 20 77 69 74 68 20 5b 64 62 5d 2e  ction with [db].
3650: 20 43 6f 6d 6d 69 74 20 74 68 65 20 5b 64 62 32   Commit the [db2
3660: 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  ] transaction.  
3670: 23 20 74 6f 20 64 69 73 6b 2e 20 56 65 72 69 66  # to disk. Verif
3680: 79 20 74 68 61 74 20 5b 64 62 5d 20 73 74 69 6c  y that [db] stil
3690: 6c 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74  l cannot write t
36a0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
36b0: 62 65 63 61 75 73 65 0a 20 20 23 20 69 74 20 69  because.  # it i
36c0: 73 20 72 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64  s reading an old
36d0: 20 73 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a   snapshot)..  #.
36e0: 20 20 23 20 43 6c 6f 73 65 20 74 68 65 20 63 75    # Close the cu
36f0: 72 72 65 6e 74 20 5b 64 62 5d 20 74 72 61 6e 73  rrent [db] trans
3700: 61 63 74 69 6f 6e 2e 20 4f 70 65 6e 20 61 20 6e  action. Open a n
3710: 65 77 20 6f 6e 65 2e 20 5b 64 62 5d 20 63 61 6e  ew one. [db] can
3720: 20 6e 6f 77 20 77 72 69 74 65 0a 20 20 23 20 74   now write.  # t
3730: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
3740: 61 73 20 69 74 20 69 73 20 6e 6f 74 20 6c 6f 63  as it is not loc
3750: 6b 65 64 20 61 6e 64 20 5b 64 62 5d 20 69 73 20  ked and [db] is 
3760: 72 65 61 64 69 6e 67 20 74 68 65 20 6c 61 74 65  reading the late
3770: 73 74 0a 20 20 23 20 73 6e 61 70 73 68 6f 74 29  st.  # snapshot)
3780: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
3790: 77 61 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20  wal-10.$tn.7 {. 
37a0: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
37b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
37c0: 56 41 4c 55 45 53 28 37 2c 20 38 29 20 3b 20 7d  VALUES(7, 8) ; }
37d0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
37e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
37f0: 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20  ALUES(9, 10) }. 
3800: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
3810: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
3820: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3830: 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .8 {.    execsql
3840: 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45 43   { BEGIN ; SELEC
3850: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3860: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
3870: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3880: 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 73 71 6c  .$tn.9 {.    sql
3890: 32 20 43 4f 4d 4d 49 54 0a 20 20 20 20 63 61 74  2 COMMIT.    cat
38a0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
38b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c  NTO t1 VALUES(9,
38c0: 20 31 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64   10) }.  } {1 {d
38d0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
38e0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  d}}.  do_test wa
38f0: 6c 2d 31 30 2e 24 74 6e 2e 31 30 20 7b 0a 20 20  l-10.$tn.10 {.  
3900: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
3910: 49 54 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  IT }.    execsql
3920: 20 7b 20 42 45 47 49 4e 20 7d 0a 20 20 20 20 65   { BEGIN }.    e
3930: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
3940: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39  INTO t1 VALUES(9
3950: 2c 20 31 30 29 20 7d 0a 20 20 20 20 65 78 65 63  , 10) }.    exec
3960: 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20  sql { COMMIT }. 
3970: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
3980: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
3990: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
39a0: 20 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20   7 8 9 10}..  # 
39b0: 4f 70 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e  Open a read tran
39c0: 73 61 63 74 69 6f 6e 20 77 69 74 68 20 5b 64 62  saction with [db
39d0: 32 5d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74  2]. Check that t
39e0: 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64 62  his prevents [db
39f0: 5d 20 66 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b  ] from.  # check
3a00: 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74  pointing the dat
3a10: 61 62 61 73 65 2e 20 42 75 74 20 6e 6f 74 20 66  abase. But not f
3a20: 72 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 69  rom writing to i
3a30: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
3a40: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 31 20 7b   wal-10.$tn.11 {
3a50: 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49  .    sql2 { BEGI
3a60: 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N; SELECT * FROM
3a70: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3a80: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d   4 5 6 7 8 9 10}
3a90: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3aa0: 30 2e 24 74 6e 2e 31 32 20 7b 0a 20 20 20 20 63  0.$tn.12 {.    c
3ab0: 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41  atchsql { PRAGMA
3ac0: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
3ad0: 7d 20 0a 20 20 7d 20 7b 30 20 7b 30 20 37 20 37  } .  } {0 {0 7 7
3ae0: 7d 7d 20 20 20 3b 23 20 52 65 61 64 65 72 20 6e  }}   ;# Reader n
3af0: 6f 20 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b 20 63  o longer block c
3b00: 68 65 63 6b 70 6f 69 6e 74 73 0a 20 20 64 6f 5f  heckpoints.  do_
3b10: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3b20: 31 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  13 {.    execsql
3b30: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3b40: 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29  1 VALUES(11, 12)
3b50: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c   }.    sql2 {SEL
3b60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
3b70: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
3b80: 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 57  7 8 9 10}..  # W
3b90: 72 69 74 65 72 73 20 64 6f 20 6e 6f 74 20 62 6c  riters do not bl
3ba0: 6f 63 6b 20 63 68 65 63 6b 70 6f 69 6e 74 73 20  ock checkpoints 
3bb0: 61 6e 79 20 6d 6f 72 65 20 65 69 74 68 65 72 2e  any more either.
3bc0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
3bd0: 61 6c 2d 31 30 2e 24 74 6e 2e 31 34 20 7b 0a 20  al-10.$tn.14 {. 
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 37 7d 7d 0a 0a 20 20 23 20 54 68 65 20   8 7}}..  # The 
3c20: 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 72 69 65 73  following series
3c30: 20 6f 66 20 74 65 73 74 20 63 61 73 65 73 20 75   of test cases u
3c40: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 61 6e  sed to verify an
3c50: 6f 74 68 65 72 20 62 6c 6f 63 6b 69 6e 67 0a 20  other blocking. 
3c60: 20 23 20 63 61 73 65 20 69 6e 20 57 41 4c 20 2d   # case in WAL -
3c70: 20 61 20 63 61 73 65 20 77 68 69 63 68 20 6e 6f   a case which no
3c80: 20 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b 73 2e 0a   longer blocks..
3c90: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
3ca0: 6c 2d 31 30 2e 24 74 6e 2e 31 35 20 7b 0a 20 20  l-10.$tn.15 {.  
3cb0: 20 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 3b    sql2 { COMMIT;
3cc0: 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a   BEGIN; SELECT *
3cd0: 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20   FROM t1; }.  } 
3ce0: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
3cf0: 20 39 20 31 30 20 31 31 20 31 32 7d 0a 20 20 64   9 10 11 12}.  d
3d00: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3d10: 6e 2e 31 36 20 7b 0a 20 20 20 20 63 61 74 63 68  n.16 {.    catch
3d20: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
3d30: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20  _checkpoint } . 
3d40: 20 7d 20 7b 30 20 7b 30 20 38 20 38 7d 7d 0a 20   } {0 {0 8 8}}. 
3d50: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3d60: 24 74 6e 2e 31 37 20 7b 0a 20 20 20 20 65 78 65  $tn.17 {.    exe
3d70: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
3d80: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a  l_checkpoint } .
3d90: 20 20 7d 20 7b 30 20 38 20 38 7d 0a 20 20 64 6f    } {0 8 8}.  do
3da0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3db0: 2e 31 38 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b  .18 {.    sql3 {
3dc0: 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a   BEGIN; SELECT *
3dd0: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
3de0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
3df0: 39 20 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f  9 10 11 12}.  do
3e00: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3e10: 2e 31 39 20 7b 0a 20 20 20 20 63 61 74 63 68 73  .19 {.    catchs
3e20: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
3e30: 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c 20 31   t1 VALUES(13, 1
3e40: 34 29 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a  4) }.  } {0 {}}.
3e50: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3e60: 2e 24 74 6e 2e 32 30 20 7b 0a 20 20 20 20 65 78  .$tn.20 {.    ex
3e70: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3e80: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
3e90: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
3ea0: 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34  9 10 11 12 13 14
3eb0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
3ec0: 31 30 2e 24 74 6e 2e 32 31 20 7b 0a 20 20 20 20  10.$tn.21 {.    
3ed0: 73 71 6c 33 20 43 4f 4d 4d 49 54 0a 20 20 20 20  sql3 COMMIT.    
3ee0: 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 7d 20  sql2 COMMIT.  } 
3ef0: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  {}.  do_test wal
3f00: 2d 31 30 2e 24 74 6e 2e 32 32 20 7b 0a 20 20 20  -10.$tn.22 {.   
3f10: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
3f20: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3f30: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
3f40: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
3f50: 20 31 34 7d 0a 0a 20 20 23 20 41 6e 6f 74 68 65   14}..  # Anothe
3f60: 72 20 73 65 72 69 65 73 20 6f 66 20 74 65 73 74  r series of test
3f70: 73 20 74 68 61 74 20 75 73 65 64 20 74 6f 20 64  s that used to d
3f80: 65 6d 6f 6e 73 74 72 61 74 65 20 62 6c 6f 63 6b  emonstrate block
3f90: 69 6e 67 20 62 65 68 61 76 69 6f 72 0a 20 20 23  ing behavior.  #
3fa0: 20 62 75 74 20 77 68 69 63 68 20 6e 6f 77 20 77   but which now w
3fb0: 6f 72 6b 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  ork..  #.  do_te
3fc0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 33  st wal-10.$tn.23
3fd0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3fe0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
3ff0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20  kpoint }.  } {0 
4000: 39 20 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  9 9}.  do_test w
4010: 61 6c 2d 31 30 2e 24 74 6e 2e 32 34 20 7b 0a 20  al-10.$tn.24 {. 
4020: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
4030: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4040: 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  1; }.  } {1 2 3 
4050: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
4060: 31 20 31 32 20 31 33 20 31 34 7d 0a 20 20 64 6f  1 12 13 14}.  do
4070: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4080: 2e 32 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .25 {.    execsq
4090: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
40a0: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
40b0: 7b 30 20 39 20 39 7d 0a 20 20 64 6f 5f 74 65 73  {0 9 9}.  do_tes
40c0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36 20  t wal-10.$tn.26 
40d0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
40e0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
40f0: 56 41 4c 55 45 53 28 31 35 2c 20 31 36 29 20 7d  VALUES(15, 16) }
4100: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f  .  } {0 {}}.  do
4110: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4120: 2e 32 37 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b  .27 {.    sql3 {
4130: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4140: 56 41 4c 55 45 53 28 31 37 2c 20 31 38 29 20 7d  VALUES(17, 18) }
4150: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
4160: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 38 20  t wal-10.$tn.28 
4170: 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b 0a 20 20  {.    code3 {.  
4180: 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b      set ::STMT [
4190: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
41a0: 64 62 33 20 22 53 45 4c 45 43 54 20 2a 20 46 52  db3 "SELECT * FR
41b0: 4f 4d 20 74 31 22 20 2d 31 20 54 41 49 4c 5d 0a  OM t1" -1 TAIL].
41c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
41d0: 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20 20 20 7d  ep $::STMT.    }
41e0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
41f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
4200: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
4210: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
4220: 32 20 31 33 20 31 34 20 31 35 20 31 36 20 31 37  2 13 14 15 16 17
4230: 20 31 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   18}.  do_test w
4240: 61 6c 2d 31 30 2e 24 74 6e 2e 32 39 20 7b 0a 20  al-10.$tn.29 {. 
4250: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
4260: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4270: 45 53 28 31 39 2c 20 32 30 29 20 7d 0a 20 20 20  ES(19, 20) }.   
4280: 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47   catchsql { PRAG
4290: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
42a0: 74 20 7d 0a 20 20 7d 20 7b 30 20 7b 30 20 33 20  t }.  } {0 {0 3 
42b0: 30 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  0}}.  do_test wa
42c0: 6c 2d 31 30 2e 24 74 6e 2e 33 30 20 7b 0a 20 20  l-10.$tn.30 {.  
42d0: 20 20 63 6f 64 65 33 20 7b 20 73 71 6c 69 74 65    code3 { sqlite
42e0: 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54  3_finalize $::ST
42f0: 4d 54 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  MT }.    execsql
4300: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
4310: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b  eckpoint }.  } {
4320: 30 20 33 20 30 7d 0a 0a 20 20 23 20 41 74 20 6f  0 3 0}..  # At o
4330: 6e 65 20 70 6f 69 6e 74 2c 20 69 66 20 61 20 72  ne point, if a r
4340: 65 61 64 65 72 20 66 61 69 6c 65 64 20 74 6f 20  eader failed to 
4350: 75 70 67 72 61 64 65 20 74 6f 20 61 20 77 72 69  upgrade to a wri
4360: 74 65 72 20 62 65 63 61 75 73 65 20 69 74 0a 20  ter because it. 
4370: 20 23 20 77 61 73 20 72 65 61 64 69 6e 67 20 61   # was reading a
4380: 6e 20 6f 6c 64 20 73 6e 61 70 73 68 6f 74 2c 20  n old snapshot, 
4390: 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  the write-locks 
43a0: 77 65 72 65 20 6e 6f 74 20 62 65 69 6e 67 20 72  were not being r
43b0: 65 6c 65 61 73 65 64 2e 0a 20 20 23 20 54 65 73  eleased..  # Tes
43c0: 74 20 74 68 61 74 20 74 68 69 73 20 62 75 67 20  t that this bug 
43d0: 68 61 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a  has been fixed..
43e0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
43f0: 6c 2d 31 30 2e 24 74 6e 2e 33 31 20 7b 0a 20 20  l-10.$tn.31 {.  
4400: 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20    sql2 COMMIT.  
4410: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
4420: 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  N ; SELECT * FRO
4430: 4d 20 74 31 20 7d 0a 20 20 20 20 73 71 6c 32 20  M t1 }.    sql2 
4440: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
4450: 20 56 41 4c 55 45 53 28 32 31 2c 20 32 32 29 20   VALUES(21, 22) 
4460: 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  }.    catchsql {
4470: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4480: 56 41 4c 55 45 53 28 32 33 2c 20 32 34 29 20 7d  VALUES(23, 24) }
4490: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
44a0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
44b0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
44c0: 74 6e 2e 33 32 20 7b 0a 20 20 20 20 23 20 54 68  tn.32 {.    # Th
44d0: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75  is statement wou
44e0: 6c 64 20 66 61 69 6c 20 77 68 65 6e 20 74 68 65  ld fail when the
44f0: 20 62 75 67 20 77 61 73 20 70 72 65 73 65 6e 74   bug was present
4500: 2e 0a 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53  ..    sql2 { INS
4510: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4520: 45 53 28 32 33 2c 20 32 34 29 20 7d 0a 20 20 7d  ES(23, 24) }.  }
4530: 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61   {}.  do_test wa
4540: 6c 2d 31 30 2e 24 74 6e 2e 33 33 20 7b 0a 20 20  l-10.$tn.33 {.  
4550: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
4560: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 3b 20 43  CT * FROM t1 ; C
4570: 4f 4d 4d 49 54 20 7d 0a 20 20 7d 20 7b 31 20 32  OMMIT }.  } {1 2
4580: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
4590: 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  0 11 12 13 14 15
45a0: 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30 7d   16 17 18 19 20}
45b0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
45c0: 30 2e 24 74 6e 2e 33 34 20 7b 0a 20 20 20 20 65  0.$tn.34 {.    e
45d0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
45e0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
45f0: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
4600: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
4610: 34 20 31 35 20 31 36 20 31 37 20 31 38 20 31 39  4 15 16 17 18 19
4620: 20 32 30 20 32 31 20 32 32 20 32 33 20 32 34 7d   20 21 22 23 24}
4630: 0a 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20  ..  # Test that 
4640: 69 66 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 65  if a checkpointe
4650: 72 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20  r cannot obtain 
4660: 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63  the required loc
4670: 6b 73 2c 20 69 74 0a 20 20 23 20 72 65 6c 65 61  ks, it.  # relea
4680: 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 62 65  ses all locks be
4690: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61  fore returning a
46a0: 20 62 75 73 79 20 65 72 72 6f 72 2e 0a 20 20 23   busy error..  #
46b0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
46c0: 30 2e 24 74 6e 2e 33 35 20 7b 0a 20 20 20 20 65  0.$tn.35 {.    e
46d0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
46e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
46f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4700: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O t1 VALUES('a',
4710: 20 27 62 27 29 3b 0a 20 20 20 20 20 20 49 4e 53   'b');.      INS
4720: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4730: 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20  ES('c', 'd');.  
4740: 20 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20    }.    sql2 {. 
4750: 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20       BEGIN;.    
4760: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
4770: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
4780: 7b 61 20 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74  {a b c d}.  do_t
4790: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33  est wal-10.$tn.3
47a0: 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  6 {.    catchsql
47b0: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
47c0: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b  eckpoint }.  } {
47d0: 30 20 7b 30 20 38 20 38 7d 7d 0a 20 20 64 6f 5f  0 {0 8 8}}.  do_
47e0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
47f0: 33 36 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b 20  36 {.    sql3 { 
4800: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4810: 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27 29 20  ALUES('e', 'f') 
4820: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20 53 45 4c  }.    sql2 { SEL
4830: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
4840: 20 20 7d 20 7b 61 20 62 20 63 20 64 7d 0a 20 20    } {a b c d}.  
4850: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
4860: 74 6e 2e 33 37 20 7b 0a 20 20 20 20 73 71 6c 32  tn.37 {.    sql2
4870: 20 43 4f 4d 4d 49 54 0a 20 20 20 20 65 78 65 63   COMMIT.    exec
4880: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
4890: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20  _checkpoint }.  
48a0: 7d 20 7b 30 20 39 20 39 7d 0a 7d 0a 0a 23 2d 2d  } {0 9 9}.}..#--
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62  -------.# This b
4900: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 77  lock of tests, w
4910: 61 6c 2d 31 31 2e 2a 2c 20 74 65 73 74 20 74 68  al-11.*, test th
4920: 61 74 20 6e 6f 74 68 69 6e 67 20 67 6f 65 73 20  at nothing goes 
4930: 74 65 72 72 69 62 6c 79 20 77 72 6f 6e 67 0a 23  terribly wrong.#
4940: 20 69 66 20 66 72 61 6d 65 73 20 6d 75 73 74 20   if frames must 
4950: 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
4960: 65 20 6c 6f 67 20 66 69 6c 65 20 62 65 66 6f 72  e log file befor
4970: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
4980: 69 73 0a 23 20 63 6f 6d 6d 69 74 74 65 64 20 28  is.# committed (
4990: 69 6e 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  in order to free
49a0: 20 75 70 20 6d 65 6d 6f 72 79 29 2e 0a 23 0a 64   up memory)..#.d
49b0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 20  o_test wal-11.1 
49c0: 7b 0a 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20  {.  reopen_db.  
49d0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
49e0: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
49f0: 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41  = 10;.    PRAGMA
4a00: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
4a10: 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  4;.    CREATE TA
4a20: 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59  BLE t1(x PRIMARY
4a30: 20 4b 45 59 29 3b 0a 20 20 7d 0a 20 20 6c 69 73   KEY);.  }.  lis
4a40: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
4a50: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
4a60: 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  ] [expr [file si
4a70: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f  ze test.db-wal]/
4a80: 31 30 34 34 5d 0a 7d 20 7b 31 20 33 7d 0a 64 6f  1044].} {1 3}.do
4a90: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 32 20 7b  _test wal-11.2 {
4aa0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
4ab0: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
4ac0: 6e 74 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70  nt }.  list [exp
4ad0: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
4ae0: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c  t.db]/1024] [fil
4af0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
4b00: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77  al].} [list 3 [w
4b10: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31  al_file_size 3 1
4b20: 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61  024]].do_test wa
4b30: 6c 2d 31 31 2e 33 20 7b 0a 20 20 65 78 65 63 73  l-11.3 {.  execs
4b40: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
4b50: 20 74 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62   t1 VALUES( blob
4b60: 28 39 30 30 29 20 29 20 7d 0a 20 20 6c 69 73 74  (900) ) }.  list
4b70: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
4b80: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
4b90: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
4ba0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
4bb0: 20 33 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a   3 [wal_file_siz
4bc0: 65 20 34 20 31 30 32 34 5d 5d 0a 0a 64 6f 5f 74  e 4 1024]]..do_t
4bd0: 65 73 74 20 77 61 6c 2d 31 31 2e 34 20 7b 0a 20  est wal-11.4 {. 
4be0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
4bf0: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
4c00: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4c10: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
4c20: 4d 20 74 31 3b 20 20 20 2d 2d 20 32 0a 20 20 20  M t1;   -- 2.   
4c30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4c40: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
4c50: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d  0) FROM t1;   --
4c60: 20 34 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   4.      INSERT 
4c70: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
4c80: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
4c90: 3b 20 20 20 2d 2d 20 38 0a 20 20 20 20 20 20 49  ;   -- 8.      I
4ca0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
4cb0: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
4cc0: 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 31 36 0a  ROM t1;   -- 16.
4cd0: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72    }.  list [expr
4ce0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
4cf0: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65  .db]/1024] [file
4d00: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
4d10: 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61  l].} [list 3 [wa
4d20: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 32 20 31  l_file_size 32 1
4d30: 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61  024]].do_test wa
4d40: 6c 2d 31 31 2e 35 20 7b 0a 20 20 65 78 65 63 73  l-11.5 {.  execs
4d50: 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54  ql { .    SELECT
4d60: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
4d70: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  1;.    PRAGMA in
4d80: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
4d90: 20 7d 0a 7d 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f   }.} {16 ok}.do_
4da0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 36 20 7b 0a  test wal-11.6 {.
4db0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
4dc0: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4dd0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4de0: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
4df0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
4e00: 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66  } [list 3 [wal_f
4e10: 69 6c 65 5f 73 69 7a 65 20 34 30 20 31 30 32 34  ile_size 40 1024
4e20: 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  ]].do_test wal-1
4e30: 31 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.7 {.  execsql 
4e40: 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  { .    SELECT co
4e50: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
4e60: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
4e70: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a  rity_check;.  }.
4e80: 7d 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73  } {16 ok}.do_tes
4e90: 74 20 77 61 6c 2d 31 31 2e 38 20 7b 0a 20 20 65  t wal-11.8 {.  e
4ea0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
4eb0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
4ec0: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4ed0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4ee0: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
4ef0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
4f00: 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f  } [list 37 [wal_
4f10: 66 69 6c 65 5f 73 69 7a 65 20 34 30 20 31 30 32  file_size 40 102
4f20: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
4f30: 31 31 2e 39 20 7b 0a 20 20 69 66 63 61 70 61 62  11.9 {.  ifcapab
4f40: 6c 65 20 65 6e 61 62 6c 65 5f 70 65 72 73 69 73  le enable_persis
4f50: 74 5f 77 61 6c 20 7b 0a 20 20 20 20 66 69 6c 65  t_wal {.    file
4f60: 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74  _control_persist
4f70: 5f 77 61 6c 20 64 62 20 30 0a 20 20 7d 0a 20 20  _wal db 0.  }.  
4f80: 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73 74 20  db close.  list 
4f90: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4fa0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
4fb0: 5b 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74 65 73  [log_deleted tes
4fc0: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 33 37 20  t.db-wal].} {37 
4fd0: 31 7d 0a 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  1}.sqlite3_wal d
4fe0: 62 20 74 65 73 74 2e 64 62 0a 0a 23 20 41 66 74  b test.db..# Aft
4ff0: 65 72 20 61 64 64 69 6e 67 20 74 68 65 20 63 61  er adding the ca
5000: 70 61 62 69 6c 69 74 79 20 6f 66 20 57 41 4c 20  pability of WAL 
5010: 74 6f 20 6f 76 65 72 77 72 69 74 65 20 70 72 69  to overwrite pri
5020: 6f 72 20 75 6e 63 6f 6d 6d 69 74 74 65 64 0a 23  or uncommitted.#
5030: 20 66 72 61 6d 65 20 69 6e 20 74 68 65 20 57 41   frame in the WA
5040: 4c 2d 66 69 6c 65 20 77 69 74 68 20 72 65 76 69  L-file with revi
5050: 73 65 64 20 63 6f 6e 74 65 6e 74 2c 20 74 68 65  sed content, the
5060: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 57 41 4c   size of the WAL
5070: 20 66 69 6c 65 0a 23 20 66 6f 6c 6c 6f 77 69 6e   file.# followin
5080: 67 20 63 61 63 68 65 2d 73 70 69 6c 6c 20 69 73  g cache-spill is
5090: 20 73 6d 61 6c 6c 65 72 2e 0a 23 0a 23 73 65 74   smaller..#.#set
50a0: 20 6e 57 61 6c 20 33 39 0a 23 69 66 20 7b 5b 70   nWal 39.#if {[p
50b0: 65 72 6d 75 74 61 74 69 6f 6e 5d 21 3d 22 6d 6d  ermutation]!="mm
50c0: 61 70 22 7d 20 7b 73 65 74 20 6e 57 61 6c 20 33  ap"} {set nWal 3
50d0: 37 7d 0a 23 69 66 63 61 70 61 62 6c 65 20 21 6d  7}.#ifcapable !m
50e0: 6d 61 70 20 7b 73 65 74 20 6e 57 61 6c 20 33 37  map {set nWal 37
50f0: 7d 0a 73 65 74 20 6e 57 61 6c 20 33 34 0a 0a 69  }.set nWal 34..i
5100: 66 63 61 70 61 62 6c 65 20 65 6e 61 62 6c 65 5f  fcapable enable_
5110: 70 65 72 73 69 73 74 5f 77 61 6c 20 7b 0a 20 20  persist_wal {.  
5120: 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
5130: 73 69 73 74 5f 77 61 6c 20 64 62 20 30 0a 7d 0a  sist_wal db 0.}.
5140: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31  do_test wal-11.1
5150: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
5160: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
5170: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
5180: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
5190: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
51a0: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
51b0: 4d 20 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20 20  M t1;   -- 32.  
51c0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
51d0: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  (*) FROM t1;.  }
51e0: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
51f0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5200: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
5210: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
5220: 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f  } [list 37 [wal_
5230: 66 69 6c 65 5f 73 69 7a 65 20 24 6e 57 61 6c 20  file_size $nWal 
5240: 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77  1024]].do_test w
5250: 61 6c 2d 31 31 2e 31 31 20 7b 0a 20 20 65 78 65  al-11.11 {.  exe
5260: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
5270: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
5280: 4d 20 74 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t1;.    ROLLBA
5290: 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  CK;.    SELECT c
52a0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
52b0: 0a 20 20 7d 0a 7d 20 7b 33 32 20 31 36 7d 0a 64  .  }.} {32 16}.d
52c0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 32  o_test wal-11.12
52d0: 20 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   {.  list [expr 
52e0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
52f0: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
5300: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
5310: 5d 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61  ].} [list 37 [wa
5320: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 24 6e 57 61  l_file_size $nWa
5330: 6c 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74  l 1024]].do_test
5340: 20 77 61 6c 2d 31 31 2e 31 33 20 7b 0a 20 20 65   wal-11.13 {.  e
5350: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53  xecsql {.    INS
5360: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
5370: 45 53 28 20 62 6c 6f 62 28 39 30 30 29 20 29 3b  ES( blob(900) );
5380: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
5390: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
53a0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
53b0: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
53c0: 7b 31 37 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  {17 ok}.do_test 
53d0: 77 61 6c 2d 31 31 2e 31 34 20 7b 0a 20 20 6c 69  wal-11.14 {.  li
53e0: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
53f0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
5400: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
5410: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
5420: 73 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f  st 37 [wal_file_
5430: 73 69 7a 65 20 24 6e 57 61 6c 20 31 30 32 34 5d  size $nWal 1024]
5440: 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ]...#-----------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5490: 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74   This block of t
54a0: 65 73 74 73 2c 20 77 61 6c 2d 31 32 2e 2a 2c 20  ests, wal-12.*, 
54b0: 74 65 73 74 73 20 74 68 65 20 66 69 78 20 66 6f  tests the fix fo
54c0: 72 20 61 20 70 72 6f 62 6c 65 6d 20 74 68 61 74  r a problem that
54d0: 20 0a 23 20 63 6f 75 6c 64 20 6f 63 63 75 72 20   .# could occur 
54e0: 69 66 20 61 20 6c 6f 67 20 74 68 61 74 20 69 73  if a log that is
54f0: 20 61 20 70 72 65 66 69 78 20 6f 66 20 61 6e 20   a prefix of an 
5500: 6f 6c 64 65 72 20 6c 6f 67 20 69 73 20 77 72 69  older log is wri
5510: 74 74 65 6e 20 0a 23 20 69 6e 74 6f 20 61 20 72  tten .# into a r
5520: 65 75 73 65 64 20 6c 6f 67 20 66 69 6c 65 2e 0a  eused log file..
5530: 23 0a 72 65 6f 70 65 6e 5f 64 62 0a 64 6f 5f 74  #.reopen_db.do_t
5540: 65 73 74 20 77 61 6c 2d 31 32 2e 31 20 7b 0a 20  est wal-12.1 {. 
5550: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
5560: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
5570: 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41  = 1024;.    CREA
5580: 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79  TE TABLE t1(x, y
5590: 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  );.    CREATE TA
55a0: 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 0a 20 20  BLE t2(x, y);.  
55b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
55c0: 20 56 41 4c 55 45 53 28 27 41 27 2c 20 31 29 3b   VALUES('A', 1);
55d0: 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70  .  }.  list [exp
55e0: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
55f0: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c  t.db]/1024] [fil
5600: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
5610: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31 20 5b 77  al].} [list 1 [w
5620: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 35 20 31  al_file_size 5 1
5630: 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61  024]].do_test wa
5640: 6c 2d 31 32 2e 32 20 7b 0a 20 20 69 66 63 61 70  l-12.2 {.  ifcap
5650: 61 62 6c 65 20 65 6e 61 62 6c 65 5f 70 65 72 73  able enable_pers
5660: 69 73 74 5f 77 61 6c 20 7b 0a 20 20 20 20 66 69  ist_wal {.    fi
5670: 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69  le_control_persi
5680: 73 74 5f 77 61 6c 20 64 62 20 30 0a 20 20 7d 0a  st_wal db 0.  }.
5690: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
56a0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
56b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
56c0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
56d0: 75 73 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20  us = normal;.   
56e0: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79   UPDATE t1 SET y
56f0: 20 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27   = 0 WHERE x = '
5700: 41 27 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  A';.  }.  list [
5710: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
5720: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
5730: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
5740: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34  test.db-wal]/104
5750: 34 5d 0a 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74 65  4].} {3 1}.do_te
5760: 73 74 20 77 61 6c 2d 31 32 2e 33 20 7b 0a 20 20  st wal-12.3 {.  
5770: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
5780: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5790: 27 42 27 2c 20 31 29 20 7d 0a 20 20 6c 69 73 74  'B', 1) }.  list
57a0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
57b0: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
57c0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
57d0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31  e test.db-wal]/1
57e0: 30 34 34 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f  044].} {3 2}.do_
57f0: 74 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a  test wal-12.4 {.
5800: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
5810: 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66  .db test2.db.  f
5820: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62  orcecopy test.db
5830: 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61  -wal test2.db-wa
5840: 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20  l.  sqlite3_wal 
5850: 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65  db2 test2.db.  e
5860: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
5870: 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a  * FROM t2 } db2.
5880: 7d 20 7b 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73  } {B 1}.db2 clos
5890: 65 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32  e.do_test wal-12
58a0: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
58b0: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
58c0: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20  checkpoint;.    
58d0: 55 50 44 41 54 45 20 74 32 20 53 45 54 20 79 20  UPDATE t2 SET y 
58e0: 3d 20 32 20 57 48 45 52 45 20 78 20 3d 20 27 42  = 2 WHERE x = 'B
58f0: 27 3b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 77  '; .    PRAGMA w
5900: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20  al_checkpoint;. 
5910: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
5920: 20 79 20 3d 20 31 20 57 48 45 52 45 20 78 20 3d   y = 1 WHERE x =
5930: 20 27 41 27 3b 0a 20 20 20 20 50 52 41 47 4d 41   'A';.    PRAGMA
5940: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
5950: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
5960: 45 54 20 79 20 3d 20 30 20 57 48 45 52 45 20 78  ET y = 0 WHERE x
5970: 20 3d 20 27 41 27 3b 0a 20 20 7d 0a 20 20 65 78   = 'A';.  }.  ex
5980: 65 63 73 71 6c 20 7b 20 20 53 45 4c 45 43 54 20  ecsql {  SELECT 
5990: 2a 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 42  * FROM t2 }.} {B
59a0: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   2}.do_test wal-
59b0: 31 32 2e 36 20 7b 0a 20 20 66 6f 72 63 65 63 6f  12.6 {.  forceco
59c0: 70 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 32  py test.db test2
59d0: 2e 64 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20  .db.  forcecopy 
59e0: 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74  test.db-wal test
59f0: 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74  2.db-wal.  sqlit
5a00: 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 32  e3_wal db2 test2
5a10: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
5a20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
5a30: 20 7d 20 64 62 32 0a 7d 20 7b 42 20 32 7d 0a 64   } db2.} {B 2}.d
5a40: 62 32 20 63 6c 6f 73 65 0a 69 66 63 61 70 61 62  b2 close.ifcapab
5a50: 6c 65 20 65 6e 61 62 6c 65 5f 70 65 72 73 69 73  le enable_persis
5a60: 74 5f 77 61 6c 20 7b 0a 20 20 66 69 6c 65 5f 63  t_wal {.  file_c
5a70: 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77  ontrol_persist_w
5a80: 61 6c 20 64 62 20 30 0a 7d 0a 64 62 20 63 6c 6f  al db 0.}.db clo
5a90: 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  se..#-----------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5ae0: 20 43 68 65 63 6b 20 61 20 66 75 6e 20 63 6f 72   Check a fun cor
5af0: 72 75 70 74 69 6f 6e 20 63 61 73 65 20 68 61 73  ruption case has
5b00: 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 23 0a 23   been fixed..#.#
5b10: 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 77 61 73   The problem was
5b20: 20 74 68 61 74 20 61 66 74 65 72 20 70 65 72 66   that after perf
5b30: 6f 72 6d 69 6e 67 20 61 20 63 68 65 63 6b 70 6f  orming a checkpo
5b40: 69 6e 74 20 75 73 69 6e 67 20 61 20 63 6f 6e 6e  int using a conn
5b50: 65 63 74 69 6f 6e 0a 23 20 74 68 61 74 20 68 61  ection.# that ha
5b60: 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74 65  d an out-of-date
5b70: 20 70 61 67 65 72 2d 63 61 63 68 65 2c 20 74 68   pager-cache, th
5b80: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
5b90: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 0a 23  connection was.#
5ba0: 20 75 73 65 64 20 69 74 20 64 69 64 20 6e 6f 74   used it did not
5bb0: 20 72 65 61 6c 69 7a 65 20 74 68 65 20 63 61 63   realize the cac
5bc0: 68 65 20 77 61 73 20 6f 75 74 2d 6f 66 2d 64 61  he was out-of-da
5bd0: 74 65 20 61 6e 64 20 70 72 6f 63 65 65 64 65 64  te and proceeded
5be0: 20 74 6f 0a 23 20 6f 70 65 72 61 74 65 20 77 69   to.# operate wi
5bf0: 74 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  th an inconsiste
5c00: 6e 74 20 63 61 63 68 65 2e 20 4c 65 61 64 69 6e  nt cache. Leadin
5c10: 67 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 2e  g to corruption.
5c20: 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c  .#.catch { db cl
5c30: 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62  ose }.catch { db
5c40: 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20  2 close }.catch 
5c50: 7b 20 64 62 33 20 63 6c 6f 73 65 20 7d 0a 66 6f  { db3 close }.fo
5c60: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
5c70: 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 73 71  b test.db-wal.sq
5c80: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
5c90: 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73  .sqlite3 db2 tes
5ca0: 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c  t.db.do_test wal
5cb0: 2d 31 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  -14 {.  execsql 
5cc0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
5cd0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
5ce0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5cf0: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
5d00: 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  EY, b);.    INSE
5d10: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
5d20: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29  S(randomblob(10)
5d30: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
5d40: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
5d50: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
5d60: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
5d70: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52  ndomblob(100) FR
5d80: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
5d90: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
5da0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c   randomblob(10),
5db0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
5dc0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
5dd0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
5de0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
5df0: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
5e00: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  00) FROM t1;.  }
5e10: 0a 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20 0a  ..  db2 eval { .
5e20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5e30: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
5e40: 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d  blob(10), random
5e50: 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49  blob(100);.    I
5e60: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
5e70: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
5e80: 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  10), randomblob(
5e90: 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  100);.    INSERT
5ea0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
5eb0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20  randomblob(10), 
5ec0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b  randomblob(100);
5ed0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5ee0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
5ef0: 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f  mblob(10), rando
5f00: 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20 7d 0a  mblob(100);.  }.
5f10: 0a 20 20 23 20 41 66 74 65 72 20 65 78 65 63 75  .  # After execu
5f20: 74 69 6e 67 20 74 68 65 20 22 50 52 41 47 4d 41  ting the "PRAGMA
5f30: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22   wal_checkpoint"
5f40: 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62  , connection [db
5f50: 5d 20 77 61 73 20 62 65 69 6e 67 0a 20 20 23 20  ] was being.  # 
5f60: 6c 65 66 74 20 77 69 74 68 20 61 6e 20 69 6e 63  left with an inc
5f70: 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
5f80: 20 52 75 6e 6e 69 6e 67 20 74 68 65 20 43 52 45   Running the CRE
5f90: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
5fa0: 65 6e 74 0a 20 20 23 20 69 6e 20 74 68 69 73 20  ent.  # in this 
5fb0: 73 74 61 74 65 20 6c 65 64 20 74 6f 20 64 61 74  state led to dat
5fc0: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
5fd0: 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 0a  ..  catchsql { .
5fe0: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
5ff0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 43  heckpoint;.    C
6000: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 6f  REATE INDEX i1 o
6010: 6e 20 74 31 28 62 29 3b 0a 20 20 7d 0a 20 20 20  n t1(b);.  }.   
6020: 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52  .  db2 eval { PR
6030: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
6040: 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 63  heck }.} {ok}..c
6050: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
6060: 7d 0a 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c  }.catch { db2 cl
6070: 6f 73 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ose }..#--------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60c0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
60d0: 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  g block of tests
60e0: 20 2d 20 77 61 6c 2d 31 35 2e 2a 20 2d 20 66 6f   - wal-15.* - fo
60f0: 63 75 73 20 6f 6e 20 74 65 73 74 69 6e 67 20 74  cus on testing t
6100: 68 65 20 0a 23 20 69 6d 70 6c 65 6d 65 6e 74 61  he .# implementa
6110: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
6120: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
6130: 6e 74 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  nt() interface..
6140: 23 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65  #.forcedelete te
6150: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
6160: 6c 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73  l.sqlite3 db tes
6170: 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c  t.db.do_test wal
6180: 2d 31 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  -15.1 {.  execsq
6190: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  l {.    PRAGMA a
61a0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
61b0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
61c0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
61d0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
61e0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 7d 0a  mode = WAL;.  }.
61f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6200: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
6210: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
6220: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6230: 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  (1, 2);.  }.} {}
6240: 0a 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e  ..# Test that an
6250: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
6260: 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
6270: 73 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72  se name is not r
6280: 65 63 6f 67 6e 69 7a 65 64 0a 23 0a 64 6f 5f 74  ecognized.#.do_t
6290: 65 73 74 20 77 61 6c 2d 31 35 2e 32 2e 31 20 7b  est wal-15.2.1 {
62a0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  .  sqlite3_wal_c
62b0: 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 61 75 78  heckpoint db aux
62c0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52  .} {SQLITE_ERROR
62d0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
62e0: 2e 32 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  .2.2 {.  sqlite3
62f0: 5f 65 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53  _errcode db.} {S
6300: 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f  QLITE_ERROR}.do_
6310: 74 65 73 74 20 77 61 6c 2d 31 35 2e 32 2e 33 20  test wal-15.2.3 
6320: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  {.  sqlite3_errm
6330: 73 67 20 64 62 0a 7d 20 7b 75 6e 6b 6e 6f 77 6e  sg db.} {unknown
6340: 20 64 61 74 61 62 61 73 65 3a 20 61 75 78 7d 0a   database: aux}.
6350: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20  .# Test that an 
6360: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
6370: 64 20 69 66 20 61 6e 20 61 74 74 65 6d 70 74 20  d if an attempt 
6380: 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
6390: 70 6f 69 6e 74 0a 23 20 69 66 20 61 20 74 72 61  point.# if a tra
63a0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nsaction is open
63b0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
63c0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..#.do_test wal-
63d0: 31 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73  15.3.1 {.  execs
63e0: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
63f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6400: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
6410: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 77  .  }.  sqlite3_w
6420: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
6430: 20 6d 61 69 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f   main.} {SQLITE_
6440: 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20  LOCKED}.do_test 
6450: 77 61 6c 2d 31 35 2e 33 2e 32 20 7b 0a 20 20 73  wal-15.3.2 {.  s
6460: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64  qlite3_errcode d
6470: 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b  b.} {SQLITE_LOCK
6480: 45 44 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ED}.do_test wal-
6490: 31 35 2e 33 2e 33 20 7b 0a 20 20 73 71 6c 69 74  15.3.3 {.  sqlit
64a0: 65 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b  e3_errmsg db.} {
64b0: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69  database table i
64c0: 73 20 6c 6f 63 6b 65 64 7d 0a 0a 23 20 45 61 72  s locked}..# Ear
64d0: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 72 65  lier versions re
64e0: 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
64f0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
6500: 68 65 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20  he db cannot be 
6510: 0a 23 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  .# checkpointed 
6520: 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 73  because of locks
6530: 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
6540: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 68 65   connection. Che
6550: 63 6b 20 74 68 61 74 0a 23 20 74 68 69 73 20 69  ck that.# this i
6560: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 68 65 20  s no longer the 
6570: 63 61 73 65 2e 0a 23 0a 73 71 6c 69 74 65 33 20  case..#.sqlite3 
6580: 64 62 32 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74  db2 test.db.do_t
6590: 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 31 20 7b  est wal-15.4.1 {
65a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
65b0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45   BEGIN;.    SELE
65c0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
65d0: 7d 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f  } db2.} {1 2}.do
65e0: 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 32  _test wal-15.4.2
65f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
6600: 4f 4d 4d 49 54 20 7d 0a 20 20 73 71 6c 69 74 65  OMMIT }.  sqlite
6610: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
6620: 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   db.} {SQLITE_OK
6630: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
6640: 2e 34 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  .4.3 {.  sqlite3
6650: 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 6e 6f  _errmsg db.} {no
6660: 74 20 61 6e 20 65 72 72 6f 72 7d 0a 0a 23 20 41  t an error}..# A
6670: 66 74 65 72 20 5b 64 62 32 5d 20 64 72 6f 70 73  fter [db2] drops
6680: 20 69 74 73 20 6c 6f 63 6b 2c 20 5b 64 62 5d 20   its lock, [db] 
6690: 6d 61 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 74  may checkpoint t
66a0: 68 65 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74  he db..#.do_test
66b0: 20 77 61 6c 2d 31 35 2e 34 2e 34 20 7b 0a 20 20   wal-15.4.4 {.  
66c0: 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  execsql { COMMIT
66d0: 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33   } db2.  sqlite3
66e0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
66f0: 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  db.} {SQLITE_OK}
6700: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
6710: 34 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  4.5 {.  sqlite3_
6720: 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 6e 6f 74  errmsg db.} {not
6730: 20 61 6e 20 65 72 72 6f 72 7d 0a 64 6f 5f 74 65   an error}.do_te
6740: 73 74 20 77 61 6c 2d 31 35 2e 34 2e 36 20 7b 0a  st wal-15.4.6 {.
6750: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
6760: 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34  .db.} [expr 1024
6770: 2a 32 5d 0a 0a 63 61 74 63 68 20 7b 20 64 62 32  *2]..catch { db2
6780: 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b   close }.catch {
6790: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d 2d   db close }..#--
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
67f0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
6800: 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 36 2e   tests - wal-16.
6810: 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 69 66  * - test that if
6820: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
6830: 6f 72 0a 23 20 61 6e 20 65 6d 70 74 79 20 73 74  or.# an empty st
6840: 72 69 6e 67 20 69 73 20 70 61 73 73 65 64 20 61  ring is passed a
6850: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
6860: 75 6d 65 6e 74 20 6f 66 20 74 68 65 20 77 61 6c  ument of the wal
6870: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 29 0a 23 20  _checkpoint().# 
6880: 41 50 49 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  API, an attempt 
6890: 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
68a0: 70 6f 69 6e 74 20 61 6c 6c 20 61 74 74 61 63 68  point all attach
68b0: 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a  ed databases..#.
68c0: 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 6b 70 74  foreach {tn ckpt
68d0: 5f 63 6d 64 20 63 6b 70 74 5f 72 65 73 20 63 6b  _cmd ckpt_res ck
68e0: 70 74 5f 6d 61 69 6e 20 63 6b 70 74 5f 61 75 78  pt_main ckpt_aux
68f0: 7d 20 7b 0a 20 20 31 20 7b 73 71 6c 69 74 65 33  } {.  1 {sqlite3
6900: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
6910: 64 62 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  db}             
6920: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31   SQLITE_OK     1
6930: 20 31 0a 20 20 32 20 7b 73 71 6c 69 74 65 33 5f   1.  2 {sqlite3_
6940: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
6950: 62 20 22 22 7d 20 20 20 20 20 20 20 20 20 20 20  b ""}           
6960: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20  SQLITE_OK     1 
6970: 31 0a 20 20 33 20 7b 64 62 20 65 76 61 6c 20 22  1.  3 {db eval "
6980: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
6990: 70 6f 69 6e 74 22 7d 20 20 20 20 20 20 20 20 7b  point"}        {
69a0: 30 20 31 30 20 31 30 7d 20 20 20 20 20 31 20 31  0 10 10}     1 1
69b0: 0a 0a 20 20 34 20 7b 73 71 6c 69 74 65 33 5f 77  ..  4 {sqlite3_w
69c0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
69d0: 20 6d 61 69 6e 7d 20 20 20 20 20 20 20 20 20 53   main}         S
69e0: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20 30  QLITE_OK     1 0
69f0: 0a 20 20 35 20 7b 73 71 6c 69 74 65 33 5f 77 61  .  5 {sqlite3_wa
6a00: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
6a10: 61 75 78 7d 20 20 20 20 20 20 20 20 20 20 53 51  aux}          SQ
6a20: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 30 20 31 0a  LITE_OK     0 1.
6a30: 20 20 36 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c    6 {sqlite3_wal
6a40: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 74  _checkpoint db t
6a50: 65 6d 70 7d 20 20 20 20 20 20 20 20 20 53 51 4c  emp}         SQL
6a60: 49 54 45 5f 4f 4b 20 20 20 20 20 30 20 30 0a 20  ITE_OK     0 0. 
6a70: 20 37 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41   7 {db eval "PRA
6a80: 47 4d 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65  GMA main.wal_che
6a90: 63 6b 70 6f 69 6e 74 22 7d 20 20 20 7b 30 20 31  ckpoint"}   {0 1
6aa0: 30 20 31 30 7d 20 20 20 20 20 31 20 30 0a 20 20  0 10}     1 0.  
6ab0: 38 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47  8 {db eval "PRAG
6ac0: 4d 41 20 61 75 78 2e 77 61 6c 5f 63 68 65 63 6b  MA aux.wal_check
6ad0: 70 6f 69 6e 74 22 7d 20 20 20 20 7b 30 20 31 33  point"}    {0 13
6ae0: 20 31 33 7d 20 20 20 20 20 30 20 31 0a 20 20 39   13}     0 1.  9
6af0: 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d   {db eval "PRAGM
6b00: 41 20 74 65 6d 70 2e 77 61 6c 5f 63 68 65 63 6b  A temp.wal_check
6b10: 70 6f 69 6e 74 22 7d 20 20 20 7b 30 20 2d 31 20  point"}   {0 -1 
6b20: 2d 31 7d 20 20 20 20 20 30 20 30 0a 7d 20 7b 0a  -1}     0 0.} {.
6b30: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36    do_test wal-16
6b40: 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 6f 72  .$tn.1 {.    for
6b50: 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64  cedelete test2.d
6b60: 62 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 20 74  b test2.db-wal t
6b70: 65 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  est2.db-journal.
6b80: 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20      forcedelete 
6b90: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
6ba0: 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  wal test.db-jour
6bb0: 6e 61 6c 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  nal..    sqlite3
6bc0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20   db test.db.    
6bd0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
6be0: 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62  ATTACH 'test2.db
6bf0: 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20  ' AS aux;.      
6c00: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 61 75 74 6f  PRAGMA main.auto
6c10: 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20  _vacuum = 0;.   
6c20: 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 61 75     PRAGMA aux.au
6c30: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20  to_vacuum = 0;. 
6c40: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
6c50: 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20  .journal_mode = 
6c60: 57 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  WAL;.      PRAGM
6c70: 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f  A aux.journal_mo
6c80: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
6c90: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
6ca0: 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65  FROM main.sqlite
6cb0: 5f 6d 61 73 74 65 72 2c 20 61 75 78 2e 73 71 6c  _master, aux.sql
6cc0: 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20 20 20 20  ite_master;.    
6cd0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 73 79    PRAGMA main.sy
6ce0: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d  nchronous = NORM
6cf0: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
6d00: 20 61 75 78 2e 73 79 6e 63 68 72 6f 6e 6f 75 73   aux.synchronous
6d10: 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20   = NORMAL;.     
6d20: 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e 63   PRAGMA aux.sync
6d30: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 0a  hronous = FULL;.
6d40: 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 20 77      }.  } {wal w
6d50: 61 6c 20 30 7d 0a 0a 20 20 64 6f 5f 74 65 73 74  al 0}..  do_test
6d60: 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 32 20 7b 0a   wal-16.$tn.2 {.
6d70: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
6d80: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
6d90: 20 6d 61 69 6e 2e 74 31 28 61 2c 20 62 2c 20 50   main.t1(a, b, P
6da0: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29  RIMARY KEY(a, b)
6db0: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
6dc0: 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20  TABLE aux.t2(a, 
6dd0: 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61  b, PRIMARY KEY(a
6de0: 2c 20 62 29 29 3b 0a 0a 20 20 20 20 20 20 49 4e  , b));..      IN
6df0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
6e00: 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(1, randomblo
6e10: 62 28 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  b(1000));.      
6e20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
6e30: 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62  ALUES(2, randomb
6e40: 6c 6f 62 28 31 30 30 30 29 29 3b 0a 20 20 20 20  lob(1000));.    
6e50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6e60: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6e70: 32 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  2;.    }.  .    
6e80: 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20  list [file size 
6e90: 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73  test.db] [file s
6ea0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
6eb0: 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72  .  } [list [expr
6ec0: 20 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69   1*1024] [wal_fi
6ed0: 6c 65 5f 73 69 7a 65 20 31 30 20 31 30 32 34 5d  le_size 10 1024]
6ee0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ].  do_test wal-
6ef0: 31 36 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 6c  16.$tn.3 {.    l
6f00: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
6f10: 65 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73  est2.db] [file s
6f20: 69 7a 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  ize test2.db-wal
6f30: 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70  ].  } [list [exp
6f40: 72 20 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66  r 1*1024] [wal_f
6f50: 69 6c 65 5f 73 69 7a 65 20 31 33 20 31 30 32 34  ile_size 13 1024
6f60: 5d 5d 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20  ]].  .  do_test 
6f70: 77 61 6c 2d 31 36 2e 24 74 6e 2e 34 20 5b 6c 69  wal-16.$tn.4 [li
6f80: 73 74 20 65 76 61 6c 20 24 63 6b 70 74 5f 63 6d  st eval $ckpt_cm
6f90: 64 5d 20 24 63 6b 70 74 5f 72 65 73 0a 20 20 0a  d] $ckpt_res.  .
6fa0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36    do_test wal-16
6fb0: 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 6c 69 73  .$tn.5 {.    lis
6fc0: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
6fd0: 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65  t.db] [file size
6fe0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20   test.db-wal].  
6ff0: 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 28 24  } [list [expr ($
7000: 63 6b 70 74 5f 6d 61 69 6e 20 3f 20 37 20 3a 20  ckpt_main ? 7 : 
7010: 31 29 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69  1)*1024] [wal_fi
7020: 6c 65 5f 73 69 7a 65 20 31 30 20 31 30 32 34 5d  le_size 10 1024]
7030: 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  ]..  do_test wal
7040: 2d 31 36 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20  -16.$tn.6 {.    
7050: 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20  list [file size 
7060: 74 65 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20  test2.db] [file 
7070: 73 69 7a 65 20 74 65 73 74 32 2e 64 62 2d 77 61  size test2.db-wa
7080: 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78  l].  } [list [ex
7090: 70 72 20 28 24 63 6b 70 74 5f 61 75 78 20 3f 20  pr ($ckpt_aux ? 
70a0: 37 20 3a 20 31 29 2a 31 30 32 34 5d 20 5b 77 61  7 : 1)*1024] [wa
70b0: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 33 20 31  l_file_size 13 1
70c0: 30 32 34 5d 5d 0a 0a 20 20 63 61 74 63 68 20 7b  024]]..  catch {
70d0: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 7d 0a 0a 23   db close }.}..#
70e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
7130: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
7140: 2d 20 77 61 6c 2d 31 37 2e 2a 20 2d 20 61 74 74  - wal-17.* - att
7150: 65 6d 70 74 20 74 6f 20 76 65 72 69 66 79 20 74  empt to verify t
7160: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a  hat the correct.
7170: 23 20 6e 75 6d 62 65 72 20 6f 66 20 22 70 61 64  # number of "pad
7180: 64 69 6e 67 22 20 66 72 61 6d 65 73 20 61 72 65  ding" frames are
7190: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
71a0: 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
71b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 69   transaction.# i
71c0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 73  s committed in s
71d0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
71e0: 6d 6f 64 65 2e 0a 23 20 0a 23 20 44 6f 20 74 68  mode..# .# Do th
71f0: 69 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  is by creating a
7200: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 75   database that u
7210: 73 65 73 20 35 31 32 20 62 79 74 65 20 70 61 67  ses 512 byte pag
7220: 65 73 2e 20 54 68 65 6e 20 77 72 69 74 69 6e 67  es. Then writing
7230: 0a 23 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  .# a transaction
7240: 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 31   that modifies 1
7250: 37 31 20 70 61 67 65 73 2e 20 49 6e 20 73 79 6e  71 pages. In syn
7260: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
7270: 6d 6f 64 65 2c 20 74 68 69 73 0a 23 20 70 72 6f  mode, this.# pro
7280: 64 75 63 65 73 20 61 20 6c 6f 67 20 66 69 6c 65  duces a log file
7290: 20 6f 66 3a 0a 23 0a 23 20 20 20 33 32 20 2b 20   of:.#.#   32 + 
72a0: 28 32 34 2b 35 31 32 29 2a 31 37 31 20 3d 20 39  (24+512)*171 = 9
72b0: 30 33 31 32 20 62 79 74 65 73 2e 0a 23 0a 23 20  0312 bytes..#.# 
72c0: 53 6c 69 67 68 74 6c 79 20 6c 61 72 67 65 72 20  Slightly larger 
72d0: 74 68 61 6e 20 31 31 2a 38 31 39 32 20 3d 20 39  than 11*8192 = 9
72e0: 30 31 31 32 20 62 79 74 65 73 2e 0a 23 0a 23 20  0112 bytes..#.# 
72f0: 52 75 6e 20 74 68 65 20 74 65 73 74 20 75 73 69  Run the test usi
7300: 6e 67 20 76 61 72 69 6f 75 73 20 64 69 66 66 65  ng various diffe
7310: 72 65 6e 74 20 73 65 63 74 6f 72 2d 73 69 7a 65  rent sector-size
7320: 73 2e 20 49 6e 20 65 61 63 68 20 63 61 73 65 2c  s. In each case,
7330: 20 74 68 65 0a 23 20 57 41 4c 20 63 6f 64 65 20   the.# WAL code 
7340: 73 68 6f 75 6c 64 20 77 72 69 74 65 20 74 68 65  should write the
7350: 20 39 30 33 30 30 20 62 79 74 65 73 20 6f 66 20   90300 bytes of 
7360: 6c 6f 67 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  log file contain
7370: 69 6e 67 20 74 68 65 20 0a 23 20 74 72 61 6e 73  ing the .# trans
7380: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 70 70  action, then app
7390: 65 6e 64 20 61 73 20 6d 61 79 20 66 72 61 6d 65  end as may frame
73a0: 73 20 61 73 20 61 72 65 20 72 65 71 75 69 72 65  s as are require
73b0: 64 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 0a  d to extend the.
73c0: 23 20 6c 6f 67 20 66 69 6c 65 20 73 6f 20 74 68  # log file so th
73d0: 61 74 20 6e 6f 20 70 61 72 74 20 6f 66 20 74 68  at no part of th
73e0: 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
73f0: 6f 6e 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74  on will be writt
7400: 65 6e 20 69 6e 74 6f 0a 23 20 61 20 64 69 73 6b  en into.# a disk
7410: 2d 73 65 63 74 6f 72 20 75 73 65 64 20 62 79 20  -sector used by 
7420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 75 73 74  transaction just
7430: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a 73 65   committed..#.se
7440: 74 20 6f 6c 64 5f 70 65 6e 64 69 6e 67 5f 62 79  t old_pending_by
7450: 74 65 20 5b 73 71 6c 69 74 65 33 5f 74 65 73 74  te [sqlite3_test
7460: 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67  _control_pending
7470: 5f 62 79 74 65 20 30 78 31 30 30 30 30 30 30 30  _byte 0x10000000
7480: 5d 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f  ].catch { db clo
7490: 73 65 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  se }.foreach {tn
74a0: 20 73 65 63 74 6f 72 73 69 7a 65 20 6c 6f 67 73   sectorsize logs
74b0: 69 7a 65 7d 20 22 0a 20 20 31 20 20 20 31 32 38  ize} ".  1   128
74c0: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
74d0: 20 31 37 32 20 35 31 32 5d 0a 20 20 32 20 20 20   172 512].  2   
74e0: 32 35 36 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  256  [wal_file_s
74f0: 69 7a 65 20 31 37 32 20 35 31 32 5d 0a 20 20 33  ize 172 512].  3
7500: 20 20 20 35 31 32 20 20 5b 77 61 6c 5f 66 69 6c     512  [wal_fil
7510: 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d 20  e_size 172 512] 
7520: 0a 20 20 34 20 20 31 30 32 34 20 20 5b 77 61 6c  .  4  1024  [wal
7530: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35  _file_size 172 5
7540: 31 32 5d 0a 20 20 35 20 20 32 30 34 38 20 20 5b  12].  5  2048  [
7550: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37  wal_file_size 17
7560: 32 20 35 31 32 5d 0a 20 20 36 20 20 34 30 39 36  2 512].  6  4096
7570: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
7580: 20 31 37 36 20 35 31 32 5d 0a 20 20 37 20 20 38   176 512].  7  8
7590: 31 39 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  192  [wal_file_s
75a0: 69 7a 65 20 31 38 34 20 35 31 32 5d 0a 22 20 7b  ize 184 512]." {
75b0: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
75c0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
75d0: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
75e0: 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 73 69 6d  al.  sqlite3_sim
75f0: 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 73 65  ulate_device -se
7600: 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72  ctorsize $sector
7610: 73 69 7a 65 0a 20 20 73 71 6c 69 74 65 33 20 64  size.  sqlite3 d
7620: 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 64  b test.db -vfs d
7630: 65 76 73 79 6d 0a 0a 20 20 64 6f 5f 74 65 73 74  evsym..  do_test
7640: 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 31 20 7b 0a   wal-17.$tn.1 {.
7650: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
7660: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
7670: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
7680: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
7690: 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20  ze = 512;.      
76a0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
76b0: 65 20 3d 20 2d 32 30 30 30 3b 0a 20 20 20 20 20  e = -2000;.     
76c0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
76d0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
76e0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
76f0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a 20  sqlite_master;. 
7700: 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63       PRAGMA sync
7710: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 0a  hronous = FULL;.
7720: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
7730: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
7740: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
7750: 42 4c 45 20 74 28 78 29 3b 0a 20 20 20 20 7d 0a  BLE t(x);.    }.
7760: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30      for {set i 0
7770: 7d 20 7b 24 69 3c 31 36 36 7d 20 7b 69 6e 63 72  } {$i<166} {incr
7780: 20 69 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63   i} {.      exec
7790: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
77a0: 4f 20 74 20 56 41 4c 55 45 53 28 72 61 6e 64 6f  O t VALUES(rando
77b0: 6d 62 6c 6f 62 28 34 30 30 29 29 20 7d 0a 20 20  mblob(400)) }.  
77c0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
77d0: 43 4f 4d 4d 49 54 0a 0a 20 20 20 20 66 69 6c 65  COMMIT..    file
77e0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
77f0: 6c 0a 20 20 7d 20 24 6c 6f 67 73 69 7a 65 0a 0a  l.  } $logsize..
7800: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 37    do_test wal-17
7810: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 66 69 6c  .$tn.2 {.    fil
7820: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20  e size test.db. 
7830: 20 7d 20 35 31 32 0a 0a 20 20 64 6f 5f 74 65 73   } 512..  do_tes
7840: 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 33 20 7b  t wal-17.$tn.3 {
7850: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
7860: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
7870: 2e 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 35 31  .db.  } [expr 51
7880: 32 2a 31 37 31 5d 0a 7d 0a 73 71 6c 69 74 65 33  2*171].}.sqlite3
7890: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65  _test_control_pe
78a0: 6e 64 69 6e 67 5f 62 79 74 65 20 24 6f 6c 64 5f  nding_byte $old_
78b0: 70 65 6e 64 69 6e 67 5f 62 79 74 65 0a 0a 23 2d  pending_byte..#-
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7900: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
7910: 74 65 73 74 20 2d 20 77 61 6c 2d 31 38 2e 2a 20  test - wal-18.* 
7920: 2d 20 76 65 72 69 66 69 65 73 20 61 20 63 6f 75  - verifies a cou
7930: 70 6c 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ple of specific 
7940: 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 0a  conditions that.
7950: 23 20 6d 61 79 20 62 65 20 65 6e 63 6f 75 6e 74  # may be encount
7960: 65 72 65 64 20 77 68 69 6c 65 20 72 65 63 6f 76  ered while recov
7970: 65 72 69 6e 67 20 61 20 6c 6f 67 20 66 69 6c 65  ering a log file
7980: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 63 6f 72   are handled cor
7990: 72 65 63 74 6c 79 3a 0a 23 0a 23 20 20 20 77 61  rectly:.#.#   wa
79a0: 6c 2d 31 38 2e 31 2e 2a 20 57 68 65 6e 20 74 68  l-18.1.* When th
79b0: 65 20 66 69 72 73 74 20 33 32 2d 62 69 74 73 20  e first 32-bits 
79c0: 6f 66 20 61 20 66 72 61 6d 65 20 63 68 65 63 6b  of a frame check
79d0: 73 75 6d 20 69 73 20 63 6f 72 72 65 63 74 20 62  sum is correct b
79e0: 75 74 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  ut .#           
79f0: 20 20 20 74 68 65 20 73 65 63 6f 6e 64 20 33 32     the second 32
7a00: 2d 62 69 74 73 20 61 72 65 20 66 61 6c 73 65 2c  -bits are false,
7a10: 20 61 6e 64 0a 23 0a 23 20 20 20 77 61 6c 2d 31   and.#.#   wal-1
7a20: 38 2e 32 2e 2a 20 57 68 65 6e 20 74 68 65 20 70  8.2.* When the p
7a30: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 74  age-size field t
7a40: 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
7a50: 65 20 73 74 61 72 74 20 6f 66 20 61 20 6c 6f 67  e start of a log
7a60: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
7a70: 66 69 6c 65 20 69 73 20 61 20 70 6f 77 65 72 20  file is a power 
7a80: 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
7a90: 6e 20 31 36 33 38 34 20 6f 72 20 73 6d 61 6c 6c  n 16384 or small
7aa0: 65 72 20 74 68 61 6e 20 35 31 32 2e 0a 23 0a 66  er than 512..#.f
7ab0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
7ac0: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  db test.db-wal t
7ad0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64  est.db-journal.d
7ae0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 30 20  o_test wal-18.0 
7af0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  {.  sqlite3 db t
7b00: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
7b10: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
7b20: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
7b30: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
7b40: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
7b50: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
7b60: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50  ode = WAL;.    P
7b70: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7b80: 73 20 3d 20 4f 46 46 3b 0a 0a 20 20 20 20 43 52  s = OFF;..    CR
7b90: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
7ba0: 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29   b, UNIQUE(a, b)
7bb0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
7bc0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 30 2c 20  TO t1 VALUES(0, 
7bd0: 30 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  0);.    PRAGMA w
7be0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 0a  al_checkpoint;..
7bf0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
7c00: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
7c10: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 66 72 61            -- fra
7c20: 6d 65 73 20 31 20 61 6e 64 20 32 0a 20 20 20 20  mes 1 and 2.    
7c30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
7c40: 41 4c 55 45 53 28 33 2c 20 34 29 3b 20 20 20 20  ALUES(3, 4);    
7c50: 20 20 20 20 20 20 2d 2d 20 66 72 61 6d 65 73 20        -- frames 
7c60: 33 20 61 6e 64 20 34 0a 20 20 20 20 49 4e 53 45  3 and 4.    INSE
7c70: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
7c80: 53 28 35 2c 20 36 29 3b 20 20 20 20 20 20 20 20  S(5, 6);        
7c90: 20 20 2d 2d 20 66 72 61 6d 65 73 20 35 20 61 6e    -- frames 5 an
7ca0: 64 20 36 0a 20 20 7d 0a 0a 20 20 66 6f 72 63 65  d 6.  }..  force
7cb0: 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74 65 73  copy test.db tes
7cc0: 74 58 2e 64 62 0a 20 20 66 6f 72 63 65 63 6f 70  tX.db.  forcecop
7cd0: 79 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  y test.db-wal te
7ce0: 73 74 58 2e 64 62 2d 77 61 6c 0a 20 20 64 62 20  stX.db-wal.  db 
7cf0: 63 6c 6f 73 65 0a 20 20 6c 69 73 74 20 5b 66 69  close.  list [fi
7d00: 6c 65 20 73 69 7a 65 20 74 65 73 74 58 2e 64 62  le size testX.db
7d10: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
7d20: 74 58 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  tX.db-wal].} [li
7d30: 73 74 20 5b 65 78 70 72 20 33 2a 31 30 32 34 5d  st [expr 3*1024]
7d40: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
7d50: 36 20 31 30 32 34 5d 5d 0a 0a 75 6e 73 65 74 20  6 1024]]..unset 
7d60: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6e 46 72 61  -nocomplain nFra
7d70: 6d 65 20 72 65 73 75 6c 74 0a 66 6f 72 65 61 63  me result.foreac
7d80: 68 20 7b 6e 46 72 61 6d 65 20 72 65 73 75 6c 74  h {nFrame result
7d90: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 30 20 20  } {.         0  
7da0: 20 20 20 20 7b 30 20 30 7d 0a 20 20 20 20 20 20      {0 0}.      
7db0: 20 20 20 31 20 20 20 20 20 20 7b 30 20 30 7d 0a     1      {0 0}.
7dc0: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
7dd0: 7b 30 20 30 20 31 20 32 7d 0a 20 20 20 20 20 20  {0 0 1 2}.      
7de0: 20 20 20 33 20 20 20 20 20 20 7b 30 20 30 20 31     3      {0 0 1
7df0: 20 32 7d 0a 20 20 20 20 20 20 20 20 20 34 20 20   2}.         4  
7e00: 20 20 20 20 7b 30 20 30 20 31 20 32 20 33 20 34      {0 0 1 2 3 4
7e10: 7d 0a 20 20 20 20 20 20 20 20 20 35 20 20 20 20  }.         5    
7e20: 20 20 7b 30 20 30 20 31 20 32 20 33 20 34 7d 0a    {0 0 1 2 3 4}.
7e30: 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20           6      
7e40: 7b 30 20 30 20 31 20 32 20 33 20 34 20 35 20 36  {0 0 1 2 3 4 5 6
7e50: 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  }.} {.  do_test 
7e60: 77 61 6c 2d 31 38 2e 31 2e 24 6e 46 72 61 6d 65  wal-18.1.$nFrame
7e70: 20 7b 0a 20 20 20 20 66 6f 72 63 65 63 6f 70 79   {.    forcecopy
7e80: 20 74 65 73 74 58 2e 64 62 20 74 65 73 74 2e 64   testX.db test.d
7e90: 62 0a 20 20 20 20 66 6f 72 63 65 63 6f 70 79 20  b.    forcecopy 
7ea0: 74 65 73 74 58 2e 64 62 2d 77 61 6c 20 74 65 73  testX.db-wal tes
7eb0: 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 20 20 68 65  t.db-wal..    he
7ec0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
7ed0: 62 2d 77 61 6c 20 5b 65 78 70 72 20 32 34 20 2b  b-wal [expr 24 +
7ee0: 20 24 6e 46 72 61 6d 65 2a 28 32 34 2b 31 30 32   $nFrame*(24+102
7ef0: 34 29 20 2b 20 32 30 5d 20 30 30 30 30 30 30 30  4) + 20] 0000000
7f00: 30 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  0..    sqlite3 d
7f10: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
7f20: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
7f30: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
7f40: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e  .      PRAGMA in
7f50: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 20 0a  tegrity_check; .
7f60: 20 20 20 20 7d 0a 20 20 7d 20 5b 63 6f 6e 63 61      }.  } [conca
7f70: 74 20 24 72 65 73 75 6c 74 20 6f 6b 5d 0a 20 20  t $result ok].  
7f80: 64 62 20 63 6c 6f 73 65 0a 7d 20 0a 0a 70 72 6f  db close.} ..pro
7f90: 63 20 72 61 6e 64 6f 6d 62 6c 6f 62 20 7b 70 67  c randomblob {pg
7fa0: 73 7a 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  sz} {.  sqlite3 
7fb0: 72 62 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20  rbdb :memory:.  
7fc0: 73 65 74 20 62 6c 6f 62 20 5b 72 62 64 62 20 6f  set blob [rbdb o
7fd0: 6e 65 20 7b 53 45 4c 45 43 54 20 72 61 6e 64 6f  ne {SELECT rando
7fe0: 6d 62 6c 6f 62 28 24 70 67 73 7a 29 7d 5d 0a 20  mblob($pgsz)}]. 
7ff0: 20 72 62 64 62 20 63 6c 6f 73 65 0a 20 20 73 65   rbdb close.  se
8000: 74 20 62 6c 6f 62 0a 7d 0a 0a 70 72 6f 63 20 6c  t blob.}..proc l
8010: 6f 67 63 6b 73 75 6d 20 7b 63 6b 76 31 20 63 6b  ogcksum {ckv1 ck
8020: 76 32 20 62 6c 6f 62 7d 20 7b 0a 20 20 75 70 76  v2 blob} {.  upv
8030: 61 72 20 24 63 6b 76 31 20 63 31 0a 20 20 75 70  ar $ckv1 c1.  up
8040: 76 61 72 20 24 63 6b 76 32 20 63 32 0a 0a 20 20  var $ckv2 c2..  
8050: 23 20 53 69 6e 63 65 20 74 68 65 20 6d 61 67 69  # Since the magi
8060: 63 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20  c number at the 
8070: 73 74 61 72 74 20 6f 66 20 74 68 65 20 2d 77 61  start of the -wa
8080: 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20 69 73  l file header is
8090: 0a 20 20 23 20 39 33 31 30 37 31 36 31 38 20 74  .  # 931071618 t
80a0: 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 74 68  hat indicates th
80b0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 73  at the content s
80c0: 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20  hould always be 
80d0: 72 65 61 64 20 61 73 0a 20 20 23 20 6c 69 74 74  read as.  # litt
80e0: 6c 65 2d 65 6e 64 69 61 6e 2e 0a 20 20 23 20 0a  le-endian..  # .
80f0: 20 20 73 65 74 20 73 63 61 6e 70 61 74 74 65 72    set scanpatter
8100: 6e 20 69 2a 0a 0a 20 20 62 69 6e 61 72 79 20 73  n i*..  binary s
8110: 63 61 6e 20 24 62 6c 6f 62 20 24 73 63 61 6e 70  can $blob $scanp
8120: 61 74 74 65 72 6e 20 76 61 6c 75 65 73 0a 20 20  attern values.  
8130: 66 6f 72 65 61 63 68 20 7b 76 31 20 76 32 7d 20  foreach {v1 v2} 
8140: 24 76 61 6c 75 65 73 20 7b 0a 20 20 20 20 73 65  $values {.    se
8150: 74 20 63 31 20 5b 65 78 70 72 20 7b 28 24 63 31  t c1 [expr {($c1
8160: 20 2b 20 24 76 31 20 2b 20 24 63 32 29 26 30 78   + $v1 + $c2)&0x
8170: 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 20 20 73  FFFFFFFF}].    s
8180: 65 74 20 63 32 20 5b 65 78 70 72 20 7b 28 24 63  et c2 [expr {($c
8190: 32 20 2b 20 24 76 32 20 2b 20 24 63 31 29 26 30  2 + $v2 + $c1)&0
81a0: 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 7d 0a  xFFFFFFFF}].  }.
81b0: 7d 0a 0a 66 6f 72 63 65 63 6f 70 79 20 74 65 73  }..forcecopy tes
81c0: 74 2e 64 62 20 74 65 73 74 58 2e 64 62 0a 66 6f  t.db testX.db.fo
81d0: 72 65 61 63 68 20 7b 74 6e 20 70 67 73 7a 20 77  reach {tn pgsz w
81e0: 6f 72 6b 73 7d 20 7b 20 0a 20 20 31 20 20 20 20  orks} { .  1    
81f0: 31 32 38 20 20 20 20 30 0a 20 20 32 20 20 20 20  128    0.  2    
8200: 32 35 36 20 20 20 20 30 0a 20 20 33 20 20 20 20  256    0.  3    
8210: 35 31 32 20 20 20 20 31 0a 20 20 34 20 20 20 31  512    1.  4   1
8220: 30 32 34 20 20 20 20 31 0a 20 20 35 20 20 20 32  024    1.  5   2
8230: 30 34 38 20 20 20 20 31 0a 20 20 36 20 20 20 34  048    1.  6   4
8240: 30 39 36 20 20 20 20 31 0a 20 20 37 20 20 20 38  096    1.  7   8
8250: 31 39 32 20 20 20 20 31 0a 20 20 38 20 20 31 36  192    1.  8  16
8260: 33 38 34 20 20 20 20 31 0a 20 20 39 20 20 33 32  384    1.  9  32
8270: 37 36 38 20 20 20 20 31 0a 20 31 30 20 20 36 35  768    1. 10  65
8280: 35 33 36 20 20 20 20 31 0a 20 31 31 20 31 33 31  536    1. 11 131
8290: 30 37 32 20 20 20 20 30 0a 20 31 31 20 20 20 31  072    0. 11   1
82a0: 30 31 36 20 20 20 20 30 0a 7d 20 7b 0a 0a 20 20  016    0.} {..  
82b0: 69 66 20 7b 24 3a 3a 53 51 4c 49 54 45 5f 4d 41  if {$::SQLITE_MA
82c0: 58 5f 50 41 47 45 5f 53 49 5a 45 20 3c 20 24 70  X_PAGE_SIZE < $p
82d0: 67 73 7a 7d 20 7b 0a 20 20 20 20 73 65 74 20 77  gsz} {.    set w
82e0: 6f 72 6b 73 20 30 0a 20 20 7d 0a 0a 20 20 66 6f  orks 0.  }..  fo
82f0: 72 20 7b 73 65 74 20 70 67 20 31 7d 20 7b 24 70  r {set pg 1} {$p
8300: 67 20 3c 3d 20 33 7d 20 7b 69 6e 63 72 20 70 67  g <= 3} {incr pg
8310: 7d 20 7b 0a 20 20 20 20 66 6f 72 63 65 63 6f 70  } {.    forcecop
8320: 79 20 74 65 73 74 58 2e 64 62 20 74 65 73 74 2e  y testX.db test.
8330: 64 62 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65  db.    forcedele
8340: 74 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  te test.db-wal. 
8350: 20 0a 20 20 20 20 23 20 43 68 65 63 6b 20 74 68   .    # Check th
8360: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
8370: 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20 63  now exists and c
8380: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 72 65 65  onsists of three
8390: 20 70 61 67 65 73 2e 20 41 6e 64 0a 20 20 20 20   pages. And.    
83a0: 23 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  # that there is 
83b0: 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20 77 61  no associated wa
83c0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 23 0a 20 20  l file..    #.  
83d0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38    do_test wal-18
83e0: 2e 32 2e 24 74 6e 2e 24 70 67 2e 31 20 7b 20 66  .2.$tn.$pg.1 { f
83f0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
8400: 64 62 2d 77 61 6c 20 7d 20 30 0a 20 20 20 20 64  db-wal } 0.    d
8410: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e  o_test wal-18.2.
8420: 24 74 6e 2e 24 70 67 2e 32 20 7b 20 66 69 6c 65  $tn.$pg.2 { file
8430: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 20   exists test.db 
8440: 7d 20 31 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  } 1.    do_test 
8450: 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67  wal-18.2.$tn.$pg
8460: 2e 33 20 7b 20 66 69 6c 65 20 73 69 7a 65 20 74  .3 { file size t
8470: 65 73 74 2e 64 62 20 7d 20 5b 65 78 70 72 20 31  est.db } [expr 1
8480: 30 32 34 2a 33 5d 0a 20 20 0a 20 20 20 20 64 6f  024*3].  .    do
8490: 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24  _test wal-18.2.$
84a0: 74 6e 2e 24 70 67 2e 34 20 7b 0a 0a 20 20 20 20  tn.$pg.4 {..    
84b0: 20 20 23 20 43 72 65 61 74 65 20 61 20 77 61 6c    # Create a wal
84c0: 20 66 69 6c 65 20 74 68 61 74 20 63 6f 6e 74 61   file that conta
84d0: 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ins a single fra
84e0: 6d 65 20 28 64 61 74 61 62 61 73 65 20 70 61 67  me (database pag
84f0: 65 0a 20 20 20 20 20 20 23 20 6e 75 6d 62 65 72  e.      # number
8500: 20 24 70 67 29 20 77 69 74 68 20 74 68 65 20 63   $pg) with the c
8510: 6f 6d 6d 69 74 20 66 6c 61 67 20 73 65 74 2e 20  ommit flag set. 
8520: 54 68 65 20 66 72 61 6d 65 20 63 68 65 63 6b 73  The frame checks
8530: 75 6d 20 69 73 0a 20 20 20 20 20 20 23 20 63 6f  um is.      # co
8540: 72 72 65 63 74 2c 20 62 75 74 20 74 68 65 20 63  rrect, but the c
8550: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
8560: 61 74 61 62 61 73 65 20 70 61 67 65 20 61 72 65  atabase page are
8570: 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20 20 20   corrupt..      
8580: 23 0a 20 20 20 20 20 20 23 20 54 68 65 20 70 61  #.      # The pa
8590: 67 65 2d 73 69 7a 65 20 69 6e 20 74 68 65 20 6c  ge-size in the l
85a0: 6f 67 20 66 69 6c 65 20 68 65 61 64 65 72 20 69  og file header i
85b0: 73 20 73 65 74 20 74 6f 20 24 70 67 73 7a 2e 20  s set to $pgsz. 
85c0: 49 66 20 74 68 65 0a 20 20 20 20 20 20 23 20 57  If the.      # W
85d0: 41 4c 20 63 6f 64 65 20 63 6f 6e 73 69 64 65 72  AL code consider
85e0: 73 20 24 70 67 73 7a 20 74 6f 20 62 65 20 61 20  s $pgsz to be a 
85f0: 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74  valid SQLite dat
8600: 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 2d  abase file page-
8610: 73 69 7a 65 2c 0a 20 20 20 20 20 20 23 20 74 68  size,.      # th
8620: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
8630: 62 65 20 63 6f 72 72 75 70 74 20 28 62 65 63 61  be corrupt (beca
8640: 75 73 65 20 74 68 65 20 67 61 72 62 61 67 65 20  use the garbage 
8650: 66 72 61 6d 65 20 63 6f 6e 74 65 6e 74 73 0a 20  frame contents. 
8660: 20 20 20 20 20 23 20 77 69 6c 6c 20 62 65 20 74       # will be t
8670: 72 65 61 74 65 64 20 61 73 20 76 61 6c 69 64 20  reated as valid 
8680: 63 6f 6e 74 65 6e 74 29 2e 20 49 66 20 24 70 67  content). If $pg
8690: 73 7a 20 69 73 20 69 6e 76 61 6c 69 64 20 28 74  sz is invalid (t
86a0: 6f 6f 20 73 6d 61 6c 6c 0a 20 20 20 20 20 20 23  oo small.      #
86b0: 20 6f 72 20 74 6f 6f 20 6c 61 72 67 65 29 2c 20   or too large), 
86c0: 74 68 65 20 64 62 20 77 69 6c 6c 20 6e 6f 74 20  the db will not 
86d0: 62 65 20 63 6f 72 72 75 70 74 20 61 73 20 74 68  be corrupt as th
86e0: 65 20 6c 6f 67 20 66 69 6c 65 20 77 69 6c 6c 0a  e log file will.
86f0: 20 20 20 20 20 20 23 20 62 65 20 69 67 6e 6f 72        # be ignor
8700: 65 64 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20  ed..      #.    
8710: 20 20 73 65 74 20 77 61 6c 68 64 72 20 5b 62 69    set walhdr [bi
8720: 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49 49 49  nary format IIII
8730: 49 49 20 39 33 31 30 37 31 36 31 38 20 33 30 30  II 931071618 300
8740: 37 30 30 30 20 24 70 67 73 7a 20 31 32 33 34 20  7000 $pgsz 1234 
8750: 32 32 20 32 33 5d 0a 20 20 20 20 20 20 73 65 74  22 23].      set
8760: 20 66 72 61 6d 65 62 6f 64 79 20 5b 72 61 6e 64   framebody [rand
8770: 6f 6d 62 6c 6f 62 20 24 70 67 73 7a 5d 0a 20 20  omblob $pgsz].  
8780: 20 20 20 20 73 65 74 20 66 72 61 6d 65 68 64 72      set framehdr
8790: 20 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74    [binary format
87a0: 20 49 49 49 49 20 24 70 67 20 35 20 32 32 20 32   IIII $pg 5 22 2
87b0: 33 5d 0a 20 20 20 20 20 20 73 65 74 20 63 31 20  3].      set c1 
87c0: 30 0a 20 20 20 20 20 20 73 65 74 20 63 32 20 30  0.      set c2 0
87d0: 0a 20 20 20 20 20 20 6c 6f 67 63 6b 73 75 6d 20  .      logcksum 
87e0: 63 31 20 63 32 20 24 77 61 6c 68 64 72 0a 0a 20  c1 c2 $walhdr.. 
87f0: 20 20 20 20 20 61 70 70 65 6e 64 20 77 61 6c 68       append walh
8800: 64 72 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61  dr [binary forma
8810: 74 20 49 49 20 24 63 31 20 24 63 32 5d 0a 20 20  t II $c1 $c2].  
8820: 20 20 20 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20      logcksum c1 
8830: 63 32 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  c2 [string range
8840: 20 24 66 72 61 6d 65 68 64 72 20 30 20 37 5d 0a   $framehdr 0 7].
8850: 20 20 20 20 20 20 6c 6f 67 63 6b 73 75 6d 20 63        logcksum c
8860: 31 20 63 32 20 24 66 72 61 6d 65 62 6f 64 79 0a  1 c2 $framebody.
8870: 20 20 20 20 20 20 73 65 74 20 66 72 61 6d 65 68        set frameh
8880: 64 72 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61  dr [binary forma
8890: 74 20 49 49 49 49 49 49 20 24 70 67 20 35 20 32  t IIIIII $pg 5 2
88a0: 32 20 32 33 20 24 63 31 20 24 63 32 5d 0a 0a 20  2 23 $c1 $c2].. 
88b0: 20 20 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65       set fd [ope
88c0: 6e 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 77 5d  n test.db-wal w]
88d0: 0a 20 20 20 20 20 20 66 63 6f 6e 66 69 67 75 72  .      fconfigur
88e0: 65 20 24 66 64 20 2d 65 6e 63 6f 64 69 6e 67 20  e $fd -encoding 
88f0: 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61 74  binary -translat
8900: 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 20 20 20  ion binary.     
8910: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
8920: 20 24 66 64 20 24 77 61 6c 68 64 72 0a 20 20 20   $fd $walhdr.   
8930: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
8940: 6e 65 20 24 66 64 20 24 66 72 61 6d 65 68 64 72  ne $fd $framehdr
8950: 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e  .      puts -non
8960: 65 77 6c 69 6e 65 20 24 66 64 20 24 66 72 61 6d  ewline $fd $fram
8970: 65 62 6f 64 79 0a 20 20 20 20 20 20 63 6c 6f 73  ebody.      clos
8980: 65 20 24 66 64 0a 20 20 0a 20 20 20 20 20 20 66  e $fd.  .      f
8990: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
89a0: 2d 77 61 6c 0a 20 20 20 20 7d 20 5b 77 61 6c 5f  -wal.    } [wal_
89b0: 66 69 6c 65 5f 73 69 7a 65 20 31 20 24 70 67 73  file_size 1 $pgs
89c0: 7a 5d 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73  z].  .    do_tes
89d0: 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24  t wal-18.2.$tn.$
89e0: 70 67 2e 35 20 7b 0a 20 20 20 20 20 20 73 71 6c  pg.5 {.      sql
89f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
8a00: 20 20 20 20 20 20 73 65 74 20 72 63 20 5b 63 61        set rc [ca
8a10: 74 63 68 20 7b 20 64 62 20 6f 6e 65 20 7b 50 52  tch { db one {PR
8a20: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
8a30: 68 65 63 6b 7d 20 7d 20 6d 73 67 5d 0a 20 20 20  heck} } msg].   
8a40: 20 20 20 65 78 70 72 20 7b 20 24 72 63 21 3d 30     expr { $rc!=0
8a50: 20 7c 7c 20 24 6d 73 67 21 3d 22 6f 6b 22 20 7d   || $msg!="ok" }
8a60: 0a 20 20 20 20 7d 20 24 77 6f 72 6b 73 0a 20 20  .    } $works.  
8a70: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
8a80: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8ad0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
8ae0: 74 65 73 74 20 2d 20 77 61 6c 2d 31 39 2e 2a 20  test - wal-19.* 
8af0: 2d 20 66 69 78 65 73 20 61 20 62 75 67 20 74 68  - fixes a bug th
8b00: 61 74 20 77 61 73 20 70 72 65 73 65 6e 74 20 64  at was present d
8b10: 75 72 69 6e 67 0a 23 20 64 65 76 65 6c 6f 70 6d  uring.# developm
8b20: 65 6e 74 2e 0a 23 0a 23 20 57 68 65 6e 20 61 20  ent..#.# When a 
8b30: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
8b40: 69 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20  ion in WAL mode 
8b50: 69 73 20 63 6c 6f 73 65 64 2c 20 69 74 20 61 74  is closed, it at
8b60: 74 65 6d 70 74 73 20 61 6e 0a 23 20 45 58 43 4c  tempts an.# EXCL
8b70: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
8b80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
8b90: 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   If the lock is 
8ba0: 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 0a 23 20  obtained, the.# 
8bb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 6b 6e 6f 77 73  connection knows
8bc0: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
8bd0: 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  last connection 
8be0: 74 6f 20 64 69 73 63 6f 6e 6e 65 63 74 20 66 72  to disconnect fr
8bf0: 6f 6d 0a 23 20 74 68 65 20 64 61 74 61 62 61 73  om.# the databas
8c00: 65 2c 20 73 6f 20 69 74 20 72 75 6e 73 20 61 20  e, so it runs a 
8c10: 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61  checkpoint opera
8c20: 74 69 6f 6e 2e 20 54 68 65 20 62 75 67 20 77 61  tion. The bug wa
8c30: 73 20 74 68 61 74 0a 23 20 74 68 65 20 63 6f 6e  s that.# the con
8c40: 6e 65 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  nection was not 
8c50: 75 70 64 61 74 69 6e 67 20 69 74 73 20 70 72 69  updating its pri
8c60: 76 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68 65  vate copy of the
8c70: 20 77 61 6c 2d 69 6e 64 65 78 20 0a 23 20 68 65   wal-index .# he
8c80: 61 64 65 72 20 62 65 66 6f 72 65 20 64 6f 69 6e  ader before doin
8c90: 67 20 73 6f 2c 20 6d 65 61 6e 69 6e 67 20 74 68  g so, meaning th
8ca0: 61 74 20 69 74 20 63 6f 75 6c 64 20 63 68 65 63  at it could chec
8cb0: 6b 70 6f 69 6e 74 20 61 6e 20 6f 6c 64 0a 23 20  kpoint an old.# 
8cc0: 73 6e 61 70 73 68 6f 74 2e 0a 23 0a 64 6f 5f 74  snapshot..#.do_t
8cd0: 65 73 74 20 77 61 6c 2d 31 39 2e 31 20 7b 0a 20  est wal-19.1 {. 
8ce0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
8cf0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
8d00: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
8d10: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
8d20: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20  st.db.  sqlite3 
8d30: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78  db2 test.db.  ex
8d40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
8d50: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
8d60: 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54  = WAL;.    CREAT
8d70: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
8d80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
8d90: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
8da0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
8db0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
8dc0: 34 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  4);.  }.  execsq
8dd0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
8de0: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
8df0: 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77  2 3 4}.do_test w
8e00: 61 6c 2d 31 39 2e 32 20 7b 0a 20 20 65 78 65 63  al-19.2 {.  exec
8e10: 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54  sql {.    INSERT
8e20: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8e30: 35 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43  5, 6);.    SELEC
8e40: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
8e50: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d  .} {1 2 3 4 5 6}
8e60: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e  .do_test wal-19.
8e70: 33 20 7b 0a 20 20 69 66 63 61 70 61 62 6c 65 20  3 {.  ifcapable 
8e80: 65 6e 61 62 6c 65 5f 70 65 72 73 69 73 74 5f 77  enable_persist_w
8e90: 61 6c 20 7b 0a 20 20 20 20 66 69 6c 65 5f 63 6f  al {.    file_co
8ea0: 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61  ntrol_persist_wa
8eb0: 6c 20 64 62 32 20 30 0a 20 20 7d 0a 20 20 64 62  l db2 0.  }.  db
8ec0: 20 63 6c 6f 73 65 0a 20 20 64 62 32 20 63 6c 6f   close.  db2 clo
8ed0: 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73  se.  file exists
8ee0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 7b   test.db-wal.} {
8ef0: 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  0}.do_test wal-1
8f00: 39 2e 34 20 7b 0a 20 20 23 20 57 68 65 6e 20 74  9.4 {.  # When t
8f10: 68 65 20 62 75 67 20 77 61 73 20 70 72 65 73 65  he bug was prese
8f20: 6e 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  nt, the followin
8f30: 67 20 77 61 73 20 72 65 74 75 72 6e 69 6e 67 20  g was returning 
8f40: 7b 31 20 32 20 33 20 34 7d 20 6f 6e 6c 79 2c 0a  {1 2 3 4} only,.
8f50: 20 20 23 20 61 73 20 5b 64 62 32 5d 20 68 61 64    # as [db2] had
8f60: 20 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   an out-of-date 
8f70: 63 6f 70 79 20 6f 66 20 74 68 65 20 77 61 6c 2d  copy of the wal-
8f80: 69 6e 64 65 78 20 68 65 61 64 65 72 20 77 68 65  index header whe
8f90: 6e 20 69 74 20 77 61 73 0a 20 20 23 20 63 6c 6f  n it was.  # clo
8fa0: 73 65 64 2e 0a 20 20 23 0a 20 20 73 71 6c 69 74  sed..  #.  sqlit
8fb0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
8fc0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
8fd0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b   * FROM t1 }.} {
8fe0: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a 23 2d  1 2 3 4 5 6}..#-
8ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9030: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20  --------.# This 
9040: 74 65 73 74 20 2d 20 77 61 6c 2d 32 30 2e 2a 20  test - wal-20.* 
9050: 2d 20 75 73 65 73 20 74 77 6f 20 63 6f 6e 6e 65  - uses two conne
9060: 63 74 69 6f 6e 73 2e 20 4f 6e 65 20 69 6e 20 74  ctions. One in t
9070: 68 69 73 20 70 72 6f 63 65 73 73 20 61 6e 64 0a  his process and.
9080: 23 20 74 68 65 20 6f 74 68 65 72 20 69 6e 20 61  # the other in a
9090: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  n external proce
90a0: 73 73 2e 20 54 68 65 20 70 72 6f 63 65 64 75 72  ss. The procedur
90b0: 65 20 69 73 3a 0a 23 0a 23 20 20 20 31 2e 20 55  e is:.#.#   1. U
90c0: 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  sing connection 
90d0: 31 2c 20 63 72 65 61 74 65 20 74 68 65 20 64 61  1, create the da
90e0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 23  tabase schema..#
90f0: 0a 23 20 20 20 32 2e 20 55 73 69 6e 67 20 63 6f  .#   2. Using co
9100: 6e 6e 65 63 74 69 6f 6e 20 32 20 28 69 6e 20 61  nnection 2 (in a
9110: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  n external proce
9120: 73 73 29 2c 20 61 64 64 20 73 6f 20 6d 75 63 68  ss), add so much
9130: 0a 23 20 20 20 20 20 20 64 61 74 61 20 74 6f 20  .#      data to 
9140: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 74  the database wit
9150: 68 6f 75 74 20 63 68 65 63 6b 70 6f 69 6e 74 69  hout checkpointi
9160: 6e 67 20 74 68 61 74 20 61 20 77 61 6c 2d 69 6e  ng that a wal-in
9170: 64 65 78 20 0a 23 20 20 20 20 20 20 6c 61 72 67  dex .#      larg
9180: 65 72 20 74 68 61 6e 20 36 34 4b 42 20 69 73 20  er than 64KB is 
9190: 72 65 71 75 69 72 65 64 2e 0a 23 0a 23 20 20 20  required..#.#   
91a0: 33 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74  3. Using connect
91b0: 69 6f 6e 20 31 2c 20 63 68 65 63 6b 70 6f 69 6e  ion 1, checkpoin
91c0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  t the database. 
91d0: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a 23 20  Make sure all.# 
91e0: 20 20 20 20 20 74 68 65 20 64 61 74 61 20 69 73       the data is
91f0: 20 70 72 65 73 65 6e 74 20 61 6e 64 20 74 68 65   present and the
9200: 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
9210: 20 63 6f 72 72 75 70 74 2e 0a 23 0a 23 20 41 74   corrupt..#.# At
9220: 20 6f 6e 65 20 70 6f 69 6e 74 2c 20 53 51 4c 69   one point, SQLi
9230: 74 65 20 77 61 73 20 66 61 69 6c 69 6e 67 20 74  te was failing t
9240: 6f 20 67 72 6f 77 20 74 68 65 20 6d 61 70 70 69  o grow the mappi
9250: 6e 67 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e  ng of the wal-in
9260: 64 65 78 0a 23 20 66 69 6c 65 20 69 6e 20 73 74  dex.# file in st
9270: 65 70 20 33 20 61 6e 64 20 74 68 65 20 63 68 65  ep 3 and the che
9280: 63 6b 70 6f 69 6e 74 20 77 61 73 20 63 6f 72 72  ckpoint was corr
9290: 75 70 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  upting the datab
92a0: 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 6f 5f 74  ase file..#.do_t
92b0: 65 73 74 20 77 61 6c 2d 32 30 2e 31 20 7b 0a 20  est wal-20.1 {. 
92c0: 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65   catch {db close
92d0: 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  }.  forcedelete 
92e0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
92f0: 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  wal test.db-jour
9300: 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62  nal.  sqlite3 db
9310: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
9320: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
9330: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
9340: 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  AL;.    CREATE T
9350: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
9360: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9370: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
9380: 28 39 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45  (900));.    SELE
9390: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
93a0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20   t1;.  }.} {wal 
93b0: 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  1}.do_test wal-2
93c0: 30 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 62 75  0.2 {.  set ::bu
93d0: 64 64 79 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74  ddy [launch_test
93e0: 66 69 78 74 75 72 65 5d 0a 20 20 74 65 73 74 66  fixture].  testf
93f0: 69 78 74 75 72 65 20 24 3a 3a 62 75 64 64 79 20  ixture $::buddy 
9400: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
9410: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 64 62 20   test.db.    db 
9420: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 20 64 62  transaction { db
9430: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 50 52   eval {.      PR
9440: 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65  AGMA wal_autoche
9450: 63 6b 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  ckpoint = 0;.   
9460: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9470: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
9480: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
9490: 3b 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a  ;       /* 2 */.
94a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
94b0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
94c0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
94d0: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 34 20   t1;       /* 4 
94e0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
94f0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9500: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9510: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9520: 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   8 */.      INSE
9530: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
9540: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
9550: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
9560: 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20   /* 16 */.      
9570: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
9580: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
9590: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
95a0: 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20       /* 32 */.  
95b0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
95c0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
95d0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
95e0: 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a  1;       /* 64 *
95f0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9600: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9610: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9620: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9630: 31 32 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  128 */.      INS
9640: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9650: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9660: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9670: 20 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 20 20    /* 256 */.    
9680: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9690: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
96a0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
96b0: 20 20 20 20 20 20 20 2f 2a 20 35 31 32 20 2a 2f         /* 512 */
96c0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
96d0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
96e0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
96f0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31  M t1;       /* 1
9700: 30 32 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  024 */.      INS
9710: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9720: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9730: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9740: 20 20 2f 2a 20 32 30 34 38 20 2a 2f 0a 20 20 20    /* 2048 */.   
9750: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9760: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
9770: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
9780: 3b 20 20 20 20 20 20 20 2f 2a 20 34 30 39 36 20  ;       /* 4096 
9790: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
97a0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
97b0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
97c0: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
97d0: 20 38 31 39 32 20 2a 2f 0a 20 20 20 20 20 20 49   8192 */.      I
97e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
97f0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
9800: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
9810: 20 20 20 20 2f 2a 20 31 36 33 38 34 20 2a 2f 0a      /* 16384 */.
9820: 20 20 20 20 7d 20 7d 0a 20 20 7d 0a 7d 20 7b 30      } }.  }.} {0
9830: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30  }.do_test wal-20
9840: 2e 33 20 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a  .3 {.  close $::
9850: 62 75 64 64 79 0a 20 20 65 78 65 63 73 71 6c 20  buddy.  execsql 
9860: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
9870: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 65 78 65 63  ckpoint }.  exec
9880: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
9890: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a  nt(*) FROM t1 }.
98a0: 7d 20 7b 31 36 33 38 34 7d 0a 64 6f 5f 74 65 73  } {16384}.do_tes
98b0: 74 20 77 61 6c 2d 32 30 2e 34 20 7b 0a 20 20 64  t wal-20.4 {.  d
98c0: 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
98d0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
98e0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
98f0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
9900: 20 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 69 6e 74   }.} {16384}.int
9910: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 77 61 6c  egrity_check wal
9920: 2d 32 30 2e 35 0a 0a 63 61 74 63 68 20 7b 20 64  -20.5..catch { d
9930: 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68  b2 close }.catch
9940: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 0a 64   { db close }..d
9950: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 31 20  o_test wal-21.1 
9960: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
9970: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
9980: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
9990: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
99a0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43  ode = WAL;.    C
99b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
99c0: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
99d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
99e0: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
99f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
9a00: 28 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45  (3, 4);.    INSE
9a10: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
9a20: 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53  S(5, 6);.    INS
9a30: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
9a40: 45 53 28 37 2c 20 38 29 3b 0a 20 20 20 20 49 4e  ES(7, 8);.    IN
9a50: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
9a60: 55 45 53 28 39 2c 20 31 30 29 3b 0a 20 20 20 20  UES(9, 10);.    
9a70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9a80: 41 4c 55 45 53 28 31 31 2c 20 31 32 29 3b 0a 20  ALUES(11, 12);. 
9a90: 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f 74 65   }.} {wal}.do_te
9aa0: 73 74 20 77 61 6c 2d 32 31 2e 32 20 7b 0a 20 20  st wal-21.2 {.  
9ab0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
9ac0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
9ad0: 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
9ae0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
9af0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
9b00: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 3b 0a     SAVEPOINT s;.
9b10: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
9b20: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9b30: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 72  ndomblob(900), r
9b40: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9b50: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 4f  ROM t1;.      RO
9b60: 4c 4c 42 41 43 4b 20 54 4f 20 73 3b 0a 20 20 20  LLBACK TO s;.   
9b70: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65   COMMIT;.  }.  e
9b80: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
9b90: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
9ba0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
9bb0: 20 31 30 20 31 31 20 31 32 7d 0a 64 6f 5f 74 65   10 11 12}.do_te
9bc0: 73 74 20 77 61 6c 2d 32 31 2e 33 20 7b 0a 20 20  st wal-21.3 {.  
9bd0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
9be0: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
9bf0: 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 23 2d 2d 2d 2d   }.} {ok}..#----
9c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c40: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 72 65 61  -----.# Test rea
9c50: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
9c60: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
9c70: 74 68 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  th different pag
9c80: 65 2d 73 69 7a 65 73 2e 0a 23 0a 69 6e 63 72 20  e-sizes..#.incr 
9c90: 3a 3a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64  ::do_not_use_cod
9ca0: 65 63 0a 66 6f 72 65 61 63 68 20 70 67 73 7a 20  ec.foreach pgsz 
9cb0: 7b 35 31 32 20 31 30 32 34 20 32 30 34 38 20 34  {512 1024 2048 4
9cc0: 30 39 36 20 38 31 39 32 20 31 36 33 38 34 20 33  096 8192 16384 3
9cd0: 32 37 36 38 20 36 35 35 33 36 7d 20 7b 0a 20 20  2768 65536} {.  
9ce0: 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74  do_multiclient_t
9cf0: 65 73 74 20 74 6e 20 5b 73 74 72 69 6e 67 20 6d  est tn [string m
9d00: 61 70 20 5b 6c 69 73 74 20 25 50 47 53 5a 25 20  ap [list %PGSZ% 
9d10: 24 70 67 73 7a 5d 20 7b 0a 20 20 20 20 64 6f 5f  $pgsz] {.    do_
9d20: 74 65 73 74 20 77 61 6c 2d 32 32 2e 25 50 47 53  test wal-22.%PGS
9d30: 5a 25 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20  Z%.$tn.1 {.     
9d40: 20 73 71 6c 31 20 7b 0a 20 20 20 20 20 20 20 20   sql1 {.        
9d50: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65  PRAGMA main.page
9d60: 5f 73 69 7a 65 20 3d 20 25 50 47 53 5a 25 3b 0a  _size = %PGSZ%;.
9d70: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 61          PRAGMA a
9d80: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
9d90: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a          PRAGMA j
9da0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
9db0: 4c 3b 0a 20 20 20 20 20 20 20 20 43 52 45 41 54  L;.        CREAT
9dc0: 45 20 54 41 42 4c 45 20 74 31 28 78 20 55 4e 49  E TABLE t1(x UNI
9dd0: 51 55 45 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  QUE);.        IN
9de0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
9df0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38  ECT randomblob(8
9e00: 30 30 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  00);.        INS
9e10: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9e20: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38 30  CT randomblob(80
9e30: 30 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  0);.        INSE
9e40: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
9e50: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30  T randomblob(800
9e60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9e70: 20 7b 77 61 6c 7d 0a 20 20 20 20 64 6f 5f 74 65   {wal}.    do_te
9e80: 73 74 20 77 61 6c 2d 32 32 2e 25 50 47 53 5a 25  st wal-22.%PGSZ%
9e90: 2e 24 74 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20  .$tn.2 { sql2 { 
9ea0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
9eb0: 5f 63 68 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a  _check } } {ok}.
9ec0: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
9ed0: 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 33 20  22.%PGSZ%.$tn.3 
9ee0: 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 50 52  {.      sql1 {PR
9ef0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
9f00: 69 6e 74 7d 0a 20 20 20 20 20 20 65 78 70 72 20  int}.      expr 
9f10: 7b 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74  {[file size test
9f20: 2e 64 62 5d 20 25 20 25 50 47 53 5a 25 7d 0a 20  .db] % %PGSZ%}. 
9f30: 20 20 20 7d 20 7b 30 7d 0a 20 20 7d 5d 0a 7d 0a     } {0}.  }].}.
9f40: 69 6e 63 72 20 3a 3a 64 6f 5f 6e 6f 74 5f 75 73  incr ::do_not_us
9f50: 65 5f 63 6f 64 65 63 20 2d 31 0a 0a 23 2d 2d 2d  e_codec -1..#---
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9fa0: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
9fb0: 61 74 20 77 68 65 6e 20 31 20 6f 72 20 6d 6f 72  at when 1 or mor
9fc0: 65 20 70 61 67 65 73 20 61 72 65 20 72 65 63 6f  e pages are reco
9fd0: 76 65 72 65 64 20 66 72 6f 6d 20 61 20 57 41 4c  vered from a WAL
9fe0: 20 66 69 6c 65 2c 20 0a 23 20 73 71 6c 69 74 65   file, .# sqlite
9ff0: 33 5f 6c 6f 67 28 29 20 69 73 20 69 6e 76 6f 6b  3_log() is invok
a000: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
a010: 73 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a 23  s to the user..#
a020: 0a 69 66 63 61 70 61 62 6c 65 20 63 75 72 64 69  .ifcapable curdi
a030: 72 20 7b 0a 20 20 73 65 74 20 77 61 6c 66 69 6c  r {.  set walfil
a040: 65 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61  e [file nativena
a050: 6d 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67  me [file join [g
a060: 65 74 5f 70 77 64 5d 20 74 65 73 74 2e 64 62 2d  et_pwd] test.db-
a070: 77 61 6c 5d 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20  wal]].} else {. 
a080: 20 73 65 74 20 77 61 6c 66 69 6c 65 20 74 65 73   set walfile tes
a090: 74 2e 64 62 2d 77 61 6c 0a 7d 0a 63 61 74 63 68  t.db-wal.}.catch
a0a0: 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63   {db close}.forc
a0b0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  edelete test.db.
a0c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e 31  do_test wal-23.1
a0d0: 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65   {.  faultsim_de
a0e0: 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  lete_and_reopen.
a0f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a100: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
a110: 61 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47 4d  a, b);.    PRAGM
a120: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
a130: 20 57 41 4c 3b 0a 20 20 20 20 49 4e 53 45 52 54   WAL;.    INSERT
a140: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
a150: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
a160: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a170: 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66  (3, 4);.  }.  if
a180: 63 61 70 61 62 6c 65 20 65 6e 61 62 6c 65 5f 70  capable enable_p
a190: 65 72 73 69 73 74 5f 77 61 6c 20 7b 0a 20 20 20  ersist_wal {.   
a1a0: 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65   file_control_pe
a1b0: 72 73 69 73 74 5f 77 61 6c 20 64 62 20 30 0a 20  rsist_wal db 0. 
a1c0: 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61   }.  faultsim_sa
a1d0: 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 20 20  ve_and_close..  
a1e0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
a1f0: 0a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  .  test_sqlite3_
a200: 6c 6f 67 20 5b 6c 69 73 74 20 6c 61 70 70 65 6e  log [list lappen
a210: 64 20 3a 3a 6c 6f 67 5d 0a 20 20 73 65 74 20 3a  d ::log].  set :
a220: 3a 6c 6f 67 20 5b 6c 69 73 74 5d 0a 20 20 73 71  :log [list].  sq
a230: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
a240: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
a250: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
a260: 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74  } {1 2 3 4}.do_t
a270: 65 73 74 20 77 61 6c 2d 32 33 2e 32 20 7b 20 73  est wal-23.2 { s
a280: 65 74 20 3a 3a 6c 6f 67 20 7d 20 7b 7d 0a 0a 64  et ::log } {}..d
a290: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e 33 20  o_test wal-23.3 
a2a0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
a2b0: 65 74 20 3a 3a 6c 6f 67 20 5b 6c 69 73 74 5d 0a  et ::log [list].
a2c0: 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f    faultsim_resto
a2d0: 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20  re_and_reopen.  
a2e0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
a2f0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b   * FROM t1 }.} {
a300: 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74  1 2 3 4}.do_test
a310: 20 77 61 6c 2d 32 33 2e 34 20 7b 20 0a 20 20 73   wal-23.4 { .  s
a320: 65 74 20 3a 3a 6c 6f 67 20 0a 7d 20 5b 6c 69 73  et ::log .} [lis
a330: 74 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  t SQLITE_NOTICE_
a340: 52 45 43 4f 56 45 52 5f 57 41 4c 20 5c 0a 20 20  RECOVER_WAL \.  
a350: 20 20 22 72 65 63 6f 76 65 72 65 64 20 32 20 66    "recovered 2 f
a360: 72 61 6d 65 73 20 66 72 6f 6d 20 57 41 4c 20 66  rames from WAL f
a370: 69 6c 65 20 24 77 61 6c 66 69 6c 65 22 5d 0a 0a  ile $walfile"]..
a380: 0a 69 66 63 61 70 61 62 6c 65 20 61 75 74 6f 76  .ifcapable autov
a390: 61 63 75 75 6d 20 7b 0a 20 20 23 20 54 68 69 73  acuum {.  # This
a3a0: 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74 68 61   block tests tha
a3b0: 74 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66  t if the size of
a3c0: 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 72   a database is r
a3d0: 65 64 75 63 65 64 20 62 79 20 61 20 0a 20 20 23  educed by a .  #
a3e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 62 65   transaction (be
a3f0: 63 61 75 73 65 20 6f 66 20 61 6e 20 69 6e 63 72  cause of an incr
a400: 65 6d 65 6e 74 61 6c 20 6f 72 20 61 75 74 6f 2d  emental or auto-
a410: 76 61 63 75 75 6d 29 2c 20 74 68 61 74 20 6e 6f  vacuum), that no
a420: 0a 20 20 23 20 64 61 74 61 20 69 73 20 77 72 69  .  # data is wri
a430: 74 74 65 6e 20 74 6f 20 74 68 65 20 57 41 4c 20  tten to the WAL 
a440: 66 69 6c 65 20 66 6f 72 20 74 68 65 20 74 72 75  file for the tru
a450: 6e 63 61 74 65 64 20 70 61 67 65 73 20 61 73 20  ncated pages as 
a460: 70 61 72 74 0a 20 20 23 20 6f 66 20 74 68 65 20  part.  # of the 
a470: 63 6f 6d 6d 69 74 2e 20 65 2e 67 2e 20 69 66 20  commit. e.g. if 
a480: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65  a transaction re
a490: 64 75 63 65 73 20 74 68 65 20 73 69 7a 65 20 6f  duces the size o
a4a0: 66 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 23  f a database.  #
a4b0: 20 74 6f 20 4e 20 70 61 67 65 73 2c 20 64 61 74   to N pages, dat
a4c0: 61 20 66 6f 72 20 70 61 67 65 20 4e 2b 31 20 73  a for page N+1 s
a4d0: 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69  hould not be wri
a4e0: 74 74 65 6e 20 74 6f 20 74 68 65 20 57 41 4c 20  tten to the WAL 
a4f0: 66 69 6c 65 20 0a 20 20 23 20 77 68 65 6e 20 63  file .  # when c
a500: 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72  ommitting the tr
a510: 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 6f 6e  ansaction. At on
a520: 65 20 70 6f 69 6e 74 20 73 75 63 68 20 64 61 74  e point such dat
a530: 61 20 77 61 73 20 62 65 69 6e 67 20 0a 20 20 23  a was being .  #
a540: 20 77 72 69 74 74 65 6e 2e 0a 20 20 23 0a 20 20   written..  #.  
a550: 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d  catch {db close}
a560: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
a570: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
a580: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f   db test.db.  do
a590: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 34  _execsql_test 24
a5a0: 2e 31 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  .1 {.    PRAGMA 
a5b0: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b  auto_vacuum = 2;
a5c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
a5d0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
a5e0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
a5f0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
a600: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a610: 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  (x);.    INSERT 
a620: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
a630: 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 30 29 29  andomblob(5000))
a640: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a650: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
a660: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
a670: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
a680: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
a690: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
a6a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
a6b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a6c0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
a6d0: 4d 20 74 31 3b 0a 20 20 7d 20 7b 77 61 6c 7d 0a  M t1;.  } {wal}.
a6e0: 20 20 64 6f 5f 74 65 73 74 20 32 34 2e 32 20 7b    do_test 24.2 {
a6f0: 20 0a 20 20 20 20 69 66 63 61 70 61 62 6c 65 20   .    ifcapable 
a700: 65 6e 61 62 6c 65 5f 70 65 72 73 69 73 74 5f 77  enable_persist_w
a710: 61 6c 20 7b 0a 20 20 20 20 20 20 66 69 6c 65 5f  al {.      file_
a720: 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
a730: 77 61 6c 20 64 62 20 30 0a 20 20 20 20 7d 0a 20  wal db 0.    }. 
a740: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
a750: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
a760: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
a770: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
a780: 20 20 20 20 7d 0a 20 20 20 20 64 62 20 63 6c 6f      }.    db clo
a790: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
a7a0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 66 69  b test.db.    fi
a7b0: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
a7c0: 62 2d 77 61 6c 0a 20 20 7d 20 30 0a 20 20 64 6f  b-wal.  } 0.  do
a7d0: 5f 74 65 73 74 20 32 34 2e 33 20 7b 0a 20 20 20  _test 24.3 {.   
a7e0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
a7f0: 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 38 34 20  db.  } [expr 84 
a800: 2a 20 31 30 32 34 5d 0a 20 20 64 6f 5f 74 65 73  * 1024].  do_tes
a810: 74 20 32 34 2e 34 20 7b 0a 20 20 20 20 65 78 65  t 24.4 {.    exe
a820: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52  csql { .      PR
a830: 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20  AGMA cache_size 
a840: 3d 20 32 30 30 3b 0a 20 20 20 20 20 20 50 52 41  = 200;.      PRA
a850: 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  GMA incremental_
a860: 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 50 52  vacuum;.      PR
a870: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
a880: 69 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  int;.    }.    f
a890: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
a8a0: 0a 20 20 7d 20 5b 65 78 70 72 20 33 20 2a 20 31  .  } [expr 3 * 1
a8b0: 30 32 34 5d 0a 0a 20 20 23 20 57 41 4c 20 66 69  024]..  # WAL fi
a8c0: 6c 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  le now contains 
a8d0: 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 2d  a single frame -
a8e0: 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 20 70 61   the new root pa
a8f0: 67 65 20 66 6f 72 20 74 61 62 6c 65 20 74 31 2e  ge for table t1.
a900: 0a 20 20 23 20 49 74 20 77 6f 75 6c 64 20 62 65  .  # It would be
a910: 20 74 77 6f 20 66 72 61 6d 65 73 20 28 74 68 65   two frames (the
a920: 20 6e 65 77 20 72 6f 6f 74 20 70 61 67 65 20 61   new root page a
a930: 6e 64 20 61 20 70 61 64 64 69 6e 67 20 66 72 61  nd a padding fra
a940: 6d 65 29 20 69 66 20 74 68 65 0a 20 20 23 20 5a  me) if the.  # Z
a950: 45 52 4f 5f 44 41 4d 41 47 45 20 66 6c 61 67 20  ERO_DAMAGE flag 
a960: 77 65 72 65 20 6e 6f 74 20 73 65 74 2e 0a 20 20  were not set..  
a970: 64 6f 5f 74 65 73 74 20 32 34 2e 35 20 7b 0a 20  do_test 24.5 {. 
a980: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
a990: 74 2e 64 62 2d 77 61 6c 0a 20 20 7d 20 5b 77 61  t.db-wal.  } [wa
a9a0: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 31 30  l_file_size 1 10
a9b0: 32 34 5d 0a 7d 0a 0a 69 66 63 61 70 61 62 6c 65  24].}..ifcapable
a9c0: 20 65 6e 61 62 6c 65 5f 70 65 72 73 69 73 74 5f   enable_persist_
a9d0: 77 61 6c 20 7b 0a 20 20 66 69 6c 65 5f 63 6f 6e  wal {.  file_con
a9e0: 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
a9f0: 20 64 62 20 30 0a 7d 0a 64 62 20 63 6c 6f 73 65   db 0.}.db close
aa00: 0a 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77  .sqlite3_shutdow
aa10: 6e 0a 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c  n.test_sqlite3_l
aa20: 6f 67 0a 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  og.sqlite3_initi
aa30: 61 6c 69 7a 65 0a 0a 23 20 4d 61 6b 65 20 73 75  alize..# Make su
aa40: 72 65 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  re PRAGMA journa
aa50: 6c 5f 6d 6f 64 65 3d 57 41 4c 20 77 6f 72 6b 73  l_mode=WAL works
aa60: 20 77 69 74 68 20 41 54 54 41 43 48 45 44 20 64   with ATTACHED d
aa70: 61 74 61 62 61 73 65 73 20 69 6e 0a 23 20 61 6c  atabases in.# al
aa80: 6c 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 2e  l journal modes.
aa90: 0a 23 0a 66 6f 72 65 61 63 68 20 6d 6f 64 65 20  .#.foreach mode 
aaa0: 7b 4f 46 46 20 4d 45 4d 4f 52 59 20 50 45 52 53  {OFF MEMORY PERS
aab0: 49 53 54 20 44 45 4c 45 54 45 20 54 52 55 4e 43  IST DELETE TRUNC
aac0: 41 54 45 20 57 41 4c 7d 20 7b 0a 20 20 64 65 6c  ATE WAL} {.  del
aad0: 65 74 65 5f 66 69 6c 65 20 74 65 73 74 2e 64 62  ete_file test.db
aae0: 20 74 65 73 74 32 2e 64 62 0a 20 20 73 71 6c 69   test2.db.  sqli
aaf0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
ab00: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 35 2e   do_test wal-25.
ab10: 24 6d 6f 64 65 20 7b 0a 20 20 20 20 64 62 20 65  $mode {.    db e
ab20: 76 61 6c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72  val "PRAGMA jour
ab30: 6e 61 6c 5f 6d 6f 64 65 3d 24 6d 6f 64 65 22 0a  nal_mode=$mode".
ab40: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 41 54 54      db eval {ATT
ab50: 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41  ACH 'test2.db' A
ab60: 53 20 74 32 3b 20 50 52 41 47 4d 41 20 6a 6f 75  S t2; PRAGMA jou
ab70: 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 3b 7d 0a  rnal_mode=WAL;}.
ab80: 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64 62 20 63    } {wal}.  db c
ab90: 6c 6f 73 65 0a 7d 0a 0a 74 65 73 74 5f 72 65 73  lose.}..test_res
aba0: 74 6f 72 65 5f 63 6f 6e 66 69 67 5f 70 61 67 65  tore_config_page
abb0: 63 61 63 68 65 0a 66 69 6e 69 73 68 5f 74 65 73  cache.finish_tes
abc0: 74 0a                                            t.