/ Hex Artifact Content
Login

Artifact 40073e54359d43354925b2b700b7eebd5e207285:


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