/ Hex Artifact Content
Login

Artifact 2fbf4bbd0cb03aff6ada8150f29808c79370d50b:


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 64 6f 5f 74 65  db test.db.do_te
4e70: 73 74 20 77 61 6c 2d 31 31 2e 31 30 20 7b 0a 20  st wal-11.10 {. 
4e80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
4e90: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
4ea0: 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e   = 10;.    BEGIN
4eb0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4ec0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
4ed0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
4ee0: 20 20 20 2d 2d 20 33 32 0a 20 20 20 20 20 20 53     -- 32.      S
4ef0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
4f00: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 6c 69  ROM t1;.  }.  li
4f10: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
4f20: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
4f30: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
4f40: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
4f50: 73 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f  st 37 [wal_file_
4f60: 73 69 7a 65 20 33 37 20 31 30 32 34 5d 5d 0a 64  size 37 1024]].d
4f70: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 31  o_test wal-11.11
4f80: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4f90: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
4fa0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4fb0: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20    ROLLBACK;.    
4fc0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4fd0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
4fe0: 33 32 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 77  32 16}.do_test w
4ff0: 61 6c 2d 31 31 2e 31 32 20 7b 0a 20 20 6c 69 73  al-11.12 {.  lis
5000: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
5010: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
5020: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
5030: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
5040: 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  t 37 [wal_file_s
5050: 69 7a 65 20 33 37 20 31 30 32 34 5d 5d 0a 64 6f  ize 37 1024]].do
5060: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 33 20  _test wal-11.13 
5070: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5080: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5090: 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39 30   VALUES( blob(90
50a0: 30 29 20 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  0) );.    SELECT
50b0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
50c0: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  1;.    PRAGMA in
50d0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
50e0: 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d 0a 64 6f 5f   }.} {17 ok}.do_
50f0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 34 20 7b  test wal-11.14 {
5100: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
5110: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5120: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
5130: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
5140: 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f  } [list 37 [wal_
5150: 66 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32  file_size 37 102
5160: 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  4]]...#---------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .# This block of
51c0: 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 32 2e 2a   tests, wal-12.*
51d0: 2c 20 74 65 73 74 73 20 74 68 65 20 66 69 78 20  , tests the fix 
51e0: 66 6f 72 20 61 20 70 72 6f 62 6c 65 6d 20 74 68  for a problem th
51f0: 61 74 20 0a 23 20 63 6f 75 6c 64 20 6f 63 63 75  at .# could occu
5200: 72 20 69 66 20 61 20 6c 6f 67 20 74 68 61 74 20  r if a log that 
5210: 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 61  is a prefix of a
5220: 6e 20 6f 6c 64 65 72 20 6c 6f 67 20 69 73 20 77  n older log is w
5230: 72 69 74 74 65 6e 20 0a 23 20 69 6e 74 6f 20 61  ritten .# into a
5240: 20 72 65 75 73 65 64 20 6c 6f 67 20 66 69 6c 65   reused log file
5250: 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64 62 0a 64 6f  ..#.reopen_db.do
5260: 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 31 20 7b  _test wal-12.1 {
5270: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5280: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
5290: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
52a0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 2c  EATE TABLE t1(x,
52b0: 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20   y);.    CREATE 
52c0: 54 41 42 4c 45 20 74 32 28 78 2c 20 79 29 3b 0a  TABLE t2(x, y);.
52d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
52e0: 74 31 20 56 41 4c 55 45 53 28 27 41 27 2c 20 31  t1 VALUES('A', 1
52f0: 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  );.  }.  list [e
5300: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5310: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66  est.db]/1024] [f
5320: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5330: 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31 20  -wal].} [list 1 
5340: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 35  [wal_file_size 5
5350: 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20   1024]].do_test 
5360: 77 61 6c 2d 31 32 2e 32 20 7b 0a 20 20 64 62 20  wal-12.2 {.  db 
5370: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
5380: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
5390: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
53a0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
53b0: 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 55 50 44 41  normal;.    UPDA
53c0: 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 30 20  TE t1 SET y = 0 
53d0: 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b 0a 20  WHERE x = 'A';. 
53e0: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
53f0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5400: 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20  db]/1024] [expr 
5410: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5420: 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20  db-wal]/1044].} 
5430: 7b 33 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {3 1}.do_test wa
5440: 6c 2d 31 32 2e 33 20 7b 0a 20 20 65 78 65 63 73  l-12.3 {.  execs
5450: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
5460: 20 74 32 20 56 41 4c 55 45 53 28 27 42 27 2c 20   t2 VALUES('B', 
5470: 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70  1) }.  list [exp
5480: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
5490: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70  t.db]/1024] [exp
54a0: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
54b0: 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a  t.db-wal]/1044].
54c0: 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {3 2}.do_test 
54d0: 77 61 6c 2d 31 32 2e 34 20 7b 0a 20 20 66 6f 72  wal-12.4 {.  for
54e0: 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74  cecopy test.db t
54f0: 65 73 74 32 2e 64 62 0a 20 20 66 6f 72 63 65 63  est2.db.  forcec
5500: 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  opy test.db-wal 
5510: 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73  test2.db-wal.  s
5520: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74  qlite3_wal db2 t
5530: 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71  est2.db.  execsq
5540: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
5550: 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 42 20  M t2 } db2.} {B 
5560: 31 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f  1}.db2 close.do_
5570: 74 65 73 74 20 77 61 6c 2d 31 32 2e 35 20 7b 0a  test wal-12.5 {.
5580: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5590: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
55a0: 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54  point;.    UPDAT
55b0: 45 20 74 32 20 53 45 54 20 79 20 3d 20 32 20 57  E t2 SET y = 2 W
55c0: 48 45 52 45 20 78 20 3d 20 27 42 27 3b 20 0a 20  HERE x = 'B'; . 
55d0: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
55e0: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50  eckpoint;.    UP
55f0: 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20  DATE t1 SET y = 
5600: 31 20 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b  1 WHERE x = 'A';
5610: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
5620: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20  checkpoint;.    
5630: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
5640: 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27 41  = 0 WHERE x = 'A
5650: 27 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  ';.  }.  execsql
5660: 20 7b 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   {  SELECT * FRO
5670: 4d 20 74 32 20 7d 0a 7d 20 7b 42 20 32 7d 0a 64  M t2 }.} {B 2}.d
5680: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 36 20  o_test wal-12.6 
5690: 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65  {.  forcecopy te
56a0: 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20  st.db test2.db. 
56b0: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
56c0: 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d  db-wal test2.db-
56d0: 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  wal.  sqlite3_wa
56e0: 6c 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20  l db2 test2.db. 
56f0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
5700: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62  T * FROM t2 } db
5710: 32 0a 7d 20 7b 42 20 32 7d 0a 64 62 32 20 63 6c  2.} {B 2}.db2 cl
5720: 6f 73 65 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 2d  ose.db close..#-
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
5780: 6c 61 72 67 65 20 6c 6f 67 20 73 75 6d 6d 61 72  large log summar
5790: 69 65 73 2e 0a 23 0a 23 20 49 6e 20 74 68 69 73  ies..#.# In this
57a0: 20 63 61 73 65 20 22 6c 61 72 67 65 22 20 75 73   case "large" us
57b0: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 61 20 6c 6f  ually means a lo
57c0: 67 20 66 69 6c 65 20 74 68 61 74 20 72 65 71 75  g file that requ
57d0: 69 72 65 73 20 61 20 77 61 6c 2d 69 6e 64 65 78  ires a wal-index
57e0: 0a 23 20 6d 61 70 70 69 6e 67 20 6c 61 72 67 65  .# mapping large
57f0: 72 20 74 68 61 6e 20 36 34 4b 42 20 28 74 68 65  r than 64KB (the
5800: 20 64 65 66 61 75 6c 74 20 69 6e 69 74 69 61 6c   default initial
5810: 20 61 6c 6c 6f 63 61 74 69 6f 6e 29 2e 20 41 20   allocation). A 
5820: 36 34 4b 42 20 77 61 6c 2d 69 6e 64 65 78 0a 23  64KB wal-index.#
5830: 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
5840: 20 66 6f 72 20 61 20 6c 6f 67 20 66 69 6c 65 20   for a log file 
5850: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 70  that contains ap
5860: 70 72 6f 78 69 6d 61 74 65 6c 79 20 31 33 31 30  proximately 1310
5870: 30 20 66 72 61 6d 65 73 2e 0a 23 20 53 6f 20 74  0 frames..# So t
5880: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
5890: 74 73 20 63 72 65 61 74 65 20 6c 6f 67 73 20 63  ts create logs c
58a0: 6f 6e 74 61 69 6e 69 6e 67 20 61 74 20 6c 65 61  ontaining at lea
58b0: 73 74 20 74 68 69 73 20 6d 61 6e 79 20 66 72 61  st this many fra
58c0: 6d 65 73 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e  mes..#.# wal-13.
58d0: 31 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 20 63  1.*: This test c
58e0: 61 73 65 20 63 72 65 61 74 65 73 20 61 20 76 65  ase creates a ve
58f0: 72 79 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c  ry large log fil
5900: 65 20 77 69 74 68 69 6e 20 74 68 65 0a 23 20 20  e within the.#  
5910: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d             file-
5920: 73 79 73 74 65 6d 20 28 61 72 6f 75 6e 64 20 32  system (around 2
5930: 30 30 4d 42 29 2e 20 54 68 65 20 6c 6f 67 20 66  00MB). The log f
5940: 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ile does not con
5950: 74 61 69 6e 0a 23 20 20 20 20 20 20 20 20 20 20  tain.#          
5960: 20 20 20 61 6e 79 20 76 61 6c 69 64 20 66 72 61     any valid fra
5970: 6d 65 73 2e 20 54 65 73 74 20 74 68 61 74 20 74  mes. Test that t
5980: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
5990: 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 0a 23 20   can still be.# 
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e              open
59b0: 65 64 20 61 6e 64 20 71 75 65 72 69 65 64 2c 20  ed and queried, 
59c0: 61 6e 64 20 74 68 61 74 20 74 68 65 20 69 6e 76  and that the inv
59d0: 61 6c 69 64 20 6c 6f 67 20 66 69 6c 65 20 63 61  alid log file ca
59e0: 75 73 65 73 20 6e 6f 20 0a 23 20 20 20 20 20 20  uses no .#      
59f0: 20 20 20 20 20 20 20 70 72 6f 62 6c 65 6d 73 2e         problems.
5a00: 0a 23 0a 23 20 77 61 6c 2d 31 33 2e 32 2e 2a 3a  .#.# wal-13.2.*:
5a10: 20 54 65 73 74 20 74 68 61 74 20 61 20 70 72 6f   Test that a pro
5a20: 63 65 73 73 20 6d 61 79 20 63 72 65 61 74 65 20  cess may create 
5a30: 61 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c 65  a large log file
5a40: 20 61 6e 64 20 71 75 65 72 79 0a 23 20 20 20 20   and query.#    
5a50: 20 20 20 20 20 20 20 20 20 74 68 65 20 64 61 74           the dat
5a60: 61 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e 67  abase (including
5a70: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 74 68   the log file th
5a80: 61 74 20 69 74 20 69 74 73 65 6c 66 20 63 72 65  at it itself cre
5a90: 61 74 65 64 29 2e 0a 23 0a 23 20 77 61 6c 2d 31  ated)..#.# wal-1
5aa0: 33 2e 33 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  3.3.*: Test that
5ab0: 20 69 66 20 61 20 76 65 72 79 20 6c 61 72 67 65   if a very large
5ac0: 20 6c 6f 67 20 66 69 6c 65 20 69 73 20 63 72 65   log file is cre
5ad0: 61 74 65 64 2c 20 61 6e 64 20 74 68 65 6e 20 61  ated, and then a
5ae0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .#             s
5af0: 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e  econd connection
5b00: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68   is opened on th
5b10: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
5b20: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 0a   it is possible.
5b30: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f  #             to
5b40: 20 71 75 65 72 79 20 74 68 65 20 64 61 74 61 62   query the datab
5b50: 61 73 65 20 28 61 6e 64 20 74 68 65 20 76 65 72  ase (and the ver
5b60: 79 20 6c 61 72 67 65 20 6c 6f 67 29 20 75 73 69  y large log) usi
5b70: 6e 67 20 74 68 65 0a 23 20 20 20 20 20 20 20 20  ng the.#        
5b80: 20 20 20 20 20 73 65 63 6f 6e 64 20 63 6f 6e 6e       second conn
5b90: 65 63 74 69 6f 6e 2e 0a 23 0a 23 20 77 61 6c 2d  ection..#.# wal-
5ba0: 31 33 2e 34 2e 2a 3a 20 53 61 6d 65 20 74 65 73  13.4.*: Same tes
5bb0: 74 20 61 73 20 77 61 6c 2d 31 33 2e 33 2e 2a 2e  t as wal-13.3.*.
5bc0: 20 45 78 63 65 70 74 20 69 6e 20 74 68 69 73 20   Except in this 
5bd0: 63 61 73 65 20 74 68 65 20 73 65 63 6f 6e 64 0a  case the second.
5be0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  #             co
5bf0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
5c00: 65 64 20 62 79 20 61 6e 20 65 78 74 65 72 6e 61  ed by an externa
5c10: 6c 20 70 72 6f 63 65 73 73 2e 0a 23 0a 64 6f 5f  l process..#.do_
5c20: 74 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e 31 20  test wal-13.1.1 
5c30: 7b 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65  {.  list [file e
5c40: 78 69 73 74 73 20 74 65 73 74 2e 64 62 5d 20 5b  xists test.db] [
5c50: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
5c60: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 31 20 30 7d  .db-wal].} {1 0}
5c70: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e  .do_test wal-13.
5c80: 31 2e 32 20 7b 0a 20 20 73 65 74 20 66 64 20 5b  1.2 {.  set fd [
5c90: 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 77 61 6c  open test.db-wal
5ca0: 20 77 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b   w].  seek $fd [
5cb0: 65 78 70 72 20 32 30 30 2a 31 30 32 34 2a 31 30  expr 200*1024*10
5cc0: 32 34 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22  24].  puts $fd "
5cd0: 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20  ".  close $fd.  
5ce0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
5cf0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
5d00: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
5d10: 7d 0a 7d 20 7b 42 20 32 7d 0a 62 72 65 61 6b 70  }.} {B 2}.breakp
5d20: 6f 69 6e 74 0a 64 6f 5f 74 65 73 74 20 77 61 6c  oint.do_test wal
5d30: 2d 31 33 2e 31 2e 33 20 7b 0a 20 20 64 62 20 63  -13.1.3 {.  db c
5d40: 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73  lose.  file exis
5d50: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d  ts test.db-wal.}
5d60: 20 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   {0}..do_test wa
5d70: 6c 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 73 71 6c  l-13.2.1 {.  sql
5d80: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
5d90: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
5da0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
5db0: 20 74 32 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74   t2 }.} {1}.do_t
5dc0: 65 73 74 20 77 61 6c 2d 31 33 2e 32 2e 32 20 7b  est wal-13.2.2 {
5dd0: 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 62  .  db function b
5de0: 6c 6f 62 20 62 6c 6f 62 0a 20 20 66 6f 72 20 7b  lob blob.  for {
5df0: 73 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31  set i 0} {$i < 1
5e00: 36 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  6} {incr i} {.  
5e10: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
5e20: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
5e30: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
5e40: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 20 7d  b(400) FROM t2 }
5e50: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
5e60: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
5e70: 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 5b 65 78   FROM t2 }.} [ex
5e80: 70 72 20 69 6e 74 28 70 6f 77 28 32 2c 20 31 36  pr int(pow(2, 16
5e90: 29 29 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ))].do_test wal-
5ea0: 31 33 2e 32 2e 33 20 7b 0a 20 20 65 78 70 72 20  13.2.3 {.  expr 
5eb0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5ec0: 64 62 2d 77 61 6c 5d 20 3e 20 5b 77 61 6c 5f 66  db-wal] > [wal_f
5ed0: 69 6c 65 5f 73 69 7a 65 20 33 33 30 30 30 20 31  ile_size 33000 1
5ee0: 30 32 34 5d 0a 7d 20 31 0a 0a 64 6f 5f 6d 75 6c  024].} 1..do_mul
5ef0: 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e  ticlient_test tn
5f00: 20 7b 0a 20 20 69 6e 63 72 20 74 6e 20 32 0a 0a   {.  incr tn 2..
5f10: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33    do_test wal-13
5f20: 2e 24 74 6e 2e 30 20 7b 0a 20 20 20 20 73 71 6c  .$tn.0 {.    sql
5f30: 31 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  1 {.      PRAGMA
5f40: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
5f50: 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54  WAL;.      CREAT
5f60: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
5f70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5f80: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
5f90: 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20  mblob(800);.    
5fa0: 7d 0a 20 20 20 20 73 71 6c 31 20 7b 20 53 45 4c  }.    sql1 { SEL
5fb0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
5fc0: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a  M t1 }.  } {1}..
5fd0: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d    for {set ii 1}
5fe0: 20 7b 24 69 69 3c 31 36 7d 20 7b 69 6e 63 72 20   {$ii<16} {incr 
5ff0: 69 69 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  ii} {.    do_tes
6000: 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69  t wal-13.$tn.$ii
6010: 2e 61 20 7b 0a 20 20 20 20 20 20 73 71 6c 32 20  .a {.      sql2 
6020: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
6030: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6040: 6f 62 28 38 30 30 29 20 46 52 4f 4d 20 74 31 20  ob(800) FROM t1 
6050: 7d 0a 20 20 20 20 20 20 73 71 6c 32 20 7b 20 53  }.      sql2 { S
6060: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
6070: 52 4f 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b  ROM t1 }.    } [
6080: 65 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20  expr (1<<$ii)]. 
6090: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31     do_test wal-1
60a0: 33 2e 24 74 6e 2e 24 69 69 2e 62 20 7b 0a 20 20  3.$tn.$ii.b {.  
60b0: 20 20 20 20 73 71 6c 31 20 7b 20 53 45 4c 45 43      sql1 { 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 63 20 7b 0a 20 20 20 20 20 20  n.$ii.c {.      
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 64 20 7b 0a 20 20 20 20 20 20 73 71 6c 31  i.d {.      sql1
6170: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
6180: 69 74 79 5f 63 68 65 63 6b 20 7d 0a 20 20 20 20  ity_check }.    
6190: 7d 20 7b 6f 6b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d  } {ok}.  }.}..#-
61a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b  --------.# Check
61f0: 20 61 20 66 75 6e 20 63 6f 72 72 75 70 74 69 6f   a fun corruptio
6200: 6e 20 63 61 73 65 20 68 61 73 20 62 65 65 6e 20  n case has been 
6210: 66 69 78 65 64 2e 0a 23 0a 23 20 54 68 65 20 70  fixed..#.# The p
6220: 72 6f 62 6c 65 6d 20 77 61 73 20 74 68 61 74 20  roblem was that 
6230: 61 66 74 65 72 20 70 65 72 66 6f 72 6d 69 6e 67  after performing
6240: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 75 73   a checkpoint us
6250: 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ing a connection
6260: 0a 23 20 74 68 61 74 20 68 61 64 20 61 6e 20 6f  .# that had an o
6270: 75 74 2d 6f 66 2d 64 61 74 65 20 70 61 67 65 72  ut-of-date pager
6280: 2d 63 61 63 68 65 2c 20 74 68 65 20 6e 65 78 74  -cache, the next
6290: 20 74 69 6d 65 20 74 68 65 20 63 6f 6e 6e 65 63   time the connec
62a0: 74 69 6f 6e 20 77 61 73 0a 23 20 75 73 65 64 20  tion was.# used 
62b0: 69 74 20 64 69 64 20 6e 6f 74 20 72 65 61 6c 69  it did not reali
62c0: 7a 65 20 74 68 65 20 63 61 63 68 65 20 77 61 73  ze the cache was
62d0: 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 61 6e 64   out-of-date and
62e0: 20 70 72 6f 63 65 65 64 65 64 20 74 6f 0a 23 20   proceeded to.# 
62f0: 6f 70 65 72 61 74 65 20 77 69 74 68 20 61 6e 20  operate with an 
6300: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
6310: 68 65 2e 20 4c 65 61 64 69 6e 67 20 74 6f 20 63  he. Leading to c
6320: 6f 72 72 75 70 74 69 6f 6e 2e 0a 23 0a 63 61 74  orruption..#.cat
6330: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
6340: 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73  catch { db2 clos
6350: 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 33 20  e }.catch { db3 
6360: 63 6c 6f 73 65 20 7d 0a 66 6f 72 63 65 64 65 6c  close }.forcedel
6370: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
6380: 2e 64 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20  .db-wal.sqlite3 
6390: 64 62 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74  db test.db.sqlit
63a0: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 64  e3 db2 test.db.d
63b0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 34 20 7b 0a  o_test wal-14 {.
63c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
63d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
63e0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43  ode = WAL;.    C
63f0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
6400: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
6410: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6420: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
6430: 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64  omblob(10), rand
6440: 6f 6d 62 6c 6f 62 28 31 30 30 29 29 3b 0a 20 20  omblob(100));.  
6450: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6460: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6470: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
6480: 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(100) FROM t1;
6490: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
64a0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
64b0: 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f  mblob(10), rando
64c0: 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20  mblob(100) FROM 
64d0: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
64e0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
64f0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
6500: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52  ndomblob(100) FR
6510: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a 20 20 64 62  OM t1;.  }..  db
6520: 32 20 65 76 61 6c 20 7b 20 0a 20 20 20 20 49 4e  2 eval { .    IN
6530: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
6540: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
6550: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
6560: 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  00);.    INSERT 
6570: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
6580: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72  andomblob(10), r
6590: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a  andomblob(100);.
65a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
65b0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
65c0: 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d  blob(10), random
65d0: 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49  blob(100);.    I
65e0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
65f0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
6600: 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  10), randomblob(
6610: 31 30 30 29 3b 0a 20 20 7d 0a 0a 20 20 23 20 41  100);.  }..  # A
6620: 66 74 65 72 20 65 78 65 63 75 74 69 6e 67 20 74  fter executing t
6630: 68 65 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63  he "PRAGMA wal_c
6640: 68 65 63 6b 70 6f 69 6e 74 22 2c 20 63 6f 6e 6e  heckpoint", conn
6650: 65 63 74 69 6f 6e 20 5b 64 62 5d 20 77 61 73 20  ection [db] was 
6660: 62 65 69 6e 67 0a 20 20 23 20 6c 65 66 74 20 77  being.  # left w
6670: 69 74 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74  ith an inconsist
6680: 65 6e 74 20 63 61 63 68 65 2e 20 52 75 6e 6e 69  ent cache. Runni
6690: 6e 67 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  ng the CREATE IN
66a0: 44 45 58 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  DEX statement.  
66b0: 23 20 69 6e 20 74 68 69 73 20 73 74 61 74 65 20  # in this state 
66c0: 6c 65 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  led to database 
66d0: 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 63 61  corruption..  ca
66e0: 74 63 68 73 71 6c 20 7b 20 0a 20 20 20 20 50 52  tchsql { .    PR
66f0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
6700: 69 6e 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20  int;.    CREATE 
6710: 49 4e 44 45 58 20 69 31 20 6f 6e 20 74 31 28 62  INDEX i1 on t1(b
6720: 29 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 64 62 32  );.  }.   .  db2
6730: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 69   eval { PRAGMA i
6740: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
6750: 0a 7d 20 7b 6f 6b 7d 0a 0a 63 61 74 63 68 20 7b  .} {ok}..catch {
6760: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63   db close }.catc
6770: 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a  h { db2 close }.
6780: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
67d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
67e0: 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77 61 6c  k of tests - wal
67f0: 2d 31 35 2e 2a 20 2d 20 66 6f 63 75 73 20 6f 6e  -15.* - focus on
6800: 20 74 65 73 74 69 6e 67 20 74 68 65 20 0a 23 20   testing the .# 
6810: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
6820: 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 77 61  f the sqlite3_wa
6830: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 29 20 69  l_checkpoint() i
6840: 6e 74 65 72 66 61 63 65 2e 0a 23 0a 66 6f 72 63  nterface..#.forc
6850: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
6860: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 73 71 6c 69  test.db-wal.sqli
6870: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64  te3 db test.db.d
6880: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 31 20  o_test wal-15.1 
6890: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
68a0: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
68b0: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52  cuum = 0;.    PR
68c0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
68d0: 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d   1024;.    PRAGM
68e0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
68f0: 20 57 41 4c 3b 0a 20 20 7d 0a 20 20 65 78 65 63   WAL;.  }.  exec
6900: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
6910: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
6920: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6930: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
6940: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65  ;.  }.} {}..# Te
6950: 73 74 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72  st that an error
6960: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
6970: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
6980: 65 20 69 73 20 6e 6f 74 20 72 65 63 6f 67 6e 69  e is not recogni
6990: 7a 65 64 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  zed.#.do_test wa
69a0: 6c 2d 31 35 2e 32 2e 31 20 7b 0a 20 20 73 71 6c  l-15.2.1 {.  sql
69b0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
69c0: 69 6e 74 20 64 62 20 61 75 78 0a 7d 20 7b 53 51  int db aux.} {SQ
69d0: 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74  LITE_ERROR}.do_t
69e0: 65 73 74 20 77 61 6c 2d 31 35 2e 32 2e 32 20 7b  est wal-15.2.2 {
69f0: 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  .  sqlite3_errco
6a00: 64 65 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f  de db.} {SQLITE_
6a10: 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 77  ERROR}.do_test w
6a20: 61 6c 2d 31 35 2e 32 2e 33 20 7b 0a 20 20 73 71  al-15.2.3 {.  sq
6a30: 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a  lite3_errmsg db.
6a40: 7d 20 7b 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  } {unknown datab
6a50: 61 73 65 3a 20 61 75 78 7d 0a 0a 23 20 54 65 73  ase: aux}..# Tes
6a60: 74 20 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20  t that an error 
6a70: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61  is returned if a
6a80: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
6a90: 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 0a  e to checkpoint.
6aa0: 23 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  # if a transacti
6ab0: 6f 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68  on is open on th
6ac0: 65 20 64 61 74 61 62 61 73 65 2e 0a 23 0a 64 6f  e database..#.do
6ad0: 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e 31  _test wal-15.3.1
6ae0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6af0: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e     BEGIN;.    IN
6b00: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
6b10: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20  UES(3, 4);.  }. 
6b20: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
6b30: 63 6b 70 6f 69 6e 74 20 64 62 20 6d 61 69 6e 0a  ckpoint db main.
6b40: 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  } {SQLITE_LOCKED
6b50: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
6b60: 2e 33 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  .3.2 {.  sqlite3
6b70: 5f 65 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53  _errcode db.} {S
6b80: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f  QLITE_LOCKED}.do
6b90: 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e 33  _test wal-15.3.3
6ba0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72   {.  sqlite3_err
6bb0: 6d 73 67 20 64 62 0a 7d 20 7b 64 61 74 61 62 61  msg db.} {databa
6bc0: 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b  se table is lock
6bd0: 65 64 7d 0a 0a 23 20 45 61 72 6c 69 65 72 20 76  ed}..# Earlier v
6be0: 65 72 73 69 6f 6e 73 20 72 65 74 75 72 6e 65 64  ersions returned
6bf0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
6c00: 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 62 20  urned if the db 
6c10: 63 61 6e 6e 6f 74 20 62 65 20 0a 23 20 63 68 65  cannot be .# che
6c20: 63 6b 70 6f 69 6e 74 65 64 20 62 65 63 61 75 73  ckpointed becaus
6c30: 65 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  e of locks held 
6c40: 62 79 20 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65  by another conne
6c50: 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61  ction. Check tha
6c60: 74 0a 23 20 74 68 69 73 20 69 73 20 6e 6f 20 6c  t.# this is no l
6c70: 6f 6e 67 65 72 20 74 68 65 20 63 61 73 65 2e 0a  onger the case..
6c80: 23 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65  #.sqlite3 db2 te
6c90: 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61  st.db.do_test wa
6ca0: 6c 2d 31 35 2e 34 2e 31 20 7b 0a 20 20 65 78 65  l-15.4.1 {.  exe
6cb0: 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e  csql {.    BEGIN
6cc0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
6cd0: 52 4f 4d 20 74 31 3b 0a 20 20 7d 20 64 62 32 0a  ROM t1;.  } db2.
6ce0: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
6cf0: 77 61 6c 2d 31 35 2e 34 2e 32 20 7b 0a 20 20 65  wal-15.4.2 {.  e
6d00: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  xecsql { COMMIT 
6d10: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  }.  sqlite3_wal_
6d20: 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 0a 7d 20  checkpoint db.} 
6d30: 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74  {SQLITE_OK}.do_t
6d40: 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 33 20 7b  est wal-15.4.3 {
6d50: 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  .  sqlite3_errms
6d60: 67 20 64 62 0a 7d 20 7b 6e 6f 74 20 61 6e 20 65  g db.} {not an e
6d70: 72 72 6f 72 7d 0a 0a 23 20 41 66 74 65 72 20 5b  rror}..# After [
6d80: 64 62 32 5d 20 64 72 6f 70 73 20 69 74 73 20 6c  db2] drops its l
6d90: 6f 63 6b 2c 20 5b 64 62 5d 20 6d 61 79 20 63 68  ock, [db] may ch
6da0: 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 62 2e  eckpoint the db.
6db0: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .#.do_test wal-1
6dc0: 35 2e 34 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  5.4.4 {.  execsq
6dd0: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 20 64 62 32  l { COMMIT } db2
6de0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  .  sqlite3_wal_c
6df0: 68 65 63 6b 70 6f 69 6e 74 20 64 62 0a 7d 20 7b  heckpoint db.} {
6e00: 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65  SQLITE_OK}.do_te
6e10: 73 74 20 77 61 6c 2d 31 35 2e 34 2e 35 20 7b 0a  st wal-15.4.5 {.
6e20: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
6e30: 20 64 62 0a 7d 20 7b 6e 6f 74 20 61 6e 20 65 72   db.} {not an er
6e40: 72 6f 72 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  ror}.do_test wal
6e50: 2d 31 35 2e 34 2e 36 20 7b 0a 20 20 66 69 6c 65  -15.4.6 {.  file
6e60: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
6e70: 5b 65 78 70 72 20 31 30 32 34 2a 32 5d 0a 0a 63  [expr 1024*2]..c
6e80: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
6e90: 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c   }.catch { db cl
6ea0: 6f 73 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ose }..#--------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
6f00: 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  g block of tests
6f10: 20 2d 20 77 61 6c 2d 31 36 2e 2a 20 2d 20 74 65   - wal-16.* - te
6f20: 73 74 20 74 68 61 74 20 69 66 20 61 20 4e 55 4c  st that if a NUL
6f30: 4c 20 70 6f 69 6e 74 65 72 20 6f 72 0a 23 20 61  L pointer or.# a
6f40: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
6f50: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
6f60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
6f70: 6f 66 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b  of the wal_check
6f80: 70 6f 69 6e 74 28 29 0a 23 20 41 50 49 2c 20 61  point().# API, a
6f90: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  n attempt is mad
6fa0: 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  e to checkpoint 
6fb0: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
6fc0: 61 62 61 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63  abases..#.foreac
6fd0: 68 20 7b 74 6e 20 63 6b 70 74 5f 63 6d 64 20 63  h {tn ckpt_cmd c
6fe0: 6b 70 74 5f 72 65 73 20 63 6b 70 74 5f 6d 61 69  kpt_res ckpt_mai
6ff0: 6e 20 63 6b 70 74 5f 61 75 78 7d 20 7b 0a 20 20  n ckpt_aux} {.  
7000: 31 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  1 {sqlite3_wal_c
7010: 68 65 63 6b 70 6f 69 6e 74 20 64 62 7d 20 20 20  heckpoint db}   
7020: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
7030: 45 5f 4f 4b 20 20 20 20 20 31 20 31 0a 20 20 32  E_OK     1 1.  2
7040: 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68   {sqlite3_wal_ch
7050: 65 63 6b 70 6f 69 6e 74 20 64 62 20 22 22 7d 20  eckpoint db ""} 
7060: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
7070: 5f 4f 4b 20 20 20 20 20 31 20 31 0a 20 20 33 20  _OK     1 1.  3 
7080: 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41  {db eval "PRAGMA
7090: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22   wal_checkpoint"
70a0: 7d 20 20 20 20 20 20 20 20 7b 30 20 31 30 20 31  }        {0 10 1
70b0: 30 7d 20 20 20 20 20 31 20 31 0a 0a 20 20 34 20  0}     1 1..  4 
70c0: 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65  {sqlite3_wal_che
70d0: 63 6b 70 6f 69 6e 74 20 64 62 20 6d 61 69 6e 7d  ckpoint db main}
70e0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
70f0: 4f 4b 20 20 20 20 20 31 20 30 0a 20 20 35 20 7b  OK     1 0.  5 {
7100: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
7110: 6b 70 6f 69 6e 74 20 64 62 20 61 75 78 7d 20 20  kpoint db aux}  
7120: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7130: 4b 20 20 20 20 20 30 20 31 0a 20 20 36 20 7b 73  K     0 1.  6 {s
7140: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
7150: 70 6f 69 6e 74 20 64 62 20 74 65 6d 70 7d 20 20  point db temp}  
7160: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
7170: 20 20 20 20 20 30 20 30 0a 20 20 37 20 7b 64 62       0 0.  7 {db
7180: 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 6d 61   eval "PRAGMA ma
7190: 69 6e 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  in.wal_checkpoin
71a0: 74 22 7d 20 20 20 7b 30 20 31 30 20 31 30 7d 20  t"}   {0 10 10} 
71b0: 20 20 20 20 31 20 30 0a 20 20 38 20 7b 64 62 20      1 0.  8 {db 
71c0: 65 76 61 6c 20 22 50 52 41 47 4d 41 20 61 75 78  eval "PRAGMA aux
71d0: 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22  .wal_checkpoint"
71e0: 7d 20 20 20 20 7b 30 20 31 33 20 31 33 7d 20 20  }    {0 13 13}  
71f0: 20 20 20 30 20 31 0a 20 20 39 20 7b 64 62 20 65     0 1.  9 {db e
7200: 76 61 6c 20 22 50 52 41 47 4d 41 20 74 65 6d 70  val "PRAGMA temp
7210: 2e 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22  .wal_checkpoint"
7220: 7d 20 20 20 7b 30 20 2d 31 20 2d 31 7d 20 20 20  }   {0 -1 -1}   
7230: 20 20 30 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74    0 0.} {.  do_t
7240: 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 31  est wal-16.$tn.1
7250: 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65   {.    forcedele
7260: 74 65 20 74 65 73 74 32 2e 64 62 20 74 65 73 74  te test2.db test
7270: 32 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64  2.db-wal test2.d
7280: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 66 6f  b-journal.    fo
7290: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
72a0: 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  b test.db-wal te
72b0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 0a 20  st.db-journal.. 
72c0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
72d0: 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73 71  st.db.    execsq
72e0: 6c 20 7b 0a 20 20 20 20 20 20 41 54 54 41 43 48  l {.      ATTACH
72f0: 20 27 74 65 73 74 32 2e 64 62 27 20 41 53 20 61   'test2.db' AS a
7300: 75 78 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  ux;.      PRAGMA
7310: 20 6d 61 69 6e 2e 61 75 74 6f 5f 76 61 63 75 75   main.auto_vacuu
7320: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 52 41  m = 0;.      PRA
7330: 47 4d 41 20 61 75 78 2e 61 75 74 6f 5f 76 61 63  GMA aux.auto_vac
7340: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  uum = 0;.      P
7350: 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e  RAGMA main.journ
7360: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
7370: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
7380: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
7390: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
73a0: 20 6d 61 69 6e 2e 73 79 6e 63 68 72 6f 6e 6f 75   main.synchronou
73b0: 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  s = NORMAL;.    
73c0: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 73 79 6e    PRAGMA aux.syn
73d0: 63 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41  chronous = NORMA
73e0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61  L;.    }.  } {wa
73f0: 6c 20 77 61 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73  l wal}..  do_tes
7400: 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 32 20 7b  t wal-16.$tn.2 {
7410: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
7420: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
7430: 45 20 6d 61 69 6e 2e 74 31 28 61 2c 20 62 2c 20  E main.t1(a, b, 
7440: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62  PRIMARY KEY(a, b
7450: 29 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  ));.      CREATE
7460: 20 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c   TABLE aux.t2(a,
7470: 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
7480: 61 2c 20 62 29 29 3b 0a 0a 20 20 20 20 20 20 49  a, b));..      I
7490: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
74a0: 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(1, randombl
74b0: 6f 62 28 31 30 30 30 29 29 3b 0a 20 20 20 20 20  ob(1000));.     
74c0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
74d0: 56 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d  VALUES(2, random
74e0: 62 6c 6f 62 28 31 30 30 30 29 29 3b 0a 20 20 20  blob(1000));.   
74f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7500: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
7510: 74 32 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20  t2;.    }.  .   
7520: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
7530: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20   test.db] [file 
7540: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
7550: 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70  ].  } [list [exp
7560: 72 20 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66  r 1*1024] [wal_f
7570: 69 6c 65 5f 73 69 7a 65 20 31 30 20 31 30 32 34  ile_size 10 1024
7580: 5d 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  ]].  do_test wal
7590: 2d 31 36 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  -16.$tn.3 {.    
75a0: 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20  list [file size 
75b0: 74 65 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20  test2.db] [file 
75c0: 73 69 7a 65 20 74 65 73 74 32 2e 64 62 2d 77 61  size test2.db-wa
75d0: 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78  l].  } [list [ex
75e0: 70 72 20 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f  pr 1*1024] [wal_
75f0: 66 69 6c 65 5f 73 69 7a 65 20 31 33 20 31 30 32  file_size 13 102
7600: 34 5d 5d 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74  4]].  .  do_test
7610: 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 34 20 5b 6c   wal-16.$tn.4 [l
7620: 69 73 74 20 65 76 61 6c 20 24 63 6b 70 74 5f 63  ist eval $ckpt_c
7630: 6d 64 5d 20 24 63 6b 70 74 5f 72 65 73 0a 20 20  md] $ckpt_res.  
7640: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
7650: 36 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20 6c 69  6.$tn.5 {.    li
7660: 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  st [file size te
7670: 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a  st.db] [file siz
7680: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20  e test.db-wal]. 
7690: 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 28   } [list [expr (
76a0: 24 63 6b 70 74 5f 6d 61 69 6e 20 3f 20 37 20 3a  $ckpt_main ? 7 :
76b0: 20 31 29 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66   1)*1024] [wal_f
76c0: 69 6c 65 5f 73 69 7a 65 20 31 30 20 31 30 32 34  ile_size 10 1024
76d0: 5d 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  ]]..  do_test wa
76e0: 6c 2d 31 36 2e 24 74 6e 2e 36 20 7b 0a 20 20 20  l-16.$tn.6 {.   
76f0: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
7700: 20 74 65 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65   test2.db] [file
7710: 20 73 69 7a 65 20 74 65 73 74 32 2e 64 62 2d 77   size test2.db-w
7720: 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65  al].  } [list [e
7730: 78 70 72 20 28 24 63 6b 70 74 5f 61 75 78 20 3f  xpr ($ckpt_aux ?
7740: 20 37 20 3a 20 31 29 2a 31 30 32 34 5d 20 5b 77   7 : 1)*1024] [w
7750: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 33 20  al_file_size 13 
7760: 31 30 32 34 5d 5d 0a 0a 20 20 63 61 74 63 68 20  1024]]..  catch 
7770: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 7d 0a 0a  { db close }.}..
7780: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
77d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
77e0: 20 2d 20 77 61 6c 2d 31 37 2e 2a 20 2d 20 61 74   - wal-17.* - at
77f0: 74 65 6d 70 74 20 74 6f 20 76 65 72 69 66 79 20  tempt to verify 
7800: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
7810: 0a 23 20 6e 75 6d 62 65 72 20 6f 66 20 22 70 61  .# number of "pa
7820: 64 64 69 6e 67 22 20 66 72 61 6d 65 73 20 61 72  dding" frames ar
7830: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
7840: 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20  e log file when 
7850: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20  a transaction.# 
7860: 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20  is committed in 
7870: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c  synchronous=FULL
7880: 20 6d 6f 64 65 2e 0a 23 20 0a 23 20 44 6f 20 74   mode..# .# Do t
7890: 68 69 73 20 62 79 20 63 72 65 61 74 69 6e 67 20  his by creating 
78a0: 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
78b0: 75 73 65 73 20 35 31 32 20 62 79 74 65 20 70 61  uses 512 byte pa
78c0: 67 65 73 2e 20 54 68 65 6e 20 77 72 69 74 69 6e  ges. Then writin
78d0: 67 0a 23 20 61 20 74 72 61 6e 73 61 63 74 69 6f  g.# a transactio
78e0: 6e 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20  n that modifies 
78f0: 31 37 31 20 70 61 67 65 73 2e 20 49 6e 20 73 79  171 pages. In sy
7900: 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c  nchronous=NORMAL
7910: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 23 20 70 72   mode, this.# pr
7920: 6f 64 75 63 65 73 20 61 20 6c 6f 67 20 66 69 6c  oduces a log fil
7930: 65 20 6f 66 3a 0a 23 0a 23 20 20 20 33 32 20 2b  e of:.#.#   32 +
7940: 20 28 32 34 2b 35 31 32 29 2a 31 37 31 20 3d 20   (24+512)*171 = 
7950: 39 30 33 31 32 20 62 79 74 65 73 2e 0a 23 0a 23  90312 bytes..#.#
7960: 20 53 6c 69 67 68 74 6c 79 20 6c 61 72 67 65 72   Slightly larger
7970: 20 74 68 61 6e 20 31 31 2a 38 31 39 32 20 3d 20   than 11*8192 = 
7980: 39 30 31 31 32 20 62 79 74 65 73 2e 0a 23 0a 23  90112 bytes..#.#
7990: 20 52 75 6e 20 74 68 65 20 74 65 73 74 20 75 73   Run the test us
79a0: 69 6e 67 20 76 61 72 69 6f 75 73 20 64 69 66 66  ing various diff
79b0: 65 72 65 6e 74 20 73 65 63 74 6f 72 2d 73 69 7a  erent sector-siz
79c0: 65 73 2e 20 49 6e 20 65 61 63 68 20 63 61 73 65  es. In each case
79d0: 2c 20 74 68 65 0a 23 20 57 41 4c 20 63 6f 64 65  , the.# WAL code
79e0: 20 73 68 6f 75 6c 64 20 77 72 69 74 65 20 74 68   should write th
79f0: 65 20 39 30 33 30 30 20 62 79 74 65 73 20 6f 66  e 90300 bytes of
7a00: 20 6c 6f 67 20 66 69 6c 65 20 63 6f 6e 74 61 69   log file contai
7a10: 6e 69 6e 67 20 74 68 65 20 0a 23 20 74 72 61 6e  ning the .# tran
7a20: 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 70  saction, then ap
7a30: 70 65 6e 64 20 61 73 20 6d 61 79 20 66 72 61 6d  pend as may fram
7a40: 65 73 20 61 73 20 61 72 65 20 72 65 71 75 69 72  es as are requir
7a50: 65 64 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  ed to extend the
7a60: 0a 23 20 6c 6f 67 20 66 69 6c 65 20 73 6f 20 74  .# log file so t
7a70: 68 61 74 20 6e 6f 20 70 61 72 74 20 6f 66 20 74  hat no part of t
7a80: 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
7a90: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 77 72 69 74  ion will be writ
7aa0: 74 65 6e 20 69 6e 74 6f 0a 23 20 61 20 64 69 73  ten into.# a dis
7ab0: 6b 2d 73 65 63 74 6f 72 20 75 73 65 64 20 62 79  k-sector used by
7ac0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 75 73   transaction jus
7ad0: 74 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a 73  t committed..#.s
7ae0: 65 74 20 6f 6c 64 5f 70 65 6e 64 69 6e 67 5f 62  et old_pending_b
7af0: 79 74 65 20 5b 73 71 6c 69 74 65 33 5f 74 65 73  yte [sqlite3_tes
7b00: 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e  t_control_pendin
7b10: 67 5f 62 79 74 65 20 30 78 31 30 30 30 30 30 30  g_byte 0x1000000
7b20: 30 5d 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c  0].catch { db cl
7b30: 6f 73 65 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74  ose }.foreach {t
7b40: 6e 20 73 65 63 74 6f 72 73 69 7a 65 20 6c 6f 67  n sectorsize log
7b50: 73 69 7a 65 7d 20 22 0a 20 20 31 20 20 20 31 32  size} ".  1   12
7b60: 38 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  8  [wal_file_siz
7b70: 65 20 31 37 32 20 35 31 32 5d 0a 20 20 32 20 20  e 172 512].  2  
7b80: 20 32 35 36 20 20 5b 77 61 6c 5f 66 69 6c 65 5f   256  [wal_file_
7b90: 73 69 7a 65 20 31 37 32 20 35 31 32 5d 0a 20 20  size 172 512].  
7ba0: 33 20 20 20 35 31 32 20 20 5b 77 61 6c 5f 66 69  3   512  [wal_fi
7bb0: 6c 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d  le_size 172 512]
7bc0: 20 0a 20 20 34 20 20 31 30 32 34 20 20 5b 77 61   .  4  1024  [wa
7bd0: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20  l_file_size 172 
7be0: 35 31 32 5d 0a 20 20 35 20 20 32 30 34 38 20 20  512].  5  2048  
7bf0: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
7c00: 37 32 20 35 31 32 5d 0a 20 20 36 20 20 34 30 39  72 512].  6  409
7c10: 36 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  6  [wal_file_siz
7c20: 65 20 31 37 36 20 35 31 32 5d 0a 20 20 37 20 20  e 176 512].  7  
7c30: 38 31 39 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f  8192  [wal_file_
7c40: 73 69 7a 65 20 31 38 34 20 35 31 32 5d 0a 22 20  size 184 512]." 
7c50: 7b 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  {.  forcedelete 
7c60: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
7c70: 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  wal test.db-jour
7c80: 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 73 69  nal.  sqlite3_si
7c90: 6d 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 73  mulate_device -s
7ca0: 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f  ectorsize $secto
7cb0: 72 73 69 7a 65 0a 20 20 73 71 6c 69 74 65 33 20  rsize.  sqlite3 
7cc0: 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20  db test.db -vfs 
7cd0: 64 65 76 73 79 6d 0a 0a 20 20 64 6f 5f 74 65 73  devsym..  do_tes
7ce0: 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 31 20 7b  t wal-17.$tn.1 {
7cf0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
7d00: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f       PRAGMA auto
7d10: 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20  _vacuum = 0;.   
7d20: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
7d30: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20  ize = 512;.     
7d40: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
7d50: 7a 65 20 3d 20 2d 32 30 30 30 3b 0a 20 20 20 20  ze = -2000;.    
7d60: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
7d70: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
7d80: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
7d90: 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 0a 20 20  onous = FULL;.  
7da0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
7db0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
7dc0: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
7dd0: 45 20 74 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20  E t(x);.    }.  
7de0: 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20    for {set i 0} 
7df0: 7b 24 69 3c 31 36 36 7d 20 7b 69 6e 63 72 20 69  {$i<166} {incr i
7e00: 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71  } {.      execsq
7e10: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
7e20: 74 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  t VALUES(randomb
7e30: 6c 6f 62 28 34 30 30 29 29 20 7d 0a 20 20 20 20  lob(400)) }.    
7e40: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 43 4f  }.    execsql CO
7e50: 4d 4d 49 54 0a 0a 20 20 20 20 66 69 6c 65 20 73  MMIT..    file s
7e60: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  ize test.db-wal.
7e70: 20 20 7d 20 24 6c 6f 67 73 69 7a 65 0a 0a 20 20    } $logsize..  
7e80: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 37 2e 24  do_test wal-17.$
7e90: 74 6e 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65 20  tn.2 {.    file 
7ea0: 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d  size test.db.  }
7eb0: 20 35 31 32 0a 0a 20 20 64 6f 5f 74 65 73 74 20   512..  do_test 
7ec0: 77 61 6c 2d 31 37 2e 24 74 6e 2e 33 20 7b 0a 20  wal-17.$tn.3 {. 
7ed0: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
7ee0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7ef0: 62 0a 20 20 7d 20 5b 65 78 70 72 20 35 31 32 2a  b.  } [expr 512*
7f00: 31 37 31 5d 0a 7d 0a 73 71 6c 69 74 65 33 5f 74  171].}.sqlite3_t
7f10: 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64  est_control_pend
7f20: 69 6e 67 5f 62 79 74 65 20 24 6f 6c 64 5f 70 65  ing_byte $old_pe
7f30: 6e 64 69 6e 67 5f 62 79 74 65 0a 0a 23 2d 2d 2d  nding_byte..#---
7f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f80: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 74 65  ------.# This te
7f90: 73 74 20 2d 20 77 61 6c 2d 31 38 2e 2a 20 2d 20  st - wal-18.* - 
7fa0: 76 65 72 69 66 69 65 73 20 61 20 63 6f 75 70 6c  verifies a coupl
7fb0: 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 63 6f  e of specific co
7fc0: 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 0a 23 20  nditions that.# 
7fd0: 6d 61 79 20 62 65 20 65 6e 63 6f 75 6e 74 65 72  may be encounter
7fe0: 65 64 20 77 68 69 6c 65 20 72 65 63 6f 76 65 72  ed while recover
7ff0: 69 6e 67 20 61 20 6c 6f 67 20 66 69 6c 65 20 61  ing a log file a
8000: 72 65 20 68 61 6e 64 6c 65 64 20 63 6f 72 72 65  re handled corre
8010: 63 74 6c 79 3a 0a 23 0a 23 20 20 20 77 61 6c 2d  ctly:.#.#   wal-
8020: 31 38 2e 31 2e 2a 20 57 68 65 6e 20 74 68 65 20  18.1.* When the 
8030: 66 69 72 73 74 20 33 32 2d 62 69 74 73 20 6f 66  first 32-bits of
8040: 20 61 20 66 72 61 6d 65 20 63 68 65 63 6b 73 75   a frame checksu
8050: 6d 20 69 73 20 63 6f 72 72 65 63 74 20 62 75 74  m is correct but
8060: 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20   .#             
8070: 20 74 68 65 20 73 65 63 6f 6e 64 20 33 32 2d 62   the second 32-b
8080: 69 74 73 20 61 72 65 20 66 61 6c 73 65 2c 20 61  its are false, a
8090: 6e 64 0a 23 0a 23 20 20 20 77 61 6c 2d 31 38 2e  nd.#.#   wal-18.
80a0: 32 2e 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67  2.* When the pag
80b0: 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 74 68 61  e-size field tha
80c0: 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20  t occurs at the 
80d0: 73 74 61 72 74 20 6f 66 20 61 20 6c 6f 67 0a 23  start of a log.#
80e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
80f0: 6c 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66  le is a power of
8100: 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
8110: 31 36 33 38 34 20 6f 72 20 73 6d 61 6c 6c 65 72  16384 or smaller
8120: 20 74 68 61 6e 20 35 31 32 2e 0a 23 0a 66 6f 72   than 512..#.for
8130: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
8140: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
8150: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f  t.db-journal.do_
8160: 74 65 73 74 20 77 61 6c 2d 31 38 2e 30 20 7b 0a  test wal-18.0 {.
8170: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
8180: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
8190: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
81a0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
81b0: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
81c0: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52  cuum = 0;.    PR
81d0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
81e0: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 50 52 41  e = WAL;.    PRA
81f0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
8200: 3d 20 4f 46 46 3b 0a 0a 20 20 20 20 43 52 45 41  = OFF;..    CREA
8210: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
8220: 2c 20 55 4e 49 51 55 45 28 61 2c 20 62 29 29 3b  , UNIQUE(a, b));
8230: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
8240: 20 74 31 20 56 41 4c 55 45 53 28 30 2c 20 30 29   t1 VALUES(0, 0)
8250: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  ;.    PRAGMA wal
8260: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 0a 20 20  _checkpoint;..  
8270: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8280: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 20 20   VALUES(1, 2);  
8290: 20 20 20 20 20 20 20 20 2d 2d 20 66 72 61 6d 65          -- frame
82a0: 73 20 31 20 61 6e 64 20 32 0a 20 20 20 20 49 4e  s 1 and 2.    IN
82b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
82c0: 55 45 53 28 33 2c 20 34 29 3b 20 20 20 20 20 20  UES(3, 4);      
82d0: 20 20 20 20 2d 2d 20 66 72 61 6d 65 73 20 33 20      -- frames 3 
82e0: 61 6e 64 20 34 0a 20 20 20 20 49 4e 53 45 52 54  and 4.    INSERT
82f0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8300: 35 2c 20 36 29 3b 20 20 20 20 20 20 20 20 20 20  5, 6);          
8310: 2d 2d 20 66 72 61 6d 65 73 20 35 20 61 6e 64 20  -- frames 5 and 
8320: 36 0a 20 20 7d 0a 0a 20 20 66 6f 72 63 65 63 6f  6.  }..  forceco
8330: 70 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 58  py test.db testX
8340: 2e 64 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20  .db.  forcecopy 
8350: 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74  test.db-wal test
8360: 58 2e 64 62 2d 77 61 6c 0a 20 20 64 62 20 63 6c  X.db-wal.  db cl
8370: 6f 73 65 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65  ose.  list [file
8380: 20 73 69 7a 65 20 74 65 73 74 58 2e 64 62 5d 20   size testX.db] 
8390: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 58  [file size testX
83a0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
83b0: 20 5b 65 78 70 72 20 33 2a 31 30 32 34 5d 20 5b   [expr 3*1024] [
83c0: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 36 20  wal_file_size 6 
83d0: 31 30 32 34 5d 5d 0a 0a 75 6e 73 65 74 20 2d 6e  1024]]..unset -n
83e0: 6f 63 6f 6d 70 6c 61 69 6e 20 6e 46 72 61 6d 65  ocomplain nFrame
83f0: 20 72 65 73 75 6c 74 0a 66 6f 72 65 61 63 68 20   result.foreach 
8400: 7b 6e 46 72 61 6d 65 20 72 65 73 75 6c 74 7d 20  {nFrame result} 
8410: 7b 0a 20 20 20 20 20 20 20 20 20 30 20 20 20 20  {.         0    
8420: 20 20 7b 30 20 30 7d 0a 20 20 20 20 20 20 20 20    {0 0}.        
8430: 20 31 20 20 20 20 20 20 7b 30 20 30 7d 0a 20 20   1      {0 0}.  
8440: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 7b 30         2      {0
8450: 20 30 20 31 20 32 7d 0a 20 20 20 20 20 20 20 20   0 1 2}.        
8460: 20 33 20 20 20 20 20 20 7b 30 20 30 20 31 20 32   3      {0 0 1 2
8470: 7d 0a 20 20 20 20 20 20 20 20 20 34 20 20 20 20  }.         4    
8480: 20 20 7b 30 20 30 20 31 20 32 20 33 20 34 7d 0a    {0 0 1 2 3 4}.
8490: 20 20 20 20 20 20 20 20 20 35 20 20 20 20 20 20           5      
84a0: 7b 30 20 30 20 31 20 32 20 33 20 34 7d 0a 20 20  {0 0 1 2 3 4}.  
84b0: 20 20 20 20 20 20 20 36 20 20 20 20 20 20 7b 30         6      {0
84c0: 20 30 20 31 20 32 20 33 20 34 20 35 20 36 7d 0a   0 1 2 3 4 5 6}.
84d0: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  } {.  do_test wa
84e0: 6c 2d 31 38 2e 31 2e 24 6e 46 72 61 6d 65 20 7b  l-18.1.$nFrame {
84f0: 0a 20 20 20 20 66 6f 72 63 65 63 6f 70 79 20 74  .    forcecopy t
8500: 65 73 74 58 2e 64 62 20 74 65 73 74 2e 64 62 0a  estX.db test.db.
8510: 20 20 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65      forcecopy te
8520: 73 74 58 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e  stX.db-wal test.
8530: 64 62 2d 77 61 6c 0a 0a 20 20 20 20 68 65 78 69  db-wal..    hexi
8540: 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d  o_write test.db-
8550: 77 61 6c 20 5b 65 78 70 72 20 32 34 20 2b 20 24  wal [expr 24 + $
8560: 6e 46 72 61 6d 65 2a 28 32 34 2b 31 30 32 34 29  nFrame*(24+1024)
8570: 20 2b 20 32 30 5d 20 30 30 30 30 30 30 30 30 0a   + 20] 00000000.
8580: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20  .    sqlite3 db 
8590: 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63  test.db.    exec
85a0: 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c  sql { .      SEL
85b0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
85c0: 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65       PRAGMA inte
85d0: 67 72 69 74 79 5f 63 68 65 63 6b 3b 20 0a 20 20  grity_check; .  
85e0: 20 20 7d 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20    }.  } [concat 
85f0: 24 72 65 73 75 6c 74 20 6f 6b 5d 0a 20 20 64 62  $result ok].  db
8600: 20 63 6c 6f 73 65 0a 7d 20 0a 0a 70 72 6f 63 20   close.} ..proc 
8610: 72 61 6e 64 6f 6d 62 6c 6f 62 20 7b 70 67 73 7a  randomblob {pgsz
8620: 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 72 62  } {.  sqlite3 rb
8630: 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 73 65  db :memory:.  se
8640: 74 20 62 6c 6f 62 20 5b 72 62 64 62 20 6f 6e 65  t blob [rbdb one
8650: 20 7b 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62   {SELECT randomb
8660: 6c 6f 62 28 24 70 67 73 7a 29 7d 5d 0a 20 20 72  lob($pgsz)}].  r
8670: 62 64 62 20 63 6c 6f 73 65 0a 20 20 73 65 74 20  bdb close.  set 
8680: 62 6c 6f 62 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67  blob.}..proc log
8690: 63 6b 73 75 6d 20 7b 63 6b 76 31 20 63 6b 76 32  cksum {ckv1 ckv2
86a0: 20 62 6c 6f 62 7d 20 7b 0a 20 20 75 70 76 61 72   blob} {.  upvar
86b0: 20 24 63 6b 76 31 20 63 31 0a 20 20 75 70 76 61   $ckv1 c1.  upva
86c0: 72 20 24 63 6b 76 32 20 63 32 0a 0a 20 20 73 65  r $ckv2 c2..  se
86d0: 74 20 73 63 61 6e 70 61 74 74 65 72 6e 20 49 2a  t scanpattern I*
86e0: 0a 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c  .  if {$::tcl_pl
86f0: 61 74 66 6f 72 6d 28 62 79 74 65 4f 72 64 65 72  atform(byteOrder
8700: 29 20 65 71 20 22 6c 69 74 74 6c 65 45 6e 64 69  ) eq "littleEndi
8710: 61 6e 22 7d 20 7b 0a 20 20 20 20 73 65 74 20 73  an"} {.    set s
8720: 63 61 6e 70 61 74 74 65 72 6e 20 69 2a 0a 20 20  canpattern i*.  
8730: 7d 0a 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e  }..  binary scan
8740: 20 24 62 6c 6f 62 20 24 73 63 61 6e 70 61 74 74   $blob $scanpatt
8750: 65 72 6e 20 76 61 6c 75 65 73 0a 20 20 66 6f 72  ern values.  for
8760: 65 61 63 68 20 7b 76 31 20 76 32 7d 20 24 76 61  each {v1 v2} $va
8770: 6c 75 65 73 20 7b 0a 20 20 20 20 73 65 74 20 63  lues {.    set c
8780: 31 20 5b 65 78 70 72 20 7b 28 24 63 31 20 2b 20  1 [expr {($c1 + 
8790: 24 76 31 20 2b 20 24 63 32 29 26 30 78 46 46 46  $v1 + $c2)&0xFFF
87a0: 46 46 46 46 46 7d 5d 0a 20 20 20 20 73 65 74 20  FFFFF}].    set 
87b0: 63 32 20 5b 65 78 70 72 20 7b 28 24 63 32 20 2b  c2 [expr {($c2 +
87c0: 20 24 76 32 20 2b 20 24 63 31 29 26 30 78 46 46   $v2 + $c1)&0xFF
87d0: 46 46 46 46 46 46 7d 5d 0a 20 20 7d 0a 7d 0a 0a  FFFFFF}].  }.}..
87e0: 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64  forcecopy test.d
87f0: 62 20 74 65 73 74 58 2e 64 62 0a 66 6f 72 65 61  b testX.db.forea
8800: 63 68 20 7b 74 6e 20 70 67 73 7a 20 77 6f 72 6b  ch {tn pgsz work
8810: 73 7d 20 7b 20 0a 20 20 31 20 20 20 20 31 32 38  s} { .  1    128
8820: 20 20 20 20 30 0a 20 20 32 20 20 20 20 32 35 36      0.  2    256
8830: 20 20 20 20 30 0a 20 20 33 20 20 20 20 35 31 32      0.  3    512
8840: 20 20 20 20 31 0a 20 20 34 20 20 20 31 30 32 34      1.  4   1024
8850: 20 20 20 20 31 0a 20 20 35 20 20 20 32 30 34 38      1.  5   2048
8860: 20 20 20 20 31 0a 20 20 36 20 20 20 34 30 39 36      1.  6   4096
8870: 20 20 20 20 31 0a 20 20 37 20 20 20 38 31 39 32      1.  7   8192
8880: 20 20 20 20 31 0a 20 20 38 20 20 31 36 33 38 34      1.  8  16384
8890: 20 20 20 20 31 0a 20 20 39 20 20 33 32 37 36 38      1.  9  32768
88a0: 20 20 20 20 31 0a 20 31 30 20 20 36 35 35 33 36      1. 10  65536
88b0: 20 20 20 20 31 0a 20 31 31 20 31 33 31 30 37 32      1. 11 131072
88c0: 20 20 20 20 30 0a 20 31 31 20 20 20 31 30 31 36      0. 11   1016
88d0: 20 20 20 20 30 0a 7d 20 7b 0a 0a 20 20 69 66 20      0.} {..  if 
88e0: 7b 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50  {$::SQLITE_MAX_P
88f0: 41 47 45 5f 53 49 5a 45 20 3c 20 24 70 67 73 7a  AGE_SIZE < $pgsz
8900: 7d 20 7b 0a 20 20 20 20 73 65 74 20 77 6f 72 6b  } {.    set work
8910: 73 20 30 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b  s 0.  }..  for {
8920: 73 65 74 20 70 67 20 31 7d 20 7b 24 70 67 20 3c  set pg 1} {$pg <
8930: 3d 20 33 7d 20 7b 69 6e 63 72 20 70 67 7d 20 7b  = 3} {incr pg} {
8940: 0a 20 20 20 20 66 6f 72 63 65 63 6f 70 79 20 74  .    forcecopy t
8950: 65 73 74 58 2e 64 62 20 74 65 73 74 2e 64 62 0a  estX.db test.db.
8960: 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20      forcedelete 
8970: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 0a 20  test.db-wal.  . 
8980: 20 20 20 23 20 43 68 65 63 6b 20 74 68 61 74 20     # Check that 
8990: 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 6f 77  the database now
89a0: 20 65 78 69 73 74 73 20 61 6e 64 20 63 6f 6e 73   exists and cons
89b0: 69 73 74 73 20 6f 66 20 74 68 72 65 65 20 70 61  ists of three pa
89c0: 67 65 73 2e 20 41 6e 64 0a 20 20 20 20 23 20 74  ges. And.    # t
89d0: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
89e0: 61 73 73 6f 63 69 61 74 65 64 20 77 61 6c 20 66  associated wal f
89f0: 69 6c 65 2e 0a 20 20 20 20 23 0a 20 20 20 20 64  ile..    #.    d
8a00: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e  o_test wal-18.2.
8a10: 24 74 6e 2e 24 70 67 2e 31 20 7b 20 66 69 6c 65  $tn.$pg.1 { file
8a20: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
8a30: 77 61 6c 20 7d 20 30 0a 20 20 20 20 64 6f 5f 74  wal } 0.    do_t
8a40: 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e  est wal-18.2.$tn
8a50: 2e 24 70 67 2e 32 20 7b 20 66 69 6c 65 20 65 78  .$pg.2 { file ex
8a60: 69 73 74 73 20 74 65 73 74 2e 64 62 20 7d 20 31  ists test.db } 1
8a70: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
8a80: 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 33 20  -18.2.$tn.$pg.3 
8a90: 7b 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74  { file size test
8aa0: 2e 64 62 20 7d 20 5b 65 78 70 72 20 31 30 32 34  .db } [expr 1024
8ab0: 2a 33 5d 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65  *3].  .    do_te
8ac0: 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e  st wal-18.2.$tn.
8ad0: 24 70 67 2e 34 20 7b 0a 0a 20 20 20 20 20 20 23  $pg.4 {..      #
8ae0: 20 43 72 65 61 74 65 20 61 20 77 61 6c 20 66 69   Create a wal fi
8af0: 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
8b00: 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65 20   a single frame 
8b10: 28 64 61 74 61 62 61 73 65 20 70 61 67 65 0a 20  (database page. 
8b20: 20 20 20 20 20 23 20 6e 75 6d 62 65 72 20 24 70       # number $p
8b30: 67 29 20 77 69 74 68 20 74 68 65 20 63 6f 6d 6d  g) with the comm
8b40: 69 74 20 66 6c 61 67 20 73 65 74 2e 20 54 68 65  it flag set. The
8b50: 20 66 72 61 6d 65 20 63 68 65 63 6b 73 75 6d 20   frame checksum 
8b60: 69 73 0a 20 20 20 20 20 20 23 20 63 6f 72 72 65  is.      # corre
8b70: 63 74 2c 20 62 75 74 20 74 68 65 20 63 6f 6e 74  ct, but the cont
8b80: 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74 61  ents of the data
8b90: 62 61 73 65 20 70 61 67 65 20 61 72 65 20 63 6f  base page are co
8ba0: 72 72 75 70 74 2e 0a 20 20 20 20 20 20 23 0a 20  rrupt..      #. 
8bb0: 20 20 20 20 20 23 20 54 68 65 20 70 61 67 65 2d       # The page-
8bc0: 73 69 7a 65 20 69 6e 20 74 68 65 20 6c 6f 67 20  size in the log 
8bd0: 66 69 6c 65 20 68 65 61 64 65 72 20 69 73 20 73  file header is s
8be0: 65 74 20 74 6f 20 24 70 67 73 7a 2e 20 49 66 20  et to $pgsz. If 
8bf0: 74 68 65 0a 20 20 20 20 20 20 23 20 57 41 4c 20  the.      # WAL 
8c00: 63 6f 64 65 20 63 6f 6e 73 69 64 65 72 73 20 24  code considers $
8c10: 70 67 73 7a 20 74 6f 20 62 65 20 61 20 76 61 6c  pgsz to be a val
8c20: 69 64 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  id SQLite databa
8c30: 73 65 20 66 69 6c 65 20 70 61 67 65 2d 73 69 7a  se file page-siz
8c40: 65 2c 0a 20 20 20 20 20 20 23 20 74 68 65 20 64  e,.      # the d
8c50: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20  atabase will be 
8c60: 63 6f 72 72 75 70 74 20 28 62 65 63 61 75 73 65  corrupt (because
8c70: 20 74 68 65 20 67 61 72 62 61 67 65 20 66 72 61   the garbage fra
8c80: 6d 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20  me contents.    
8c90: 20 20 23 20 77 69 6c 6c 20 62 65 20 74 72 65 61    # will be trea
8ca0: 74 65 64 20 61 73 20 76 61 6c 69 64 20 63 6f 6e  ted as valid con
8cb0: 74 65 6e 74 29 2e 20 49 66 20 24 70 67 73 7a 20  tent). If $pgsz 
8cc0: 69 73 20 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20  is invalid (too 
8cd0: 73 6d 61 6c 6c 0a 20 20 20 20 20 20 23 20 6f 72  small.      # or
8ce0: 20 74 6f 6f 20 6c 61 72 67 65 29 2c 20 74 68 65   too large), the
8cf0: 20 64 62 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   db will not be 
8d00: 63 6f 72 72 75 70 74 20 61 73 20 74 68 65 20 6c  corrupt as the l
8d10: 6f 67 20 66 69 6c 65 20 77 69 6c 6c 0a 20 20 20  og file will.   
8d20: 20 20 20 23 20 62 65 20 69 67 6e 6f 72 65 64 2e     # be ignored.
8d30: 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 73  .      #.      s
8d40: 65 74 20 77 61 6c 68 64 72 20 5b 62 69 6e 61 72  et walhdr [binar
8d50: 79 20 66 6f 72 6d 61 74 20 49 49 49 49 49 49 20  y format IIIIII 
8d60: 39 33 31 30 37 31 36 31 38 20 33 30 30 37 30 30  931071618 300700
8d70: 30 20 24 70 67 73 7a 20 31 32 33 34 20 32 32 20  0 $pgsz 1234 22 
8d80: 32 33 5d 0a 20 20 20 20 20 20 73 65 74 20 66 72  23].      set fr
8d90: 61 6d 65 62 6f 64 79 20 5b 72 61 6e 64 6f 6d 62  amebody [randomb
8da0: 6c 6f 62 20 24 70 67 73 7a 5d 0a 20 20 20 20 20  lob $pgsz].     
8db0: 20 73 65 74 20 66 72 61 6d 65 68 64 72 20 20 5b   set framehdr  [
8dc0: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49  binary format II
8dd0: 49 49 20 24 70 67 20 35 20 32 32 20 32 33 5d 0a  II $pg 5 22 23].
8de0: 20 20 20 20 20 20 73 65 74 20 63 31 20 30 0a 20        set c1 0. 
8df0: 20 20 20 20 20 73 65 74 20 63 32 20 30 0a 20 20       set c2 0.  
8e00: 20 20 20 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20      logcksum c1 
8e10: 63 32 20 24 77 61 6c 68 64 72 0a 0a 20 20 20 20  c2 $walhdr..    
8e20: 20 20 61 70 70 65 6e 64 20 77 61 6c 68 64 72 20    append walhdr 
8e30: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49  [binary format I
8e40: 49 20 24 63 31 20 24 63 32 5d 0a 20 20 20 20 20  I $c1 $c2].     
8e50: 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20   logcksum c1 c2 
8e60: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 66  [string range $f
8e70: 72 61 6d 65 68 64 72 20 30 20 37 5d 0a 20 20 20  ramehdr 0 7].   
8e80: 20 20 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63     logcksum c1 c
8e90: 32 20 24 66 72 61 6d 65 62 6f 64 79 0a 20 20 20  2 $framebody.   
8ea0: 20 20 20 73 65 74 20 66 72 61 6d 65 68 64 72 20     set framehdr 
8eb0: 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49  [binary format I
8ec0: 49 49 49 49 49 20 24 70 67 20 35 20 32 32 20 32  IIIII $pg 5 22 2
8ed0: 33 20 24 63 31 20 24 63 32 5d 0a 0a 20 20 20 20  3 $c1 $c2]..    
8ee0: 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74    set fd [open t
8ef0: 65 73 74 2e 64 62 2d 77 61 6c 20 77 5d 0a 20 20  est.db-wal w].  
8f00: 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20 24      fconfigure $
8f10: 66 64 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e  fd -encoding bin
8f20: 61 72 79 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  ary -translation
8f30: 20 62 69 6e 61 72 79 0a 20 20 20 20 20 20 70 75   binary.      pu
8f40: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
8f50: 64 20 24 77 61 6c 68 64 72 0a 20 20 20 20 20 20  d $walhdr.      
8f60: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
8f70: 24 66 64 20 24 66 72 61 6d 65 68 64 72 0a 20 20  $fd $framehdr.  
8f80: 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c      puts -nonewl
8f90: 69 6e 65 20 24 66 64 20 24 66 72 61 6d 65 62 6f  ine $fd $framebo
8fa0: 64 79 0a 20 20 20 20 20 20 63 6c 6f 73 65 20 24  dy.      close $
8fb0: 66 64 0a 20 20 0a 20 20 20 20 20 20 66 69 6c 65  fd.  .      file
8fc0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
8fd0: 6c 0a 20 20 20 20 7d 20 5b 77 61 6c 5f 66 69 6c  l.    } [wal_fil
8fe0: 65 5f 73 69 7a 65 20 31 20 24 70 67 73 7a 5d 0a  e_size 1 $pgsz].
8ff0: 20 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77    .    do_test w
9000: 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e  al-18.2.$tn.$pg.
9010: 35 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  5 {.      sqlite
9020: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
9030: 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63 68     set rc [catch
9040: 20 7b 20 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d   { db one {PRAGM
9050: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
9060: 6b 7d 20 7d 20 6d 73 67 5d 0a 20 20 20 20 20 20  k} } msg].      
9070: 65 78 70 72 20 7b 20 24 72 63 21 3d 30 20 7c 7c  expr { $rc!=0 ||
9080: 20 24 6d 73 67 21 3d 22 6f 6b 22 20 7d 0a 20 20   $msg!="ok" }.  
9090: 20 20 7d 20 24 77 6f 72 6b 73 0a 20 20 0a 20 20    } $works.  .  
90a0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d    db close.  }.}
90b0: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
9100: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73  he following tes
9110: 74 20 2d 20 77 61 6c 2d 31 39 2e 2a 20 2d 20 66  t - wal-19.* - f
9120: 69 78 65 73 20 61 20 62 75 67 20 74 68 61 74 20  ixes a bug that 
9130: 77 61 73 20 70 72 65 73 65 6e 74 20 64 75 72 69  was present duri
9140: 6e 67 0a 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74  ng.# development
9150: 2e 0a 23 0a 23 20 57 68 65 6e 20 61 20 64 61 74  ..#.# When a dat
9160: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
9170: 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20 69 73 20   in WAL mode is 
9180: 63 6c 6f 73 65 64 2c 20 69 74 20 61 74 74 65 6d  closed, it attem
9190: 70 74 73 20 61 6e 0a 23 20 45 58 43 4c 55 53 49  pts an.# EXCLUSI
91a0: 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
91b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
91c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74   the lock is obt
91d0: 61 69 6e 65 64 2c 20 74 68 65 0a 23 20 63 6f 6e  ained, the.# con
91e0: 6e 65 63 74 69 6f 6e 20 6b 6e 6f 77 73 20 74 68  nection knows th
91f0: 61 74 20 69 74 20 69 73 20 74 68 65 20 6c 61 73  at it is the las
9200: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  t connection to 
9210: 64 69 73 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 0a  disconnect from.
9220: 23 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  # the database, 
9230: 73 6f 20 69 74 20 72 75 6e 73 20 61 20 63 68 65  so it runs a che
9240: 63 6b 70 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f  ckpoint operatio
9250: 6e 2e 20 54 68 65 20 62 75 67 20 77 61 73 20 74  n. The bug was t
9260: 68 61 74 0a 23 20 74 68 65 20 63 6f 6e 6e 65 63  hat.# the connec
9270: 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 75 70 64  tion was not upd
9280: 61 74 69 6e 67 20 69 74 73 20 70 72 69 76 61 74  ating its privat
9290: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 77 61  e copy of the wa
92a0: 6c 2d 69 6e 64 65 78 20 0a 23 20 68 65 61 64 65  l-index .# heade
92b0: 72 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 73  r before doing s
92c0: 6f 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  o, meaning that 
92d0: 69 74 20 63 6f 75 6c 64 20 63 68 65 63 6b 70 6f  it could checkpo
92e0: 69 6e 74 20 61 6e 20 6f 6c 64 0a 23 20 73 6e 61  int an old.# sna
92f0: 70 73 68 6f 74 2e 0a 23 0a 64 6f 5f 74 65 73 74  pshot..#.do_test
9300: 20 77 61 6c 2d 31 39 2e 31 20 7b 0a 20 20 66 6f   wal-19.1 {.  fo
9310: 72 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64  rcedelete test.d
9320: 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  b test.db-wal te
9330: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  st.db-journal.  
9340: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
9350: 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32  db.  sqlite3 db2
9360: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
9370: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
9380: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
9390: 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  AL;.    CREATE T
93a0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
93b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
93c0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
93d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
93e0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
93f0: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
9400: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
9410: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33  1 } db2.} {1 2 3
9420: 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   4}.do_test wal-
9430: 31 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  19.2 {.  execsql
9440: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
9450: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
9460: 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  6);.    SELECT *
9470: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
9480: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f  {1 2 3 4 5 6}.do
9490: 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e 33 20 7b  _test wal-19.3 {
94a0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62  .  db close.  db
94b0: 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65  2 close.  file e
94c0: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61  xists test.db-wa
94d0: 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20  l.} {0}.do_test 
94e0: 77 61 6c 2d 31 39 2e 34 20 7b 0a 20 20 23 20 57  wal-19.4 {.  # W
94f0: 68 65 6e 20 74 68 65 20 62 75 67 20 77 61 73 20  hen the bug was 
9500: 70 72 65 73 65 6e 74 2c 20 74 68 65 20 66 6f 6c  present, the fol
9510: 6c 6f 77 69 6e 67 20 77 61 73 20 72 65 74 75 72  lowing was retur
9520: 6e 69 6e 67 20 7b 31 20 32 20 33 20 34 7d 20 6f  ning {1 2 3 4} o
9530: 6e 6c 79 2c 0a 20 20 23 20 61 73 20 5b 64 62 32  nly,.  # as [db2
9540: 5d 20 68 61 64 20 61 6e 20 6f 75 74 2d 6f 66 2d  ] had an out-of-
9550: 64 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68 65  date copy of the
9560: 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65   wal-index heade
9570: 72 20 77 68 65 6e 20 69 74 20 77 61 73 0a 20 20  r when it was.  
9580: 23 20 63 6c 6f 73 65 64 2e 0a 20 20 23 0a 20 20  # closed..  #.  
9590: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
95a0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
95b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
95c0: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  }.} {1 2 3 4 5 6
95d0: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
95e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
95f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
9620: 54 68 69 73 20 74 65 73 74 20 2d 20 77 61 6c 2d  This test - wal-
9630: 32 30 2e 2a 20 2d 20 75 73 65 73 20 74 77 6f 20  20.* - uses two 
9640: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 4f 6e 65  connections. One
9650: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
9660: 20 61 6e 64 0a 23 20 74 68 65 20 6f 74 68 65 72   and.# the other
9670: 20 69 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20   in an external 
9680: 70 72 6f 63 65 73 73 2e 20 54 68 65 20 70 72 6f  process. The pro
9690: 63 65 64 75 72 65 20 69 73 3a 0a 23 0a 23 20 20  cedure is:.#.#  
96a0: 20 31 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63   1. Using connec
96b0: 74 69 6f 6e 20 31 2c 20 63 72 65 61 74 65 20 74  tion 1, create t
96c0: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
96d0: 6d 61 2e 0a 23 0a 23 20 20 20 32 2e 20 55 73 69  ma..#.#   2. Usi
96e0: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20  ng connection 2 
96f0: 28 69 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20  (in an external 
9700: 70 72 6f 63 65 73 73 29 2c 20 61 64 64 20 73 6f  process), add so
9710: 20 6d 75 63 68 0a 23 20 20 20 20 20 20 64 61 74   much.#      dat
9720: 61 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  a to the databas
9730: 65 20 77 69 74 68 6f 75 74 20 63 68 65 63 6b 70  e without checkp
9740: 6f 69 6e 74 69 6e 67 20 74 68 61 74 20 61 20 77  ointing that a w
9750: 61 6c 2d 69 6e 64 65 78 20 0a 23 20 20 20 20 20  al-index .#     
9760: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34 4b   larger than 64K
9770: 42 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 23  B is required..#
9780: 0a 23 20 20 20 33 2e 20 55 73 69 6e 67 20 63 6f  .#   3. Using co
9790: 6e 6e 65 63 74 69 6f 6e 20 31 2c 20 63 68 65 63  nnection 1, chec
97a0: 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62  kpoint the datab
97b0: 61 73 65 2e 20 4d 61 6b 65 20 73 75 72 65 20 61  ase. Make sure a
97c0: 6c 6c 0a 23 20 20 20 20 20 20 74 68 65 20 64 61  ll.#      the da
97d0: 74 61 20 69 73 20 70 72 65 73 65 6e 74 20 61 6e  ta is present an
97e0: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  d the database i
97f0: 73 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e 0a 23  s not corrupt..#
9800: 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c  .# At one point,
9810: 20 53 51 4c 69 74 65 20 77 61 73 20 66 61 69 6c   SQLite was fail
9820: 69 6e 67 20 74 6f 20 67 72 6f 77 20 74 68 65 20  ing to grow the 
9830: 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65 20 77  mapping of the w
9840: 61 6c 2d 69 6e 64 65 78 0a 23 20 66 69 6c 65 20  al-index.# file 
9850: 69 6e 20 73 74 65 70 20 33 20 61 6e 64 20 74 68  in step 3 and th
9860: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 61 73  e checkpoint was
9870: 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20   corrupting the 
9880: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23  database file..#
9890: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e  .do_test wal-20.
98a0: 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20  1 {.  catch {db 
98b0: 63 6c 6f 73 65 7d 0a 20 20 66 6f 72 63 65 64 65  close}.  forcede
98c0: 6c 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73  lete test.db tes
98d0: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  t.db-wal test.db
98e0: 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74  -journal.  sqlit
98f0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
9900: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
9910: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
9920: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45  e = WAL;.    CRE
9930: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
9940: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
9950: 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
9960: 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20  mblob(900));.   
9970: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
9980: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
9990: 7b 77 61 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20  {wal 1}.do_test 
99a0: 77 61 6c 2d 32 30 2e 32 20 7b 0a 20 20 73 65 74  wal-20.2 {.  set
99b0: 20 3a 3a 62 75 64 64 79 20 5b 6c 61 75 6e 63 68   ::buddy [launch
99c0: 5f 74 65 73 74 66 69 78 74 75 72 65 5d 0a 20 20  _testfixture].  
99d0: 74 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a 62  testfixture $::b
99e0: 75 64 64 79 20 7b 0a 20 20 20 20 73 71 6c 69 74  uddy {.    sqlit
99f0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
9a00: 20 20 64 62 20 74 72 61 6e 73 61 63 74 69 6f 6e    db transaction
9a10: 20 7b 20 64 62 20 65 76 61 6c 20 7b 0a 20 20 20   { db eval {.   
9a20: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 61 75     PRAGMA wal_au
9a30: 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 3d 20 30  tocheckpoint = 0
9a40: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
9a50: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9a60: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9a70: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9a80: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
9a90: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9aa0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9ab0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9ac0: 2f 2a 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  /* 4 */.      IN
9ad0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
9ae0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
9af0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
9b00: 20 20 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 20     /* 8 */.     
9b10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9b20: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9b30: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9b40: 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20        /* 16 */. 
9b50: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9b60: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9b70: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
9b80: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32 20  t1;       /* 32 
9b90: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
9ba0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9bb0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9bc0: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9bd0: 20 36 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   64 */.      INS
9be0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9bf0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9c00: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9c10: 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20    /* 128 */.    
9c20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9c30: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9c40: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9c50: 20 20 20 20 20 20 20 2f 2a 20 32 35 36 20 2a 2f         /* 256 */
9c60: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9c70: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
9c80: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
9c90: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 35  M t1;       /* 5
9ca0: 31 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  12 */.      INSE
9cb0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
9cc0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
9cd0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
9ce0: 20 2f 2a 20 31 30 32 34 20 2a 2f 0a 20 20 20 20   /* 1024 */.    
9cf0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9d00: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9d10: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9d20: 20 20 20 20 20 20 20 2f 2a 20 32 30 34 38 20 2a         /* 2048 *
9d30: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9d40: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9d50: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9d60: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9d70: 34 30 39 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e  4096 */.      IN
9d80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
9d90: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
9da0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
9db0: 20 20 20 2f 2a 20 38 31 39 32 20 2a 2f 0a 20 20     /* 8192 */.  
9dc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9dd0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9de0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
9df0: 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 36 33 38  1;       /* 1638
9e00: 34 20 2a 2f 0a 20 20 20 20 7d 20 7d 0a 20 20 7d  4 */.    } }.  }
9e10: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {0}.do_test w
9e20: 61 6c 2d 32 30 2e 33 20 7b 0a 20 20 63 6c 6f 73  al-20.3 {.  clos
9e30: 65 20 24 3a 3a 62 75 64 64 79 0a 20 20 65 78 65  e $::buddy.  exe
9e40: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
9e50: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
9e60: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9e70: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9e80: 74 31 20 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 64  t1 }.} {16384}.d
9e90: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 34 20  o_test wal-20.4 
9ea0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
9eb0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
9ec0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
9ed0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9ee0: 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 36 33 38 34  OM t1 }.} {16384
9ef0: 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  }.integrity_chec
9f00: 6b 20 77 61 6c 2d 32 30 2e 35 0a 0a 63 61 74 63  k wal-20.5..catc
9f10: 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a  h { db2 close }.
9f20: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
9f30: 20 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   }..do_test wal-
9f40: 32 31 2e 31 20 7b 0a 20 20 66 61 75 6c 74 73 69  21.1 {.  faultsi
9f50: 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72 65 6f  m_delete_and_reo
9f60: 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  pen.  execsql { 
9f70: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
9f80: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
9f90: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
9fa0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
9fb0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
9fc0: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20  LUES(1, 2);.    
9fd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
9fe0: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20  ALUES(3, 4);.   
9ff0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
a000: 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a 20 20  VALUES(5, 6);.  
a010: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a020: 20 56 41 4c 55 45 53 28 37 2c 20 38 29 3b 0a 20   VALUES(7, 8);. 
a030: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a040: 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 3b  1 VALUES(9, 10);
a050: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a060: 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31   t1 VALUES(11, 1
a070: 32 29 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 7d 0a  2);.  }.} {wal}.
a080: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 32  do_test wal-21.2
a090: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
a0a0: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
a0b0: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
a0c0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
a0d0: 70 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e  point;.    BEGIN
a0e0: 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
a0f0: 54 20 73 3b 0a 20 20 20 20 20 20 20 20 49 4e 53  T s;.        INS
a100: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
a110: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
a120: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  0), randomblob(9
a130: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
a140: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
a150: 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  ;.    COMMIT;.  
a160: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
a170: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
a180: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
a190: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a  7 8 9 10 11 12}.
a1a0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 33  do_test wal-21.3
a1b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
a1c0: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
a1d0: 63 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a  check }.} {ok}..
a1e0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
a1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73  ----------.# Tes
a230: 74 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72  t reading and wr
a240: 69 74 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73  iting of databas
a250: 65 73 20 77 69 74 68 20 64 69 66 66 65 72 65 6e  es with differen
a260: 74 20 70 61 67 65 2d 73 69 7a 65 73 2e 0a 23 0a  t page-sizes..#.
a270: 66 6f 72 65 61 63 68 20 70 67 73 7a 20 7b 35 31  foreach pgsz {51
a280: 32 20 31 30 32 34 20 32 30 34 38 20 34 30 39 36  2 1024 2048 4096
a290: 20 38 31 39 32 20 31 36 33 38 34 20 33 32 37 36   8192 16384 3276
a2a0: 38 20 36 35 35 33 36 7d 20 7b 0a 20 20 64 6f 5f  8 65536} {.  do_
a2b0: 6d 75 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74  multiclient_test
a2c0: 20 74 6e 20 5b 73 74 72 69 6e 67 20 6d 61 70 20   tn [string map 
a2d0: 5b 6c 69 73 74 20 25 50 47 53 5a 25 20 24 70 67  [list %PGSZ% $pg
a2e0: 73 7a 5d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  sz] {.    do_tes
a2f0: 74 20 77 61 6c 2d 32 32 2e 25 50 47 53 5a 25 2e  t wal-22.%PGSZ%.
a300: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 71  $tn.1 {.      sq
a310: 6c 31 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41  l1 {.        PRA
a320: 47 4d 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69  GMA main.page_si
a330: 7a 65 20 3d 20 25 50 47 53 5a 25 3b 0a 20 20 20  ze = %PGSZ%;.   
a340: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f       PRAGMA auto
a350: 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20  _vacuum = 0;.   
a360: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
a370: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
a380: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
a390: 41 42 4c 45 20 74 31 28 78 20 55 4e 49 51 55 45  ABLE t1(x UNIQUE
a3a0: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
a3b0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
a3c0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29   randomblob(800)
a3d0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
a3e0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a3f0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b  randomblob(800);
a400: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
a410: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
a420: 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a  andomblob(800);.
a430: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77        }.    } {w
a440: 61 6c 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  al}.    do_test 
a450: 77 61 6c 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74  wal-22.%PGSZ%.$t
a460: 6e 2e 32 20 7b 20 73 71 6c 32 20 7b 20 50 52 41  n.2 { sql2 { PRA
a470: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
a480: 65 63 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 20  eck } } {ok}.   
a490: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 32 2e   do_test wal-22.
a4a0: 25 50 47 53 5a 25 2e 24 74 6e 2e 33 20 7b 0a 20  %PGSZ%.$tn.3 {. 
a4b0: 20 20 20 20 20 73 71 6c 31 20 7b 50 52 41 47 4d       sql1 {PRAGM
a4c0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
a4d0: 7d 0a 20 20 20 20 20 20 65 78 70 72 20 7b 5b 66  }.      expr {[f
a4e0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
a4f0: 5d 20 25 20 25 50 47 53 5a 25 7d 0a 20 20 20 20  ] % %PGSZ%}.    
a500: 7d 20 7b 30 7d 0a 20 20 7d 5d 0a 7d 0a 0a 23 2d  } {0}.  }].}..#-
a510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a550: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
a560: 74 68 61 74 20 77 68 65 6e 20 31 20 6f 72 20 6d  that when 1 or m
a570: 6f 72 65 20 70 61 67 65 73 20 61 72 65 20 72 65  ore pages are re
a580: 63 6f 76 65 72 65 64 20 66 72 6f 6d 20 61 20 57  covered from a W
a590: 41 4c 20 66 69 6c 65 2c 20 0a 23 20 73 71 6c 69  AL file, .# sqli
a5a0: 74 65 33 5f 6c 6f 67 28 29 20 69 73 20 69 6e 76  te3_log() is inv
a5b0: 6f 6b 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  oked to report t
a5c0: 68 69 73 20 74 6f 20 74 68 65 20 75 73 65 72 2e  his to the user.
a5d0: 0a 23 0a 73 65 74 20 77 61 6c 66 69 6c 65 20 5b  .#.set walfile [
a5e0: 66 69 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20  file nativename 
a5f0: 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 67 65 74 5f  [file join [get_
a600: 70 77 64 5d 20 74 65 73 74 2e 64 62 2d 77 61 6c  pwd] test.db-wal
a610: 5d 5d 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  ]].catch {db clo
a620: 73 65 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  se}.forcedelete 
a630: 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20  test.db.do_test 
a640: 77 61 6c 2d 32 33 2e 31 20 7b 0a 20 20 66 61 75  wal-23.1 {.  fau
a650: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
a660: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
a670: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
a680: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
a690: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
a6a0: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
a6b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a6c0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
a6d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a6e0: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
a6f0: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
a700: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 20  ave_and_close.. 
a710: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
a720: 6e 0a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33  n.  test_sqlite3
a730: 5f 6c 6f 67 20 5b 6c 69 73 74 20 6c 61 70 70 65  _log [list lappe
a740: 6e 64 20 3a 3a 6c 6f 67 5d 0a 20 20 73 65 74 20  nd ::log].  set 
a750: 3a 3a 6c 6f 67 20 5b 6c 69 73 74 5d 0a 20 20 73  ::log [list].  s
a760: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
a770: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
a780: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
a790: 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f  .} {1 2 3 4}.do_
a7a0: 74 65 73 74 20 77 61 6c 2d 32 33 2e 32 20 7b 20  test wal-23.2 { 
a7b0: 73 65 74 20 3a 3a 6c 6f 67 20 7d 20 7b 7d 0a 0a  set ::log } {}..
a7c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e 33  do_test wal-23.3
a7d0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
a7e0: 73 65 74 20 3a 3a 6c 6f 67 20 5b 6c 69 73 74 5d  set ::log [list]
a7f0: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
a800: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
a810: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
a820: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
a830: 7b 31 20 32 20 33 20 34 7d 0a 73 65 74 20 6e 50  {1 2 3 4}.set nP
a840: 61 67 65 20 5b 65 78 70 72 20 32 2b 24 41 55 54  age [expr 2+$AUT
a850: 4f 56 41 43 55 55 4d 5d 0a 64 6f 5f 74 65 73 74  OVACUUM].do_test
a860: 20 77 61 6c 2d 32 33 2e 34 20 7b 20 0a 20 20 73   wal-23.4 { .  s
a870: 65 74 20 3a 3a 6c 6f 67 20 0a 7d 20 5b 6c 69 73  et ::log .} [lis
a880: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 22 52 65 63  t SQLITE_OK "Rec
a890: 6f 76 65 72 65 64 20 24 6e 50 61 67 65 20 66 72  overed $nPage fr
a8a0: 61 6d 65 73 20 66 72 6f 6d 20 57 41 4c 20 66 69  ames from WAL fi
a8b0: 6c 65 20 24 77 61 6c 66 69 6c 65 22 5d 0a 0a 0a  le $walfile"]...
a8c0: 69 66 63 61 70 61 62 6c 65 20 61 75 74 6f 76 61  ifcapable autova
a8d0: 63 75 75 6d 20 7b 0a 20 20 23 20 54 68 69 73 20  cuum {.  # This 
a8e0: 62 6c 6f 63 6b 20 74 65 73 74 73 20 74 68 61 74  block tests that
a8f0: 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   if the size of 
a900: 61 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65  a database is re
a910: 64 75 63 65 64 20 62 79 20 61 20 0a 20 20 23 20  duced by a .  # 
a920: 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 62 65 63  transaction (bec
a930: 61 75 73 65 20 6f 66 20 61 6e 20 69 6e 63 72 65  ause of an incre
a940: 6d 65 6e 74 61 6c 20 6f 72 20 61 75 74 6f 2d 76  mental or auto-v
a950: 61 63 75 75 6d 29 2c 20 74 68 61 74 20 6e 6f 0a  acuum), that no.
a960: 20 20 23 20 64 61 74 61 20 69 73 20 77 72 69 74    # data is writ
a970: 74 65 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66  ten to the WAL f
a980: 69 6c 65 20 66 6f 72 20 74 68 65 20 74 72 75 6e  ile for the trun
a990: 63 61 74 65 64 20 70 61 67 65 73 20 61 73 20 70  cated pages as p
a9a0: 61 72 74 0a 20 20 23 20 6f 66 20 74 68 65 20 63  art.  # of the c
a9b0: 6f 6d 6d 69 74 2e 20 65 2e 67 2e 20 69 66 20 61  ommit. e.g. if a
a9c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 64   transaction red
a9d0: 75 63 65 73 20 74 68 65 20 73 69 7a 65 20 6f 66  uces the size of
a9e0: 20 61 20 64 61 74 61 62 61 73 65 0a 20 20 23 20   a database.  # 
a9f0: 74 6f 20 4e 20 70 61 67 65 73 2c 20 64 61 74 61  to N pages, data
aa00: 20 66 6f 72 20 70 61 67 65 20 4e 2b 31 20 73 68   for page N+1 sh
aa10: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
aa20: 74 65 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66  ten to the WAL f
aa30: 69 6c 65 20 0a 20 20 23 20 77 68 65 6e 20 63 6f  ile .  # when co
aa40: 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74 72 61  mmitting the tra
aa50: 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 6f 6e 65  nsaction. At one
aa60: 20 70 6f 69 6e 74 20 73 75 63 68 20 64 61 74 61   point such data
aa70: 20 77 61 73 20 62 65 69 6e 67 20 0a 20 20 23 20   was being .  # 
aa80: 77 72 69 74 74 65 6e 2e 0a 20 20 23 0a 20 20 63  written..  #.  c
aa90: 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a  atch {db close}.
aaa0: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
aab0: 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20  st.db.  sqlite3 
aac0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f  db test.db.  do_
aad0: 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32 34 2e  execsql_test 24.
aae0: 31 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  1 {.    PRAGMA a
aaf0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a  uto_vacuum = 2;.
ab00: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
ab10: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
ab20: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
ab30: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
ab40: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
ab50: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
ab60: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
ab70: 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 30 29 29 3b  ndomblob(5000));
ab80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
ab90: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
aba0: 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54  M t1;.    INSERT
abb0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
abc0: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49  * FROM t1;.    I
abd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
abe0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
abf0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
ac00: 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  t1 SELECT * FROM
ac10: 20 74 31 3b 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20   t1;.  } {wal}. 
ac20: 20 64 6f 5f 74 65 73 74 20 32 34 2e 32 20 7b 20   do_test 24.2 { 
ac30: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
ac40: 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d       DELETE FROM
ac50: 20 74 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d   t1;.      PRAGM
ac60: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
ac70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 20 63  ;.    }.    db c
ac80: 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  lose.    sqlite3
ac90: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20   db test.db.    
aca0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
acb0: 2e 64 62 2d 77 61 6c 0a 20 20 7d 20 30 0a 20 20  .db-wal.  } 0.  
acc0: 64 6f 5f 74 65 73 74 20 32 34 2e 33 20 7b 0a 20  do_test 24.3 {. 
acd0: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
ace0: 74 2e 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 38  t.db.  } [expr 8
acf0: 34 20 2a 20 31 30 32 34 5d 0a 20 20 64 6f 5f 74  4 * 1024].  do_t
ad00: 65 73 74 20 32 34 2e 34 20 7b 0a 20 20 20 20 65  est 24.4 {.    e
ad10: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20  xecsql { .      
ad20: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
ad30: 65 20 3d 20 32 30 30 3b 0a 20 20 20 20 20 20 50  e = 200;.      P
ad40: 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61  RAGMA incrementa
ad50: 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20  l_vacuum;.      
ad60: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
ad70: 70 6f 69 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  point;.    }.   
ad80: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
ad90: 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 33 20 2a  db.  } [expr 3 *
ada0: 20 31 30 32 34 5d 0a 0a 20 20 23 20 57 41 4c 20   1024]..  # WAL 
adb0: 66 69 6c 65 20 6e 6f 77 20 63 6f 6e 74 61 69 6e  file now contain
adc0: 73 20 61 20 73 69 6e 67 6c 65 20 66 72 61 6d 65  s a single frame
add0: 20 2d 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 20   - the new root 
ade0: 70 61 67 65 20 66 6f 72 20 74 61 62 6c 65 20 74  page for table t
adf0: 31 2e 0a 20 20 23 20 49 74 20 77 6f 75 6c 64 20  1..  # It would 
ae00: 62 65 20 74 77 6f 20 66 72 61 6d 65 73 20 28 74  be two frames (t
ae10: 68 65 20 6e 65 77 20 72 6f 6f 74 20 70 61 67 65  he new root page
ae20: 20 61 6e 64 20 61 20 70 61 64 64 69 6e 67 20 66   and a padding f
ae30: 72 61 6d 65 29 20 69 66 20 74 68 65 0a 20 20 23  rame) if the.  #
ae40: 20 5a 45 52 4f 5f 44 41 4d 41 47 45 20 66 6c 61   ZERO_DAMAGE fla
ae50: 67 20 77 65 72 65 20 6e 6f 74 20 73 65 74 2e 0a  g were not set..
ae60: 20 20 64 6f 5f 74 65 73 74 20 32 34 2e 35 20 7b    do_test 24.5 {
ae70: 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74  .    file size t
ae80: 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 7d 20 5b  est.db-wal.  } [
ae90: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20  wal_file_size 1 
aea0: 31 30 32 34 5d 0a 7d 0a 0a 64 62 20 63 6c 6f 73  1024].}..db clos
aeb0: 65 0a 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f  e.sqlite3_shutdo
aec0: 77 6e 0a 74 65 73 74 5f 73 71 6c 69 74 65 33 5f  wn.test_sqlite3_
aed0: 6c 6f 67 0a 73 71 6c 69 74 65 33 5f 69 6e 69 74  log.sqlite3_init
aee0: 69 61 6c 69 7a 65 0a 0a 66 69 6e 69 73 68 5f 74  ialize..finish_t
aef0: 65 73 74 0a                                      est.