/ Hex Artifact Content
Login

Artifact 3a6ebdf0287b38b5537c07c517b30dda9aaac317:


0000: 23 20 32 30 31 30 20 41 70 72 69 6c 20 31 33 0a  # 2010 April 13.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f  .  The.# focus o
01b0: 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74  f this file is t
01c0: 65 73 74 69 6e 67 20 74 68 65 20 6f 70 65 72 61  esting the opera
01d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
01e0: 61 72 79 20 69 6e 0a 23 20 22 50 52 41 47 4d 41  ary in.# "PRAGMA
01f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41   journal_mode=WA
0200: 4c 22 20 6d 6f 64 65 2e 0a 23 0a 0a 73 65 74 20  L" mode..#..set 
0210: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0220: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0230: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0240: 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20  ster.tcl.source 
0250: 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f  $testdir/lock_co
0260: 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20  mmon.tcl.source 
0270: 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f  $testdir/malloc_
0280: 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63  common.tcl.sourc
0290: 65 20 24 74 65 73 74 64 69 72 2f 77 61 6c 5f 63  e $testdir/wal_c
02a0: 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 74  ommon.tcl..set t
02b0: 65 73 74 70 72 65 66 69 78 20 77 61 6c 0a 0a 69  estprefix wal..i
02c0: 66 63 61 70 61 62 6c 65 20 21 77 61 6c 20 7b 66  fcapable !wal {f
02d0: 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74  inish_test ; ret
02e0: 75 72 6e 20 7d 0a 0a 70 72 6f 63 20 72 65 6f 70  urn }..proc reop
02f0: 65 6e 5f 64 62 20 7b 7d 20 7b 0a 20 20 63 61 74  en_db {} {.  cat
0300: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
0310: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
0320: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
0330: 6c 20 74 65 73 74 2e 64 62 2d 77 61 6c 2d 73 75  l test.db-wal-su
0340: 6d 6d 61 72 79 0a 20 20 73 71 6c 69 74 65 33 5f  mmary.  sqlite3_
0350: 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 7d  wal db test.db.}
0360: 0a 0a 73 65 74 20 3a 3a 62 6c 6f 62 63 6e 74 20  ..set ::blobcnt 
0370: 30 0a 70 72 6f 63 20 62 6c 6f 62 20 7b 6e 42 79  0.proc blob {nBy
0380: 74 65 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a 62  te} {.  incr ::b
0390: 6c 6f 62 63 6e 74 0a 20 20 72 65 74 75 72 6e 20  lobcnt.  return 
03a0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 73  [string range [s
03b0: 74 72 69 6e 67 20 72 65 70 65 61 74 20 22 24 7b  tring repeat "${
03c0: 3a 3a 62 6c 6f 62 63 6e 74 7d 78 22 20 24 6e 42  ::blobcnt}x" $nB
03d0: 79 74 65 5d 20 31 20 24 6e 42 79 74 65 5d 0a 7d  yte] 1 $nByte].}
03e0: 0a 0a 70 72 6f 63 20 73 71 6c 69 74 65 33 5f 77  ..proc sqlite3_w
03f0: 61 6c 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76  al {args} {.  ev
0400: 61 6c 20 73 71 6c 69 74 65 33 20 24 61 72 67 73  al sqlite3 $args
0410: 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73  .  [lindex $args
0420: 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   0] eval { PRAGM
0430: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
0440: 30 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61  0 }.  [lindex $a
0450: 72 67 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52  rgs 0] eval { PR
0460: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
0470: 20 31 30 32 34 20 7d 0a 20 20 5b 6c 69 6e 64 65   1024 }.  [linde
0480: 78 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20  x $args 0] eval 
0490: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
04a0: 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20  _mode = wal }.  
04b0: 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d  [lindex $args 0]
04c0: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 73   eval { PRAGMA s
04d0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72  ynchronous = nor
04e0: 6d 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20  mal }.  [lindex 
04f0: 24 61 72 67 73 20 30 5d 20 66 75 6e 63 74 69 6f  $args 0] functio
0500: 6e 20 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a 0a 70  n blob blob.}..p
0510: 72 6f 63 20 6c 6f 67 5f 64 65 6c 65 74 65 64 20  roc log_deleted 
0520: 7b 6c 6f 67 66 69 6c 65 7d 20 7b 0a 20 20 72 65  {logfile} {.  re
0530: 74 75 72 6e 20 5b 65 78 70 72 20 5b 66 69 6c 65  turn [expr [file
0540: 20 65 78 69 73 74 73 20 24 6c 6f 67 66 69 6c 65   exists $logfile
0550: 5d 3d 3d 30 5d 0a 7d 0a 0a 23 0a 23 20 54 68 65  ]==0].}..#.# The
0560: 73 65 20 61 72 65 20 27 77 61 72 6d 2d 62 6f 64  se are 'warm-bod
0570: 79 27 20 74 65 73 74 73 20 75 73 65 64 20 77 68  y' tests used wh
0580: 69 6c 65 20 64 65 76 65 6c 6f 70 69 6e 67 20 74  ile developing t
0590: 68 65 20 57 41 4c 20 63 6f 64 65 2e 20 54 68 65  he WAL code. The
05a0: 79 0a 23 20 73 65 72 76 65 20 74 6f 20 70 72 6f  y.# serve to pro
05b0: 76 65 20 74 68 61 74 20 61 20 66 65 77 20 72 65  ve that a few re
05c0: 61 6c 6c 79 20 73 69 6d 70 6c 65 20 63 61 73 65  ally simple case
05d0: 73 20 77 6f 72 6b 3a 0a 23 0a 23 20 77 61 6c 2d  s work:.#.# wal-
05e0: 31 2e 2a 3a 20 52 65 61 64 20 61 6e 64 20 77 72  1.*: Read and wr
05f0: 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
0600: 2e 0a 23 20 77 61 6c 2d 32 2e 2a 3a 20 54 65 73  ..# wal-2.*: Tes
0610: 74 20 4d 56 43 43 20 77 69 74 68 20 6f 6e 65 20  t MVCC with one 
0620: 72 65 61 64 65 72 2c 20 6f 6e 65 20 77 72 69 74  reader, one writ
0630: 65 72 2e 0a 23 20 77 61 6c 2d 33 2e 2a 3a 20 54  er..# wal-3.*: T
0640: 65 73 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  est transaction 
0650: 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d  rollback..# wal-
0660: 34 2e 2a 3a 20 54 65 73 74 20 73 61 76 65 70 6f  4.*: Test savepo
0670: 69 6e 74 2f 73 74 61 74 65 6d 65 6e 74 20 72 6f  int/statement ro
0680: 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 35 2e  llback..# wal-5.
0690: 2a 3a 20 54 65 73 74 20 74 68 65 20 74 65 6d 70  *: Test the temp
06a0: 20 64 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c   database..# wal
06b0: 2d 36 2e 2a 3a 20 54 65 73 74 20 63 72 65 61 74  -6.*: Test creat
06c0: 69 6e 67 20 64 61 74 61 62 61 73 65 73 20 77 69  ing databases wi
06d0: 74 68 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  th different pag
06e0: 65 20 73 69 7a 65 73 2e 0a 23 0a 23 0a 23 0a 64  e sizes..#.#.#.d
06f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e 31 20 7b  o_test wal-0.1 {
0700: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
0710: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
0720: 3d 20 30 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  = 0 }.  execsql 
0730: 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f  { PRAGMA synchro
0740: 6e 6f 75 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a  nous = normal }.
0750: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
0760: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
0770: 3d 20 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c 7d 0a  = wal }.} {wal}.
0780: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e 32 20  do_test wal-0.2 
0790: 7b 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  {.  file size te
07a0: 73 74 2e 64 62 0a 7d 20 7b 31 30 32 34 7d 0a 0a  st.db.} {1024}..
07b0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 30 20  do_test wal-1.0 
07c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
07d0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52     BEGIN;.    CR
07e0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
07f0: 20 62 29 3b 20 0a 20 20 7d 0a 20 20 6c 69 73 74   b); .  }.  list
0800: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
0810: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5c  st.db-journal] \
0820: 0a 20 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78  .       [file ex
0830: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
0840: 5d 20 20 20 20 20 5c 0a 20 20 20 20 20 20 20 5b  ]     \.       [
0850: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
0860: 62 5d 0a 7d 20 7b 30 20 31 20 31 30 32 34 7d 0a  b].} {0 1 1024}.
0870: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 31 20  do_test wal-1.1 
0880: 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d  {.  execsql COMM
0890: 49 54 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  IT.  list [file 
08a0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a  exists test.db-j
08b0: 6f 75 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78  ournal] [file ex
08c0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
08d0: 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73  ].} {0 1}.do_tes
08e0: 74 20 77 61 6c 2d 31 2e 32 20 7b 0a 20 20 23 20  t wal-1.2 {.  # 
08f0: 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20 74 77  There are now tw
0900: 6f 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c  o pages in the l
0910: 6f 67 2e 0a 20 20 66 69 6c 65 20 73 69 7a 65 20  og..  file size 
0920: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 5b 77  test.db-wal.} [w
0930: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31  al_file_size 2 1
0940: 30 32 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  024]..do_test wa
0950: 6c 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  l-1.3 {.  execsq
0960: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0970: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
0980: 7d 0a 7d 20 7b 74 61 62 6c 65 20 74 31 20 74 31  }.} {table t1 t1
0990: 20 32 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45   2 {CREATE TABLE
09a0: 20 74 31 28 61 2c 20 62 29 7d 7d 0a 0a 64 6f 5f   t1(a, b)}}..do_
09b0: 74 65 73 74 20 77 61 6c 2d 31 2e 34 20 7b 0a 20  test wal-1.4 {. 
09c0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
09d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
09e0: 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73  (1, 2) }.  execs
09f0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
0a00: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
0a10: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   }.  execsql { I
0a20: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0a30: 4c 55 45 53 28 35 2c 20 36 29 20 7d 0a 20 20 65  LUES(5, 6) }.  e
0a40: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
0a50: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37  INTO t1 VALUES(7
0a60: 2c 20 38 29 20 7d 0a 20 20 65 78 65 63 73 71 6c  , 8) }.  execsql
0a70: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
0a80: 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20  1 VALUES(9, 10) 
0a90: 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20  }.} {}..do_test 
0aa0: 77 61 6c 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63  wal-1.5 {.  exec
0ab0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0ac0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20  ROM t1 }.} {1 2 
0ad0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0ae0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0af0: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77  .1 {.  sqlite3_w
0b00: 61 6c 20 64 62 32 20 2e 2f 74 65 73 74 2e 64 62  al db2 ./test.db
0b10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47  .  execsql { BEG
0b20: 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN; SELECT * FRO
0b30: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
0b40: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
0b50: 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  10}..do_test wal
0b60: 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.2 {.  execsql
0b70: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
0b80: 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29  1 VALUES(11, 12)
0b90: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
0ba0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0bb0: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  }.} {1 2 3 4 5 6
0bc0: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d   7 8 9 10 11 12}
0bd0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0be0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
0bf0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0c00: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
0c10: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0c20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 34  .do_test wal-2.4
0c30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
0c40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0c50: 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20  LUES(13, 14) }. 
0c60: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
0c70: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
0c80: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0c90: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
0ca0: 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4}..do_test wal-
0cb0: 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.5 {.  execsql 
0cc0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0cd0: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20  t1 } db2.} {1 2 
0ce0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0cf0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0d00: 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .6 {.  execsql {
0d10: 20 43 4f 4d 4d 49 54 3b 20 53 45 4c 45 43 54 20   COMMIT; SELECT 
0d20: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  * FROM t1 } db2.
0d30: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0d40: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
0d50: 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   14}..do_test wa
0d60: 6c 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  l-3.1 {.  execsq
0d70: 6c 20 7b 20 42 45 47 49 4e 3b 20 44 45 4c 45 54  l { BEGIN; DELET
0d80: 45 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78  E FROM t1 }.  ex
0d90: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
0da0: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a   FROM t1 }.} {}.
0db0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33 2e 32 20  do_test wal-3.2 
0dc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0dd0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0de0: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20   db2.} {1 2 3 4 
0df0: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
0e00: 31 32 20 31 33 20 31 34 7d 0a 64 6f 5f 74 65 73  12 13 14}.do_tes
0e10: 74 20 77 61 6c 2d 33 2e 33 20 7b 0a 20 20 65 78  t wal-3.3 {.  ex
0e20: 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b  ecsql { ROLLBACK
0e30: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
0e40: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0e50: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  }.} {1 2 3 4 5 6
0e60: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
0e70: 31 33 20 31 34 7d 0a 64 62 32 20 63 6c 6f 73 65  13 14}.db2 close
0e80: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
0ed0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
0ee0: 74 73 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74 65 73  ts, wal-4.*, tes
0ef0: 74 20 74 68 61 74 20 73 61 76 65 70 6f 69 6e 74  t that savepoint
0f00: 73 20 77 6f 72 6b 20 77 69 74 68 20 57 41 4c 20  s work with WAL 
0f10: 0a 23 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a  .# databases..#.
0f20: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 31 20  do_test wal-4.1 
0f30: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0f40: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
0f50: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
0f60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0f70: 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62  1 VALUES('a', 'b
0f80: 27 29 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  ');.      SAVEPO
0f90: 49 4e 54 20 73 70 3b 0a 20 20 20 20 20 20 20 20  INT sp;.        
0fa0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0fb0: 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
0fc0: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
0fd0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
0fe0: 20 7b 61 20 62 20 63 20 64 7d 0a 64 6f 5f 74 65   {a b c d}.do_te
0ff0: 73 74 20 77 61 6c 2d 34 2e 32 20 7b 0a 20 20 65  st wal-4.2 {.  e
1000: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 52  xecsql {.      R
1010: 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20  OLLBACK TO sp;. 
1020: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
1030: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20  OM t1;.  }.} {a 
1040: 62 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  b}.do_test wal-4
1050: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
1060: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20  .    COMMIT;.   
1070: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1080: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a 0a  1;.  }.} {a b}..
1090: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
10a0: 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  1 {.  db close. 
10b0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
10c0: 2e 64 62 0a 20 20 64 62 20 66 75 6e 63 20 62 6c  .db.  db func bl
10d0: 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20 5b  ob blob.  list [
10e0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
10f0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b 66   * FROM t1 }] [f
1100: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
1110: 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20 30  -wal].} {{a b} 0
1120: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1130: 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.2 {.  execsql 
1140: 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73  { PRAGMA cache_s
1150: 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 65 78 65  ize = 10 }.  exe
1160: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1170: 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  E TABLE t2(a, b)
1180: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1190: 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62  O t2 VALUES(blob
11a0: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
11b0: 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54  );.    SAVEPOINT
11c0: 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   tr;.      INSER
11d0: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
11e0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
11f0: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f  (400) FROM t2; /
1200: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
1210: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
1220: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1230: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32  lob(400) FROM t2
1240: 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20  ; /*  4 */.     
1250: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1260: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1270: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1280: 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20   t2; /*  8 */.  
1290: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
12a0: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
12b0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
12c0: 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f  ROM t2; /* 16 */
12d0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
12e0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
12f0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1300: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32  ) FROM t2; /* 32
1310: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
1320: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
1330: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1340: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a  400) FROM t1; /*
1350: 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    2 */.      INS
1360: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1370: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1380: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1390: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20   /*  4 */.      
13a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
13b0: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
13c0: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
13d0: 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20  t1; /*  8 */.   
13e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13f0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
1400: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1410: 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a  OM t1; /* 16 */.
1420: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1430: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
1440: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1450: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20   FROM t1; /* 32 
1460: 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  */.      SELECT 
1470: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
1480: 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f  ;.  }.} {32}.do_
1490: 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 33 20 7b  test wal-4.4.3 {
14a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c  .  execsql { ROL
14b0: 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20  LBACK TO tr }.} 
14c0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  {}.do_test wal-4
14d0: 2e 34 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67  .4.4 {.  set log
14e0: 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20  size [file size 
14f0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65  test.db-wal].  e
1500: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
1510: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1520: 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a  LUES('x', 'y');.
1530: 20 20 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a      RELEASE tr;.
1540: 20 20 7d 0a 20 20 65 78 70 72 20 7b 20 24 6c 6f    }.  expr { $lo
1550: 67 73 69 7a 65 20 3d 3d 20 5b 66 69 6c 65 20 73  gsize == [file s
1560: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
1570: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
1580: 20 77 61 6c 2d 34 2e 34 2e 35 20 7b 0a 20 20 65   wal-4.4.5 {.  e
1590: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
15a0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
15b0: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
15c0: 20 77 61 6c 2d 34 2e 34 2e 36 20 7b 0a 20 20 66   wal-4.4.6 {.  f
15d0: 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62  orcecopy test.db
15e0: 20 74 65 73 74 32 2e 64 62 0a 20 20 66 6f 72 63   test2.db.  forc
15f0: 65 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61  ecopy test.db-wa
1600: 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  l test2.db-wal. 
1610: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
1620: 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  t2.db.  execsql 
1630: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
1640: 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c 45  ) FROM t2 ; SELE
1650: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1660: 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32   t1 } db2.} {1 2
1670: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1680: 34 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.7 {.  execsql 
1690: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
16a0: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d  ty_check } db2.}
16b0: 20 7b 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73 65 0a   {ok}.db2 close.
16c0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
16d0: 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64 62  .1 {.  reopen_db
16e0: 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62 20  .  db func blob 
16f0: 62 6c 6f 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  blob.  execsql {
1700: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
1710: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
1720: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1730: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
1740: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1750: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
1760: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
1770: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75   test.db.  db fu
1780: 6e 63 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c  nc blob blob.  l
1790: 69 73 74 20 5b 65 78 65 63 73 71 6c 20 7b 20 53  ist [execsql { S
17a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
17b0: 7d 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  }] [file size te
17c0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61  st.db-wal].} {{a
17d0: 20 62 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77   b} 0}.do_test w
17e0: 61 6c 2d 34 2e 35 2e 32 20 7b 0a 20 20 65 78 65  al-4.5.2 {.  exe
17f0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61  csql { PRAGMA ca
1800: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a  che_size = 10 }.
1810: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1820: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
1830: 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e  a, b);.    BEGIN
1840: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1850: 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62  O t2 VALUES(blob
1860: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1870: 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54  );.    SAVEPOINT
1880: 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   tr;.      INSER
1890: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
18a0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
18b0: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f  (400) FROM t2; /
18c0: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
18d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
18e0: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
18f0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32  lob(400) FROM t2
1900: 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20  ; /*  4 */.     
1910: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1920: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1930: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1940: 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20   t2; /*  8 */.  
1950: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1960: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
1970: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1980: 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f  ROM t2; /* 16 */
1990: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
19a0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
19b0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
19c0: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32  ) FROM t2; /* 32
19d0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
19e0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
19f0: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1a00: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a  400) FROM t1; /*
1a10: 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    2 */.      INS
1a20: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1a30: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1a40: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1a50: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20   /*  4 */.      
1a60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1a70: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1a80: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1a90: 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20  t1; /*  8 */.   
1aa0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1ab0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
1ac0: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1ad0: 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a  OM t1; /* 16 */.
1ae0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1af0: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
1b00: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1b10: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20   FROM t1; /* 32 
1b20: 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  */.      SELECT 
1b30: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
1b40: 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f  ;.  }.} {32}.do_
1b50: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 33 20 7b  test wal-4.5.3 {
1b60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c  .  execsql { ROL
1b70: 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20  LBACK TO tr }.} 
1b80: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  {}.do_test wal-4
1b90: 2e 35 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67  .5.4 {.  set log
1ba0: 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20  size [file size 
1bb0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65  test.db-wal].  e
1bc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
1bd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1be0: 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a  LUES('x', 'y');.
1bf0: 20 20 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a      RELEASE tr;.
1c00: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
1c10: 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73 69 7a    expr { $logsiz
1c20: 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a 65 20  e == [file size 
1c30: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d  test.db-wal] }.}
1c40: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   {1}.do_test wal
1c50: 2d 34 2e 35 2e 35 20 7b 0a 20 20 65 78 65 63 73  -4.5.5 {.  execs
1c60: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
1c70: 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53  t(*) FROM t2 ; S
1c80: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1c90: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 7d  ROM t1 }.} {1 2}
1ca0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
1cb0: 2e 36 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79  .6 {.  forcecopy
1cc0: 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64   test.db test2.d
1cd0: 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  b.  forcecopy te
1ce0: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e  st.db-wal test2.
1cf0: 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33  db-wal.  sqlite3
1d00: 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20   db2 test2.db.  
1d10: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
1d20: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1d30: 32 20 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  2 ; SELECT count
1d40: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  (*) FROM t1 } db
1d50: 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73  2.} {1 2}.do_tes
1d60: 74 20 77 61 6c 2d 34 2e 35 2e 37 20 7b 0a 20 20  t wal-4.5.7 {.  
1d70: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1d80: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
1d90: 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62   } db2.} {ok}.db
1da0: 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74  2 close..do_test
1db0: 20 77 61 6c 2d 34 2e 36 2e 31 20 7b 0a 20 20 65   wal-4.6.1 {.  e
1dc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c  xecsql {.    DEL
1dd0: 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  ETE FROM t2;.   
1de0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
1df0: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47 49  kpoint;.    BEGI
1e00: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
1e10: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
1e20: 77 27 2c 20 27 78 27 29 3b 0a 20 20 20 20 20 20  w', 'x');.      
1e30: 53 41 56 45 50 4f 49 4e 54 20 73 61 76 65 3b 0a  SAVEPOINT save;.
1e40: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
1e50: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 79  NTO t2 VALUES('y
1e60: 27 2c 20 27 7a 27 29 3b 0a 20 20 20 20 20 20 52  ', 'z');.      R
1e70: 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 61 76 65 3b  OLLBACK TO save;
1e80: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
1e90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
1ea0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a  ECT * FROM t2 }.
1eb0: 7d 20 7b 77 20 78 7d 0a 0a 0a 72 65 6f 70 65 6e  } {w x}...reopen
1ec0: 5f 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  _db.do_test wal-
1ed0: 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
1ee0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  {.    CREATE TEM
1ef0: 50 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29  P TABLE t2(a, b)
1f00: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1f10: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32  O t2 VALUES(1, 2
1f20: 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74  );.  }.} {}.do_t
1f30: 65 73 74 20 77 61 6c 2d 35 2e 32 20 7b 0a 20 20  est wal-5.2 {.  
1f40: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
1f50: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
1f60: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1f70: 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 45  (3, 4);.      SE
1f80: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
1f90: 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a    }.} {1 2 3 4}.
1fa0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 33 20  do_test wal-5.3 
1fb0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
1fc0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20    ROLLBACK;.    
1fd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1fe0: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f  ;.  }.} {1 2}.do
1ff0: 5f 74 65 73 74 20 77 61 6c 2d 35 2e 34 20 7b 0a  _test wal-5.4 {.
2000: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
2010: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
2020: 45 20 74 33 28 78 20 55 4e 49 51 55 45 29 3b 0a  E t3(x UNIQUE);.
2030: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
2040: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
2050: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
2060: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2070: 74 33 20 56 41 4c 55 45 53 28 27 61 62 63 27 29  t3 VALUES('abc')
2080: 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c  ;.  }.  catchsql
2090: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
20a0: 33 20 56 41 4c 55 45 53 28 27 61 62 63 27 29 20  3 VALUES('abc') 
20b0: 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20 78  }.} {1 {column x
20c0: 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d 7d   is not unique}}
20d0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 35  .do_test wal-5.5
20e0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
20f0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53     COMMIT;.    S
2100: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
2110: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d  .  }.} {1 2 3 4}
2120: 0a 64 62 20 63 6c 6f 73 65 0a 0a 66 6f 72 65 61  .db close..forea
2130: 63 68 20 73 65 63 74 6f 72 20 7b 35 31 32 20 34  ch sector {512 4
2140: 30 39 36 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33  096} {.  sqlite3
2150: 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76 69 63 65  _simulate_device
2160: 20 2d 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65   -sectorsize $se
2170: 63 74 6f 72 0a 20 20 66 6f 72 65 61 63 68 20 70  ctor.  foreach p
2180: 67 73 7a 20 7b 35 31 32 20 31 30 32 34 20 32 30  gsz {512 1024 20
2190: 34 38 20 34 30 39 36 7d 20 7b 0a 20 20 20 20 66  48 4096} {.    f
21a0: 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e  orcedelete test.
21b0: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  db test.db-wal. 
21c0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 36     do_test wal-6
21d0: 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e 31  .$sector.$pgsz.1
21e0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
21f0: 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73   db test.db -vfs
2200: 20 64 65 76 73 79 6d 0a 20 20 20 20 20 20 65 78   devsym.      ex
2210: 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  ecsql ".        
2220: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
2230: 20 3d 20 24 70 67 73 7a 3b 0a 20 20 20 20 20 20   = $pgsz;.      
2240: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
2250: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cuum = 0;.      
2260: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
2270: 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20  _mode = wal;.   
2280: 20 20 20 22 0a 20 20 20 20 20 20 65 78 65 63 73     ".      execs
2290: 71 6c 20 22 0a 20 20 20 20 20 20 20 20 43 52 45  ql ".        CRE
22a0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
22b0: 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  b);.        INSE
22c0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
22d0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 22  S(1, 2);.      "
22e0: 0a 20 20 20 20 20 20 64 62 20 63 6c 6f 73 65 0a  .      db close.
22f0: 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20        file size 
2300: 74 65 73 74 2e 64 62 0a 20 20 20 20 7d 20 5b 65  test.db.    } [e
2310: 78 70 72 20 24 70 67 73 7a 2a 32 5d 0a 20 20 0a  xpr $pgsz*2].  .
2320: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
2330: 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e  6.$sector.$pgsz.
2340: 32 20 7b 0a 20 20 20 20 20 20 6c 6f 67 5f 64 65  2 {.      log_de
2350: 6c 65 74 65 64 20 74 65 73 74 2e 64 62 2d 77 61  leted test.db-wa
2360: 6c 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d 0a  l.    } {1}.  }.
2370: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 37  }..do_test wal-7
2380: 2e 31 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  .1 {.  forcedele
2390: 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  te test.db test.
23a0: 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33  db-wal.  sqlite3
23b0: 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a  _wal db test.db.
23c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
23d0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
23e0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
23f0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
2400: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
2410: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
2420: 20 32 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20   2);.  }.  list 
2430: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
2440: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
2450: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
2460: 69 73 74 20 31 30 32 34 20 5b 77 61 6c 5f 66 69  ist 1024 [wal_fi
2470: 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d  le_size 3 1024]]
2480: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 37 2e 32  .do_test wal-7.2
2490: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
24a0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
24b0: 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74 20 5b 66  oint }.  list [f
24c0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
24d0: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
24e0: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
24f0: 74 20 32 30 34 38 20 5b 77 61 6c 5f 66 69 6c 65  t 2048 [wal_file
2500: 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a 0a  _size 3 1024]]..
2510: 23 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20 74  # Execute some t
2520: 72 61 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20 61  ransactions in a
2530: 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
2540: 74 6f 20 74 65 73 74 20 64 61 74 61 62 61 73 65  to test database
2550: 20 66 69 6c 65 0a 23 20 74 72 75 6e 63 61 74 69   file.# truncati
2560: 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  on..#.do_test wa
2570: 6c 2d 38 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e  l-8.1 {.  reopen
2580: 5f 64 62 0a 20 20 63 61 74 63 68 20 7b 20 64 62  _db.  catch { db
2590: 20 63 6c 6f 73 65 20 7d 0a 20 20 66 6f 72 63 65   close }.  force
25a0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74  delete test.db t
25b0: 65 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 73 71  est.db-wal..  sq
25c0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
25d0: 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 62  .  db function b
25e0: 6c 6f 62 20 62 6c 6f 62 0a 20 20 65 78 65 63 73  lob blob.  execs
25f0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
2600: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
2610: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
2620: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
2630: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
2640: 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 7d 20 7b 77  vacuum;.  }.} {w
2650: 61 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61  al 1}.do_test wa
2660: 6c 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  l-8.2 {.  execsq
2670: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
2680: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
2690: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
26a0: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53  E t1(x);.    INS
26b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
26c0: 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  ES(blob(900));. 
26d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
26e0: 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30  1 VALUES(blob(90
26f0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
2700: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
2710: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
2720: 3b 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f  ;       /*  4 */
2730: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2740: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2750: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2760: 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20      /*  8 */.   
2770: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2780: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2790: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
27a0: 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53  /* 16 */.    INS
27b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
27c0: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
27d0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33  M t1;       /* 3
27e0: 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  2 */.    INSERT 
27f0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
2800: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
2810: 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f  ;       /* 64 */
2820: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
2830: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a  checkpoint;.  }.
2840: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
2850: 2e 64 62 0a 7d 20 5b 65 78 70 72 20 36 38 2a 31  .db.} [expr 68*1
2860: 30 32 34 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  024].do_test wal
2870: 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.3 {.  execsql
2880: 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46   { .    DELETE F
2890: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77  ROM t1 WHERE row
28a0: 69 64 3c 35 34 3b 0a 20 20 20 20 50 52 41 47 4d  id<54;.    PRAGM
28b0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
28c0: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  ;.  }.  file siz
28d0: 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70  e test.db.} [exp
28e0: 72 20 31 34 2a 31 30 32 34 5d 0a 0a 23 20 52 75  r 14*1024]..# Ru
28f0: 6e 20 73 6f 6d 65 20 22 77 61 72 6d 2d 62 6f 64  n some "warm-bod
2900: 79 22 20 74 65 73 74 73 20 74 6f 20 65 6e 73 75  y" tests to ensu
2910: 72 65 20 74 68 61 74 20 6c 6f 67 2d 73 75 6d 6d  re that log-summ
2920: 61 72 79 20 66 69 6c 65 73 20 77 69 74 68 20 6d  ary files with m
2930: 6f 72 65 0a 23 20 74 68 61 6e 20 32 35 36 20 65  ore.# than 256 e
2940: 6e 74 72 69 65 73 20 28 6c 6f 67 20 73 75 6d 6d  ntries (log summ
2950: 61 72 69 65 73 20 74 68 61 74 20 63 6f 6e 74 61  aries that conta
2960: 69 6e 20 69 6e 64 65 78 20 62 6c 6f 63 6b 73 29  in index blocks)
2970: 20 77 6f 72 6b 20 4f 6b 2e 0a 23 0a 64 6f 5f 74   work Ok..#.do_t
2980: 65 73 74 20 77 61 6c 2d 39 2e 31 20 7b 0a 20 20  est wal-9.1 {.  
2990: 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63  reopen_db.  exec
29a0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
29b0: 20 63 61 63 68 65 5f 73 69 7a 65 3d 32 30 30 30   cache_size=2000
29c0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
29d0: 4c 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20  LE t1(x PRIMARY 
29e0: 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  KEY);.    INSERT
29f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
2a00: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2a20: 41 4c 55 45 53 28 62 6c 6f 62 28 39 30 30 29 29  ALUES(blob(900))
2a30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2a40: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2a50: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2a60: 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20       /*  4 */.  
2a70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2a80: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2a90: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2aa0: 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e   /*  8 */.    IN
2ab0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2ac0: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2ad0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2ae0: 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  16 */.    INSERT
2af0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2b00: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2b10: 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a  1;       /* 32 *
2b20: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
2b30: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2b40: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2b50: 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20       /* 64 */.  
2b60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2b70: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2b80: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2b90: 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20 49   /* 128 */.    I
2ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2bb0: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
2bc0: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
2bd0: 20 32 35 36 20 2a 2f 0a 20 20 7d 0a 20 20 66 69   256 */.  }.  fi
2be0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
2bf0: 7d 20 31 30 32 34 0a 64 6f 5f 74 65 73 74 20 77  } 1024.do_test w
2c00: 61 6c 2d 39 2e 32 20 7b 0a 20 20 73 71 6c 69 74  al-9.2 {.  sqlit
2c10: 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e  e3_wal db2 test.
2c20: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52  db.  execsql {PR
2c30: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
2c40: 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
2c50: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39  }..do_test wal-9
2c60: 2e 33 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65  .3 {.  forcedele
2c70: 74 65 20 74 65 73 74 32 2e 64 62 20 74 65 73 74  te test2.db test
2c80: 32 2e 64 62 2d 77 61 6c 0a 20 20 63 6f 70 79 5f  2.db-wal.  copy_
2c90: 66 69 6c 65 20 74 65 73 74 2e 64 62 20 74 65 73  file test.db tes
2ca0: 74 32 2e 64 62 0a 20 20 63 6f 70 79 5f 66 69 6c  t2.db.  copy_fil
2cb0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  e test.db-wal te
2cc0: 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c  st2.db-wal.  sql
2cd0: 69 74 65 33 5f 77 61 6c 20 64 62 33 20 74 65 73  ite3_wal db3 tes
2ce0: 74 32 2e 64 62 20 0a 20 20 65 78 65 63 73 71 6c  t2.db .  execsql
2cf0: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   {PRAGMA integri
2d00: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 33 0a 7d  ty_check } db3.}
2d10: 20 7b 6f 6b 7d 0a 64 62 33 20 63 6c 6f 73 65 0a   {ok}.db3 close.
2d20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e 34  .do_test wal-9.4
2d30: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
2d40: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
2d50: 6f 69 6e 74 20 7d 0a 20 20 64 62 32 20 63 6c 6f  oint }.  db2 clo
2d60: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  se.  sqlite3_wal
2d70: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
2d80: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
2d90: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
2da0: 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 66 6f 72   db2.} {ok}..for
2db0: 65 61 63 68 20 68 61 6e 64 6c 65 20 7b 64 62 20  each handle {db 
2dc0: 64 62 32 20 64 62 33 7d 20 7b 20 63 61 74 63 68  db2 db3} { catch
2dd0: 20 7b 20 24 68 61 6e 64 6c 65 20 63 6c 6f 73 65   { $handle close
2de0: 20 7d 20 7d 0a 75 6e 73 65 74 20 68 61 6e 64 6c   } }.unset handl
2df0: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
2e40: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
2e50: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77  ock of tests - w
2e60: 61 6c 2d 31 30 2e 2a 20 2d 20 74 65 73 74 20 74  al-10.* - test t
2e70: 68 61 74 20 74 68 65 20 57 41 4c 20 6c 6f 63 6b  hat the WAL lock
2e80: 69 6e 67 20 0a 23 20 73 63 68 65 6d 65 20 77 6f  ing .# scheme wo
2e90: 72 6b 73 20 69 6e 20 73 69 6d 70 6c 65 20 63 61  rks in simple ca
2ea0: 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ses. This block 
2eb0: 6f 66 20 74 65 73 74 73 20 69 73 20 72 75 6e 20  of tests is run 
2ec0: 74 77 69 63 65 2e 20 4f 6e 63 65 0a 23 20 75 73  twice. Once.# us
2ed0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e  ing multiple con
2ee0: 6e 65 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  nections in the 
2ef0: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f 66  address space of
2f00: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
2f10: 63 65 73 73 2c 0a 23 20 61 6e 64 20 6f 6e 63 65  cess,.# and once
2f20: 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 6e 65 63   with all connec
2f30: 74 69 6f 6e 73 20 65 78 63 65 70 74 20 6f 6e 65  tions except one
2f40: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 74 65   running in exte
2f50: 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 2e 0a  rnal processes..
2f60: 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69 65 6e 74  #.do_multiclient
2f70: 5f 74 65 73 74 20 74 6e 20 7b 0a 0a 20 20 23 20  _test tn {..  # 
2f80: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 64  Initialize the d
2f90: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 61  atabase schema a
2fa0: 6e 64 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 23  nd contents..  #
2fb0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
2fc0: 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  0.$tn.1 {.    ex
2fd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52  ecsql {.      PR
2fe0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
2ff0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41 47   = 0;.      PRAG
3000: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
3010: 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 43 52 45  = wal;.      CRE
3020: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
3030: 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  b);.      INSERT
3040: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3050: 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 53 45 4c  1, 2);.      SEL
3060: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
3070: 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 20 31 20     }.  } {wal 1 
3080: 32 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74  2}..  # Open a t
3090: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 77  ransaction and w
30a0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
30b0: 62 61 73 65 20 75 73 69 6e 67 20 5b 64 62 5d 2e  base using [db].
30c0: 20 43 68 65 63 6b 20 74 68 61 74 20 5b 64 62 32   Check that [db2
30d0: 5d 0a 20 20 23 20 69 73 20 73 74 69 6c 6c 20 61  ].  # is still a
30e0: 62 6c 65 20 74 6f 20 72 65 61 64 20 74 68 65 20  ble to read the 
30f0: 73 6e 61 70 73 68 6f 74 20 62 65 66 6f 72 65 20  snapshot before 
3100: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
3110: 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20 20 23 0a  was opened..  #.
3120: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3130: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65  .$tn.2 {.    exe
3140: 63 73 71 6c 20 7b 20 42 45 47 49 4e 3b 20 49 4e  csql { BEGIN; IN
3150: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3160: 55 45 53 28 33 2c 20 34 29 3b 20 7d 0a 20 20 20  UES(3, 4); }.   
3170: 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20   sql2 {SELECT * 
3180: 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20  FROM t1}.  } {1 
3190: 32 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64 62  2}..  # Have [db
31a0: 5d 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  ] commit the tra
31b0: 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20  nsaction. Check 
31c0: 74 68 61 74 20 5b 64 62 32 5d 20 69 73 20 6e 6f  that [db2] is no
31d0: 77 20 73 65 65 69 6e 67 20 74 68 65 20 0a 20 20  w seeing the .  
31e0: 23 20 6e 65 77 2c 20 75 70 64 61 74 65 64 20 73  # new, updated s
31f0: 6e 61 70 73 68 6f 74 2e 0a 20 20 23 0a 20 20 64  napshot..  #.  d
3200: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3210: 6e 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.3 {.    execsq
3220: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20  l { COMMIT }.   
3230: 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20   sql2 {SELECT * 
3240: 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20  FROM t1}.  } {1 
3250: 32 20 33 20 34 7d 0a 0a 20 20 23 20 48 61 76 65  2 3 4}..  # Have
3260: 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 72 65   [db2] open a re
3270: 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ad transaction. 
3280: 54 68 65 6e 20 77 72 69 74 65 20 74 6f 20 74 68  Then write to th
3290: 65 20 64 62 20 76 69 61 20 5b 64 62 5d 2e 20 43  e db via [db]. C
32a0: 68 65 63 6b 0a 20 20 23 20 74 68 61 74 20 5b 64  heck.  # that [d
32b0: 62 32 5d 20 69 73 20 73 74 69 6c 6c 20 73 65 65  b2] is still see
32c0: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
32d0: 20 73 6e 61 70 73 68 6f 74 2e 20 54 68 65 6e 20   snapshot. Then 
32e0: 72 65 61 64 20 77 69 74 68 20 5b 64 62 33 5d 2e  read with [db3].
32f0: 0a 20 20 23 20 5b 64 62 33 5d 20 73 68 6f 75 6c  .  # [db3] shoul
3300: 64 20 73 65 65 20 74 68 65 20 6e 65 77 6c 79 20  d see the newly 
3310: 63 6f 6d 6d 69 74 74 65 64 20 64 61 74 61 2e 0a  committed data..
3320: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
3330: 6c 2d 31 30 2e 24 74 6e 2e 34 20 7b 0a 20 20 20  l-10.$tn.4 {.   
3340: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20   sql2 { BEGIN ; 
3350: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3360: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a  }.  } {1 2 3 4}.
3370: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3380: 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 65 78 65  .$tn.5 {.    exe
3390: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
33a0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
33b0: 36 29 3b 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b  6); }.    sql2 {
33c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
33d0: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a  }.  } {1 2 3 4}.
33e0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
33f0: 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 73 71 6c  .$tn.6 {.    sql
3400: 33 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  3 {SELECT * FROM
3410: 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20   t1}.  } {1 2 3 
3420: 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74  4 5 6}.  do_test
3430: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a   wal-10.$tn.7 {.
3440: 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a      sql2 COMMIT.
3450: 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76 65    } {}..  # Have
3460: 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61 20 77 72   [db2] open a wr
3470: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
3480: 20 54 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   Then attempt to
3490: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 0a 20   write to the . 
34a0: 20 23 20 64 61 74 61 62 61 73 65 20 76 69 61 20   # database via 
34b0: 5b 64 62 5d 2e 20 54 68 69 73 20 73 68 6f 75 6c  [db]. This shoul
34c0: 64 20 66 61 69 6c 20 28 77 72 69 74 65 72 20 6c  d fail (writer l
34d0: 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
34e0: 74 61 69 6e 65 64 29 2e 0a 20 20 23 0a 20 20 23  tained)..  #.  #
34f0: 20 54 68 65 6e 20 6f 70 65 6e 20 61 20 72 65 61   Then open a rea
3500: 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  d-transaction wi
3510: 74 68 20 5b 64 62 5d 2e 20 43 6f 6d 6d 69 74 20  th [db]. Commit 
3520: 74 68 65 20 5b 64 62 32 5d 20 74 72 61 6e 73 61  the [db2] transa
3530: 63 74 69 6f 6e 0a 20 20 23 20 74 6f 20 64 69 73  ction.  # to dis
3540: 6b 2e 20 56 65 72 69 66 79 20 74 68 61 74 20 5b  k. Verify that [
3550: 64 62 5d 20 73 74 69 6c 6c 20 63 61 6e 6e 6f 74  db] still cannot
3560: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61   write to the da
3570: 74 61 62 61 73 65 20 28 62 65 63 61 75 73 65 0a  tabase (because.
3580: 20 20 23 20 69 74 20 69 73 20 72 65 61 64 69 6e    # it is readin
3590: 67 20 61 6e 20 6f 6c 64 20 73 6e 61 70 73 68 6f  g an old snapsho
35a0: 74 29 2e 0a 20 20 23 0a 20 20 23 20 43 6c 6f 73  t)..  #.  # Clos
35b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 5b 64  e the current [d
35c0: 62 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  b] transaction. 
35d0: 4f 70 65 6e 20 61 20 6e 65 77 20 6f 6e 65 2e 20  Open a new one. 
35e0: 5b 64 62 5d 20 63 61 6e 20 6e 6f 77 20 77 72 69  [db] can now wri
35f0: 74 65 0a 20 20 23 20 74 6f 20 74 68 65 20 64 61  te.  # to the da
3600: 74 61 62 61 73 65 20 28 61 73 20 69 74 20 69 73  tabase (as it is
3610: 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 61 6e 64 20   not locked and 
3620: 5b 64 62 5d 20 69 73 20 72 65 61 64 69 6e 67 20  [db] is reading 
3630: 74 68 65 20 6c 61 74 65 73 74 0a 20 20 23 20 73  the latest.  # s
3640: 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20  napshot)..  #.  
3650: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3660: 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20  tn.7 {.    sql2 
3670: 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20  { BEGIN; INSERT 
3680: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37  INTO t1 VALUES(7
3690: 2c 20 38 29 20 3b 20 7d 0a 20 20 20 20 63 61 74  , 8) ; }.    cat
36a0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
36b0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c  NTO t1 VALUES(9,
36c0: 20 31 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64   10) }.  } {1 {d
36d0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
36e0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  d}}.  do_test wa
36f0: 6c 2d 31 30 2e 24 74 6e 2e 38 20 7b 0a 20 20 20  l-10.$tn.8 {.   
3700: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
3710: 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   ; SELECT * FROM
3720: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3730: 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73   4 5 6}.  do_tes
3740: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 39 20 7b  t wal-10.$tn.9 {
3750: 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54  .    sql2 COMMIT
3760: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
3770: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3780: 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20  ALUES(9, 10) }. 
3790: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
37a0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
37b0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
37c0: 2e 31 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .10 {.    execsq
37d0: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20  l { COMMIT }.   
37e0: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
37f0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
3800: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3810: 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a  VALUES(9, 10) }.
3820: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f      execsql { CO
3830: 4d 4d 49 54 20 7d 0a 20 20 20 20 65 78 65 63 73  MMIT }.    execs
3840: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
3850: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32  OM t1 }.  } {1 2
3860: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
3870: 30 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 72  0}..  # Open a r
3880: 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead transaction 
3890: 77 69 74 68 20 5b 64 62 32 5d 2e 20 43 68 65 63  with [db2]. Chec
38a0: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65 76  k that this prev
38b0: 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d 0a 20  ents [db] from. 
38c0: 20 23 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67   # checkpointing
38d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 42   the database. B
38e0: 75 74 20 6e 6f 74 20 66 72 6f 6d 20 77 72 69 74  ut not from writ
38f0: 69 6e 67 20 74 6f 20 69 74 2e 0a 20 20 23 0a 20  ing to it..  #. 
3900: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3910: 24 74 6e 2e 31 31 20 7b 0a 20 20 20 20 73 71 6c  $tn.11 {.    sql
3920: 32 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43  2 { BEGIN; SELEC
3930: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3940: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
3950: 20 38 20 39 20 31 30 7d 0a 20 20 64 6f 5f 74 65   8 9 10}.  do_te
3960: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 32  st wal-10.$tn.12
3970: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
3980: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
3990: 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b  ckpoint } .  } {
39a0: 30 20 7b 30 20 37 20 37 7d 7d 20 20 20 3b 23 20  0 {0 7 7}}   ;# 
39b0: 52 65 61 64 65 72 20 6e 6f 20 6c 6f 6e 67 65 72  Reader no longer
39c0: 20 62 6c 6f 63 6b 20 63 68 65 63 6b 70 6f 69 6e   block checkpoin
39d0: 74 73 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  ts.  do_test wal
39e0: 2d 31 30 2e 24 74 6e 2e 31 33 20 7b 0a 20 20 20  -10.$tn.13 {.   
39f0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
3a00: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3a10: 28 31 31 2c 20 31 32 29 20 7d 0a 20 20 20 20 73  (11, 12) }.    s
3a20: 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  ql2 {SELECT * FR
3a30: 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20  OM t1}.  } {1 2 
3a40: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
3a50: 7d 0a 0a 20 20 23 20 57 72 69 74 65 72 73 20 64  }..  # Writers d
3a60: 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 63 68 65 63  o not block chec
3a70: 6b 70 6f 69 6e 74 73 20 61 6e 79 20 6d 6f 72 65  kpoints any more
3a80: 20 65 69 74 68 65 72 2e 0a 20 20 23 0a 20 20 64   either..  #.  d
3a90: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3aa0: 6e 2e 31 34 20 7b 0a 20 20 20 20 63 61 74 63 68  n.14 {.    catch
3ab0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
3ac0: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20  _checkpoint } . 
3ad0: 20 7d 20 7b 30 20 7b 30 20 38 20 37 7d 7d 0a 0a   } {0 {0 8 7}}..
3ae0: 20 20 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e    # The followin
3af0: 67 20 73 65 72 69 65 73 20 6f 66 20 74 65 73 74  g series of test
3b00: 20 63 61 73 65 73 20 75 73 65 64 20 74 6f 20 76   cases used to v
3b10: 65 72 69 66 79 20 61 6e 6f 74 68 65 72 20 62 6c  erify another bl
3b20: 6f 63 6b 69 6e 67 0a 20 20 23 20 63 61 73 65 20  ocking.  # case 
3b30: 69 6e 20 57 41 4c 20 2d 20 61 20 63 61 73 65 20  in WAL - a case 
3b40: 77 68 69 63 68 20 6e 6f 20 6c 6f 6e 67 65 72 20  which no longer 
3b50: 62 6c 6f 63 6b 73 2e 0a 20 20 23 0a 20 20 64 6f  blocks..  #.  do
3b60: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3b70: 2e 31 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b  .15 {.    sql2 {
3b80: 20 43 4f 4d 4d 49 54 3b 20 42 45 47 49 4e 3b 20   COMMIT; BEGIN; 
3b90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3ba0: 3b 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  ; }.  } {1 2 3 4
3bb0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
3bc0: 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   12}.  do_test w
3bd0: 61 6c 2d 31 30 2e 24 74 6e 2e 31 36 20 7b 0a 20  al-10.$tn.16 {. 
3be0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52     catchsql { PR
3bf0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
3c00: 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 30 20 7b 30  int } .  } {0 {0
3c10: 20 38 20 38 7d 7d 0a 20 20 64 6f 5f 74 65 73 74   8 8}}.  do_test
3c20: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 37 20 7b   wal-10.$tn.17 {
3c30: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
3c40: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
3c50: 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 30 20 38  oint } .  } {0 8
3c60: 20 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61   8}.  do_test wa
3c70: 6c 2d 31 30 2e 24 74 6e 2e 31 38 20 7b 0a 20 20  l-10.$tn.18 {.  
3c80: 20 20 73 71 6c 33 20 7b 20 42 45 47 49 4e 3b 20    sql3 { BEGIN; 
3c90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3ca0: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3cb0: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
3cc0: 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  12}.  do_test wa
3cd0: 6c 2d 31 30 2e 24 74 6e 2e 31 39 20 7b 0a 20 20  l-10.$tn.19 {.  
3ce0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
3cf0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3d00: 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20 7d  ES(13, 14) }.  }
3d10: 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73   {0 {}}.  do_tes
3d20: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 30 20  t wal-10.$tn.20 
3d30: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
3d40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3d50: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3d60: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
3d70: 31 32 20 31 33 20 31 34 7d 0a 20 20 64 6f 5f 74  12 13 14}.  do_t
3d80: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
3d90: 31 20 7b 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d  1 {.    sql3 COM
3da0: 4d 49 54 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d  MIT.    sql2 COM
3db0: 4d 49 54 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  MIT.  } {}.  do_
3dc0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3dd0: 32 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  22 {.    execsql
3de0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
3df0: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3e00: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
3e10: 31 31 20 31 32 20 31 33 20 31 34 7d 0a 0a 20 20  11 12 13 14}..  
3e20: 23 20 41 6e 6f 74 68 65 72 20 73 65 72 69 65 73  # Another series
3e30: 20 6f 66 20 74 65 73 74 73 20 74 68 61 74 20 75   of tests that u
3e40: 73 65 64 20 74 6f 20 64 65 6d 6f 6e 73 74 72 61  sed to demonstra
3e50: 74 65 20 62 6c 6f 63 6b 69 6e 67 20 62 65 68 61  te blocking beha
3e60: 76 69 6f 72 0a 20 20 23 20 62 75 74 20 77 68 69  vior.  # but whi
3e70: 63 68 20 6e 6f 77 20 77 6f 72 6b 2e 0a 20 20 23  ch now work..  #
3e80: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3e90: 30 2e 24 74 6e 2e 32 33 20 7b 0a 20 20 20 20 65  0.$tn.23 {.    e
3ea0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
3eb0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
3ec0: 0a 20 20 7d 20 7b 30 20 39 20 39 7d 0a 20 20 64  .  } {0 9 9}.  d
3ed0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3ee0: 6e 2e 32 34 20 7b 0a 20 20 20 20 73 71 6c 32 20  n.24 {.    sql2 
3ef0: 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20  { BEGIN; SELECT 
3f00: 2a 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d  * FROM t1; }.  }
3f10: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3f20: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
3f30: 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  14}.  do_test wa
3f40: 6c 2d 31 30 2e 24 74 6e 2e 32 35 20 7b 0a 20 20  l-10.$tn.25 {.  
3f50: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
3f60: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
3f70: 74 20 7d 0a 20 20 7d 20 7b 30 20 39 20 39 7d 0a  t }.  } {0 9 9}.
3f80: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3f90: 2e 24 74 6e 2e 32 36 20 7b 0a 20 20 20 20 63 61  .$tn.26 {.    ca
3fa0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
3fb0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
3fc0: 35 2c 20 31 36 29 20 7d 0a 20 20 7d 20 7b 30 20  5, 16) }.  } {0 
3fd0: 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  {}}.  do_test wa
3fe0: 6c 2d 31 30 2e 24 74 6e 2e 32 37 20 7b 0a 20 20  l-10.$tn.27 {.  
3ff0: 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20    sql3 { INSERT 
4000: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
4010: 37 2c 20 31 38 29 20 7d 0a 20 20 7d 20 7b 7d 0a  7, 18) }.  } {}.
4020: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
4030: 2e 24 74 6e 2e 32 38 20 7b 0a 20 20 20 20 63 6f  .$tn.28 {.    co
4040: 64 65 33 20 7b 0a 20 20 20 20 20 20 73 65 74 20  de3 {.      set 
4050: 3a 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  ::STMT [sqlite3_
4060: 70 72 65 70 61 72 65 20 64 62 33 20 22 53 45 4c  prepare db3 "SEL
4070: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 2d  ECT * FROM t1" -
4080: 31 20 54 41 49 4c 5d 0a 20 20 20 20 20 20 73 71  1 TAIL].      sq
4090: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
40a0: 4d 54 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  MT.    }.    exe
40b0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
40c0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
40d0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
40e0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
40f0: 31 35 20 31 36 20 31 37 20 31 38 7d 0a 20 20 64  15 16 17 18}.  d
4100: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
4110: 6e 2e 32 39 20 7b 0a 20 20 20 20 65 78 65 63 73  n.29 {.    execs
4120: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
4130: 20 74 31 20 56 41 4c 55 45 53 28 31 39 2c 20 32   t1 VALUES(19, 2
4140: 30 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71  0) }.    catchsq
4150: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
4160: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
4170: 7b 30 20 7b 30 20 33 20 30 7d 7d 0a 20 20 64 6f  {0 {0 3 0}}.  do
4180: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4190: 2e 33 30 20 7b 0a 20 20 20 20 63 6f 64 65 33 20  .30 {.    code3 
41a0: 7b 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  { sqlite3_finali
41b0: 7a 65 20 24 3a 3a 53 54 4d 54 20 7d 0a 20 20 20  ze $::STMT }.   
41c0: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
41d0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
41e0: 20 7d 0a 20 20 7d 20 7b 30 20 33 20 30 7d 0a 0a   }.  } {0 3 0}..
41f0: 20 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74    # At one point
4200: 2c 20 69 66 20 61 20 72 65 61 64 65 72 20 66 61  , if a reader fa
4210: 69 6c 65 64 20 74 6f 20 75 70 67 72 61 64 65 20  iled to upgrade 
4220: 74 6f 20 61 20 77 72 69 74 65 72 20 62 65 63 61  to a writer beca
4230: 75 73 65 20 69 74 0a 20 20 23 20 77 61 73 20 72  use it.  # was r
4240: 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e  eading an old sn
4250: 61 70 73 68 6f 74 2c 20 74 68 65 20 77 72 69 74  apshot, the writ
4260: 65 2d 6c 6f 63 6b 73 20 77 65 72 65 20 6e 6f 74  e-locks were not
4270: 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 2e   being released.
4280: 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20 74  .  # Test that t
4290: 68 69 73 20 62 75 67 20 68 61 73 20 62 65 65 6e  his bug has been
42a0: 20 66 69 78 65 64 2e 0a 20 20 23 0a 20 20 64 6f   fixed..  #.  do
42b0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
42c0: 2e 33 31 20 7b 0a 20 20 20 20 73 71 6c 32 20 43  .31 {.    sql2 C
42d0: 4f 4d 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71  OMMIT.    execsq
42e0: 6c 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45  l { BEGIN ; SELE
42f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
4300: 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52 54     sql2 { INSERT
4310: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4320: 32 31 2c 20 32 32 29 20 7d 0a 20 20 20 20 63 61  21, 22) }.    ca
4330: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
4340: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
4350: 33 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b 31 20  3, 24) }.  } {1 
4360: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
4370: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
4380: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 32 20 7b 0a  wal-10.$tn.32 {.
4390: 20 20 20 20 23 20 54 68 69 73 20 73 74 61 74 65      # This state
43a0: 6d 65 6e 74 20 77 6f 75 6c 64 20 66 61 69 6c 20  ment would fail 
43b0: 77 68 65 6e 20 74 68 65 20 62 75 67 20 77 61 73  when the bug was
43c0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 73 71   present..    sq
43d0: 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l2 { INSERT INTO
43e0: 20 74 31 20 56 41 4c 55 45 53 28 32 33 2c 20 32   t1 VALUES(23, 2
43f0: 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  4) }.  } {}.  do
4400: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4410: 2e 33 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .33 {.    execsq
4420: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
4430: 4d 20 74 31 20 3b 20 43 4f 4d 4d 49 54 20 7d 0a  M t1 ; COMMIT }.
4440: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
4450: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
4460: 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31  13 14 15 16 17 1
4470: 38 20 31 39 20 32 30 7d 0a 20 20 64 6f 5f 74 65  8 19 20}.  do_te
4480: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 34  st wal-10.$tn.34
4490: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
44a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
44b0: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
44c0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
44d0: 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36 20   12 13 14 15 16 
44e0: 31 37 20 31 38 20 31 39 20 32 30 20 32 31 20 32  17 18 19 20 21 2
44f0: 32 20 32 33 20 32 34 7d 0a 0a 20 20 23 20 54 65  2 23 24}..  # Te
4500: 73 74 20 74 68 61 74 20 69 66 20 61 20 63 68 65  st that if a che
4510: 63 6b 70 6f 69 6e 74 65 72 20 63 61 6e 6e 6f 74  ckpointer cannot
4520: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
4530: 69 72 65 64 20 6c 6f 63 6b 73 2c 20 69 74 0a 20  ired locks, it. 
4540: 20 23 20 72 65 6c 65 61 73 65 73 20 61 6c 6c 20   # releases all 
4550: 6c 6f 63 6b 73 20 62 65 66 6f 72 65 20 72 65 74  locks before ret
4560: 75 72 6e 69 6e 67 20 61 20 62 75 73 79 20 65 72  urning a busy er
4570: 72 6f 72 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  ror..  #.  do_te
4580: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 35  st wal-10.$tn.35
4590: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
45a0: 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46   .      DELETE F
45b0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
45c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
45d0: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
45e0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
45f0: 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
4600: 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  'd');.    }.    
4610: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47  sql2 {.      BEG
4620: 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  IN;.        SELE
4630: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
4640: 20 20 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64    }.  } {a b c d
4650: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4660: 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20 20  10.$tn.36 {.    
4670: 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d  catchsql { PRAGM
4680: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
4690: 20 7d 0a 20 20 7d 20 7b 30 20 7b 30 20 38 20 38   }.  } {0 {0 8 8
46a0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  }}.  do_test wal
46b0: 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20  -10.$tn.36 {.   
46c0: 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20 49   sql3 { INSERT I
46d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65  NTO t1 VALUES('e
46e0: 27 2c 20 27 66 27 29 20 7d 0a 20 20 20 20 73 71  ', 'f') }.    sq
46f0: 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l2 { SELECT * FR
4700: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 61 20 62  OM t1 }.  } {a b
4710: 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20   c d}.  do_test 
4720: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 37 20 7b 0a  wal-10.$tn.37 {.
4730: 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a      sql2 COMMIT.
4740: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
4750: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
4760: 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 39 20 39  int }.  } {0 9 9
4770: 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }.}..#----------
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
47c0: 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20  # This block of 
47d0: 74 65 73 74 73 2c 20 77 61 6c 2d 31 31 2e 2a 2c  tests, wal-11.*,
47e0: 20 74 65 73 74 20 74 68 61 74 20 6e 6f 74 68 69   test that nothi
47f0: 6e 67 20 67 6f 65 73 20 74 65 72 72 69 62 6c 79  ng goes terribly
4800: 20 77 72 6f 6e 67 0a 23 20 69 66 20 66 72 61 6d   wrong.# if fram
4810: 65 73 20 6d 75 73 74 20 62 65 20 77 72 69 74 74  es must be writt
4820: 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69  en to the log fi
4830: 6c 65 20 62 65 66 6f 72 65 20 61 20 74 72 61 6e  le before a tran
4840: 73 61 63 74 69 6f 6e 20 69 73 0a 23 20 63 6f 6d  saction is.# com
4850: 6d 69 74 74 65 64 20 28 69 6e 20 6f 72 64 65 72  mitted (in order
4860: 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f   to free up memo
4870: 72 79 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ry)..#.do_test w
4880: 61 6c 2d 31 31 2e 31 20 7b 0a 20 20 72 65 6f 70  al-11.1 {.  reop
4890: 65 6e 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20  en_db.  execsql 
48a0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63  {.    PRAGMA cac
48b0: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
48c0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
48d0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
48e0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
48f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20   PRIMARY KEY);. 
4900: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
4910: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4920: 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20  db]/1024] [expr 
4930: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4940: 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20  db-wal]/1044].} 
4950: 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {1 3}.do_test wa
4960: 6c 2d 31 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  l-11.2 {.  execs
4970: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
4980: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c  checkpoint }.  l
4990: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
49a0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
49b0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
49c0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
49d0: 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c 65 5f  ist 3 [wal_file_
49e0: 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a 64 6f  size 3 1024]].do
49f0: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 33 20 7b  _test wal-11.3 {
4a00: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
4a10: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4a20: 45 53 28 20 62 6c 6f 62 28 39 30 30 29 20 29 20  ES( blob(900) ) 
4a30: 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  }.  list [expr [
4a40: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4a50: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
4a60: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4a70: 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f  .} [list 3 [wal_
4a80: 66 69 6c 65 5f 73 69 7a 65 20 34 20 31 30 32 34  file_size 4 1024
4a90: 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ]]..do_test wal-
4aa0: 31 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.4 {.  execsql
4ab0: 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20   { .    BEGIN;. 
4ac0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
4ad0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
4ae0: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
4af0: 2d 2d 20 32 0a 20 20 20 20 20 20 49 4e 53 45 52  -- 2.      INSER
4b00: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4b10: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
4b20: 74 31 3b 20 20 20 2d 2d 20 34 0a 20 20 20 20 20  t1;   -- 4.     
4b30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4b40: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
4b50: 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 38   FROM t1;   -- 8
4b60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4b70: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
4b80: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
4b90: 20 20 2d 2d 20 31 36 0a 20 20 7d 0a 20 20 6c 69    -- 16.  }.  li
4ba0: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
4bb0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
4bc0: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
4bd0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
4be0: 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  st 3 [wal_file_s
4bf0: 69 7a 65 20 33 32 20 31 30 32 34 5d 5d 0a 64 6f  ize 32 1024]].do
4c00: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 35 20 7b  _test wal-11.5 {
4c10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
4c20: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
4c30: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
4c40: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
4c50: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 36  check;.  }.} {16
4c60: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   ok}.do_test wal
4c70: 2d 31 31 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  -11.6 {.  execsq
4c80: 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73 74 20  l COMMIT.  list 
4c90: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4ca0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
4cb0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4cc0: 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20  db-wal].} [list 
4cd0: 33 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  3 [wal_file_size
4ce0: 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65   41 1024]].do_te
4cf0: 73 74 20 77 61 6c 2d 31 31 2e 37 20 7b 0a 20 20  st wal-11.7 {.  
4d00: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53  execsql { .    S
4d10: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
4d20: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
4d30: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
4d40: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 36 20 6f 6b  ck;.  }.} {16 ok
4d50: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  }.do_test wal-11
4d60: 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .8 {.  execsql {
4d70: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4d80: 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74 20  kpoint }.  list 
4d90: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4da0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
4db0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4dc0: 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20  db-wal].} [list 
4dd0: 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  37 [wal_file_siz
4de0: 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f 74  e 41 1024]].do_t
4df0: 65 73 74 20 77 61 6c 2d 31 31 2e 39 20 7b 0a 20  est wal-11.9 {. 
4e00: 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73 74   db close.  list
4e10: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
4e20: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
4e30: 20 5b 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74 65   [log_deleted te
4e40: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 33 37  st.db-wal].} {37
4e50: 20 31 7d 0a 73 71 6c 69 74 65 33 5f 77 61 6c 20   1}.sqlite3_wal 
4e60: 64 62 20 74 65 73 74 2e 64 62 0a 73 65 74 20 6e  db test.db.set n
4e70: 57 61 6c 20 33 39 0a 69 66 20 7b 5b 70 65 72 6d  Wal 39.if {[perm
4e80: 75 74 61 74 69 6f 6e 5d 21 3d 22 6d 6d 61 70 22  utation]!="mmap"
4e90: 7d 20 7b 73 65 74 20 6e 57 61 6c 20 33 37 7d 0a  } {set nWal 37}.
4ea0: 69 66 63 61 70 61 62 6c 65 20 21 6d 6d 61 70 20  ifcapable !mmap 
4eb0: 7b 73 65 74 20 6e 57 61 6c 20 33 37 7d 0a 64 6f  {set nWal 37}.do
4ec0: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 30 20  _test wal-11.10 
4ed0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4ee0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
4ef0: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45  ize = 10;.    BE
4f00: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
4f10: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4f20: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
4f30: 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20 20 20 20  t1;   -- 32.    
4f40: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
4f50: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20  ) FROM t1;.  }. 
4f60: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4f70: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4f80: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4f90: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4fa0: 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f 66 69  [list 37 [wal_fi
4fb0: 6c 65 5f 73 69 7a 65 20 24 6e 57 61 6c 20 31 30  le_size $nWal 10
4fc0: 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  24]].do_test wal
4fd0: 2d 31 31 2e 31 31 20 7b 0a 20 20 65 78 65 63 73  -11.11 {.  execs
4fe0: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
4ff0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
5000: 74 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  t1;.    ROLLBACK
5010: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
5020: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
5030: 20 7d 0a 7d 20 7b 33 32 20 31 36 7d 0a 64 6f 5f   }.} {32 16}.do_
5040: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 32 20 7b  test wal-11.12 {
5050: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
5060: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5070: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
5080: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
5090: 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f  } [list 37 [wal_
50a0: 66 69 6c 65 5f 73 69 7a 65 20 24 6e 57 61 6c 20  file_size $nWal 
50b0: 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77  1024]].do_test w
50c0: 61 6c 2d 31 31 2e 31 33 20 7b 0a 20 20 65 78 65  al-11.13 {.  exe
50d0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
50e0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
50f0: 28 20 62 6c 6f 62 28 39 30 30 29 20 29 3b 0a 20  ( blob(900) );. 
5100: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
5110: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
5120: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
5130: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31  _check;.  }.} {1
5140: 37 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  7 ok}.do_test wa
5150: 6c 2d 31 31 2e 31 34 20 7b 0a 20 20 6c 69 73 74  l-11.14 {.  list
5160: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
5170: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
5180: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5190: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
51a0: 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69   37 [wal_file_si
51b0: 7a 65 20 24 6e 57 61 6c 20 31 30 32 34 5d 5d 0a  ze $nWal 1024]].
51c0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 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 0a 23 20 54  ------------.# T
5210: 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  his block of tes
5220: 74 73 2c 20 77 61 6c 2d 31 32 2e 2a 2c 20 74 65  ts, wal-12.*, te
5230: 73 74 73 20 74 68 65 20 66 69 78 20 66 6f 72 20  sts the fix for 
5240: 61 20 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 0a  a problem that .
5250: 23 20 63 6f 75 6c 64 20 6f 63 63 75 72 20 69 66  # could occur if
5260: 20 61 20 6c 6f 67 20 74 68 61 74 20 69 73 20 61   a log that is a
5270: 20 70 72 65 66 69 78 20 6f 66 20 61 6e 20 6f 6c   prefix of an ol
5280: 64 65 72 20 6c 6f 67 20 69 73 20 77 72 69 74 74  der log is writt
5290: 65 6e 20 0a 23 20 69 6e 74 6f 20 61 20 72 65 75  en .# into a reu
52a0: 73 65 64 20 6c 6f 67 20 66 69 6c 65 2e 0a 23 0a  sed log file..#.
52b0: 72 65 6f 70 65 6e 5f 64 62 0a 64 6f 5f 74 65 73  reopen_db.do_tes
52c0: 74 20 77 61 6c 2d 31 32 2e 31 20 7b 0a 20 20 65  t wal-12.1 {.  e
52d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
52e0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
52f0: 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45  1024;.    CREATE
5300: 20 54 41 42 4c 45 20 74 31 28 78 2c 20 79 29 3b   TABLE t1(x, y);
5310: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
5320: 45 20 74 32 28 78 2c 20 79 29 3b 0a 20 20 20 20  E t2(x, y);.    
5330: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
5340: 41 4c 55 45 53 28 27 41 27 2c 20 31 29 3b 0a 20  ALUES('A', 1);. 
5350: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
5360: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5370: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
5380: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
5390: 5d 0a 7d 20 5b 6c 69 73 74 20 31 20 5b 77 61 6c  ].} [list 1 [wal
53a0: 5f 66 69 6c 65 5f 73 69 7a 65 20 35 20 31 30 32  _file_size 5 102
53b0: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
53c0: 31 32 2e 32 20 7b 0a 20 20 64 62 20 63 6c 6f 73  12.2 {.  db clos
53d0: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
53e0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
53f0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79   {.    PRAGMA sy
5400: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d  nchronous = norm
5410: 61 6c 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  al;.    UPDATE t
5420: 31 20 53 45 54 20 79 20 3d 20 30 20 57 48 45 52  1 SET y = 0 WHER
5430: 45 20 78 20 3d 20 27 41 27 3b 0a 20 20 7d 0a 20  E x = 'A';.  }. 
5440: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
5450: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
5460: 31 30 32 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c  1024] [expr [fil
5470: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
5480: 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20 7b 33 20 31  al]/1044].} {3 1
5490: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32  }.do_test wal-12
54a0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
54b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
54c0: 56 41 4c 55 45 53 28 27 42 27 2c 20 31 29 20 7d  VALUES('B', 1) }
54d0: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
54e0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
54f0: 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20 5b 66  ]/1024] [expr [f
5500: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5510: 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20 7b 33  -wal]/1044].} {3
5520: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   2}.do_test wal-
5530: 31 32 2e 34 20 7b 0a 20 20 66 6f 72 63 65 63 6f  12.4 {.  forceco
5540: 70 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 32  py test.db test2
5550: 2e 64 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20  .db.  forcecopy 
5560: 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74  test.db-wal test
5570: 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74  2.db-wal.  sqlit
5580: 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 32  e3_wal db2 test2
5590: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
55a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
55b0: 20 7d 20 64 62 32 0a 7d 20 7b 42 20 31 7d 0a 64   } db2.} {B 1}.d
55c0: 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74 65 73 74  b2 close.do_test
55d0: 20 77 61 6c 2d 31 32 2e 35 20 7b 0a 20 20 65 78   wal-12.5 {.  ex
55e0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
55f0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
5600: 74 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 32  t;.    UPDATE t2
5610: 20 53 45 54 20 79 20 3d 20 32 20 57 48 45 52 45   SET y = 2 WHERE
5620: 20 78 20 3d 20 27 42 27 3b 20 0a 20 20 20 20 50   x = 'B'; .    P
5630: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
5640: 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54 45  oint;.    UPDATE
5650: 20 74 31 20 53 45 54 20 79 20 3d 20 31 20 57 48   t1 SET y = 1 WH
5660: 45 52 45 20 78 20 3d 20 27 41 27 3b 0a 20 20 20  ERE x = 'A';.   
5670: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
5680: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41  kpoint;.    UPDA
5690: 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 30 20  TE t1 SET y = 0 
56a0: 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b 0a 20  WHERE x = 'A';. 
56b0: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 20   }.  execsql {  
56c0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
56d0: 20 7d 0a 7d 20 7b 42 20 32 7d 0a 64 6f 5f 74 65   }.} {B 2}.do_te
56e0: 73 74 20 77 61 6c 2d 31 32 2e 36 20 7b 0a 20 20  st wal-12.6 {.  
56f0: 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64  forcecopy test.d
5700: 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 6f 72  b test2.db.  for
5710: 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 77  cecopy test.db-w
5720: 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a  al test2.db-wal.
5730: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62    sqlite3_wal db
5740: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65  2 test2.db.  exe
5750: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
5760: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
5770: 7b 42 20 32 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  {B 2}.db2 close.
5780: 64 62 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d  db close..#-----
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6c 61 72 67  ----.# Test larg
57e0: 65 20 6c 6f 67 20 73 75 6d 6d 61 72 69 65 73 2e  e log summaries.
57f0: 0a 23 0a 23 20 49 6e 20 74 68 69 73 20 63 61 73  .#.# In this cas
5800: 65 20 22 6c 61 72 67 65 22 20 75 73 75 61 6c 6c  e "large" usuall
5810: 79 20 6d 65 61 6e 73 20 61 20 6c 6f 67 20 66 69  y means a log fi
5820: 6c 65 20 74 68 61 74 20 72 65 71 75 69 72 65 73  le that requires
5830: 20 61 20 77 61 6c 2d 69 6e 64 65 78 0a 23 20 6d   a wal-index.# m
5840: 61 70 70 69 6e 67 20 6c 61 72 67 65 72 20 74 68  apping larger th
5850: 61 6e 20 36 34 4b 42 20 28 74 68 65 20 64 65 66  an 64KB (the def
5860: 61 75 6c 74 20 69 6e 69 74 69 61 6c 20 61 6c 6c  ault initial all
5870: 6f 63 61 74 69 6f 6e 29 2e 20 41 20 36 34 4b 42  ocation). A 64KB
5880: 20 77 61 6c 2d 69 6e 64 65 78 0a 23 20 69 73 20   wal-index.# is 
5890: 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
58a0: 20 61 20 6c 6f 67 20 66 69 6c 65 20 74 68 61 74   a log file that
58b0: 20 63 6f 6e 74 61 69 6e 73 20 61 70 70 72 6f 78   contains approx
58c0: 69 6d 61 74 65 6c 79 20 31 33 31 30 30 20 66 72  imately 13100 fr
58d0: 61 6d 65 73 2e 0a 23 20 53 6f 20 74 68 65 20 66  ames..# So the f
58e0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 63  ollowing tests c
58f0: 72 65 61 74 65 20 6c 6f 67 73 20 63 6f 6e 74 61  reate logs conta
5900: 69 6e 69 6e 67 20 61 74 20 6c 65 61 73 74 20 74  ining at least t
5910: 68 69 73 20 6d 61 6e 79 20 66 72 61 6d 65 73 2e  his many frames.
5920: 0a 23 0a 23 20 77 61 6c 2d 31 33 2e 31 2e 2a 3a  .#.# wal-13.1.*:
5930: 20 54 68 69 73 20 74 65 73 74 20 63 61 73 65 20   This test case 
5940: 63 72 65 61 74 65 73 20 61 20 76 65 72 79 20 6c  creates a very l
5950: 61 72 67 65 20 6c 6f 67 20 66 69 6c 65 20 77 69  arge log file wi
5960: 74 68 69 6e 20 74 68 65 0a 23 20 20 20 20 20 20  thin the.#      
5970: 20 20 20 20 20 20 20 66 69 6c 65 2d 73 79 73 74         file-syst
5980: 65 6d 20 28 61 72 6f 75 6e 64 20 32 30 30 4d 42  em (around 200MB
5990: 29 2e 20 54 68 65 20 6c 6f 67 20 66 69 6c 65 20  ). The log file 
59a0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
59b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .#             a
59c0: 6e 79 20 76 61 6c 69 64 20 66 72 61 6d 65 73 2e  ny valid frames.
59d0: 20 54 65 73 74 20 74 68 61 74 20 74 68 65 20 64   Test that the d
59e0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 61 6e  atabase file can
59f0: 20 73 74 69 6c 6c 20 62 65 0a 23 20 20 20 20 20   still be.#     
5a00: 20 20 20 20 20 20 20 20 6f 70 65 6e 65 64 20 61          opened a
5a10: 6e 64 20 71 75 65 72 69 65 64 2c 20 61 6e 64 20  nd queried, and 
5a20: 74 68 61 74 20 74 68 65 20 69 6e 76 61 6c 69 64  that the invalid
5a30: 20 6c 6f 67 20 66 69 6c 65 20 63 61 75 73 65 73   log file causes
5a40: 20 6e 6f 20 0a 23 20 20 20 20 20 20 20 20 20 20   no .#          
5a50: 20 20 20 70 72 6f 62 6c 65 6d 73 2e 0a 23 0a 23     problems..#.#
5a60: 20 77 61 6c 2d 31 33 2e 32 2e 2a 3a 20 54 65 73   wal-13.2.*: Tes
5a70: 74 20 74 68 61 74 20 61 20 70 72 6f 63 65 73 73  t that a process
5a80: 20 6d 61 79 20 63 72 65 61 74 65 20 61 20 6c 61   may create a la
5a90: 72 67 65 20 6c 6f 67 20 66 69 6c 65 20 61 6e 64  rge log file and
5aa0: 20 71 75 65 72 79 0a 23 20 20 20 20 20 20 20 20   query.#        
5ab0: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
5ac0: 65 20 28 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e (including the
5ad0: 20 6c 6f 67 20 66 69 6c 65 20 74 68 61 74 20 69   log file that i
5ae0: 74 20 69 74 73 65 6c 66 20 63 72 65 61 74 65 64  t itself created
5af0: 29 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e 33 2e  )..#.# wal-13.3.
5b00: 2a 3a 20 54 65 73 74 20 74 68 61 74 20 69 66 20  *: Test that if 
5b10: 61 20 76 65 72 79 20 6c 61 72 67 65 20 6c 6f 67  a very large log
5b20: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
5b30: 2c 20 61 6e 64 20 74 68 65 6e 20 61 0a 23 20 20  , and then a.#  
5b40: 20 20 20 20 20 20 20 20 20 20 20 73 65 63 6f 6e             secon
5b50: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  d connection is 
5b60: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
5b70: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74 20  tabase file, it 
5b80: 69 73 20 70 6f 73 73 69 62 6c 65 0a 23 20 20 20  is possible.#   
5b90: 20 20 20 20 20 20 20 20 20 20 74 6f 20 71 75 65            to que
5ba0: 72 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ry the database 
5bb0: 28 61 6e 64 20 74 68 65 20 76 65 72 79 20 6c 61  (and the very la
5bc0: 72 67 65 20 6c 6f 67 29 20 75 73 69 6e 67 20 74  rge log) using t
5bd0: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
5be0: 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69   second connecti
5bf0: 6f 6e 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e 34  on..#.# wal-13.4
5c00: 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74 20 61 73  .*: Same test as
5c10: 20 77 61 6c 2d 31 33 2e 33 2e 2a 2e 20 45 78 63   wal-13.3.*. Exc
5c20: 65 70 74 20 69 6e 20 74 68 69 73 20 63 61 73 65  ept in this case
5c30: 20 74 68 65 20 73 65 63 6f 6e 64 0a 23 20 20 20   the second.#   
5c40: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63            connec
5c50: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 62  tion is opened b
5c60: 79 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  y an external pr
5c70: 6f 63 65 73 73 2e 0a 23 0a 64 6f 5f 74 65 73 74  ocess..#.do_test
5c80: 20 77 61 6c 2d 31 33 2e 31 2e 31 20 7b 0a 20 20   wal-13.1.1 {.  
5c90: 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74  list [file exist
5ca0: 73 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65  s test.db] [file
5cb0: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
5cc0: 77 61 6c 5d 0a 7d 20 7b 31 20 30 7d 0a 64 6f 5f  wal].} {1 0}.do_
5cd0: 74 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e 32 20  test wal-13.1.2 
5ce0: 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e  {.  set fd [open
5cf0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 77 5d 0a   test.db-wal w].
5d00: 20 20 73 65 65 6b 20 24 66 64 20 5b 65 78 70 72    seek $fd [expr
5d10: 20 32 30 30 2a 31 30 32 34 2a 31 30 32 34 5d 0a   200*1024*1024].
5d20: 20 20 70 75 74 73 20 24 66 64 20 22 22 0a 20 20    puts $fd "".  
5d30: 63 6c 6f 73 65 20 24 66 64 0a 20 20 73 71 6c 69  close $fd.  sqli
5d40: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
5d50: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
5d60: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20  T * FROM t2 }.} 
5d70: 7b 42 20 32 7d 0a 62 72 65 61 6b 70 6f 69 6e 74  {B 2}.breakpoint
5d80: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e  .do_test wal-13.
5d90: 31 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  1.3 {.  db close
5da0: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
5db0: 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d  est.db-wal.} {0}
5dc0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33  ..do_test wal-13
5dd0: 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .2.1 {.  sqlite3
5de0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
5df0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
5e00: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
5e10: 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  }.} {1}.do_test 
5e20: 77 61 6c 2d 31 33 2e 32 2e 32 20 7b 0a 20 20 64  wal-13.2.2 {.  d
5e30: 62 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 20  b function blob 
5e40: 62 6c 6f 62 0a 20 20 66 6f 72 20 7b 73 65 74 20  blob.  for {set 
5e50: 69 20 30 7d 20 7b 24 69 20 3c 20 31 36 7d 20 7b  i 0} {$i < 16} {
5e60: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78  incr i} {.    ex
5e70: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
5e80: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c  NTO t2 SELECT bl
5e90: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
5ea0: 30 29 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20 7d  0) FROM t2 }.  }
5eb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
5ec0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
5ed0: 4d 20 74 32 20 7d 0a 7d 20 5b 65 78 70 72 20 69  M t2 }.} [expr i
5ee0: 6e 74 28 70 6f 77 28 32 2c 20 31 36 29 29 5d 0a  nt(pow(2, 16))].
5ef0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 32  do_test wal-13.2
5f00: 2e 33 20 7b 0a 20 20 65 78 70 72 20 5b 66 69 6c  .3 {.  expr [fil
5f10: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
5f20: 61 6c 5d 20 3e 20 5b 77 61 6c 5f 66 69 6c 65 5f  al] > [wal_file_
5f30: 73 69 7a 65 20 33 33 30 30 30 20 31 30 32 34 5d  size 33000 1024]
5f40: 0a 7d 20 31 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c  .} 1..do_multicl
5f50: 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20  ient_test tn {. 
5f60: 20 69 6e 63 72 20 74 6e 20 32 0a 0a 20 20 64 6f   incr tn 2..  do
5f70: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e  _test wal-13.$tn
5f80: 2e 30 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a  .0 {.    sql1 {.
5f90: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
5fa0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
5fb0: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
5fc0: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20  BLE t1(x);.     
5fd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5fe0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
5ff0: 62 28 38 30 30 29 3b 0a 20 20 20 20 7d 0a 20 20  b(800);.    }.  
6000: 20 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20    sql1 { SELECT 
6010: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
6020: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 20 20 66 6f   }.  } {1}..  fo
6030: 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69  r {set ii 1} {$i
6040: 69 3c 31 36 7d 20 7b 69 6e 63 72 20 69 69 7d 20  i<16} {incr ii} 
6050: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  {.    do_test wa
6060: 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e 61 20 7b  l-13.$tn.$ii.a {
6070: 0a 20 20 20 20 20 20 73 71 6c 32 20 7b 20 49 4e  .      sql2 { IN
6080: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
6090: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38  ECT randomblob(8
60a0: 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  00) FROM t1 }.  
60b0: 20 20 20 20 73 71 6c 32 20 7b 20 53 45 4c 45 43      sql2 { SELEC
60c0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
60d0: 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72  t1 }.    } [expr
60e0: 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64   (1<<$ii)].    d
60f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74  o_test wal-13.$t
6100: 6e 2e 24 69 69 2e 62 20 7b 0a 20 20 20 20 20 20  n.$ii.b {.      
6110: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 63 6f  sql1 { SELECT co
6120: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d  unt(*) FROM t1 }
6130: 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 28 31 3c  .    } [expr (1<
6140: 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f 5f 74 65  <$ii)].    do_te
6150: 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69  st wal-13.$tn.$i
6160: 69 2e 63 20 7b 0a 20 20 20 20 20 20 73 71 6c 31  i.c {.      sql1
6170: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
6180: 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 20  *) FROM t1 }.   
6190: 20 7d 20 5b 65 78 70 72 20 28 31 3c 3c 24 69 69   } [expr (1<<$ii
61a0: 29 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77  )].    do_test w
61b0: 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e 64 20  al-13.$tn.$ii.d 
61c0: 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20 50  {.      sql1 { P
61d0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
61e0: 63 68 65 63 6b 20 7d 0a 20 20 20 20 7d 20 7b 6f  check }.    } {o
61f0: 6b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  k}.  }.}..#-----
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6240: 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 61 20 66  ----.# Check a f
6250: 75 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 61  un corruption ca
6260: 73 65 20 68 61 73 20 62 65 65 6e 20 66 69 78 65  se has been fixe
6270: 64 2e 0a 23 0a 23 20 54 68 65 20 70 72 6f 62 6c  d..#.# The probl
6280: 65 6d 20 77 61 73 20 74 68 61 74 20 61 66 74 65  em was that afte
6290: 72 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 63  r performing a c
62a0: 68 65 63 6b 70 6f 69 6e 74 20 75 73 69 6e 67 20  heckpoint using 
62b0: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 23 20 74  a connection.# t
62c0: 68 61 74 20 68 61 64 20 61 6e 20 6f 75 74 2d 6f  hat had an out-o
62d0: 66 2d 64 61 74 65 20 70 61 67 65 72 2d 63 61 63  f-date pager-cac
62e0: 68 65 2c 20 74 68 65 20 6e 65 78 74 20 74 69 6d  he, the next tim
62f0: 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
6300: 20 77 61 73 0a 23 20 75 73 65 64 20 69 74 20 64   was.# used it d
6310: 69 64 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  id not realize t
6320: 68 65 20 63 61 63 68 65 20 77 61 73 20 6f 75 74  he cache was out
6330: 2d 6f 66 2d 64 61 74 65 20 61 6e 64 20 70 72 6f  -of-date and pro
6340: 63 65 65 64 65 64 20 74 6f 0a 23 20 6f 70 65 72  ceeded to.# oper
6350: 61 74 65 20 77 69 74 68 20 61 6e 20 69 6e 63 6f  ate with an inco
6360: 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
6370: 4c 65 61 64 69 6e 67 20 74 6f 20 63 6f 72 72 75  Leading to corru
6380: 70 74 69 6f 6e 2e 0a 23 0a 63 61 74 63 68 20 7b  ption..#.catch {
6390: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63   db close }.catc
63a0: 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a  h { db2 close }.
63b0: 63 61 74 63 68 20 7b 20 64 62 33 20 63 6c 6f 73  catch { db3 clos
63c0: 65 20 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  e }.forcedelete 
63d0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
63e0: 77 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20 74  wal.sqlite3 db t
63f0: 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33 20 64  est.db.sqlite3 d
6400: 62 32 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65  b2 test.db.do_te
6410: 73 74 20 77 61 6c 2d 31 34 20 7b 0a 20 20 65 78  st wal-14 {.  ex
6420: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
6430: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
6440: 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54  = WAL;.    CREAT
6450: 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52 49  E TABLE t1(a PRI
6460: 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20  MARY KEY, b);.  
6470: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6480: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
6490: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
64a0: 6f 62 28 31 30 30 29 29 3b 0a 20 20 20 20 49 4e  ob(100));.    IN
64b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
64c0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
64d0: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
64e0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
64f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6500: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
6510: 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  b(10), randomblo
6520: 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(100) FROM t1;.
6530: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6540: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
6550: 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d  blob(10), random
6560: 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74  blob(100) FROM t
6570: 31 3b 0a 20 20 7d 0a 0a 20 20 64 62 32 20 65 76  1;.  }..  db2 ev
6580: 61 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52 54  al { .    INSERT
6590: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
65a0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20  randomblob(10), 
65b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b  randomblob(100);
65c0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
65d0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
65e0: 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f  mblob(10), rando
65f0: 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20 20 20  mblob(100);.    
6600: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
6610: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
6620: 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  (10), randomblob
6630: 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52  (100);.    INSER
6640: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
6650: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c   randomblob(10),
6660: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
6670: 3b 0a 20 20 7d 0a 0a 20 20 23 20 41 66 74 65 72  ;.  }..  # After
6680: 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 20 22   executing the "
6690: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
66a0: 70 6f 69 6e 74 22 2c 20 63 6f 6e 6e 65 63 74 69  point", connecti
66b0: 6f 6e 20 5b 64 62 5d 20 77 61 73 20 62 65 69 6e  on [db] was bein
66c0: 67 0a 20 20 23 20 6c 65 66 74 20 77 69 74 68 20  g.  # left with 
66d0: 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20  an inconsistent 
66e0: 63 61 63 68 65 2e 20 52 75 6e 6e 69 6e 67 20 74  cache. Running t
66f0: 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
6700: 73 74 61 74 65 6d 65 6e 74 0a 20 20 23 20 69 6e  statement.  # in
6710: 20 74 68 69 73 20 73 74 61 74 65 20 6c 65 64 20   this state led 
6720: 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
6730: 75 70 74 69 6f 6e 2e 0a 20 20 63 61 74 63 68 73  uption..  catchs
6740: 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41  ql { .    PRAGMA
6750: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
6760: 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  .    CREATE INDE
6770: 58 20 69 31 20 6f 6e 20 74 31 28 62 29 3b 0a 20  X i1 on t1(b);. 
6780: 20 7d 0a 20 20 20 0a 20 20 64 62 32 20 65 76 61   }.   .  db2 eva
6790: 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  l { PRAGMA integ
67a0: 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 7d 20 7b  rity_check }.} {
67b0: 6f 6b 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 20  ok}..catch { db 
67c0: 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20  close }.catch { 
67d0: 64 62 32 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d 2d  db2 close }..#--
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
6830: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
6840: 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 35 2e   tests - wal-15.
6850: 2a 20 2d 20 66 6f 63 75 73 20 6f 6e 20 74 65 73  * - focus on tes
6860: 74 69 6e 67 20 74 68 65 20 0a 23 20 69 6d 70 6c  ting the .# impl
6870: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  ementation of th
6880: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
6890: 65 63 6b 70 6f 69 6e 74 28 29 20 69 6e 74 65 72  eckpoint() inter
68a0: 66 61 63 65 2e 0a 23 0a 66 6f 72 63 65 64 65 6c  face..#.forcedel
68b0: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
68c0: 2e 64 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20  .db-wal.sqlite3 
68d0: 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65  db test.db.do_te
68e0: 73 74 20 77 61 6c 2d 31 35 2e 31 20 7b 0a 20 20  st wal-15.1 {.  
68f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
6900: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
6910: 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 0;.    PRAGMA
6920: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32   page_size = 102
6930: 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  4;.    PRAGMA jo
6940: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
6950: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
6960: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
6970: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
6980: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6990: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
69a0: 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74  }.} {}..# Test t
69b0: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  hat an error is 
69c0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
69d0: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
69e0: 20 6e 6f 74 20 72 65 63 6f 67 6e 69 7a 65 64 0a   not recognized.
69f0: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  #.do_test wal-15
6a00: 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .2.1 {.  sqlite3
6a10: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
6a20: 64 62 20 61 75 78 0a 7d 20 7b 53 51 4c 49 54 45  db aux.} {SQLITE
6a30: 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20  _ERROR}.do_test 
6a40: 77 61 6c 2d 31 35 2e 32 2e 32 20 7b 0a 20 20 73  wal-15.2.2 {.  s
6a50: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64  qlite3_errcode d
6a60: 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f  b.} {SQLITE_ERRO
6a70: 52 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  R}.do_test wal-1
6a80: 35 2e 32 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65  5.2.3 {.  sqlite
6a90: 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 75  3_errmsg db.} {u
6aa0: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a  nknown database:
6ab0: 20 61 75 78 7d 0a 0a 23 20 54 65 73 74 20 74 68   aux}..# Test th
6ac0: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  at an error is r
6ad0: 65 74 75 72 6e 65 64 20 69 66 20 61 6e 20 61 74  eturned if an at
6ae0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
6af0: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 23 20 69 66   checkpoint.# if
6b00: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
6b10: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
6b20: 74 61 62 61 73 65 2e 0a 23 0a 64 6f 5f 74 65 73  tabase..#.do_tes
6b30: 74 20 77 61 6c 2d 31 35 2e 33 2e 31 20 7b 0a 20  t wal-15.3.1 {. 
6b40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
6b50: 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54  EGIN;.    INSERT
6b60: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6b70: 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  3, 4);.  }.  sql
6b80: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
6b90: 69 6e 74 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 53  int db main.} {S
6ba0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f  QLITE_LOCKED}.do
6bb0: 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e 32  _test wal-15.3.2
6bc0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72   {.  sqlite3_err
6bd0: 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c 49 54  code db.} {SQLIT
6be0: 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73  E_LOCKED}.do_tes
6bf0: 74 20 77 61 6c 2d 31 35 2e 33 2e 33 20 7b 0a 20  t wal-15.3.3 {. 
6c00: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20   sqlite3_errmsg 
6c10: 64 62 0a 7d 20 7b 64 61 74 61 62 61 73 65 20 74  db.} {database t
6c20: 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 7d 0a  able is locked}.
6c30: 0a 23 20 45 61 72 6c 69 65 72 20 76 65 72 73 69  .# Earlier versi
6c40: 6f 6e 73 20 72 65 74 75 72 6e 65 64 20 61 6e 20  ons returned an 
6c50: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
6c60: 64 20 69 66 20 74 68 65 20 64 62 20 63 61 6e 6e  d if the db cann
6c70: 6f 74 20 62 65 20 0a 23 20 63 68 65 63 6b 70 6f  ot be .# checkpo
6c80: 69 6e 74 65 64 20 62 65 63 61 75 73 65 20 6f 66  inted because of
6c90: 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 61   locks held by a
6ca0: 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f  nother connectio
6cb0: 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 0a 23 20  n. Check that.# 
6cc0: 74 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  this is no longe
6cd0: 72 20 74 68 65 20 63 61 73 65 2e 0a 23 0a 73 71  r the case..#.sq
6ce0: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
6cf0: 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  b.do_test wal-15
6d00: 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.1 {.  execsql
6d10: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
6d20: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
6d30: 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31  t1;.  } db2.} {1
6d40: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   2}.do_test wal-
6d50: 31 35 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63 73  15.4.2 {.  execs
6d60: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  ql { COMMIT }.  
6d70: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
6d80: 6b 70 6f 69 6e 74 20 64 62 0a 7d 20 7b 53 51 4c  kpoint db.} {SQL
6d90: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
6da0: 77 61 6c 2d 31 35 2e 34 2e 33 20 7b 0a 20 20 73  wal-15.4.3 {.  s
6db0: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62  qlite3_errmsg db
6dc0: 0a 7d 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72  .} {not an error
6dd0: 7d 0a 0a 23 20 41 66 74 65 72 20 5b 64 62 32 5d  }..# After [db2]
6de0: 20 64 72 6f 70 73 20 69 74 73 20 6c 6f 63 6b 2c   drops its lock,
6df0: 20 5b 64 62 5d 20 6d 61 79 20 63 68 65 63 6b 70   [db] may checkp
6e00: 6f 69 6e 74 20 74 68 65 20 64 62 2e 0a 23 0a 64  oint the db..#.d
6e10: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e  o_test wal-15.4.
6e20: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  4 {.  execsql { 
6e30: 43 4f 4d 4d 49 54 20 7d 20 64 62 32 0a 20 20 73  COMMIT } db2.  s
6e40: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
6e50: 70 6f 69 6e 74 20 64 62 0a 7d 20 7b 53 51 4c 49  point db.} {SQLI
6e60: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 77  TE_OK}.do_test w
6e70: 61 6c 2d 31 35 2e 34 2e 35 20 7b 0a 20 20 73 71  al-15.4.5 {.  sq
6e80: 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a  lite3_errmsg db.
6e90: 7d 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d  } {not an error}
6ea0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
6eb0: 34 2e 36 20 7b 0a 20 20 66 69 6c 65 20 73 69 7a  4.6 {.  file siz
6ec0: 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70  e test.db.} [exp
6ed0: 72 20 31 30 32 34 2a 32 5d 0a 0a 63 61 74 63 68  r 1024*2]..catch
6ee0: 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63   { db2 close }.c
6ef0: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
6f00: 7d 0a 0a 23 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 2d 2d 2d 0a 23 20  -------------.# 
6f50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
6f60: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77  ock of tests - w
6f70: 61 6c 2d 31 36 2e 2a 20 2d 20 74 65 73 74 20 74  al-16.* - test t
6f80: 68 61 74 20 69 66 20 61 20 4e 55 4c 4c 20 70 6f  hat if a NULL po
6f90: 69 6e 74 65 72 20 6f 72 0a 23 20 61 6e 20 65 6d  inter or.# an em
6fa0: 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 70 61  pty string is pa
6fb0: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
6fc0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74  nd argument of t
6fd0: 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  he wal_checkpoin
6fe0: 74 28 29 0a 23 20 41 50 49 2c 20 61 6e 20 61 74  t().# API, an at
6ff0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
7000: 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6c 6c 20   checkpoint all 
7010: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
7020: 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74  es..#.foreach {t
7030: 6e 20 63 6b 70 74 5f 63 6d 64 20 63 6b 70 74 5f  n ckpt_cmd ckpt_
7040: 72 65 73 20 63 6b 70 74 5f 6d 61 69 6e 20 63 6b  res ckpt_main ck
7050: 70 74 5f 61 75 78 7d 20 7b 0a 20 20 31 20 7b 73  pt_aux} {.  1 {s
7060: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
7070: 70 6f 69 6e 74 20 64 62 7d 20 20 20 20 20 20 20  point db}       
7080: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
7090: 20 20 20 20 20 31 20 31 0a 20 20 32 20 7b 73 71       1 1.  2 {sq
70a0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
70b0: 6f 69 6e 74 20 64 62 20 22 22 7d 20 20 20 20 20  oint db ""}     
70c0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20        SQLITE_OK 
70d0: 20 20 20 20 31 20 31 0a 20 20 33 20 7b 64 62 20      1 1.  3 {db 
70e0: 65 76 61 6c 20 22 50 52 41 47 4d 41 20 77 61 6c  eval "PRAGMA wal
70f0: 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20  _checkpoint"}   
7100: 20 20 20 20 20 7b 30 20 31 30 20 31 30 7d 20 20       {0 10 10}  
7110: 20 20 20 31 20 31 0a 0a 20 20 34 20 7b 73 71 6c     1 1..  4 {sql
7120: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
7130: 69 6e 74 20 64 62 20 6d 61 69 6e 7d 20 20 20 20  int db main}    
7140: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20       SQLITE_OK  
7150: 20 20 20 31 20 30 0a 20 20 35 20 7b 73 71 6c 69     1 0.  5 {sqli
7160: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
7170: 6e 74 20 64 62 20 61 75 78 7d 20 20 20 20 20 20  nt db aux}      
7180: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
7190: 20 20 30 20 31 0a 20 20 36 20 7b 73 71 6c 69 74    0 1.  6 {sqlit
71a0: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
71b0: 74 20 64 62 20 74 65 6d 70 7d 20 20 20 20 20 20  t db temp}      
71c0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
71d0: 20 30 20 30 0a 20 20 37 20 7b 64 62 20 65 76 61   0 0.  7 {db eva
71e0: 6c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77  l "PRAGMA main.w
71f0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20  al_checkpoint"} 
7200: 20 20 7b 30 20 31 30 20 31 30 7d 20 20 20 20 20    {0 10 10}     
7210: 31 20 30 0a 20 20 38 20 7b 64 62 20 65 76 61 6c  1 0.  8 {db eval
7220: 20 22 50 52 41 47 4d 41 20 61 75 78 2e 77 61 6c   "PRAGMA aux.wal
7230: 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20  _checkpoint"}   
7240: 20 7b 30 20 31 33 20 31 33 7d 20 20 20 20 20 30   {0 13 13}     0
7250: 20 31 0a 20 20 39 20 7b 64 62 20 65 76 61 6c 20   1.  9 {db eval 
7260: 22 50 52 41 47 4d 41 20 74 65 6d 70 2e 77 61 6c  "PRAGMA temp.wal
7270: 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20  _checkpoint"}   
7280: 7b 30 20 2d 31 20 2d 31 7d 20 20 20 20 20 30 20  {0 -1 -1}     0 
7290: 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20  0.} {.  do_test 
72a0: 77 61 6c 2d 31 36 2e 24 74 6e 2e 31 20 7b 0a 20  wal-16.$tn.1 {. 
72b0: 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74     forcedelete t
72c0: 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62  est2.db test2.db
72d0: 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 6a 6f  -wal test2.db-jo
72e0: 75 72 6e 61 6c 0a 20 20 20 20 66 6f 72 63 65 64  urnal.    forced
72f0: 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65  elete test.db te
7300: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64  st.db-wal test.d
7310: 62 2d 6a 6f 75 72 6e 61 6c 0a 0a 20 20 20 20 73  b-journal..    s
7320: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
7330: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  b.    execsql {.
7340: 20 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65        ATTACH 'te
7350: 73 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a  st2.db' AS aux;.
7360: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
7370: 6e 2e 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  n.auto_vacuum = 
7380: 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  0;.      PRAGMA 
7390: 61 75 78 2e 61 75 74 6f 5f 76 61 63 75 75 6d 20  aux.auto_vacuum 
73a0: 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d  = 0;.      PRAGM
73b0: 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d  A main.journal_m
73c0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20  ode = WAL;.     
73d0: 20 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f 75 72   PRAGMA aux.jour
73e0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
73f0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69        PRAGMA mai
7400: 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  n.synchronous = 
7410: 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 20 20 50 52  NORMAL;.      PR
7420: 41 47 4d 41 20 61 75 78 2e 73 79 6e 63 68 72 6f  AGMA aux.synchro
7430: 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20  nous = NORMAL;. 
7440: 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 20 77 61     }.  } {wal wa
7450: 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  l}..  do_test wa
7460: 6c 2d 31 36 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  l-16.$tn.2 {.   
7470: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
7480: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61   CREATE TABLE ma
7490: 69 6e 2e 74 31 28 61 2c 20 62 2c 20 50 52 49 4d  in.t1(a, b, PRIM
74a0: 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a  ARY KEY(a, b));.
74b0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
74c0: 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62 2c 20  LE aux.t2(a, b, 
74d0: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62  PRIMARY KEY(a, b
74e0: 29 29 3b 0a 0a 20 20 20 20 20 20 49 4e 53 45 52  ));..      INSER
74f0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7500: 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (1, randomblob(1
7510: 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  000));.      INS
7520: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
7530: 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(2, randomblob
7540: 28 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49  (1000));.      I
7550: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
7560: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
7570: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 6c 69 73      }.  .    lis
7580: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
7590: 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65  t.db] [file size
75a0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20   test.db-wal].  
75b0: 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 31 2a  } [list [expr 1*
75c0: 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f  1024] [wal_file_
75d0: 73 69 7a 65 20 31 30 20 31 30 32 34 5d 5d 0a 20  size 10 1024]]. 
75e0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e   do_test wal-16.
75f0: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 6c 69 73 74  $tn.3 {.    list
7600: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
7610: 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65  2.db] [file size
7620: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a 20   test2.db-wal]. 
7630: 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 31   } [list [expr 1
7640: 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65  *1024] [wal_file
7650: 5f 73 69 7a 65 20 31 33 20 31 30 32 34 5d 5d 0a  _size 13 1024]].
7660: 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c    .  do_test wal
7670: 2d 31 36 2e 24 74 6e 2e 34 20 5b 6c 69 73 74 20  -16.$tn.4 [list 
7680: 65 76 61 6c 20 24 63 6b 70 74 5f 63 6d 64 5d 20  eval $ckpt_cmd] 
7690: 24 63 6b 70 74 5f 72 65 73 0a 20 20 0a 20 20 64  $ckpt_res.  .  d
76a0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74  o_test wal-16.$t
76b0: 6e 2e 35 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  n.5 {.    list [
76c0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
76d0: 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  b] [file size te
76e0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b  st.db-wal].  } [
76f0: 6c 69 73 74 20 5b 65 78 70 72 20 28 24 63 6b 70  list [expr ($ckp
7700: 74 5f 6d 61 69 6e 20 3f 20 37 20 3a 20 31 29 2a  t_main ? 7 : 1)*
7710: 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f  1024] [wal_file_
7720: 73 69 7a 65 20 31 30 20 31 30 32 34 5d 5d 0a 0a  size 10 1024]]..
7730: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36    do_test wal-16
7740: 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 6c 69 73  .$tn.6 {.    lis
7750: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
7760: 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a  t2.db] [file siz
7770: 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a  e test2.db-wal].
7780: 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20    } [list [expr 
7790: 28 24 63 6b 70 74 5f 61 75 78 20 3f 20 37 20 3a  ($ckpt_aux ? 7 :
77a0: 20 31 29 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66   1)*1024] [wal_f
77b0: 69 6c 65 5f 73 69 7a 65 20 31 33 20 31 30 32 34  ile_size 13 1024
77c0: 5d 5d 0a 0a 20 20 63 61 74 63 68 20 7b 20 64 62  ]]..  catch { db
77d0: 20 63 6c 6f 73 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d   close }.}..#---
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
7830: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20 77  lowing tests - w
7840: 61 6c 2d 31 37 2e 2a 20 2d 20 61 74 74 65 6d 70  al-17.* - attemp
7850: 74 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  t to verify that
7860: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 23 20 6e   the correct.# n
7870: 75 6d 62 65 72 20 6f 66 20 22 70 61 64 64 69 6e  umber of "paddin
7880: 67 22 20 66 72 61 6d 65 73 20 61 72 65 20 61 70  g" frames are ap
7890: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6c 6f  pended to the lo
78a0: 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 74 72  g file when a tr
78b0: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 69 73 20 63  ansaction.# is c
78c0: 6f 6d 6d 69 74 74 65 64 20 69 6e 20 73 79 6e 63  ommitted in sync
78d0: 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 6d 6f 64  hronous=FULL mod
78e0: 65 2e 0a 23 20 0a 23 20 44 6f 20 74 68 69 73 20  e..# .# Do this 
78f0: 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 64 61  by creating a da
7900: 74 61 62 61 73 65 20 74 68 61 74 20 75 73 65 73  tabase that uses
7910: 20 35 31 32 20 62 79 74 65 20 70 61 67 65 73 2e   512 byte pages.
7920: 20 54 68 65 6e 20 77 72 69 74 69 6e 67 0a 23 20   Then writing.# 
7930: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
7940: 61 74 20 6d 6f 64 69 66 69 65 73 20 31 37 31 20  at modifies 171 
7950: 70 61 67 65 73 2e 20 49 6e 20 73 79 6e 63 68 72  pages. In synchr
7960: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 6d 6f 64  onous=NORMAL mod
7970: 65 2c 20 74 68 69 73 0a 23 20 70 72 6f 64 75 63  e, this.# produc
7980: 65 73 20 61 20 6c 6f 67 20 66 69 6c 65 20 6f 66  es a log file of
7990: 3a 0a 23 0a 23 20 20 20 33 32 20 2b 20 28 32 34  :.#.#   32 + (24
79a0: 2b 35 31 32 29 2a 31 37 31 20 3d 20 39 30 33 31  +512)*171 = 9031
79b0: 32 20 62 79 74 65 73 2e 0a 23 0a 23 20 53 6c 69  2 bytes..#.# Sli
79c0: 67 68 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ghtly larger tha
79d0: 6e 20 31 31 2a 38 31 39 32 20 3d 20 39 30 31 31  n 11*8192 = 9011
79e0: 32 20 62 79 74 65 73 2e 0a 23 0a 23 20 52 75 6e  2 bytes..#.# Run
79f0: 20 74 68 65 20 74 65 73 74 20 75 73 69 6e 67 20   the test using 
7a00: 76 61 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e  various differen
7a10: 74 20 73 65 63 74 6f 72 2d 73 69 7a 65 73 2e 20  t sector-sizes. 
7a20: 49 6e 20 65 61 63 68 20 63 61 73 65 2c 20 74 68  In each case, th
7a30: 65 0a 23 20 57 41 4c 20 63 6f 64 65 20 73 68 6f  e.# WAL code sho
7a40: 75 6c 64 20 77 72 69 74 65 20 74 68 65 20 39 30  uld write the 90
7a50: 33 30 30 20 62 79 74 65 73 20 6f 66 20 6c 6f 67  300 bytes of log
7a60: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
7a70: 20 74 68 65 20 0a 23 20 74 72 61 6e 73 61 63 74   the .# transact
7a80: 69 6f 6e 2c 20 74 68 65 6e 20 61 70 70 65 6e 64  ion, then append
7a90: 20 61 73 20 6d 61 79 20 66 72 61 6d 65 73 20 61   as may frames a
7aa0: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  s are required t
7ab0: 6f 20 65 78 74 65 6e 64 20 74 68 65 0a 23 20 6c  o extend the.# l
7ac0: 6f 67 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  og file so that 
7ad0: 6e 6f 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  no part of the n
7ae0: 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ext transaction 
7af0: 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20  will be written 
7b00: 69 6e 74 6f 0a 23 20 61 20 64 69 73 6b 2d 73 65  into.# a disk-se
7b10: 63 74 6f 72 20 75 73 65 64 20 62 79 20 74 72 61  ctor used by tra
7b20: 6e 73 61 63 74 69 6f 6e 20 6a 75 73 74 20 63 6f  nsaction just co
7b30: 6d 6d 69 74 74 65 64 2e 0a 23 0a 73 65 74 20 6f  mmitted..#.set o
7b40: 6c 64 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20  ld_pending_byte 
7b50: 5b 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f  [sqlite3_test_co
7b60: 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79  ntrol_pending_by
7b70: 74 65 20 30 78 31 30 30 30 30 30 30 30 5d 0a 63  te 0x10000000].c
7b80: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
7b90: 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65  }.foreach {tn se
7ba0: 63 74 6f 72 73 69 7a 65 20 6c 6f 67 73 69 7a 65  ctorsize logsize
7bb0: 7d 20 22 0a 20 20 31 20 20 20 31 32 38 20 20 5b  } ".  1   128  [
7bc0: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37  wal_file_size 17
7bd0: 32 20 35 31 32 5d 0a 20 20 32 20 20 20 32 35 36  2 512].  2   256
7be0: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
7bf0: 20 31 37 32 20 35 31 32 5d 0a 20 20 33 20 20 20   172 512].  3   
7c00: 35 31 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  512  [wal_file_s
7c10: 69 7a 65 20 31 37 32 20 35 31 32 5d 20 0a 20 20  ize 172 512] .  
7c20: 34 20 20 31 30 32 34 20 20 5b 77 61 6c 5f 66 69  4  1024  [wal_fi
7c30: 6c 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d  le_size 172 512]
7c40: 0a 20 20 35 20 20 32 30 34 38 20 20 5b 77 61 6c  .  5  2048  [wal
7c50: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35  _file_size 172 5
7c60: 31 32 5d 0a 20 20 36 20 20 34 30 39 36 20 20 5b  12].  6  4096  [
7c70: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37  wal_file_size 17
7c80: 36 20 35 31 32 5d 0a 20 20 37 20 20 38 31 39 32  6 512].  7  8192
7c90: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
7ca0: 20 31 38 34 20 35 31 32 5d 0a 22 20 7b 0a 20 20   184 512]." {.  
7cb0: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
7cc0: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  .db test.db-wal 
7cd0: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
7ce0: 20 20 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61    sqlite3_simula
7cf0: 74 65 5f 64 65 76 69 63 65 20 2d 73 65 63 74 6f  te_device -secto
7d00: 72 73 69 7a 65 20 24 73 65 63 74 6f 72 73 69 7a  rsize $sectorsiz
7d10: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
7d20: 65 73 74 2e 64 62 20 2d 76 66 73 20 64 65 76 73  est.db -vfs devs
7d30: 79 6d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  ym..  do_test wa
7d40: 6c 2d 31 37 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  l-17.$tn.1 {.   
7d50: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
7d60: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
7d70: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  uum = 0;.      P
7d80: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
7d90: 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50 52 41  = 512;.      PRA
7da0: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
7db0: 20 2d 32 30 30 30 3b 0a 20 20 20 20 20 20 50 52   -2000;.      PR
7dc0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
7dd0: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50  e = WAL;.      P
7de0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7df0: 73 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  s = FULL;.    }.
7e00: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
7e10: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
7e20: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
7e30: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  x);.    }.    fo
7e40: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c  r {set i 0} {$i<
7e50: 31 36 36 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  166} {incr i} {.
7e60: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20        execsql { 
7e70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 20 56 41  INSERT INTO t VA
7e80: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
7e90: 34 30 30 29 29 20 7d 0a 20 20 20 20 7d 0a 20 20  400)) }.    }.  
7ea0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
7eb0: 0a 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20  ..    file size 
7ec0: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 7d 20  test.db-wal.  } 
7ed0: 24 6c 6f 67 73 69 7a 65 0a 0a 20 20 64 6f 5f 74  $logsize..  do_t
7ee0: 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 32  est wal-17.$tn.2
7ef0: 20 7b 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65   {.    file size
7f00: 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 35 31 32   test.db.  } 512
7f10: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..  do_test wal-
7f20: 31 37 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 64  17.$tn.3 {.    d
7f30: 62 20 63 6c 6f 73 65 0a 20 20 20 20 66 69 6c 65  b close.    file
7f40: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
7f50: 7d 20 5b 65 78 70 72 20 35 31 32 2a 31 37 31 5d  } [expr 512*171]
7f60: 0a 7d 0a 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .}.sqlite3_test_
7f70: 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f  control_pending_
7f80: 62 79 74 65 20 24 6f 6c 64 5f 70 65 6e 64 69 6e  byte $old_pendin
7f90: 67 5f 62 79 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  g_byte..#-------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 0a 23 20 54 68 69 73 20 74 65 73 74 20 2d  --.# This test -
7ff0: 20 77 61 6c 2d 31 38 2e 2a 20 2d 20 76 65 72 69   wal-18.* - veri
8000: 66 69 65 73 20 61 20 63 6f 75 70 6c 65 20 6f 66  fies a couple of
8010: 20 73 70 65 63 69 66 69 63 20 63 6f 6e 64 69 74   specific condit
8020: 69 6f 6e 73 20 74 68 61 74 0a 23 20 6d 61 79 20  ions that.# may 
8030: 62 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  be encountered w
8040: 68 69 6c 65 20 72 65 63 6f 76 65 72 69 6e 67 20  hile recovering 
8050: 61 20 6c 6f 67 20 66 69 6c 65 20 61 72 65 20 68  a log file are h
8060: 61 6e 64 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  andled correctly
8070: 3a 0a 23 0a 23 20 20 20 77 61 6c 2d 31 38 2e 31  :.#.#   wal-18.1
8080: 2e 2a 20 57 68 65 6e 20 74 68 65 20 66 69 72 73  .* When the firs
8090: 74 20 33 32 2d 62 69 74 73 20 6f 66 20 61 20 66  t 32-bits of a f
80a0: 72 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69 73  rame checksum is
80b0: 20 63 6f 72 72 65 63 74 20 62 75 74 20 0a 23 20   correct but .# 
80c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
80d0: 20 73 65 63 6f 6e 64 20 33 32 2d 62 69 74 73 20   second 32-bits 
80e0: 61 72 65 20 66 61 6c 73 65 2c 20 61 6e 64 0a 23  are false, and.#
80f0: 0a 23 20 20 20 77 61 6c 2d 31 38 2e 32 2e 2a 20  .#   wal-18.2.* 
8100: 57 68 65 6e 20 74 68 65 20 70 61 67 65 2d 73 69  When the page-si
8110: 7a 65 20 66 69 65 6c 64 20 74 68 61 74 20 6f 63  ze field that oc
8120: 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72  curs at the star
8130: 74 20 6f 66 20 61 20 6c 6f 67 0a 23 20 20 20 20  t of a log.#    
8140: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 69            file i
8150: 73 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  s a power of 2 g
8160: 72 65 61 74 65 72 20 74 68 61 6e 20 31 36 33 38  reater than 1638
8170: 34 20 6f 72 20 73 6d 61 6c 6c 65 72 20 74 68 61  4 or smaller tha
8180: 6e 20 35 31 32 2e 0a 23 0a 66 6f 72 63 65 64 65  n 512..#.forcede
8190: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
81a0: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  t.db-wal test.db
81b0: 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65 73 74  -journal.do_test
81c0: 20 77 61 6c 2d 31 38 2e 30 20 7b 0a 20 20 73 71   wal-18.0 {.  sq
81d0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
81e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
81f0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
8200: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52  e = 1024;.    PR
8210: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
8220: 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 0;.    PRAGMA
8230: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
8240: 57 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  WAL;.    PRAGMA 
8250: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46  synchronous = OF
8260: 46 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  F;..    CREATE T
8270: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 55 4e  ABLE t1(a, b, UN
8280: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20  IQUE(a, b));.   
8290: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
82a0: 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20 20  VALUES(0, 0);.  
82b0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
82c0: 63 6b 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 49 4e  ckpoint;..    IN
82d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
82e0: 55 45 53 28 31 2c 20 32 29 3b 20 20 20 20 20 20  UES(1, 2);      
82f0: 20 20 20 20 2d 2d 20 66 72 61 6d 65 73 20 31 20      -- frames 1 
8300: 61 6e 64 20 32 0a 20 20 20 20 49 4e 53 45 52 54  and 2.    INSERT
8310: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8320: 33 2c 20 34 29 3b 20 20 20 20 20 20 20 20 20 20  3, 4);          
8330: 2d 2d 20 66 72 61 6d 65 73 20 33 20 61 6e 64 20  -- frames 3 and 
8340: 34 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  4.    INSERT INT
8350: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36  O t1 VALUES(5, 6
8360: 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20 66  );          -- f
8370: 72 61 6d 65 73 20 35 20 61 6e 64 20 36 0a 20 20  rames 5 and 6.  
8380: 7d 0a 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74  }..  forcecopy t
8390: 65 73 74 2e 64 62 20 74 65 73 74 58 2e 64 62 0a  est.db testX.db.
83a0: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
83b0: 2e 64 62 2d 77 61 6c 20 74 65 73 74 58 2e 64 62  .db-wal testX.db
83c0: 2d 77 61 6c 0a 20 20 64 62 20 63 6c 6f 73 65 0a  -wal.  db close.
83d0: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a    list [file siz
83e0: 65 20 74 65 73 74 58 2e 64 62 5d 20 5b 66 69 6c  e testX.db] [fil
83f0: 65 20 73 69 7a 65 20 74 65 73 74 58 2e 64 62 2d  e size testX.db-
8400: 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 5b 65 78  wal].} [list [ex
8410: 70 72 20 33 2a 31 30 32 34 5d 20 5b 77 61 6c 5f  pr 3*1024] [wal_
8420: 66 69 6c 65 5f 73 69 7a 65 20 36 20 31 30 32 34  file_size 6 1024
8430: 5d 5d 0a 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d  ]]..unset -nocom
8440: 70 6c 61 69 6e 20 6e 46 72 61 6d 65 20 72 65 73  plain nFrame res
8450: 75 6c 74 0a 66 6f 72 65 61 63 68 20 7b 6e 46 72  ult.foreach {nFr
8460: 61 6d 65 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20  ame result} {.  
8470: 20 20 20 20 20 20 20 30 20 20 20 20 20 20 7b 30         0      {0
8480: 20 30 7d 0a 20 20 20 20 20 20 20 20 20 31 20 20   0}.         1  
8490: 20 20 20 20 7b 30 20 30 7d 0a 20 20 20 20 20 20      {0 0}.      
84a0: 20 20 20 32 20 20 20 20 20 20 7b 30 20 30 20 31     2      {0 0 1
84b0: 20 32 7d 0a 20 20 20 20 20 20 20 20 20 33 20 20   2}.         3  
84c0: 20 20 20 20 7b 30 20 30 20 31 20 32 7d 0a 20 20      {0 0 1 2}.  
84d0: 20 20 20 20 20 20 20 34 20 20 20 20 20 20 7b 30         4      {0
84e0: 20 30 20 31 20 32 20 33 20 34 7d 0a 20 20 20 20   0 1 2 3 4}.    
84f0: 20 20 20 20 20 35 20 20 20 20 20 20 7b 30 20 30       5      {0 0
8500: 20 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20   1 2 3 4}.      
8510: 20 20 20 36 20 20 20 20 20 20 7b 30 20 30 20 31     6      {0 0 1
8520: 20 32 20 33 20 34 20 35 20 36 7d 0a 7d 20 7b 0a   2 3 4 5 6}.} {.
8530: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38    do_test wal-18
8540: 2e 31 2e 24 6e 46 72 61 6d 65 20 7b 0a 20 20 20  .1.$nFrame {.   
8550: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 58   forcecopy testX
8560: 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20  .db test.db.    
8570: 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 58 2e  forcecopy testX.
8580: 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 77  db-wal test.db-w
8590: 61 6c 0a 0a 20 20 20 20 68 65 78 69 6f 5f 77 72  al..    hexio_wr
85a0: 69 74 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  ite test.db-wal 
85b0: 5b 65 78 70 72 20 32 34 20 2b 20 24 6e 46 72 61  [expr 24 + $nFra
85c0: 6d 65 2a 28 32 34 2b 31 30 32 34 29 20 2b 20 32  me*(24+1024) + 2
85d0: 30 5d 20 30 30 30 30 30 30 30 30 0a 0a 20 20 20  0] 00000000..   
85e0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
85f0: 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20  .db.    execsql 
8600: 7b 20 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  { .      SELECT 
8610: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20  * FROM t1;.     
8620: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
8630: 79 5f 63 68 65 63 6b 3b 20 0a 20 20 20 20 7d 0a  y_check; .    }.
8640: 20 20 7d 20 5b 63 6f 6e 63 61 74 20 24 72 65 73    } [concat $res
8650: 75 6c 74 20 6f 6b 5d 0a 20 20 64 62 20 63 6c 6f  ult ok].  db clo
8660: 73 65 0a 7d 20 0a 0a 70 72 6f 63 20 72 61 6e 64  se.} ..proc rand
8670: 6f 6d 62 6c 6f 62 20 7b 70 67 73 7a 7d 20 7b 0a  omblob {pgsz} {.
8680: 20 20 73 71 6c 69 74 65 33 20 72 62 64 62 20 3a    sqlite3 rbdb :
8690: 6d 65 6d 6f 72 79 3a 0a 20 20 73 65 74 20 62 6c  memory:.  set bl
86a0: 6f 62 20 5b 72 62 64 62 20 6f 6e 65 20 7b 53 45  ob [rbdb one {SE
86b0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
86c0: 24 70 67 73 7a 29 7d 5d 0a 20 20 72 62 64 62 20  $pgsz)}].  rbdb 
86d0: 63 6c 6f 73 65 0a 20 20 73 65 74 20 62 6c 6f 62  close.  set blob
86e0: 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67 63 6b 73 75  .}..proc logcksu
86f0: 6d 20 7b 63 6b 76 31 20 63 6b 76 32 20 62 6c 6f  m {ckv1 ckv2 blo
8700: 62 7d 20 7b 0a 20 20 75 70 76 61 72 20 24 63 6b  b} {.  upvar $ck
8710: 76 31 20 63 31 0a 20 20 75 70 76 61 72 20 24 63  v1 c1.  upvar $c
8720: 6b 76 32 20 63 32 0a 0a 20 20 23 20 53 69 6e 63  kv2 c2..  # Sinc
8730: 65 20 74 68 65 20 6d 61 67 69 63 20 6e 75 6d 62  e the magic numb
8740: 65 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20  er at the start 
8750: 6f 66 20 74 68 65 20 2d 77 61 6c 20 66 69 6c 65  of the -wal file
8760: 20 68 65 61 64 65 72 20 69 73 0a 20 20 23 20 39   header is.  # 9
8770: 33 31 30 37 31 36 31 38 20 74 68 61 74 20 69 6e  31071618 that in
8780: 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
8790: 20 63 6f 6e 74 65 6e 74 20 73 68 6f 75 6c 64 20   content should 
87a0: 61 6c 77 61 79 73 20 62 65 20 72 65 61 64 20 61  always be read a
87b0: 73 0a 20 20 23 20 6c 69 74 74 6c 65 2d 65 6e 64  s.  # little-end
87c0: 69 61 6e 2e 0a 20 20 23 20 0a 20 20 73 65 74 20  ian..  # .  set 
87d0: 73 63 61 6e 70 61 74 74 65 72 6e 20 69 2a 0a 0a  scanpattern i*..
87e0: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24 62    binary scan $b
87f0: 6c 6f 62 20 24 73 63 61 6e 70 61 74 74 65 72 6e  lob $scanpattern
8800: 20 76 61 6c 75 65 73 0a 20 20 66 6f 72 65 61 63   values.  foreac
8810: 68 20 7b 76 31 20 76 32 7d 20 24 76 61 6c 75 65  h {v1 v2} $value
8820: 73 20 7b 0a 20 20 20 20 73 65 74 20 63 31 20 5b  s {.    set c1 [
8830: 65 78 70 72 20 7b 28 24 63 31 20 2b 20 24 76 31  expr {($c1 + $v1
8840: 20 2b 20 24 63 32 29 26 30 78 46 46 46 46 46 46   + $c2)&0xFFFFFF
8850: 46 46 7d 5d 0a 20 20 20 20 73 65 74 20 63 32 20  FF}].    set c2 
8860: 5b 65 78 70 72 20 7b 28 24 63 32 20 2b 20 24 76  [expr {($c2 + $v
8870: 32 20 2b 20 24 63 31 29 26 30 78 46 46 46 46 46  2 + $c1)&0xFFFFF
8880: 46 46 46 7d 5d 0a 20 20 7d 0a 7d 0a 0a 66 6f 72  FFF}].  }.}..for
8890: 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74  cecopy test.db t
88a0: 65 73 74 58 2e 64 62 0a 66 6f 72 65 61 63 68 20  estX.db.foreach 
88b0: 7b 74 6e 20 70 67 73 7a 20 77 6f 72 6b 73 7d 20  {tn pgsz works} 
88c0: 7b 20 0a 20 20 31 20 20 20 20 31 32 38 20 20 20  { .  1    128   
88d0: 20 30 0a 20 20 32 20 20 20 20 32 35 36 20 20 20   0.  2    256   
88e0: 20 30 0a 20 20 33 20 20 20 20 35 31 32 20 20 20   0.  3    512   
88f0: 20 31 0a 20 20 34 20 20 20 31 30 32 34 20 20 20   1.  4   1024   
8900: 20 31 0a 20 20 35 20 20 20 32 30 34 38 20 20 20   1.  5   2048   
8910: 20 31 0a 20 20 36 20 20 20 34 30 39 36 20 20 20   1.  6   4096   
8920: 20 31 0a 20 20 37 20 20 20 38 31 39 32 20 20 20   1.  7   8192   
8930: 20 31 0a 20 20 38 20 20 31 36 33 38 34 20 20 20   1.  8  16384   
8940: 20 31 0a 20 20 39 20 20 33 32 37 36 38 20 20 20   1.  9  32768   
8950: 20 31 0a 20 31 30 20 20 36 35 35 33 36 20 20 20   1. 10  65536   
8960: 20 31 0a 20 31 31 20 31 33 31 30 37 32 20 20 20   1. 11 131072   
8970: 20 30 0a 20 31 31 20 20 20 31 30 31 36 20 20 20   0. 11   1016   
8980: 20 30 0a 7d 20 7b 0a 0a 20 20 69 66 20 7b 24 3a   0.} {..  if {$:
8990: 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  :SQLITE_MAX_PAGE
89a0: 5f 53 49 5a 45 20 3c 20 24 70 67 73 7a 7d 20 7b  _SIZE < $pgsz} {
89b0: 0a 20 20 20 20 73 65 74 20 77 6f 72 6b 73 20 30  .    set works 0
89c0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74  .  }..  for {set
89d0: 20 70 67 20 31 7d 20 7b 24 70 67 20 3c 3d 20 33   pg 1} {$pg <= 3
89e0: 7d 20 7b 69 6e 63 72 20 70 67 7d 20 7b 0a 20 20  } {incr pg} {.  
89f0: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
8a00: 58 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  X.db test.db.   
8a10: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
8a20: 74 2e 64 62 2d 77 61 6c 0a 20 20 0a 20 20 20 20  t.db-wal.  .    
8a30: 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  # Check that the
8a40: 20 64 61 74 61 62 61 73 65 20 6e 6f 77 20 65 78   database now ex
8a50: 69 73 74 73 20 61 6e 64 20 63 6f 6e 73 69 73 74  ists and consist
8a60: 73 20 6f 66 20 74 68 72 65 65 20 70 61 67 65 73  s of three pages
8a70: 2e 20 41 6e 64 0a 20 20 20 20 23 20 74 68 61 74  . And.    # that
8a80: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 73 73   there is no ass
8a90: 6f 63 69 61 74 65 64 20 77 61 6c 20 66 69 6c 65  ociated wal file
8aa0: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74  ..    #.    do_t
8ab0: 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e  est wal-18.2.$tn
8ac0: 2e 24 70 67 2e 31 20 7b 20 66 69 6c 65 20 65 78  .$pg.1 { file ex
8ad0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
8ae0: 20 7d 20 30 0a 20 20 20 20 64 6f 5f 74 65 73 74   } 0.    do_test
8af0: 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70   wal-18.2.$tn.$p
8b00: 67 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74  g.2 { file exist
8b10: 73 20 74 65 73 74 2e 64 62 20 7d 20 31 0a 20 20  s test.db } 1.  
8b20: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38    do_test wal-18
8b30: 2e 32 2e 24 74 6e 2e 24 70 67 2e 33 20 7b 20 66  .2.$tn.$pg.3 { f
8b40: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
8b50: 20 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d   } [expr 1024*3]
8b60: 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  .  .    do_test 
8b70: 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67  wal-18.2.$tn.$pg
8b80: 2e 34 20 7b 0a 0a 20 20 20 20 20 20 23 20 43 72  .4 {..      # Cr
8b90: 65 61 74 65 20 61 20 77 61 6c 20 66 69 6c 65 20  eate a wal file 
8ba0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
8bb0: 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 28 64 61  single frame (da
8bc0: 74 61 62 61 73 65 20 70 61 67 65 0a 20 20 20 20  tabase page.    
8bd0: 20 20 23 20 6e 75 6d 62 65 72 20 24 70 67 29 20    # number $pg) 
8be0: 77 69 74 68 20 74 68 65 20 63 6f 6d 6d 69 74 20  with the commit 
8bf0: 66 6c 61 67 20 73 65 74 2e 20 54 68 65 20 66 72  flag set. The fr
8c00: 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69 73 0a  ame checksum is.
8c10: 20 20 20 20 20 20 23 20 63 6f 72 72 65 63 74 2c        # correct,
8c20: 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
8c30: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
8c40: 65 20 70 61 67 65 20 61 72 65 20 63 6f 72 72 75  e page are corru
8c50: 70 74 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20  pt..      #.    
8c60: 20 20 23 20 54 68 65 20 70 61 67 65 2d 73 69 7a    # The page-siz
8c70: 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  e in the log fil
8c80: 65 20 68 65 61 64 65 72 20 69 73 20 73 65 74 20  e header is set 
8c90: 74 6f 20 24 70 67 73 7a 2e 20 49 66 20 74 68 65  to $pgsz. If the
8ca0: 0a 20 20 20 20 20 20 23 20 57 41 4c 20 63 6f 64  .      # WAL cod
8cb0: 65 20 63 6f 6e 73 69 64 65 72 73 20 24 70 67 73  e considers $pgs
8cc0: 7a 20 74 6f 20 62 65 20 61 20 76 61 6c 69 64 20  z to be a valid 
8cd0: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
8ce0: 66 69 6c 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a  file page-size,.
8cf0: 20 20 20 20 20 20 23 20 74 68 65 20 64 61 74 61        # the data
8d00: 62 61 73 65 20 77 69 6c 6c 20 62 65 20 63 6f 72  base will be cor
8d10: 72 75 70 74 20 28 62 65 63 61 75 73 65 20 74 68  rupt (because th
8d20: 65 20 67 61 72 62 61 67 65 20 66 72 61 6d 65 20  e garbage frame 
8d30: 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 23  contents.      #
8d40: 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
8d50: 20 61 73 20 76 61 6c 69 64 20 63 6f 6e 74 65 6e   as valid conten
8d60: 74 29 2e 20 49 66 20 24 70 67 73 7a 20 69 73 20  t). If $pgsz is 
8d70: 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 73 6d 61  invalid (too sma
8d80: 6c 6c 0a 20 20 20 20 20 20 23 20 6f 72 20 74 6f  ll.      # or to
8d90: 6f 20 6c 61 72 67 65 29 2c 20 74 68 65 20 64 62  o large), the db
8da0: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
8db0: 72 75 70 74 20 61 73 20 74 68 65 20 6c 6f 67 20  rupt as the log 
8dc0: 66 69 6c 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  file will.      
8dd0: 23 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  # be ignored..  
8de0: 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74 20      #.      set 
8df0: 77 61 6c 68 64 72 20 5b 62 69 6e 61 72 79 20 66  walhdr [binary f
8e00: 6f 72 6d 61 74 20 49 49 49 49 49 49 20 39 33 31  ormat IIIIII 931
8e10: 30 37 31 36 31 38 20 33 30 30 37 30 30 30 20 24  071618 3007000 $
8e20: 70 67 73 7a 20 31 32 33 34 20 32 32 20 32 33 5d  pgsz 1234 22 23]
8e30: 0a 20 20 20 20 20 20 73 65 74 20 66 72 61 6d 65  .      set frame
8e40: 62 6f 64 79 20 5b 72 61 6e 64 6f 6d 62 6c 6f 62  body [randomblob
8e50: 20 24 70 67 73 7a 5d 0a 20 20 20 20 20 20 73 65   $pgsz].      se
8e60: 74 20 66 72 61 6d 65 68 64 72 20 20 5b 62 69 6e  t framehdr  [bin
8e70: 61 72 79 20 66 6f 72 6d 61 74 20 49 49 49 49 20  ary format IIII 
8e80: 24 70 67 20 35 20 32 32 20 32 33 5d 0a 20 20 20  $pg 5 22 23].   
8e90: 20 20 20 73 65 74 20 63 31 20 30 0a 20 20 20 20     set c1 0.    
8ea0: 20 20 73 65 74 20 63 32 20 30 0a 20 20 20 20 20    set c2 0.     
8eb0: 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20   logcksum c1 c2 
8ec0: 24 77 61 6c 68 64 72 0a 0a 20 20 20 20 20 20 61  $walhdr..      a
8ed0: 70 70 65 6e 64 20 77 61 6c 68 64 72 20 5b 62 69  ppend walhdr [bi
8ee0: 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49 20 24  nary format II $
8ef0: 63 31 20 24 63 32 5d 0a 20 20 20 20 20 20 6c 6f  c1 $c2].      lo
8f00: 67 63 6b 73 75 6d 20 63 31 20 63 32 20 5b 73 74  gcksum c1 c2 [st
8f10: 72 69 6e 67 20 72 61 6e 67 65 20 24 66 72 61 6d  ring range $fram
8f20: 65 68 64 72 20 30 20 37 5d 0a 20 20 20 20 20 20  ehdr 0 7].      
8f30: 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20 24  logcksum c1 c2 $
8f40: 66 72 61 6d 65 62 6f 64 79 0a 20 20 20 20 20 20  framebody.      
8f50: 73 65 74 20 66 72 61 6d 65 68 64 72 20 5b 62 69  set framehdr [bi
8f60: 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49 49 49  nary format IIII
8f70: 49 49 20 24 70 67 20 35 20 32 32 20 32 33 20 24  II $pg 5 22 23 $
8f80: 63 31 20 24 63 32 5d 0a 0a 20 20 20 20 20 20 73  c1 $c2]..      s
8f90: 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74  et fd [open test
8fa0: 2e 64 62 2d 77 61 6c 20 77 5d 0a 20 20 20 20 20  .db-wal w].     
8fb0: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64 20   fconfigure $fd 
8fc0: 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79  -encoding binary
8fd0: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69   -translation bi
8fe0: 6e 61 72 79 0a 20 20 20 20 20 20 70 75 74 73 20  nary.      puts 
8ff0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24  -nonewline $fd $
9000: 77 61 6c 68 64 72 0a 20 20 20 20 20 20 70 75 74  walhdr.      put
9010: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64  s -nonewline $fd
9020: 20 24 66 72 61 6d 65 68 64 72 0a 20 20 20 20 20   $framehdr.     
9030: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
9040: 20 24 66 64 20 24 66 72 61 6d 65 62 6f 64 79 0a   $fd $framebody.
9050: 20 20 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a        close $fd.
9060: 20 20 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69    .      file si
9070: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  ze test.db-wal. 
9080: 20 20 20 7d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73     } [wal_file_s
9090: 69 7a 65 20 31 20 24 70 67 73 7a 5d 0a 20 20 0a  ize 1 $pgsz].  .
90a0: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
90b0: 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 35 20 7b  18.2.$tn.$pg.5 {
90c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64  .      sqlite3 d
90d0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20  b test.db.      
90e0: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20  set rc [catch { 
90f0: 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d 41 20 69  db one {PRAGMA i
9100: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 20  ntegrity_check} 
9110: 7d 20 6d 73 67 5d 0a 20 20 20 20 20 20 65 78 70  } msg].      exp
9120: 72 20 7b 20 24 72 63 21 3d 30 20 7c 7c 20 24 6d  r { $rc!=0 || $m
9130: 73 67 21 3d 22 6f 6b 22 20 7d 0a 20 20 20 20 7d  sg!="ok" }.    }
9140: 20 24 77 6f 72 6b 73 0a 20 20 0a 20 20 20 20 64   $works.  .    d
9150: 62 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 23  b close.  }.}..#
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 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
91b0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 2d  following test -
91c0: 20 77 61 6c 2d 31 39 2e 2a 20 2d 20 66 69 78 65   wal-19.* - fixe
91d0: 73 20 61 20 62 75 67 20 74 68 61 74 20 77 61 73  s a bug that was
91e0: 20 70 72 65 73 65 6e 74 20 64 75 72 69 6e 67 0a   present during.
91f0: 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e 0a 23  # development..#
9200: 0a 23 20 57 68 65 6e 20 61 20 64 61 74 61 62 61  .# When a databa
9210: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  se connection in
9220: 20 57 41 4c 20 6d 6f 64 65 20 69 73 20 63 6c 6f   WAL mode is clo
9230: 73 65 64 2c 20 69 74 20 61 74 74 65 6d 70 74 73  sed, it attempts
9240: 20 61 6e 0a 23 20 45 58 43 4c 55 53 49 56 45 20   an.# EXCLUSIVE 
9250: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9260: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
9270: 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
9280: 65 64 2c 20 74 68 65 0a 23 20 63 6f 6e 6e 65 63  ed, the.# connec
9290: 74 69 6f 6e 20 6b 6e 6f 77 73 20 74 68 61 74 20  tion knows that 
92a0: 69 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  it is the last c
92b0: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 64 69 73  onnection to dis
92c0: 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 0a 23 20 74  connect from.# t
92d0: 68 65 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20  he database, so 
92e0: 69 74 20 72 75 6e 73 20 61 20 63 68 65 63 6b 70  it runs a checkp
92f0: 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  oint operation. 
9300: 54 68 65 20 62 75 67 20 77 61 73 20 74 68 61 74  The bug was that
9310: 0a 23 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  .# the connectio
9320: 6e 20 77 61 73 20 6e 6f 74 20 75 70 64 61 74 69  n was not updati
9330: 6e 67 20 69 74 73 20 70 72 69 76 61 74 65 20 63  ng its private c
9340: 6f 70 79 20 6f 66 20 74 68 65 20 77 61 6c 2d 69  opy of the wal-i
9350: 6e 64 65 78 20 0a 23 20 68 65 61 64 65 72 20 62  ndex .# header b
9360: 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 2c 20  efore doing so, 
9370: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
9380: 63 6f 75 6c 64 20 63 68 65 63 6b 70 6f 69 6e 74  could checkpoint
9390: 20 61 6e 20 6f 6c 64 0a 23 20 73 6e 61 70 73 68   an old.# snapsh
93a0: 6f 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  ot..#.do_test wa
93b0: 6c 2d 31 39 2e 31 20 7b 0a 20 20 66 6f 72 63 65  l-19.1 {.  force
93c0: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74  delete test.db t
93d0: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e  est.db-wal test.
93e0: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c  db-journal.  sql
93f0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
9400: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
9410: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
9420: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
9430: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
9440: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9450: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
9460: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9470: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
9480: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9490: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
94a0: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
94b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
94c0: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 7d   db2.} {1 2 3 4}
94d0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e  .do_test wal-19.
94e0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
94f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9500: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
9510: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
9520: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t1;.  }.} {1 
9530: 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74 65  2 3 4 5 6}.do_te
9540: 73 74 20 77 61 6c 2d 31 39 2e 33 20 7b 0a 20 20  st wal-19.3 {.  
9550: 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32 20 63  db close.  db2 c
9560: 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73  lose.  file exis
9570: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d  ts test.db-wal.}
9580: 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   {0}.do_test wal
9590: 2d 31 39 2e 34 20 7b 0a 20 20 23 20 57 68 65 6e  -19.4 {.  # When
95a0: 20 74 68 65 20 62 75 67 20 77 61 73 20 70 72 65   the bug was pre
95b0: 73 65 6e 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  sent, the follow
95c0: 69 6e 67 20 77 61 73 20 72 65 74 75 72 6e 69 6e  ing was returnin
95d0: 67 20 7b 31 20 32 20 33 20 34 7d 20 6f 6e 6c 79  g {1 2 3 4} only
95e0: 2c 0a 20 20 23 20 61 73 20 5b 64 62 32 5d 20 68  ,.  # as [db2] h
95f0: 61 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74  ad an out-of-dat
9600: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 77 61  e copy of the wa
9610: 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20 77  l-index header w
9620: 68 65 6e 20 69 74 20 77 61 73 0a 20 20 23 20 63  hen it was.  # c
9630: 6c 6f 73 65 64 2e 0a 20 20 23 0a 20 20 73 71 6c  losed..  #.  sql
9640: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
9650: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
9660: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
9670: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 0a   {1 2 3 4 5 6}..
9680: 23 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 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
96d0: 73 20 74 65 73 74 20 2d 20 77 61 6c 2d 32 30 2e  s test - wal-20.
96e0: 2a 20 2d 20 75 73 65 73 20 74 77 6f 20 63 6f 6e  * - uses two con
96f0: 6e 65 63 74 69 6f 6e 73 2e 20 4f 6e 65 20 69 6e  nections. One in
9700: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 61 6e   this process an
9710: 64 0a 23 20 74 68 65 20 6f 74 68 65 72 20 69 6e  d.# the other in
9720: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f   an external pro
9730: 63 65 73 73 2e 20 54 68 65 20 70 72 6f 63 65 64  cess. The proced
9740: 75 72 65 20 69 73 3a 0a 23 0a 23 20 20 20 31 2e  ure is:.#.#   1.
9750: 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   Using connectio
9760: 6e 20 31 2c 20 63 72 65 61 74 65 20 74 68 65 20  n 1, create the 
9770: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
9780: 0a 23 0a 23 20 20 20 32 2e 20 55 73 69 6e 67 20  .#.#   2. Using 
9790: 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 28 69 6e  connection 2 (in
97a0: 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f   an external pro
97b0: 63 65 73 73 29 2c 20 61 64 64 20 73 6f 20 6d 75  cess), add so mu
97c0: 63 68 0a 23 20 20 20 20 20 20 64 61 74 61 20 74  ch.#      data t
97d0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  o the database w
97e0: 69 74 68 6f 75 74 20 63 68 65 63 6b 70 6f 69 6e  ithout checkpoin
97f0: 74 69 6e 67 20 74 68 61 74 20 61 20 77 61 6c 2d  ting that a wal-
9800: 69 6e 64 65 78 20 0a 23 20 20 20 20 20 20 6c 61  index .#      la
9810: 72 67 65 72 20 74 68 61 6e 20 36 34 4b 42 20 69  rger than 64KB i
9820: 73 20 72 65 71 75 69 72 65 64 2e 0a 23 0a 23 20  s required..#.# 
9830: 20 20 33 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65    3. Using conne
9840: 63 74 69 6f 6e 20 31 2c 20 63 68 65 63 6b 70 6f  ction 1, checkpo
9850: 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  int the database
9860: 2e 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a  . Make sure all.
9870: 23 20 20 20 20 20 20 74 68 65 20 64 61 74 61 20  #      the data 
9880: 69 73 20 70 72 65 73 65 6e 74 20 61 6e 64 20 74  is present and t
9890: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 6e  he database is n
98a0: 6f 74 20 63 6f 72 72 75 70 74 2e 0a 23 0a 23 20  ot corrupt..#.# 
98b0: 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20 53 51  At one point, SQ
98c0: 4c 69 74 65 20 77 61 73 20 66 61 69 6c 69 6e 67  Lite was failing
98d0: 20 74 6f 20 67 72 6f 77 20 74 68 65 20 6d 61 70   to grow the map
98e0: 70 69 6e 67 20 6f 66 20 74 68 65 20 77 61 6c 2d  ping of the wal-
98f0: 69 6e 64 65 78 0a 23 20 66 69 6c 65 20 69 6e 20  index.# file in 
9900: 73 74 65 70 20 33 20 61 6e 64 20 74 68 65 20 63  step 3 and the c
9910: 68 65 63 6b 70 6f 69 6e 74 20 77 61 73 20 63 6f  heckpoint was co
9920: 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61 74  rrupting the dat
9930: 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64 6f  abase file..#.do
9940: 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 31 20 7b  _test wal-20.1 {
9950: 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .  catch {db clo
9960: 73 65 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74  se}.  forcedelet
9970: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
9980: 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f  b-wal test.db-jo
9990: 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20  urnal.  sqlite3 
99a0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
99b0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
99c0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
99d0: 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45   WAL;.    CREATE
99e0: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
99f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9a00: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
9a10: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 53 45  ob(900));.    SE
9a20: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9a30: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 77 61  OM t1;.  }.} {wa
9a40: 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  l 1}.do_test wal
9a50: 2d 32 30 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a  -20.2 {.  set ::
9a60: 62 75 64 64 79 20 5b 6c 61 75 6e 63 68 5f 74 65  buddy [launch_te
9a70: 73 74 66 69 78 74 75 72 65 5d 0a 20 20 74 65 73  stfixture].  tes
9a80: 74 66 69 78 74 75 72 65 20 24 3a 3a 62 75 64 64  tfixture $::budd
9a90: 79 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  y {.    sqlite3 
9aa0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 64  db test.db.    d
9ab0: 62 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 20  b transaction { 
9ac0: 64 62 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20  db eval {.      
9ad0: 50 52 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63  PRAGMA wal_autoc
9ae0: 68 65 63 6b 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  heckpoint = 0;. 
9af0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9b00: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9b10: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
9b20: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 32 20 2a  t1;       /* 2 *
9b30: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9b40: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9b50: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9b60: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9b70: 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  4 */.      INSER
9b80: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9b90: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9ba0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9bb0: 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e  /* 8 */.      IN
9bc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
9bd0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
9be0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
9bf0: 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20     /* 16 */.    
9c00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9c10: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9c20: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9c30: 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a         /* 32 */.
9c40: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9c50: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9c60: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9c70: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34   t1;       /* 64
9c80: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9c90: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
9ca0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
9cb0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
9cc0: 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20 20 20 49  * 128 */.      I
9cd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
9ce0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
9cf0: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
9d00: 20 20 20 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20      /* 256 */.  
9d10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9d20: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9d30: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
9d40: 31 3b 20 20 20 20 20 20 20 2f 2a 20 35 31 32 20  1;       /* 512 
9d50: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
9d60: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9d70: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9d80: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9d90: 20 31 30 32 34 20 2a 2f 0a 20 20 20 20 20 20 49   1024 */.      I
9da0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
9db0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
9dc0: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
9dd0: 20 20 20 20 2f 2a 20 32 30 34 38 20 2a 2f 0a 20      /* 2048 */. 
9de0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9df0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9e00: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
9e10: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 34 30 39  t1;       /* 409
9e20: 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  6 */.      INSER
9e30: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9e40: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9e50: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9e60: 2f 2a 20 38 31 39 32 20 2a 2f 0a 20 20 20 20 20  /* 8192 */.     
9e70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9e80: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9e90: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9ea0: 20 20 20 20 20 20 2f 2a 20 31 36 33 38 34 20 2a        /* 16384 *
9eb0: 2f 0a 20 20 20 20 7d 20 7d 0a 20 20 7d 0a 7d 20  /.    } }.  }.} 
9ec0: 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  {0}.do_test wal-
9ed0: 32 30 2e 33 20 7b 0a 20 20 63 6c 6f 73 65 20 24  20.3 {.  close $
9ee0: 3a 3a 62 75 64 64 79 0a 20 20 65 78 65 63 73 71  ::buddy.  execsq
9ef0: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
9f00: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 65 78  heckpoint }.  ex
9f10: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
9f20: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
9f30: 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 64 6f 5f 74  }.} {16384}.do_t
9f40: 65 73 74 20 77 61 6c 2d 32 30 2e 34 20 7b 0a 20  est wal-20.4 {. 
9f50: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
9f60: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
9f70: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9f80: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9f90: 74 31 20 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 69  t1 }.} {16384}.i
9fa0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 77  ntegrity_check w
9fb0: 61 6c 2d 32 30 2e 35 0a 0a 63 61 74 63 68 20 7b  al-20.5..catch {
9fc0: 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74   db2 close }.cat
9fd0: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
9fe0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e  .do_test wal-21.
9ff0: 31 20 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64  1 {.  faultsim_d
a000: 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e  elete_and_reopen
a010: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
a020: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
a030: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
a040: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
a050: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
a060: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
a070: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53  S(1, 2);.    INS
a080: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
a090: 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e  ES(3, 4);.    IN
a0a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
a0b0: 55 45 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 49  UES(5, 6);.    I
a0c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
a0d0: 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20 20 20 20  LUES(7, 8);.    
a0e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
a0f0: 41 4c 55 45 53 28 39 2c 20 31 30 29 3b 0a 20 20  ALUES(9, 10);.  
a100: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a110: 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 3b   VALUES(11, 12);
a120: 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f  .  }.} {wal}.do_
a130: 74 65 73 74 20 77 61 6c 2d 32 31 2e 32 20 7b 0a  test wal-21.2 {.
a140: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
a150: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
a160: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41  ze = 10;.    PRA
a170: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
a180: 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  nt;.    BEGIN;. 
a190: 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
a1a0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
a1b0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a1c0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c  randomblob(900),
a1d0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
a1e0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20   FROM t1;.      
a1f0: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 3b 0a 20  ROLLBACK TO s;. 
a200: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
a210: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
a220: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
a230: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
a240: 20 39 20 31 30 20 31 31 20 31 32 7d 0a 64 6f 5f   9 10 11 12}.do_
a250: 74 65 73 74 20 77 61 6c 2d 32 31 2e 33 20 7b 0a  test wal-21.3 {.
a260: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
a270: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
a280: 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 23 2d 2d  ck }.} {ok}..#--
a290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 72  -------.# Test r
a2e0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
a2f0: 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  ng of databases 
a300: 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20 70  with different p
a310: 61 67 65 2d 73 69 7a 65 73 2e 0a 23 0a 66 6f 72  age-sizes..#.for
a320: 65 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31  each pgsz {512 1
a330: 30 32 34 20 32 30 34 38 20 34 30 39 36 20 38 31  024 2048 4096 81
a340: 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20 36  92 16384 32768 6
a350: 35 35 33 36 7d 20 7b 0a 20 20 64 6f 5f 6d 75 6c  5536} {.  do_mul
a360: 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
a370: 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69   [string map [li
a380: 73 74 20 25 50 47 53 5a 25 20 24 70 67 73 7a 5d  st %PGSZ% $pgsz]
a390: 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77   {.    do_test w
a3a0: 61 6c 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e  al-22.%PGSZ%.$tn
a3b0: 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20  .1 {.      sql1 
a3c0: 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  {.        PRAGMA
a3d0: 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20   main.page_size 
a3e0: 3d 20 25 50 47 53 5a 25 3b 0a 20 20 20 20 20 20  = %PGSZ%;.      
a3f0: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
a400: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cuum = 0;.      
a410: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
a420: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
a430: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
a440: 45 20 74 31 28 78 20 55 4e 49 51 55 45 29 3b 0a  E t1(x UNIQUE);.
a450: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
a460: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
a470: 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20  ndomblob(800);. 
a480: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
a490: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
a4a0: 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20  domblob(800);.  
a4b0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a4c0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
a4d0: 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20  omblob(800);.   
a4e0: 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d     }.    } {wal}
a4f0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
a500: 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 32  -22.%PGSZ%.$tn.2
a510: 20 7b 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41   { sql2 { PRAGMA
a520: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
a530: 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64 6f   } } {ok}.    do
a540: 5f 74 65 73 74 20 77 61 6c 2d 32 32 2e 25 50 47  _test wal-22.%PG
a550: 53 5a 25 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  SZ%.$tn.3 {.    
a560: 20 20 73 71 6c 31 20 7b 50 52 41 47 4d 41 20 77    sql1 {PRAGMA w
a570: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 7d 0a 20  al_checkpoint}. 
a580: 20 20 20 20 20 65 78 70 72 20 7b 5b 66 69 6c 65       expr {[file
a590: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 25   size test.db] %
a5a0: 20 25 50 47 53 5a 25 7d 0a 20 20 20 20 7d 20 7b   %PGSZ%}.    } {
a5b0: 30 7d 0a 20 20 7d 5d 0a 7d 0a 0a 23 2d 2d 2d 2d  0}.  }].}..#----
a5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a600: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61  -----.# Test tha
a610: 74 20 77 68 65 6e 20 31 20 6f 72 20 6d 6f 72 65  t when 1 or more
a620: 20 70 61 67 65 73 20 61 72 65 20 72 65 63 6f 76   pages are recov
a630: 65 72 65 64 20 66 72 6f 6d 20 61 20 57 41 4c 20  ered from a WAL 
a640: 66 69 6c 65 2c 20 0a 23 20 73 71 6c 69 74 65 33  file, .# sqlite3
a650: 5f 6c 6f 67 28 29 20 69 73 20 69 6e 76 6f 6b 65  _log() is invoke
a660: 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
a670: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a 23 0a   to the user..#.
a680: 69 66 63 61 70 61 62 6c 65 20 63 75 72 64 69 72  ifcapable curdir
a690: 20 7b 0a 20 20 73 65 74 20 77 61 6c 66 69 6c 65   {.  set walfile
a6a0: 20 5b 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d   [file nativenam
a6b0: 65 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65  e [file join [ge
a6c0: 74 5f 70 77 64 5d 20 74 65 73 74 2e 64 62 2d 77  t_pwd] test.db-w
a6d0: 61 6c 5d 5d 0a 7d 20 65 6c 73 65 20 7b 0a 20 20  al]].} else {.  
a6e0: 73 65 74 20 77 61 6c 66 69 6c 65 20 74 65 73 74  set walfile test
a6f0: 2e 64 62 2d 77 61 6c 0a 7d 0a 63 61 74 63 68 20  .db-wal.}.catch 
a700: 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 6f 72 63 65  {db close}.force
a710: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 64  delete test.db.d
a720: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e 31 20  o_test wal-23.1 
a730: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
a740: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
a750: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
a760: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
a770: 2c 20 62 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , b);.    PRAGMA
a780: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
a790: 57 41 4c 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  WAL;.    INSERT 
a7a0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
a7b0: 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 2);.    INSERT
a7c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
a7d0: 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 66 61 75  3, 4);.  }.  fau
a7e0: 6c 74 73 69 6d 5f 73 61 76 65 5f 61 6e 64 5f 63  ltsim_save_and_c
a7f0: 6c 6f 73 65 0a 0a 20 20 73 71 6c 69 74 65 33 5f  lose..  sqlite3_
a800: 73 68 75 74 64 6f 77 6e 0a 20 20 74 65 73 74 5f  shutdown.  test_
a810: 73 71 6c 69 74 65 33 5f 6c 6f 67 20 5b 6c 69 73  sqlite3_log [lis
a820: 74 20 6c 61 70 70 65 6e 64 20 3a 3a 6c 6f 67 5d  t lappend ::log]
a830: 0a 20 20 73 65 74 20 3a 3a 6c 6f 67 20 5b 6c 69  .  set ::log [li
a840: 73 74 5d 0a 20 20 73 71 6c 69 74 65 33 20 64 62  st].  sqlite3 db
a850: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
a860: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
a870: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33  OM t1 }.} {1 2 3
a880: 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   4}.do_test wal-
a890: 32 33 2e 32 20 7b 20 73 65 74 20 3a 3a 6c 6f 67  23.2 { set ::log
a8a0: 20 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77   } {}..do_test w
a8b0: 61 6c 2d 32 33 2e 33 20 7b 0a 20 20 64 62 20 63  al-23.3 {.  db c
a8c0: 6c 6f 73 65 0a 20 20 73 65 74 20 3a 3a 6c 6f 67  lose.  set ::log
a8d0: 20 5b 6c 69 73 74 5d 0a 20 20 66 61 75 6c 74 73   [list].  faults
a8e0: 69 6d 5f 72 65 73 74 6f 72 65 5f 61 6e 64 5f 72  im_restore_and_r
a8f0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
a900: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
a910: 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d  t1 }.} {1 2 3 4}
a920: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e  .do_test wal-23.
a930: 34 20 7b 20 0a 20 20 73 65 74 20 3a 3a 6c 6f 67  4 { .  set ::log
a940: 20 0a 7d 20 5b 6c 69 73 74 20 53 51 4c 49 54 45   .} [list SQLITE
a950: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
a960: 57 41 4c 20 5c 0a 20 20 20 20 22 72 65 63 6f 76  WAL \.    "recov
a970: 65 72 65 64 20 32 20 66 72 61 6d 65 73 20 66 72  ered 2 frames fr
a980: 6f 6d 20 57 41 4c 20 66 69 6c 65 20 24 77 61 6c  om WAL file $wal
a990: 66 69 6c 65 22 5d 0a 0a 0a 69 66 63 61 70 61 62  file"]...ifcapab
a9a0: 6c 65 20 61 75 74 6f 76 61 63 75 75 6d 20 7b 0a  le autovacuum {.
a9b0: 20 20 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 74    # This block t
a9c0: 65 73 74 73 20 74 68 61 74 20 69 66 20 74 68 65  ests that if the
a9d0: 20 73 69 7a 65 20 6f 66 20 61 20 64 61 74 61 62   size of a datab
a9e0: 61 73 65 20 69 73 20 72 65 64 75 63 65 64 20 62  ase is reduced b
a9f0: 79 20 61 20 0a 20 20 23 20 74 72 61 6e 73 61 63  y a .  # transac
aa00: 74 69 6f 6e 20 28 62 65 63 61 75 73 65 20 6f 66  tion (because of
aa10: 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   an incremental 
aa20: 6f 72 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  or auto-vacuum),
aa30: 20 74 68 61 74 20 6e 6f 0a 20 20 23 20 64 61 74   that no.  # dat
aa40: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
aa50: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 66 6f 72  the WAL file for
aa60: 20 74 68 65 20 74 72 75 6e 63 61 74 65 64 20 70   the truncated p
aa70: 61 67 65 73 20 61 73 20 70 61 72 74 0a 20 20 23  ages as part.  #
aa80: 20 6f 66 20 74 68 65 20 63 6f 6d 6d 69 74 2e 20   of the commit. 
aa90: 65 2e 67 2e 20 69 66 20 61 20 74 72 61 6e 73 61  e.g. if a transa
aaa0: 63 74 69 6f 6e 20 72 65 64 75 63 65 73 20 74 68  ction reduces th
aab0: 65 20 73 69 7a 65 20 6f 66 20 61 20 64 61 74 61  e size of a data
aac0: 62 61 73 65 0a 20 20 23 20 74 6f 20 4e 20 70 61  base.  # to N pa
aad0: 67 65 73 2c 20 64 61 74 61 20 66 6f 72 20 70 61  ges, data for pa
aae0: 67 65 20 4e 2b 31 20 73 68 6f 75 6c 64 20 6e 6f  ge N+1 should no
aaf0: 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
ab00: 74 68 65 20 57 41 4c 20 66 69 6c 65 20 0a 20 20  the WAL file .  
ab10: 23 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  # when committin
ab20: 67 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  g the transactio
ab30: 6e 2e 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 20  n. At one point 
ab40: 73 75 63 68 20 64 61 74 61 20 77 61 73 20 62 65  such data was be
ab50: 69 6e 67 20 0a 20 20 23 20 77 72 69 74 74 65 6e  ing .  # written
ab60: 2e 0a 20 20 23 0a 20 20 63 61 74 63 68 20 7b 64  ..  #.  catch {d
ab70: 62 20 63 6c 6f 73 65 7d 0a 20 20 66 6f 72 63 65  b close}.  force
ab80: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20  delete test.db. 
ab90: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
aba0: 2e 64 62 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c  .db.  do_execsql
abb0: 5f 74 65 73 74 20 32 34 2e 31 20 7b 0a 20 20 20  _test 24.1 {.   
abc0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
abd0: 75 75 6d 20 3d 20 32 3b 0a 20 20 20 20 50 52 41  uum = 2;.    PRA
abe0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
abf0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41 47   = WAL;.    PRAG
ac00: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
ac10: 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54 45 20  024;.    CREATE 
ac20: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
ac30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
ac40: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
ac50: 62 28 35 30 30 30 29 29 3b 0a 20 20 20 20 49 4e  b(5000));.    IN
ac60: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
ac70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
ac80: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
ac90: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
aca0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
acb0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
acc0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
acd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
ace0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
acf0: 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73  } {wal}.  do_tes
ad00: 74 20 32 34 2e 32 20 7b 20 0a 20 20 20 20 65 78  t 24.2 { .    ex
ad10: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 44 45  ecsql {.      DE
ad20: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
ad30: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
ad40: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 7d  heckpoint;.    }
ad50: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
ad60: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
ad70: 74 2e 64 62 0a 20 20 20 20 66 69 6c 65 20 65 78  t.db.    file ex
ad80: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
ad90: 0a 20 20 7d 20 30 0a 20 20 64 6f 5f 74 65 73 74  .  } 0.  do_test
ada0: 20 32 34 2e 33 20 7b 0a 20 20 20 20 66 69 6c 65   24.3 {.    file
adb0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
adc0: 7d 20 5b 65 78 70 72 20 38 34 20 2a 20 31 30 32  } [expr 84 * 102
add0: 34 5d 0a 20 20 64 6f 5f 74 65 73 74 20 32 34 2e  4].  do_test 24.
ade0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
adf0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
ae00: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 32 30 30  cache_size = 200
ae10: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69  ;.      PRAGMA i
ae20: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
ae30: 6d 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  m;.      PRAGMA 
ae40: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
ae50: 20 20 20 20 7d 0a 20 20 20 20 66 69 6c 65 20 73      }.    file s
ae60: 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20  ize test.db.  } 
ae70: 5b 65 78 70 72 20 33 20 2a 20 31 30 32 34 5d 0a  [expr 3 * 1024].
ae80: 0a 20 20 23 20 57 41 4c 20 66 69 6c 65 20 6e 6f  .  # WAL file no
ae90: 77 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  w contains a sin
aea0: 67 6c 65 20 66 72 61 6d 65 20 2d 20 74 68 65 20  gle frame - the 
aeb0: 6e 65 77 20 72 6f 6f 74 20 70 61 67 65 20 66 6f  new root page fo
aec0: 72 20 74 61 62 6c 65 20 74 31 2e 0a 20 20 23 20  r table t1..  # 
aed0: 49 74 20 77 6f 75 6c 64 20 62 65 20 74 77 6f 20  It would be two 
aee0: 66 72 61 6d 65 73 20 28 74 68 65 20 6e 65 77 20  frames (the new 
aef0: 72 6f 6f 74 20 70 61 67 65 20 61 6e 64 20 61 20  root page and a 
af00: 70 61 64 64 69 6e 67 20 66 72 61 6d 65 29 20 69  padding frame) i
af10: 66 20 74 68 65 0a 20 20 23 20 5a 45 52 4f 5f 44  f the.  # ZERO_D
af20: 41 4d 41 47 45 20 66 6c 61 67 20 77 65 72 65 20  AMAGE flag were 
af30: 6e 6f 74 20 73 65 74 2e 0a 20 20 64 6f 5f 74 65  not set..  do_te
af40: 73 74 20 32 34 2e 35 20 7b 0a 20 20 20 20 66 69  st 24.5 {.    fi
af50: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
af60: 77 61 6c 0a 20 20 7d 20 5b 77 61 6c 5f 66 69 6c  wal.  } [wal_fil
af70: 65 5f 73 69 7a 65 20 31 20 31 30 32 34 5d 0a 7d  e_size 1 1024].}
af80: 0a 0a 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74  ..db close.sqlit
af90: 65 33 5f 73 68 75 74 64 6f 77 6e 0a 74 65 73 74  e3_shutdown.test
afa0: 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 0a 73 71 6c  _sqlite3_log.sql
afb0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a  ite3_initialize.
afc0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a           .finish_test.