/ Hex Artifact Content
Login

Artifact 70227190e713b3e7eb2a7d5ec3510b66db01f327:


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 69 66 63 61 70  ommon.tcl..ifcap
02b0: 61 62 6c 65 20 21 77 61 6c 20 7b 66 69 6e 69 73  able !wal {finis
02c0: 68 5f 74 65 73 74 20 3b 20 72 65 74 75 72 6e 20  h_test ; return 
02d0: 7d 0a 0a 70 72 6f 63 20 72 65 6f 70 65 6e 5f 64  }..proc reopen_d
02e0: 62 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b  b {} {.  catch {
02f0: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 69   db close }.  fi
0300: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
0310: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
0320: 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 77 61 6c  -wal test.db-wal
0330: 2d 73 75 6d 6d 61 72 79 0a 20 20 73 71 6c 69 74  -summary.  sqlit
0340: 65 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64  e3_wal db test.d
0350: 62 0a 7d 0a 0a 73 65 74 20 3a 3a 62 6c 6f 62 63  b.}..set ::blobc
0360: 6e 74 20 30 0a 70 72 6f 63 20 62 6c 6f 62 20 7b  nt 0.proc blob {
0370: 6e 42 79 74 65 7d 20 7b 0a 20 20 69 6e 63 72 20  nByte} {.  incr 
0380: 3a 3a 62 6c 6f 62 63 6e 74 0a 20 20 72 65 74 75  ::blobcnt.  retu
0390: 72 6e 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  rn [string range
03a0: 20 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20   [string repeat 
03b0: 22 24 7b 3a 3a 62 6c 6f 62 63 6e 74 7d 78 22 20  "${::blobcnt}x" 
03c0: 24 6e 42 79 74 65 5d 20 31 20 24 6e 42 79 74 65  $nByte] 1 $nByte
03d0: 5d 0a 7d 0a 0a 70 72 6f 63 20 73 71 6c 69 74 65  ].}..proc sqlite
03e0: 33 5f 77 61 6c 20 7b 61 72 67 73 7d 20 7b 0a 20  3_wal {args} {. 
03f0: 20 65 76 61 6c 20 73 71 6c 69 74 65 33 20 24 61   eval sqlite3 $a
0400: 72 67 73 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61  rgs.  [lindex $a
0410: 72 67 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52  rgs 0] eval { PR
0420: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
0430: 20 3d 20 30 20 7d 0a 20 20 5b 6c 69 6e 64 65 78   = 0 }.  [lindex
0440: 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b   $args 0] eval {
0450: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
0460: 65 20 3d 20 31 30 32 34 20 7d 0a 20 20 5b 6c 69  e = 1024 }.  [li
0470: 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20 65 76  ndex $args 0] ev
0480: 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  al { PRAGMA jour
0490: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d  nal_mode = wal }
04a0: 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73  .  [lindex $args
04b0: 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d   0] eval { PRAGM
04c0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
04d0: 6e 6f 72 6d 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64  normal }.  [lind
04e0: 65 78 20 24 61 72 67 73 20 30 5d 20 66 75 6e 63  ex $args 0] func
04f0: 74 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f 62 0a 7d  tion blob blob.}
0500: 0a 0a 70 72 6f 63 20 6c 6f 67 5f 64 65 6c 65 74  ..proc log_delet
0510: 65 64 20 7b 6c 6f 67 66 69 6c 65 7d 20 7b 0a 20  ed {logfile} {. 
0520: 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 5b 66   return [expr [f
0530: 69 6c 65 20 65 78 69 73 74 73 20 24 6c 6f 67 66  ile exists $logf
0540: 69 6c 65 5d 3d 3d 30 5d 0a 7d 0a 0a 23 0a 23 20  ile]==0].}..#.# 
0550: 54 68 65 73 65 20 61 72 65 20 27 77 61 72 6d 2d  These are 'warm-
0560: 62 6f 64 79 27 20 74 65 73 74 73 20 75 73 65 64  body' tests used
0570: 20 77 68 69 6c 65 20 64 65 76 65 6c 6f 70 69 6e   while developin
0580: 67 20 74 68 65 20 57 41 4c 20 63 6f 64 65 2e 20  g the WAL code. 
0590: 54 68 65 79 0a 23 20 73 65 72 76 65 20 74 6f 20  They.# serve to 
05a0: 70 72 6f 76 65 20 74 68 61 74 20 61 20 66 65 77  prove that a few
05b0: 20 72 65 61 6c 6c 79 20 73 69 6d 70 6c 65 20 63   really simple c
05c0: 61 73 65 73 20 77 6f 72 6b 3a 0a 23 0a 23 20 77  ases work:.#.# w
05d0: 61 6c 2d 31 2e 2a 3a 20 52 65 61 64 20 61 6e 64  al-1.*: Read and
05e0: 20 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62   write the datab
05f0: 61 73 65 2e 0a 23 20 77 61 6c 2d 32 2e 2a 3a 20  ase..# wal-2.*: 
0600: 54 65 73 74 20 4d 56 43 43 20 77 69 74 68 20 6f  Test MVCC with o
0610: 6e 65 20 72 65 61 64 65 72 2c 20 6f 6e 65 20 77  ne reader, one w
0620: 72 69 74 65 72 2e 0a 23 20 77 61 6c 2d 33 2e 2a  riter..# wal-3.*
0630: 3a 20 54 65 73 74 20 74 72 61 6e 73 61 63 74 69  : Test transacti
0640: 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 77  on rollback..# w
0650: 61 6c 2d 34 2e 2a 3a 20 54 65 73 74 20 73 61 76  al-4.*: Test sav
0660: 65 70 6f 69 6e 74 2f 73 74 61 74 65 6d 65 6e 74  epoint/statement
0670: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c   rollback..# wal
0680: 2d 35 2e 2a 3a 20 54 65 73 74 20 74 68 65 20 74  -5.*: Test the t
0690: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 0a 23 20  emp database..# 
06a0: 77 61 6c 2d 36 2e 2a 3a 20 54 65 73 74 20 63 72  wal-6.*: Test cr
06b0: 65 61 74 69 6e 67 20 64 61 74 61 62 61 73 65 73  eating databases
06c0: 20 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20   with different 
06d0: 70 61 67 65 20 73 69 7a 65 73 2e 0a 23 0a 23 0a  page sizes..#.#.
06e0: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e  #.do_test wal-0.
06f0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
0700: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
0710: 75 6d 20 3d 20 30 20 7d 0a 20 20 65 78 65 63 73  um = 0 }.  execs
0720: 71 6c 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63  ql { PRAGMA sync
0730: 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d 61 6c  hronous = normal
0740: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   }.  execsql { P
0750: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
0760: 64 65 20 3d 20 77 61 6c 20 7d 0a 7d 20 7b 77 61  de = wal }.} {wa
0770: 6c 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30  l}.do_test wal-0
0780: 2e 32 20 7b 0a 20 20 66 69 6c 65 20 73 69 7a 65  .2 {.  file size
0790: 20 74 65 73 74 2e 64 62 0a 7d 20 7b 31 30 32 34   test.db.} {1024
07a0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  }..do_test wal-1
07b0: 2e 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .0 {.  execsql {
07c0: 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20   .    BEGIN;.   
07d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
07e0: 28 61 2c 20 62 29 3b 20 0a 20 20 7d 0a 20 20 6c  (a, b); .  }.  l
07f0: 69 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73  ist [file exists
0800: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
0810: 5d 20 5c 0a 20 20 20 20 20 20 20 5b 66 69 6c 65  ] \.       [file
0820: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
0830: 77 61 6c 5d 20 20 20 20 20 5c 0a 20 20 20 20 20  wal]     \.     
0840: 20 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73    [file size tes
0850: 74 2e 64 62 5d 0a 7d 20 7b 30 20 31 20 31 30 32  t.db].} {0 1 102
0860: 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  4}.do_test wal-1
0870: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43  .1 {.  execsql C
0880: 4f 4d 4d 49 54 0a 20 20 6c 69 73 74 20 5b 66 69  OMMIT.  list [fi
0890: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
08a0: 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5b 66 69 6c 65  b-journal] [file
08b0: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
08c0: 77 61 6c 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f  wal].} {0 1}.do_
08d0: 74 65 73 74 20 77 61 6c 2d 31 2e 32 20 7b 0a 20  test wal-1.2 {. 
08e0: 20 23 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77   # There are now
08f0: 20 74 77 6f 20 70 61 67 65 73 20 69 6e 20 74 68   two pages in th
0900: 65 20 6c 6f 67 2e 0a 20 20 66 69 6c 65 20 73 69  e log..  file si
0910: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d  ze test.db-wal.}
0920: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
0930: 32 20 31 30 32 34 5d 0a 0a 64 6f 5f 74 65 73 74  2 1024]..do_test
0940: 20 77 61 6c 2d 31 2e 33 20 7b 0a 20 20 65 78 65   wal-1.3 {.  exe
0950: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0960: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
0970: 65 72 20 7d 0a 7d 20 7b 74 61 62 6c 65 20 74 31  er }.} {table t1
0980: 20 74 31 20 32 20 7b 43 52 45 41 54 45 20 54 41   t1 2 {CREATE TA
0990: 42 4c 45 20 74 31 28 61 2c 20 62 29 7d 7d 0a 0a  BLE t1(a, b)}}..
09a0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 34 20  do_test wal-1.4 
09b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
09c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
09d0: 55 45 53 28 31 2c 20 32 29 20 7d 0a 20 20 65 78  UES(1, 2) }.  ex
09e0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
09f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
0a00: 20 34 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   4) }.  execsql 
0a10: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0a20: 20 56 41 4c 55 45 53 28 35 2c 20 36 29 20 7d 0a   VALUES(5, 6) }.
0a30: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
0a40: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0a50: 53 28 37 2c 20 38 29 20 7d 0a 20 20 65 78 65 63  S(7, 8) }.  exec
0a60: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0a70: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
0a80: 30 29 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  0) }.} {}..do_te
0a90: 73 74 20 77 61 6c 2d 31 2e 35 20 7b 0a 20 20 65  st wal-1.5 {.  e
0aa0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0ab0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
0ac0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0ad0: 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   10}..do_test wa
0ae0: 6c 2d 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  l-2.1 {.  sqlite
0af0: 33 5f 77 61 6c 20 64 62 32 20 2e 2f 74 65 73 74  3_wal db2 ./test
0b00: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
0b10: 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20  BEGIN; SELECT * 
0b20: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
0b30: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0b40: 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20   9 10}..do_test 
0b50: 77 61 6c 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63  wal-2.2 {.  exec
0b60: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0b70: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20  O t1 VALUES(11, 
0b80: 31 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  12) }.  execsql 
0b90: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0ba0: 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  t1 }.} {1 2 3 4 
0bb0: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
0bc0: 31 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  12}..do_test wal
0bd0: 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.3 {.  execsql
0be0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0bf0: 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32   t1 } db2.} {1 2
0c00: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0c10: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  0}..do_test wal-
0c20: 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.4 {.  execsql 
0c30: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0c40: 20 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20   VALUES(13, 14) 
0c50: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
0c60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0c70: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
0c80: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
0c90: 33 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  3 14}..do_test w
0ca0: 61 6c 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63 73  al-2.5 {.  execs
0cb0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0cc0: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t1 } db2.} {1
0cd0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0ce0: 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   10}..do_test wa
0cf0: 6c 2d 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  l-2.6 {.  execsq
0d00: 6c 20 7b 20 43 4f 4d 4d 49 54 3b 20 53 45 4c 45  l { COMMIT; SELE
0d10: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
0d20: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
0d30: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
0d40: 20 31 33 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74   13 14}..do_test
0d50: 20 77 61 6c 2d 33 2e 31 20 7b 0a 20 20 65 78 65   wal-3.1 {.  exe
0d60: 63 73 71 6c 20 7b 20 42 45 47 49 4e 3b 20 44 45  csql { BEGIN; DE
0d70: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 20  LETE FROM t1 }. 
0d80: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
0d90: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
0da0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33  {}.do_test wal-3
0db0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0dc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0dd0: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33  1 } db2.} {1 2 3
0de0: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
0df0: 31 31 20 31 32 20 31 33 20 31 34 7d 0a 64 6f 5f  11 12 13 14}.do_
0e00: 74 65 73 74 20 77 61 6c 2d 33 2e 33 20 7b 0a 20  test wal-3.3 {. 
0e10: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
0e20: 41 43 4b 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ACK }.  execsql 
0e30: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0e40: 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  t1 }.} {1 2 3 4 
0e50: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
0e60: 31 32 20 31 33 20 31 34 7d 0a 64 62 32 20 63 6c  12 13 14}.db2 cl
0e70: 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ose..#----------
0e80: 2d 2d 2d 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 0a  ---------------.
0ec0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
0ed0: 74 65 73 74 73 2c 20 77 61 6c 2d 34 2e 2a 2c 20  tests, wal-4.*, 
0ee0: 74 65 73 74 20 74 68 61 74 20 73 61 76 65 70 6f  test that savepo
0ef0: 69 6e 74 73 20 77 6f 72 6b 20 77 69 74 68 20 57  ints work with W
0f00: 41 4c 20 0a 23 20 64 61 74 61 62 61 73 65 73 2e  AL .# databases.
0f10: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  .#.do_test wal-4
0f20: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
0f30: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
0f40: 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   t1;.    BEGIN;.
0f50: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
0f60: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c  O t1 VALUES('a',
0f70: 20 27 62 27 29 3b 0a 20 20 20 20 20 20 53 41 56   'b');.      SAV
0f80: 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 20  EPOINT sp;.     
0f90: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
0fa0: 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  1 VALUES('c', 'd
0fb0: 27 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  ');.        SELE
0fc0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
0fd0: 7d 0a 7d 20 7b 61 20 62 20 63 20 64 7d 0a 64 6f  }.} {a b c d}.do
0fe0: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 32 20 7b 0a  _test wal-4.2 {.
0ff0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1000: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70    ROLLBACK TO sp
1010: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
1020: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
1030: 7b 61 20 62 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {a b}.do_test wa
1040: 6c 2d 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  l-4.3 {.  execsq
1050: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  l {.    COMMIT;.
1060: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1070: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62  M t1;.  }.} {a b
1080: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  }..do_test wal-4
1090: 2e 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73  .4.1 {.  db clos
10a0: 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  e.  sqlite3 db t
10b0: 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63  est.db.  db func
10c0: 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73   blob blob.  lis
10d0: 74 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  t [execsql { SEL
10e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d  ECT * FROM t1 }]
10f0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
1100: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62  .db-wal].} {{a b
1110: 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  } 0}.do_test wal
1120: 2d 34 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63 73  -4.4.2 {.  execs
1130: 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  ql { PRAGMA cach
1140: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
1150: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1160: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
1170: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
1180: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 62  INTO t2 VALUES(b
1190: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
11a0: 30 30 29 29 3b 0a 20 20 20 20 53 41 56 45 50 4f  00));.    SAVEPO
11b0: 49 4e 54 20 74 72 3b 0a 20 20 20 20 20 20 49 4e  INT tr;.      IN
11c0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
11d0: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
11e0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32  lob(400) FROM t2
11f0: 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20  ; /*  2 */.     
1200: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1210: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1220: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1230: 20 74 32 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20   t2; /*  4 */.  
1240: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1250: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
1260: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1270: 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f  ROM t2; /*  8 */
1280: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1290: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
12a0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
12b0: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36  ) FROM t2; /* 16
12c0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
12d0: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
12e0: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
12f0: 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a  400) FROM t2; /*
1300: 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   32 */.      INS
1310: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1320: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1330: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1340: 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20   /*  2 */.      
1350: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1360: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1370: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1380: 74 31 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20  t1; /*  4 */.   
1390: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
13a0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
13b0: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
13c0: 4f 4d 20 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a  OM t1; /*  8 */.
13d0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
13e0: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
13f0: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1400: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20   FROM t1; /* 16 
1410: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
1420: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
1430: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
1440: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20  00) FROM t1; /* 
1450: 33 32 20 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45  32 */.      SELE
1460: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1470: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a   t2;.  }.} {32}.
1480: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
1490: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
14a0: 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d  ROLLBACK TO tr }
14b0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  .} {}.do_test wa
14c0: 6c 2d 34 2e 34 2e 34 20 7b 0a 20 20 73 65 74 20  l-4.4.4 {.  set 
14d0: 6c 6f 67 73 69 7a 65 20 5b 66 69 6c 65 20 73 69  logsize [file si
14e0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
14f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1500: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1510: 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27   VALUES('x', 'y'
1520: 29 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20 74  );.    RELEASE t
1530: 72 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 20  r;.  }.  expr { 
1540: 24 6c 6f 67 73 69 7a 65 20 3d 3d 20 5b 66 69 6c  $logsize == [fil
1550: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
1560: 61 6c 5d 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74  al] }.} {1}.do_t
1570: 65 73 74 20 77 61 6c 2d 34 2e 34 2e 35 20 7b 0a  est wal-4.4.5 {.
1580: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
1590: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
15a0: 20 74 32 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74   t2 }.} {1}.do_t
15b0: 65 73 74 20 77 61 6c 2d 34 2e 34 2e 36 20 7b 0a  est wal-4.4.6 {.
15c0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
15d0: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 32  ce test.db test2
15e0: 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20  .db.  file copy 
15f0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77  -force test.db-w
1600: 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a  al test2.db-wal.
1610: 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65    sqlite3 db2 te
1620: 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  st2.db.  execsql
1630: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
1640: 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c  *) FROM t2 ; SEL
1650: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1660: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
1670: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  2}.do_test wal-4
1680: 2e 34 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.7 {.  execsql
1690: 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72   { PRAGMA integr
16a0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a  ity_check } db2.
16b0: 7d 20 7b 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73 65  } {ok}.db2 close
16c0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  ..do_test wal-4.
16d0: 35 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64  5.1 {.  reopen_d
16e0: 62 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62  b.  db func blob
16f0: 20 62 6c 6f 62 0a 20 20 65 78 65 63 73 71 6c 20   blob.  execsql 
1700: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
1710: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
1720: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1730: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
1740: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1750: 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b  ALUES('a', 'b');
1760: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64  .  }.  sqlite3 d
1770: 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66  b test.db.  db f
1780: 75 6e 63 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20  unc blob blob.  
1790: 6c 69 73 74 20 5b 65 78 65 63 73 71 6c 20 7b 20  list [execsql { 
17a0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
17b0: 20 7d 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74   }] [file size t
17c0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b  est.db-wal].} {{
17d0: 61 20 62 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20  a b} 0}.do_test 
17e0: 77 61 6c 2d 34 2e 35 2e 32 20 7b 0a 20 20 65 78  wal-4.5.2 {.  ex
17f0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63  ecsql { PRAGMA c
1800: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d  ache_size = 10 }
1810: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1820: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32   CREATE TABLE t2
1830: 28 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49  (a, b);.    BEGI
1840: 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  N;.    INSERT IN
1850: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c 6f  TO t2 VALUES(blo
1860: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1870: 29 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e  ));.    SAVEPOIN
1880: 54 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53 45  T tr;.      INSE
1890: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
18a0: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
18b0: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
18c0: 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49  /*  2 */.      I
18d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
18e0: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
18f0: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1900: 32 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20  2; /*  4 */.    
1910: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1920: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1930: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1940: 4d 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20  M t2; /*  8 */. 
1950: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1960: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
1970: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
1980: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a  FROM t2; /* 16 *
1990: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
19a0: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c  NTO t2 SELECT bl
19b0: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
19c0: 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33  0) FROM t2; /* 3
19d0: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
19e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
19f0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1a00: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1a10: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
1a20: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1a30: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1a40: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
1a50: 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20  ; /*  4 */.     
1a60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1a70: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1a80: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1a90: 20 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20   t1; /*  8 */.  
1aa0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1ab0: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
1ac0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1ad0: 52 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f  ROM t1; /* 16 */
1ae0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1af0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
1b00: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1b10: 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32  ) FROM t1; /* 32
1b20: 20 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43 54   */.      SELECT
1b30: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1b40: 32 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f  2;.  }.} {32}.do
1b50: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 33 20  _test wal-4.5.3 
1b60: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f  {.  execsql { RO
1b70: 4c 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d  LLBACK TO tr }.}
1b80: 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   {}.do_test wal-
1b90: 34 2e 35 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f  4.5.4 {.  set lo
1ba0: 67 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65  gsize [file size
1bb0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20   test.db-wal].  
1bc0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
1bd0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1be0: 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b  ALUES('x', 'y');
1bf0: 0a 20 20 20 20 52 45 4c 45 41 53 45 20 74 72 3b  .    RELEASE tr;
1c00: 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d  .    COMMIT;.  }
1c10: 0a 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73 69  .  expr { $logsi
1c20: 7a 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a 65  ze == [file size
1c30: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a   test.db-wal] }.
1c40: 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61  } {1}.do_test wa
1c50: 6c 2d 34 2e 35 2e 35 20 7b 0a 20 20 65 78 65 63  l-4.5.5 {.  exec
1c60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
1c70: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20  nt(*) FROM t2 ; 
1c80: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1c90: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
1ca0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1cb0: 35 2e 36 20 7b 0a 20 20 66 69 6c 65 20 63 6f 70  5.6 {.  file cop
1cc0: 79 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  y -force test.db
1cd0: 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65   test2.db.  file
1ce0: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
1cf0: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64  t.db-wal test2.d
1d00: 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20  b-wal.  sqlite3 
1d10: 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65  db2 test2.db.  e
1d20: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
1d30: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
1d40: 20 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   ; SELECT count(
1d50: 2a 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32  *) FROM t1 } db2
1d60: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {1 2}.do_test
1d70: 20 77 61 6c 2d 34 2e 35 2e 37 20 7b 0a 20 20 65   wal-4.5.7 {.  e
1d80: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
1d90: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
1da0: 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62 32  } db2.} {ok}.db2
1db0: 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20   close..do_test 
1dc0: 77 61 6c 2d 34 2e 36 2e 31 20 7b 0a 20 20 65 78  wal-4.6.1 {.  ex
1dd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
1de0: 54 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20  TE FROM t2;.    
1df0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
1e00: 70 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e  point;.    BEGIN
1e10: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
1e20: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 77  NTO t2 VALUES('w
1e30: 27 2c 20 27 78 27 29 3b 0a 20 20 20 20 20 20 53  ', 'x');.      S
1e40: 41 56 45 50 4f 49 4e 54 20 73 61 76 65 3b 0a 20  AVEPOINT save;. 
1e50: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
1e60: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 79 27  TO t2 VALUES('y'
1e70: 2c 20 27 7a 27 29 3b 0a 20 20 20 20 20 20 52 4f  , 'z');.      RO
1e80: 4c 4c 42 41 43 4b 20 54 4f 20 73 61 76 65 3b 0a  LLBACK TO save;.
1e90: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
1ea0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1eb0: 3b 0a 20 20 7d 0a 7d 20 7b 77 20 78 7d 0a 0a 0a  ;.  }.} {w x}...
1ec0: 72 65 6f 70 65 6e 5f 64 62 0a 64 6f 5f 74 65 73  reopen_db.do_tes
1ed0: 74 20 77 61 6c 2d 35 2e 31 20 7b 0a 20 20 65 78  t wal-5.1 {.  ex
1ee0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
1ef0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 32  TE TEMP TABLE t2
1f00: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
1f10: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1f20: 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b  S(1, 2);.  }.} {
1f30: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e  }.do_test wal-5.
1f40: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
1f50: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
1f60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1f70: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
1f80: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
1f90: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  M t2;.  }.} {1 2
1fa0: 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61   3 4}.do_test wa
1fb0: 6c 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  l-5.3 {.  execsq
1fc0: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
1fd0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
1fe0: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t2;.  }.} {1
1ff0: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   2}.do_test wal-
2000: 35 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.4 {.  execsql 
2010: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  {.    CREATE TEM
2020: 50 20 54 41 42 4c 45 20 74 33 28 78 20 55 4e 49  P TABLE t3(x UNI
2030: 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  QUE);.    BEGIN;
2040: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2050: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20  TO t2 VALUES(3, 
2060: 34 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  4);.      INSERT
2070: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
2080: 27 61 62 63 27 29 3b 0a 20 20 7d 0a 20 20 63 61  'abc');.  }.  ca
2090: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
20a0: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
20b0: 61 62 63 27 29 20 7d 0a 7d 20 7b 31 20 7b 63 6f  abc') }.} {1 {co
20c0: 6c 75 6d 6e 20 78 20 69 73 20 6e 6f 74 20 75 6e  lumn x is not un
20d0: 69 71 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 77  ique}}.do_test w
20e0: 61 6c 2d 35 2e 35 20 7b 0a 20 20 65 78 65 63 73  al-5.5 {.  execs
20f0: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
2100: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2110: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
2120: 32 20 33 20 34 7d 0a 64 62 20 63 6c 6f 73 65 0a  2 3 4}.db close.
2130: 0a 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 20  .foreach sector 
2140: 7b 35 31 32 20 34 30 39 36 7d 20 7b 0a 20 20 73  {512 4096} {.  s
2150: 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f  qlite3_simulate_
2160: 64 65 76 69 63 65 20 2d 73 65 63 74 6f 72 73 69  device -sectorsi
2170: 7a 65 20 24 73 65 63 74 6f 72 0a 20 20 66 6f 72  ze $sector.  for
2180: 65 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31  each pgsz {512 1
2190: 30 32 34 20 32 30 34 38 20 34 30 39 36 7d 20 7b  024 2048 4096} {
21a0: 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65  .    file delete
21b0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
21c0: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20  test.db-wal.    
21d0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 36 2e 24 73  do_test wal-6.$s
21e0: 65 63 74 6f 72 2e 24 70 67 73 7a 2e 31 20 7b 0a  ector.$pgsz.1 {.
21f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62        sqlite3 db
2200: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 64 65   test.db -vfs de
2210: 76 73 79 6d 0a 20 20 20 20 20 20 65 78 65 63 73  vsym.      execs
2220: 71 6c 20 22 0a 20 20 20 20 20 20 20 20 50 52 41  ql ".        PRA
2230: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
2240: 24 70 67 73 7a 3b 0a 20 20 20 20 20 20 20 20 50  $pgsz;.        P
2250: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2260: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 50  m = 0;.        P
2270: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
2280: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20  de = wal;.      
2290: 22 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  ".      execsql 
22a0: 22 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45  ".        CREATE
22b0: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
22c0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
22d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
22e0: 2c 20 32 29 3b 0a 20 20 20 20 20 20 22 0a 20 20  , 2);.      ".  
22f0: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
2300: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
2310: 74 2e 64 62 0a 20 20 20 20 7d 20 5b 65 78 70 72  t.db.    } [expr
2320: 20 24 70 67 73 7a 2a 32 5d 0a 20 20 0a 20 20 20   $pgsz*2].  .   
2330: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 36 2e 24   do_test wal-6.$
2340: 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e 32 20 7b  sector.$pgsz.2 {
2350: 0a 20 20 20 20 20 20 6c 6f 67 5f 64 65 6c 65 74  .      log_delet
2360: 65 64 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  ed test.db-wal. 
2370: 20 20 20 7d 20 7b 31 7d 0a 20 20 7d 0a 7d 0a 0a     } {1}.  }.}..
2380: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 37 2e 31 20  do_test wal-7.1 
2390: 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20  {.  file delete 
23a0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74  -force test.db t
23b0: 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c  est.db-wal.  sql
23c0: 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65 73 74  ite3_wal db test
23d0: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
23e0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
23f0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
2400: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
2410: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
2420: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2430: 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 6c  S(1, 2);.  }.  l
2440: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
2450: 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69  est.db] [file si
2460: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
2470: 7d 20 5b 6c 69 73 74 20 31 30 32 34 20 5b 77 61  } [list 1024 [wa
2480: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30  l_file_size 3 10
2490: 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  24]].do_test wal
24a0: 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -7.2 {.  execsql
24b0: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
24c0: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73  eckpoint }.  lis
24d0: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
24e0: 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65  t.db] [file size
24f0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
2500: 5b 6c 69 73 74 20 32 30 34 38 20 5b 77 61 6c 5f  [list 2048 [wal_
2510: 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34  file_size 3 1024
2520: 5d 5d 0a 0a 23 20 45 78 65 63 75 74 65 20 73 6f  ]]..# Execute so
2530: 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  me transactions 
2540: 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
2550: 6f 64 65 20 74 6f 20 74 65 73 74 20 64 61 74 61  ode to test data
2560: 62 61 73 65 20 66 69 6c 65 0a 23 20 74 72 75 6e  base file.# trun
2570: 63 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73  cation..#.do_tes
2580: 74 20 77 61 6c 2d 38 2e 31 20 7b 0a 20 20 72 65  t wal-8.1 {.  re
2590: 6f 70 65 6e 5f 64 62 0a 20 20 63 61 74 63 68 20  open_db.  catch 
25a0: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66  { db close }.  f
25b0: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
25c0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
25d0: 62 2d 77 61 6c 0a 0a 20 20 73 71 6c 69 74 65 33  b-wal..  sqlite3
25e0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
25f0: 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 20 62   function blob b
2600: 6c 6f 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  lob.  execsql {.
2610: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
2620: 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20  vacuum = 1;.    
2630: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
2640: 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 50  ode = wal;.    P
2650: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2660: 6d 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20 31 7d  m;.  }.} {wal 1}
2670: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 38 2e 32  .do_test wal-8.2
2680: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2690: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
26a0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
26b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
26c0: 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  x);.    INSERT I
26d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 62 6c  NTO t1 VALUES(bl
26e0: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e  ob(900));.    IN
26f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2700: 55 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a  UES(blob(900));.
2710: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2720: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
2730: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
2740: 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20     /*  4 */.    
2750: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2760: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
2770: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
2780: 2a 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45  *  8 */.    INSE
2790: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
27a0: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
27b0: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 36   t1;       /* 16
27c0: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
27d0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
27e0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
27f0: 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a         /* 32 */.
2800: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2810: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
2820: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
2830: 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20 20 20     /* 64 */.    
2840: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
2850: 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20 66 69 6c  point;.  }.  fil
2860: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
2870: 20 5b 65 78 70 72 20 36 38 2a 31 30 32 34 5d 0a   [expr 68*1024].
2880: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 38 2e 33 20  do_test wal-8.3 
2890: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
28a0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
28b0: 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c 35 34  1 WHERE rowid<54
28c0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  ;.    PRAGMA wal
28d0: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d  _checkpoint;.  }
28e0: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
28f0: 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 34 2a  t.db.} [expr 14*
2900: 31 30 32 34 5d 0a 0a 23 20 52 75 6e 20 73 6f 6d  1024]..# Run som
2910: 65 20 22 77 61 72 6d 2d 62 6f 64 79 22 20 74 65  e "warm-body" te
2920: 73 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sts to ensure th
2930: 61 74 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66  at log-summary f
2940: 69 6c 65 73 20 77 69 74 68 20 6d 6f 72 65 0a 23  iles with more.#
2950: 20 74 68 61 6e 20 32 35 36 20 65 6e 74 72 69 65   than 256 entrie
2960: 73 20 28 6c 6f 67 20 73 75 6d 6d 61 72 69 65 73  s (log summaries
2970: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 69 6e   that contain in
2980: 64 65 78 20 62 6c 6f 63 6b 73 29 20 77 6f 72 6b  dex blocks) work
2990: 20 4f 6b 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77   Ok..#.do_test w
29a0: 61 6c 2d 39 2e 31 20 7b 0a 20 20 72 65 6f 70 65  al-9.1 {.  reope
29b0: 6e 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  n_db.  execsql {
29c0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
29d0: 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
29e0: 45 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  EY);.    INSERT 
29f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 62  INTO t1 VALUES(b
2a00: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49  lob(900));.    I
2a10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
2a20: 4c 55 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b  LUES(blob(900));
2a30: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2a40: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2a50: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2a60: 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20      /*  4 */.   
2a70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2a80: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2a90: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
2aa0: 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53  /*  8 */.    INS
2ab0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2ac0: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
2ad0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31  M t1;       /* 1
2ae0: 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  6 */.    INSERT 
2af0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
2b00: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
2b10: 3b 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f  ;       /* 32 */
2b20: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2b30: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2b40: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2b50: 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20 20      /* 64 */.   
2b60: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2b70: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2b80: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
2b90: 2f 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20 49 4e  /* 128 */.    IN
2ba0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2bb0: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2bc0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2bd0: 32 35 36 20 2a 2f 0a 20 20 7d 0a 20 20 66 69 6c  256 */.  }.  fil
2be0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
2bf0: 20 31 30 32 34 0a 64 6f 5f 74 65 73 74 20 77 61   1024.do_test wa
2c00: 6c 2d 39 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  l-9.2 {.  sqlite
2c10: 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e 64  3_wal db2 test.d
2c20: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  b.  execsql {PRA
2c30: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
2c40: 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d  eck } db2.} {ok}
2c50: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e  ..do_test wal-9.
2c60: 33 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  3 {.  file delet
2c70: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64  e -force test2.d
2c80: 62 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  b test2.db-wal. 
2c90: 20 66 69 6c 65 20 63 6f 70 79 20 74 65 73 74 2e   file copy test.
2ca0: 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69  db test2.db.  fi
2cb0: 6c 65 20 63 6f 70 79 20 74 65 73 74 2e 64 62 2d  le copy test.db-
2cc0: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
2cd0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
2ce0: 62 33 20 74 65 73 74 32 2e 64 62 20 0a 20 20 65  b3 test2.db .  e
2cf0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
2d00: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
2d10: 20 64 62 33 0a 7d 20 7b 6f 6b 7d 0a 64 62 33 20   db3.} {ok}.db3 
2d20: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
2d30: 61 6c 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63 73  al-9.4 {.  execs
2d40: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
2d50: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 64  checkpoint }.  d
2d60: 62 32 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  b2 close.  sqlit
2d70: 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e  e3_wal db2 test.
2d80: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52  db.  execsql {PR
2d90: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
2da0: 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
2db0: 7d 0a 0a 66 6f 72 65 61 63 68 20 68 61 6e 64 6c  }..foreach handl
2dc0: 65 20 7b 64 62 20 64 62 32 20 64 62 33 7d 20 7b  e {db db2 db3} {
2dd0: 20 63 61 74 63 68 20 7b 20 24 68 61 6e 64 6c 65   catch { $handle
2de0: 20 63 6c 6f 73 65 20 7d 20 7d 0a 75 6e 73 65 74   close } }.unset
2df0: 20 68 61 6e 64 6c 65 0a 0a 23 2d 2d 2d 2d 2d 2d   handle..#------
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
2e50: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  ing block of tes
2e60: 74 73 20 2d 20 77 61 6c 2d 31 30 2e 2a 20 2d 20  ts - wal-10.* - 
2e70: 74 65 73 74 20 74 68 61 74 20 74 68 65 20 57 41  test that the WA
2e80: 4c 20 6c 6f 63 6b 69 6e 67 20 0a 23 20 73 63 68  L locking .# sch
2e90: 65 6d 65 20 77 6f 72 6b 73 20 69 6e 20 73 69 6d  eme works in sim
2ea0: 70 6c 65 20 63 61 73 65 73 2e 20 54 68 69 73 20  ple cases. This 
2eb0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 69  block of tests i
2ec0: 73 20 72 75 6e 20 74 77 69 63 65 2e 20 4f 6e 63  s run twice. Onc
2ed0: 65 0a 23 20 75 73 69 6e 67 20 6d 75 6c 74 69 70  e.# using multip
2ee0: 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 69  le connections i
2ef0: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70  n the address sp
2f00: 61 63 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ace of the curre
2f10: 6e 74 20 70 72 6f 63 65 73 73 2c 0a 23 20 61 6e  nt process,.# an
2f20: 64 20 6f 6e 63 65 20 77 69 74 68 20 61 6c 6c 20  d once with all 
2f30: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 65 78 63 65  connections exce
2f40: 70 74 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  pt one running i
2f50: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  n external proce
2f60: 73 73 65 73 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69  sses..#.do_multi
2f70: 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
2f80: 0a 0a 20 20 23 20 49 6e 69 74 69 61 6c 69 7a 65  ..  # Initialize
2f90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2fa0: 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74  hema and content
2fb0: 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  s..  #.  do_test
2fc0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 20 7b 0a   wal-10.$tn.1 {.
2fd0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2fe0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
2ff0: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
3000: 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c       CREATE TABL
3010: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
3020: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3030: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
3040: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
3050: 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  OM t1;.    }.  }
3060: 20 7b 77 61 6c 20 31 20 32 7d 0a 0a 20 20 23 20   {wal 1 2}..  # 
3070: 4f 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  Open a transacti
3080: 6f 6e 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20  on and write to 
3090: 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69  the database usi
30a0: 6e 67 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 74  ng [db]. Check t
30b0: 68 61 74 20 5b 64 62 32 5d 0a 20 20 23 20 69 73  hat [db2].  # is
30c0: 20 73 74 69 6c 6c 20 61 62 6c 65 20 74 6f 20 72   still able to r
30d0: 65 61 64 20 74 68 65 20 73 6e 61 70 73 68 6f 74  ead the snapshot
30e0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
30f0: 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
3100: 65 64 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  ed..  #.  do_tes
3110: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 20 7b  t wal-10.$tn.2 {
3120: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42  .    execsql { B
3130: 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
3140: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
3150: 29 3b 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53  ); }.    sql2 {S
3160: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
3170: 0a 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 23 20  .  } {1 2}..  # 
3180: 48 61 76 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74  Have [db] commit
3190: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
31a0: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 5b 64 62  . Check that [db
31b0: 32 5d 20 69 73 20 6e 6f 77 20 73 65 65 69 6e 67  2] is now seeing
31c0: 20 74 68 65 20 0a 20 20 23 20 6e 65 77 2c 20 75   the .  # new, u
31d0: 70 64 61 74 65 64 20 73 6e 61 70 73 68 6f 74 2e  pdated snapshot.
31e0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
31f0: 61 6c 2d 31 30 2e 24 74 6e 2e 33 20 7b 0a 20 20  al-10.$tn.3 {.  
3200: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
3210: 49 54 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53  IT }.    sql2 {S
3220: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
3230: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a  .  } {1 2 3 4}..
3240: 20 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f    # Have [db2] o
3250: 70 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  pen a read trans
3260: 61 63 74 69 6f 6e 2e 20 54 68 65 6e 20 77 72 69  action. Then wri
3270: 74 65 20 74 6f 20 74 68 65 20 64 62 20 76 69 61  te to the db via
3280: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 0a 20 20 23   [db]. Check.  #
3290: 20 74 68 61 74 20 5b 64 62 32 5d 20 69 73 20 73   that [db2] is s
32a0: 74 69 6c 6c 20 73 65 65 69 6e 67 20 74 68 65 20  till seeing the 
32b0: 6f 72 69 67 69 6e 61 6c 20 73 6e 61 70 73 68 6f  original snapsho
32c0: 74 2e 20 54 68 65 6e 20 72 65 61 64 20 77 69 74  t. Then read wit
32d0: 68 20 5b 64 62 33 5d 2e 0a 20 20 23 20 5b 64 62  h [db3]..  # [db
32e0: 33 5d 20 73 68 6f 75 6c 64 20 73 65 65 20 74 68  3] should see th
32f0: 65 20 6e 65 77 6c 79 20 63 6f 6d 6d 69 74 74 65  e newly committe
3300: 64 20 64 61 74 61 2e 0a 20 20 23 0a 20 20 64 6f  d data..  #.  do
3310: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3320: 2e 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .4 {.    sql2 { 
3330: 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a  BEGIN ; SELECT *
3340: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
3350: 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   2 3 4}.  do_tes
3360: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 35 20 7b  t wal-10.$tn.5 {
3370: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
3380: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3390: 4c 55 45 53 28 35 2c 20 36 29 3b 20 7d 0a 20 20  LUES(5, 6); }.  
33a0: 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a    sql2 {SELECT *
33b0: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
33c0: 20 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73   2 3 4}.  do_tes
33d0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 36 20 7b  t wal-10.$tn.6 {
33e0: 0a 20 20 20 20 73 71 6c 33 20 7b 53 45 4c 45 43  .    sql3 {SELEC
33f0: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d  T * FROM t1}.  }
3400: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20   {1 2 3 4 5 6}. 
3410: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3420: 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32  $tn.7 {.    sql2
3430: 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 0a   COMMIT.  } {}..
3440: 20 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f    # Have [db2] o
3450: 70 65 6e 20 61 20 77 72 69 74 65 20 74 72 61 6e  pen a write tran
3460: 73 61 63 74 69 6f 6e 2e 20 54 68 65 6e 20 61 74  saction. Then at
3470: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74  tempt to write t
3480: 6f 20 74 68 65 20 0a 20 20 23 20 64 61 74 61 62  o the .  # datab
3490: 61 73 65 20 76 69 61 20 5b 64 62 5d 2e 20 54 68  ase via [db]. Th
34a0: 69 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 20 28  is should fail (
34b0: 77 72 69 74 65 72 20 6c 6f 63 6b 20 63 61 6e 6e  writer lock cann
34c0: 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 29 2e  ot be obtained).
34d0: 0a 20 20 23 0a 20 20 23 20 54 68 65 6e 20 6f 70  .  #.  # Then op
34e0: 65 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  en a read-transa
34f0: 63 74 69 6f 6e 20 77 69 74 68 20 5b 64 62 5d 2e  ction with [db].
3500: 20 43 6f 6d 6d 69 74 20 74 68 65 20 5b 64 62 32   Commit the [db2
3510: 5d 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  ] transaction.  
3520: 23 20 74 6f 20 64 69 73 6b 2e 20 56 65 72 69 66  # to disk. Verif
3530: 79 20 74 68 61 74 20 5b 64 62 5d 20 73 74 69 6c  y that [db] stil
3540: 6c 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74  l cannot write t
3550: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
3560: 62 65 63 61 75 73 65 0a 20 20 23 20 69 74 20 69  because.  # it i
3570: 73 20 72 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64  s reading an old
3580: 20 73 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a   snapshot)..  #.
3590: 20 20 23 20 43 6c 6f 73 65 20 74 68 65 20 63 75    # Close the cu
35a0: 72 72 65 6e 74 20 5b 64 62 5d 20 74 72 61 6e 73  rrent [db] trans
35b0: 61 63 74 69 6f 6e 2e 20 4f 70 65 6e 20 61 20 6e  action. Open a n
35c0: 65 77 20 6f 6e 65 2e 20 5b 64 62 5d 20 63 61 6e  ew one. [db] can
35d0: 20 6e 6f 77 20 77 72 69 74 65 0a 20 20 23 20 74   now write.  # t
35e0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
35f0: 61 73 20 69 74 20 69 73 20 6e 6f 74 20 6c 6f 63  as it is not loc
3600: 6b 65 64 20 61 6e 64 20 5b 64 62 5d 20 69 73 20  ked and [db] is 
3610: 72 65 61 64 69 6e 67 20 74 68 65 20 6c 61 74 65  reading the late
3620: 73 74 0a 20 20 23 20 73 6e 61 70 73 68 6f 74 29  st.  # snapshot)
3630: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
3640: 77 61 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20  wal-10.$tn.7 {. 
3650: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
3660: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3670: 56 41 4c 55 45 53 28 37 2c 20 38 29 20 3b 20 7d  VALUES(7, 8) ; }
3680: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
3690: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
36a0: 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20  ALUES(9, 10) }. 
36b0: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
36c0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
36d0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
36e0: 2e 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .8 {.    execsql
36f0: 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45 43   { BEGIN ; SELEC
3700: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3710: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
3720: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3730: 2e 24 74 6e 2e 39 20 7b 0a 20 20 20 20 73 71 6c  .$tn.9 {.    sql
3740: 32 20 43 4f 4d 4d 49 54 0a 20 20 20 20 63 61 74  2 COMMIT.    cat
3750: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
3760: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c  NTO t1 VALUES(9,
3770: 20 31 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64   10) }.  } {1 {d
3780: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
3790: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  d}}.  do_test wa
37a0: 6c 2d 31 30 2e 24 74 6e 2e 31 30 20 7b 0a 20 20  l-10.$tn.10 {.  
37b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
37c0: 49 54 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  IT }.    execsql
37d0: 20 7b 20 42 45 47 49 4e 20 7d 0a 20 20 20 20 65   { BEGIN }.    e
37e0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
37f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39  INTO t1 VALUES(9
3800: 2c 20 31 30 29 20 7d 0a 20 20 20 20 65 78 65 63  , 10) }.    exec
3810: 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20  sql { COMMIT }. 
3820: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
3830: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
3840: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
3850: 20 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20   7 8 9 10}..  # 
3860: 4f 70 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e  Open a read tran
3870: 73 61 63 74 69 6f 6e 20 77 69 74 68 20 5b 64 62  saction with [db
3880: 32 5d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74  2]. Check that t
3890: 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64 62  his prevents [db
38a0: 5d 20 66 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b  ] from.  # check
38b0: 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74  pointing the dat
38c0: 61 62 61 73 65 2e 20 42 75 74 20 6e 6f 74 20 66  abase. But not f
38d0: 72 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 69  rom writing to i
38e0: 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  t..  #.  do_test
38f0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 31 20 7b   wal-10.$tn.11 {
3900: 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49  .    sql2 { BEGI
3910: 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N; SELECT * FROM
3920: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3930: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d   4 5 6 7 8 9 10}
3940: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3950: 30 2e 24 74 6e 2e 31 32 20 7b 0a 20 20 20 20 63  0.$tn.12 {.    c
3960: 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41  atchsql { PRAGMA
3970: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
3980: 7d 20 0a 20 20 7d 20 7b 30 20 7b 7d 7d 20 20 20  } .  } {0 {}}   
3990: 3b 23 20 52 65 61 64 65 72 20 6e 6f 20 6c 6f 6e  ;# Reader no lon
39a0: 67 65 72 20 62 6c 6f 63 6b 20 63 68 65 63 6b 70  ger block checkp
39b0: 6f 69 6e 74 73 0a 20 20 64 6f 5f 74 65 73 74 20  oints.  do_test 
39c0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 33 20 7b 0a  wal-10.$tn.13 {.
39d0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
39e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
39f0: 55 45 53 28 31 31 2c 20 31 32 29 20 7d 0a 20 20  UES(11, 12) }.  
3a00: 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a    sql2 {SELECT *
3a10: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
3a20: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
3a30: 20 31 30 7d 0a 0a 20 20 23 20 57 72 69 74 65 72   10}..  # Writer
3a40: 73 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 63  s do not block c
3a50: 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 79 20 6d  heckpoints any m
3a60: 6f 72 65 20 65 69 74 68 65 72 2e 0a 20 20 23 0a  ore either..  #.
3a70: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3a80: 2e 24 74 6e 2e 31 34 20 7b 0a 20 20 20 20 63 61  .$tn.14 {.    ca
3a90: 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  tchsql { PRAGMA 
3aa0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
3ab0: 20 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 0a 20 20   .  } {0 {}}..  
3ac0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
3ad0: 73 65 72 69 65 73 20 6f 66 20 74 65 73 74 20 63  series of test c
3ae0: 61 73 65 73 20 75 73 65 64 20 74 6f 20 76 65 72  ases used to ver
3af0: 69 66 79 20 61 6e 6f 74 68 65 72 20 62 6c 6f 63  ify another bloc
3b00: 6b 69 6e 67 0a 20 20 23 20 63 61 73 65 20 69 6e  king.  # case in
3b10: 20 57 41 4c 20 2d 20 61 20 63 61 73 65 20 77 68   WAL - a case wh
3b20: 69 63 68 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 6c  ich no longer bl
3b30: 6f 63 6b 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  ocks..  #.  do_t
3b40: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3b50: 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 43  5 {.    sql2 { C
3b60: 4f 4d 4d 49 54 3b 20 42 45 47 49 4e 3b 20 53 45  OMMIT; BEGIN; SE
3b70: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20  LECT * FROM t1; 
3b80: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
3b90: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
3ba0: 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  2}.  do_test wal
3bb0: 2d 31 30 2e 24 74 6e 2e 31 36 20 7b 0a 20 20 20  -10.$tn.16 {.   
3bc0: 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47   catchsql { PRAG
3bd0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
3be0: 74 20 7d 20 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a  t } .  } {0 {}}.
3bf0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3c00: 2e 24 74 6e 2e 31 37 20 7b 0a 20 20 20 20 65 78  .$tn.17 {.    ex
3c10: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
3c20: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20  al_checkpoint } 
3c30: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
3c40: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 38 20  t wal-10.$tn.18 
3c50: 7b 0a 20 20 20 20 73 71 6c 33 20 7b 20 42 45 47  {.    sql3 { BEG
3c60: 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN; SELECT * FRO
3c70: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20  M t1 }.  } {1 2 
3c80: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
3c90: 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73   11 12}.  do_tes
3ca0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 39 20  t wal-10.$tn.19 
3cb0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
3cc0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3cd0: 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d  VALUES(13, 14) }
3ce0: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f  .  } {0 {}}.  do
3cf0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3d00: 2e 32 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .20 {.    execsq
3d10: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
3d20: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20  M t1 }.  } {1 2 
3d30: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
3d40: 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a 20 20   11 12 13 14}.  
3d50: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3d60: 74 6e 2e 32 31 20 7b 0a 20 20 20 20 73 71 6c 33  tn.21 {.    sql3
3d70: 20 43 4f 4d 4d 49 54 0a 20 20 20 20 73 71 6c 32   COMMIT.    sql2
3d80: 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 20   COMMIT.  } {}. 
3d90: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3da0: 24 74 6e 2e 32 32 20 7b 0a 20 20 20 20 65 78 65  $tn.22 {.    exe
3db0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
3dc0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
3dd0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
3de0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d   10 11 12 13 14}
3df0: 0a 0a 20 20 23 20 41 6e 6f 74 68 65 72 20 73 65  ..  # Another se
3e00: 72 69 65 73 20 6f 66 20 74 65 73 74 73 20 74 68  ries of tests th
3e10: 61 74 20 75 73 65 64 20 74 6f 20 64 65 6d 6f 6e  at used to demon
3e20: 73 74 72 61 74 65 20 62 6c 6f 63 6b 69 6e 67 20  strate blocking 
3e30: 62 65 68 61 76 69 6f 72 0a 20 20 23 20 62 75 74  behavior.  # but
3e40: 20 77 68 69 63 68 20 6e 6f 77 20 77 6f 72 6b 2e   which now work.
3e50: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
3e60: 61 6c 2d 31 30 2e 24 74 6e 2e 32 33 20 7b 0a 20  al-10.$tn.23 {. 
3e70: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
3e80: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
3e90: 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  nt }.  } {}.  do
3ea0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3eb0: 2e 32 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b  .24 {.    sql2 {
3ec0: 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a   BEGIN; SELECT *
3ed0: 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20   FROM t1; }.  } 
3ee0: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
3ef0: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
3f00: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  4}.  do_test wal
3f10: 2d 31 30 2e 24 74 6e 2e 32 35 20 7b 0a 20 20 20  -10.$tn.25 {.   
3f20: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
3f30: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
3f40: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
3f50: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
3f60: 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  6 {.    catchsql
3f70: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3f80: 31 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36 29  1 VALUES(15, 16)
3f90: 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20   }.  } {0 {}}.  
3fa0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3fb0: 74 6e 2e 32 37 20 7b 0a 20 20 20 20 73 71 6c 33  tn.27 {.    sql3
3fc0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3fd0: 31 20 56 41 4c 55 45 53 28 31 37 2c 20 31 38 29  1 VALUES(17, 18)
3fe0: 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74   }.  } {}.  do_t
3ff0: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
4000: 38 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b 0a  8 {.    code3 {.
4010: 20 20 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54        set ::STMT
4020: 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   [sqlite3_prepar
4030: 65 20 64 62 33 20 22 53 45 4c 45 43 54 20 2a 20  e db3 "SELECT * 
4040: 46 52 4f 4d 20 74 31 22 20 2d 31 20 54 41 49 4c  FROM t1" -1 TAIL
4050: 5d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ].      sqlite3_
4060: 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20 20  step $::STMT.   
4070: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
4080: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4090: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
40a0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
40b0: 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36 20   12 13 14 15 16 
40c0: 31 37 20 31 38 7d 0a 20 20 64 6f 5f 74 65 73 74  17 18}.  do_test
40d0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 39 20 7b   wal-10.$tn.29 {
40e0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
40f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4100: 4c 55 45 53 28 31 39 2c 20 32 30 29 20 7d 0a 20  LUES(19, 20) }. 
4110: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52     catchsql { PR
4120: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
4130: 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d  int }.  } {0 {}}
4140: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
4150: 30 2e 24 74 6e 2e 33 30 20 7b 0a 20 20 20 20 63  0.$tn.30 {.    c
4160: 6f 64 65 33 20 7b 20 73 71 6c 69 74 65 33 5f 66  ode3 { sqlite3_f
4170: 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 20  inalize $::STMT 
4180: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
4190: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
41a0: 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a 0a  point }.  } {}..
41b0: 20 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74    # At one point
41c0: 2c 20 69 66 20 61 20 72 65 61 64 65 72 20 66 61  , if a reader fa
41d0: 69 6c 65 64 20 74 6f 20 75 70 67 72 61 64 65 20  iled to upgrade 
41e0: 74 6f 20 61 20 77 72 69 74 65 72 20 62 65 63 61  to a writer beca
41f0: 75 73 65 20 69 74 0a 20 20 23 20 77 61 73 20 72  use it.  # was r
4200: 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e  eading an old sn
4210: 61 70 73 68 6f 74 2c 20 74 68 65 20 77 72 69 74  apshot, the writ
4220: 65 2d 6c 6f 63 6b 73 20 77 65 72 65 20 6e 6f 74  e-locks were not
4230: 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 2e   being released.
4240: 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20 74  .  # Test that t
4250: 68 69 73 20 62 75 67 20 68 61 73 20 62 65 65 6e  his bug has been
4260: 20 66 69 78 65 64 2e 0a 20 20 23 0a 20 20 64 6f   fixed..  #.  do
4270: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4280: 2e 33 31 20 7b 0a 20 20 20 20 73 71 6c 32 20 43  .31 {.    sql2 C
4290: 4f 4d 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71  OMMIT.    execsq
42a0: 6c 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45  l { BEGIN ; SELE
42b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
42c0: 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52 54     sql2 { INSERT
42d0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
42e0: 32 31 2c 20 32 32 29 20 7d 0a 20 20 20 20 63 61  21, 22) }.    ca
42f0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
4300: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
4310: 33 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b 31 20  3, 24) }.  } {1 
4320: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
4330: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
4340: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 32 20 7b 0a  wal-10.$tn.32 {.
4350: 20 20 20 20 23 20 54 68 69 73 20 73 74 61 74 65      # This state
4360: 6d 65 6e 74 20 77 6f 75 6c 64 20 66 61 69 6c 20  ment would fail 
4370: 77 68 65 6e 20 74 68 65 20 62 75 67 20 77 61 73  when the bug was
4380: 20 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 73 71   present..    sq
4390: 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l2 { INSERT INTO
43a0: 20 74 31 20 56 41 4c 55 45 53 28 32 33 2c 20 32   t1 VALUES(23, 2
43b0: 34 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  4) }.  } {}.  do
43c0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
43d0: 2e 33 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .33 {.    execsq
43e0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
43f0: 4d 20 74 31 20 3b 20 43 4f 4d 4d 49 54 20 7d 0a  M t1 ; COMMIT }.
4400: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
4410: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
4420: 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31  13 14 15 16 17 1
4430: 38 20 31 39 20 32 30 7d 0a 20 20 64 6f 5f 74 65  8 19 20}.  do_te
4440: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 34  st wal-10.$tn.34
4450: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4460: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
4470: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
4480: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
4490: 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36 20   12 13 14 15 16 
44a0: 31 37 20 31 38 20 31 39 20 32 30 20 32 31 20 32  17 18 19 20 21 2
44b0: 32 20 32 33 20 32 34 7d 0a 0a 20 20 23 20 54 65  2 23 24}..  # Te
44c0: 73 74 20 74 68 61 74 20 69 66 20 61 20 63 68 65  st that if a che
44d0: 63 6b 70 6f 69 6e 74 65 72 20 63 61 6e 6e 6f 74  ckpointer cannot
44e0: 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75   obtain the requ
44f0: 69 72 65 64 20 6c 6f 63 6b 73 2c 20 69 74 0a 20  ired locks, it. 
4500: 20 23 20 72 65 6c 65 61 73 65 73 20 61 6c 6c 20   # releases all 
4510: 6c 6f 63 6b 73 20 62 65 66 6f 72 65 20 72 65 74  locks before ret
4520: 75 72 6e 69 6e 67 20 61 20 62 75 73 79 20 65 72  urning a busy er
4530: 72 6f 72 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  ror..  #.  do_te
4540: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 35  st wal-10.$tn.35
4550: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
4560: 20 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46   .      DELETE F
4570: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e  ROM t1;.      IN
4580: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4590: 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20  UES('a', 'b');. 
45a0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
45b0: 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
45c0: 27 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  'd');.    }.    
45d0: 73 71 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47  sql2 {.      BEG
45e0: 49 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45  IN;.        SELE
45f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
4600: 20 20 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64    }.  } {a b c d
4610: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4620: 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20 20  10.$tn.36 {.    
4630: 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d  catchsql { PRAGM
4640: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
4650: 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20   }.  } {0 {}}.  
4660: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
4670: 74 6e 2e 33 36 20 7b 0a 20 20 20 20 73 71 6c 33  tn.36 {.    sql3
4680: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4690: 31 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66  1 VALUES('e', 'f
46a0: 27 29 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20  ') }.    sql2 { 
46b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
46c0: 20 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64 7d   }.  } {a b c d}
46d0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
46e0: 30 2e 24 74 6e 2e 33 37 20 7b 0a 20 20 20 20 73  0.$tn.37 {.    s
46f0: 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 20 20 65  ql2 COMMIT.    e
4700: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
4710: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
4720: 0a 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  .  } {}.}..#----
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4770: 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f  -----.# This blo
4780: 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c  ck of tests, wal
4790: 2d 31 31 2e 2a 2c 20 74 65 73 74 20 74 68 61 74  -11.*, test that
47a0: 20 6e 6f 74 68 69 6e 67 20 67 6f 65 73 20 74 65   nothing goes te
47b0: 72 72 69 62 6c 79 20 77 72 6f 6e 67 0a 23 20 69  rribly wrong.# i
47c0: 66 20 66 72 61 6d 65 73 20 6d 75 73 74 20 62 65  f frames must be
47d0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
47e0: 6c 6f 67 20 66 69 6c 65 20 62 65 66 6f 72 65 20  log file before 
47f0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
4800: 0a 23 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e  .# committed (in
4810: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
4820: 70 20 6d 65 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f  p memory)..#.do_
4830: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 20 7b 0a  test wal-11.1 {.
4840: 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78    reopen_db.  ex
4850: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
4860: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
4870: 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  10;.    PRAGMA p
4880: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
4890: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
48a0: 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
48b0: 45 59 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20  EY);.  }.  list 
48c0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
48d0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
48e0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
48f0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
4900: 34 34 5d 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74  44].} {1 3}.do_t
4910: 65 73 74 20 77 61 6c 2d 31 31 2e 32 20 7b 0a 20  est wal-11.2 {. 
4920: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
4930: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
4940: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
4950: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4960: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
4970: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
4980: 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c  ].} [list 3 [wal
4990: 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32  _file_size 3 102
49a0: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
49b0: 31 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.3 {.  execsql
49c0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
49d0: 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39  1 VALUES( blob(9
49e0: 30 30 29 20 29 20 7d 0a 20 20 6c 69 73 74 20 5b  00) ) }.  list [
49f0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
4a00: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
4a10: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4a20: 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33  b-wal].} [list 3
4a30: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
4a40: 34 20 31 30 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73  4 1024]]..do_tes
4a50: 74 20 77 61 6c 2d 31 31 2e 34 20 7b 0a 20 20 65  t wal-11.4 {.  e
4a60: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
4a70: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
4a80: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4a90: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
4aa0: 74 31 3b 20 20 20 2d 2d 20 32 0a 20 20 20 20 20  t1;   -- 2.     
4ab0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4ac0: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
4ad0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 34   FROM t1;   -- 4
4ae0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4af0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
4b00: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
4b10: 20 20 2d 2d 20 38 0a 20 20 20 20 20 20 49 4e 53    -- 8.      INS
4b20: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4b30: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
4b40: 4d 20 74 31 3b 20 20 20 2d 2d 20 31 36 0a 20 20  M t1;   -- 16.  
4b50: 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  }.  list [expr [
4b60: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4b70: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
4b80: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4b90: 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f  .} [list 3 [wal_
4ba0: 66 69 6c 65 5f 73 69 7a 65 20 33 32 20 31 30 32  file_size 32 102
4bb0: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
4bc0: 31 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.5 {.  execsql
4bd0: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63   { .    SELECT c
4be0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
4bf0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
4c00: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
4c10: 0a 7d 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65  .} {16 ok}.do_te
4c20: 73 74 20 77 61 6c 2d 31 31 2e 36 20 7b 0a 20 20  st wal-11.6 {.  
4c30: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
4c40: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4c50: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4c60: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4c70: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4c80: 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c  [list 3 [wal_fil
4c90: 65 5f 73 69 7a 65 20 34 31 20 31 30 32 34 5d 5d  e_size 41 1024]]
4ca0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
4cb0: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
4cc0: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
4cd0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4ce0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
4cf0: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
4d00: 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  {16 ok}.do_test 
4d10: 77 61 6c 2d 31 31 2e 38 20 7b 0a 20 20 65 78 65  wal-11.8 {.  exe
4d20: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
4d30: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
4d40: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4d50: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4d60: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4d70: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4d80: 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f 66 69  [list 37 [wal_fi
4d90: 6c 65 5f 73 69 7a 65 20 34 31 20 31 30 32 34 5d  le_size 41 1024]
4da0: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
4db0: 2e 39 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .9 {.  db close.
4dc0: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
4dd0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
4de0: 2f 31 30 32 34 5d 20 5b 6c 6f 67 5f 64 65 6c 65  /1024] [log_dele
4df0: 74 65 64 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ted test.db-wal]
4e00: 0a 7d 20 7b 33 37 20 31 7d 0a 73 71 6c 69 74 65  .} {37 1}.sqlite
4e10: 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62  3_wal db test.db
4e20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
4e30: 31 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  10 {.  execsql {
4e40: 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68  .    PRAGMA cach
4e50: 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20  e_size = 10;.   
4e60: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
4e70: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
4e80: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
4e90: 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20  OM t1;   -- 32. 
4ea0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
4eb0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4ec0: 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  }.  list [expr [
4ed0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4ee0: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
4ef0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4f00: 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c  .} [list 37 [wal
4f10: 5f 66 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30  _file_size 37 10
4f20: 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  24]].do_test wal
4f30: 2d 31 31 2e 31 31 20 7b 0a 20 20 65 78 65 63 73  -11.11 {.  execs
4f40: 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43  ql {.      SELEC
4f50: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
4f60: 74 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  t1;.    ROLLBACK
4f70: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
4f80: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
4f90: 20 7d 0a 7d 20 7b 33 32 20 31 36 7d 0a 64 6f 5f   }.} {32 16}.do_
4fa0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 32 20 7b  test wal-11.12 {
4fb0: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4fc0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4fd0: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
4fe0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
4ff0: 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f  } [list 37 [wal_
5000: 66 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32  file_size 37 102
5010: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
5020: 31 31 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71  11.13 {.  execsq
5030: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
5040: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 20 62  NTO t1 VALUES( b
5050: 6c 6f 62 28 39 30 30 29 20 29 3b 0a 20 20 20 20  lob(900) );.    
5060: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
5070: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41  FROM t1;.    PRA
5080: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
5090: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 37 20 6f  eck;.  }.} {17 o
50a0: 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  k}.do_test wal-1
50b0: 31 2e 31 34 20 7b 0a 20 20 6c 69 73 74 20 5b 65  1.14 {.  list [e
50c0: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
50d0: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66  est.db]/1024] [f
50e0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
50f0: 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 37  -wal].} [list 37
5100: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
5110: 33 37 20 31 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d  37 1024]]...#---
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c  ------.# This bl
5170: 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61  ock of tests, wa
5180: 6c 2d 31 32 2e 2a 2c 20 74 65 73 74 73 20 74 68  l-12.*, tests th
5190: 65 20 66 69 78 20 66 6f 72 20 61 20 70 72 6f 62  e fix for a prob
51a0: 6c 65 6d 20 74 68 61 74 20 0a 23 20 63 6f 75 6c  lem that .# coul
51b0: 64 20 6f 63 63 75 72 20 69 66 20 61 20 6c 6f 67  d occur if a log
51c0: 20 74 68 61 74 20 69 73 20 61 20 70 72 65 66 69   that is a prefi
51d0: 78 20 6f 66 20 61 6e 20 6f 6c 64 65 72 20 6c 6f  x of an older lo
51e0: 67 20 69 73 20 77 72 69 74 74 65 6e 20 0a 23 20  g is written .# 
51f0: 69 6e 74 6f 20 61 20 72 65 75 73 65 64 20 6c 6f  into a reused lo
5200: 67 20 66 69 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e  g file..#.reopen
5210: 5f 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  _db.do_test wal-
5220: 31 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  12.1 {.  execsql
5230: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
5240: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
5250: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
5260: 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 43   t1(x, y);.    C
5270: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
5280: 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
5290: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
52a0: 27 41 27 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c  'A', 1);.  }.  l
52b0: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
52c0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
52d0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
52e0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
52f0: 69 73 74 20 31 20 5b 77 61 6c 5f 66 69 6c 65 5f  ist 1 [wal_file_
5300: 73 69 7a 65 20 35 20 31 30 32 34 5d 5d 0a 64 6f  size 5 1024]].do
5310: 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 32 20 7b  _test wal-12.2 {
5320: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
5330: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
5340: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5350: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
5360: 6f 75 73 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20  ous = normal;.  
5370: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
5380: 79 20 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20  y = 0 WHERE x = 
5390: 27 41 27 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20  'A';.  }.  list 
53a0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
53b0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
53c0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
53d0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
53e0: 34 34 5d 0a 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74  44].} {3 1}.do_t
53f0: 65 73 74 20 77 61 6c 2d 31 32 2e 33 20 7b 0a 20  est wal-12.3 {. 
5400: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
5410: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
5420: 28 27 42 27 2c 20 31 29 20 7d 0a 20 20 6c 69 73  ('B', 1) }.  lis
5430: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
5440: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
5450: 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  ] [expr [file si
5460: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f  ze test.db-wal]/
5470: 31 30 34 34 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f  1044].} {3 2}.do
5480: 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b  _test wal-12.4 {
5490: 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f  .  file copy -fo
54a0: 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  rce test.db test
54b0: 32 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79  2.db.  file copy
54c0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d   -force test.db-
54d0: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
54e0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
54f0: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78  b2 test2.db.  ex
5500: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
5510: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
5520: 20 7b 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65   {B 1}.db2 close
5530: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e  .do_test wal-12.
5540: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
5550: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
5560: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55  heckpoint;.    U
5570: 50 44 41 54 45 20 74 32 20 53 45 54 20 79 20 3d  PDATE t2 SET y =
5580: 20 32 20 57 48 45 52 45 20 78 20 3d 20 27 42 27   2 WHERE x = 'B'
5590: 3b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  ; .    PRAGMA wa
55a0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
55b0: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
55c0: 79 20 3d 20 31 20 57 48 45 52 45 20 78 20 3d 20  y = 1 WHERE x = 
55d0: 27 41 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  'A';.    PRAGMA 
55e0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
55f0: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
5600: 54 20 79 20 3d 20 30 20 57 48 45 52 45 20 78 20  T y = 0 WHERE x 
5610: 3d 20 27 41 27 3b 0a 20 20 20 20 53 45 4c 45 43  = 'A';.    SELEC
5620: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
5630: 0a 7d 20 7b 42 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {B 2}.do_test
5640: 20 77 61 6c 2d 31 32 2e 36 20 7b 0a 20 20 66 69   wal-12.6 {.  fi
5650: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74  le copy -force t
5660: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
5670: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
5680: 63 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  ce test.db-wal t
5690: 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71  est2.db-wal.  sq
56a0: 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65  lite3_wal db2 te
56b0: 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  st2.db.  execsql
56c0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
56d0: 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 42 20 32   t2 } db2.} {B 2
56e0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62 20 63  }.db2 close.db c
56f0: 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  lose..#---------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5740: 0a 23 20 54 65 73 74 20 6c 61 72 67 65 20 6c 6f  .# Test large lo
5750: 67 20 73 75 6d 6d 61 72 69 65 73 2e 0a 23 0a 23  g summaries..#.#
5760: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 22 6c   In this case "l
5770: 61 72 67 65 22 20 75 73 75 61 6c 6c 79 20 6d 65  arge" usually me
5780: 61 6e 73 20 61 20 6c 6f 67 20 66 69 6c 65 20 74  ans a log file t
5790: 68 61 74 20 72 65 71 75 69 72 65 73 20 61 20 77  hat requires a w
57a0: 61 6c 2d 69 6e 64 65 78 0a 23 20 6d 61 70 70 69  al-index.# mappi
57b0: 6e 67 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36  ng larger than 6
57c0: 34 4b 42 20 28 74 68 65 20 64 65 66 61 75 6c 74  4KB (the default
57d0: 20 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74   initial allocat
57e0: 69 6f 6e 29 2e 20 41 20 36 34 4b 42 20 77 61 6c  ion). A 64KB wal
57f0: 2d 69 6e 64 65 78 0a 23 20 69 73 20 6c 61 72 67  -index.# is larg
5800: 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6c  e enough for a l
5810: 6f 67 20 66 69 6c 65 20 74 68 61 74 20 63 6f 6e  og file that con
5820: 74 61 69 6e 73 20 61 70 70 72 6f 78 69 6d 61 74  tains approximat
5830: 65 6c 79 20 31 33 31 30 30 20 66 72 61 6d 65 73  ely 13100 frames
5840: 2e 0a 23 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f  ..# So the follo
5850: 77 69 6e 67 20 74 65 73 74 73 20 63 72 65 61 74  wing tests creat
5860: 65 20 6c 6f 67 73 20 63 6f 6e 74 61 69 6e 69 6e  e logs containin
5870: 67 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20  g at least this 
5880: 6d 61 6e 79 20 66 72 61 6d 65 73 2e 0a 23 0a 23  many frames..#.#
5890: 20 77 61 6c 2d 31 33 2e 31 2e 2a 3a 20 54 68 69   wal-13.1.*: Thi
58a0: 73 20 74 65 73 74 20 63 61 73 65 20 63 72 65 61  s test case crea
58b0: 74 65 73 20 61 20 76 65 72 79 20 6c 61 72 67 65  tes a very large
58c0: 20 6c 6f 67 20 66 69 6c 65 20 77 69 74 68 69 6e   log file within
58d0: 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20   the.#          
58e0: 20 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 28     file-system (
58f0: 61 72 6f 75 6e 64 20 32 30 30 4d 42 29 2e 20 54  around 200MB). T
5900: 68 65 20 6c 6f 67 20 66 69 6c 65 20 64 6f 65 73  he log file does
5910: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 23 20 20   not contain.#  
5920: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 76             any v
5930: 61 6c 69 64 20 66 72 61 6d 65 73 2e 20 54 65 73  alid frames. Tes
5940: 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
5950: 61 73 65 20 66 69 6c 65 20 63 61 6e 20 73 74 69  ase file can sti
5960: 6c 6c 20 62 65 0a 23 20 20 20 20 20 20 20 20 20  ll be.#         
5970: 20 20 20 20 6f 70 65 6e 65 64 20 61 6e 64 20 71      opened and q
5980: 75 65 72 69 65 64 2c 20 61 6e 64 20 74 68 61 74  ueried, and that
5990: 20 74 68 65 20 69 6e 76 61 6c 69 64 20 6c 6f 67   the invalid log
59a0: 20 66 69 6c 65 20 63 61 75 73 65 73 20 6e 6f 20   file causes no 
59b0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .#             p
59c0: 72 6f 62 6c 65 6d 73 2e 0a 23 0a 23 20 77 61 6c  roblems..#.# wal
59d0: 2d 31 33 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68  -13.2.*: Test th
59e0: 61 74 20 61 20 70 72 6f 63 65 73 73 20 6d 61 79  at a process may
59f0: 20 63 72 65 61 74 65 20 61 20 6c 61 72 67 65 20   create a large 
5a00: 6c 6f 67 20 66 69 6c 65 20 61 6e 64 20 71 75 65  log file and que
5a10: 72 79 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  ry.#            
5a20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
5a30: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6c 6f 67  ncluding the log
5a40: 20 66 69 6c 65 20 74 68 61 74 20 69 74 20 69 74   file that it it
5a50: 73 65 6c 66 20 63 72 65 61 74 65 64 29 2e 0a 23  self created)..#
5a60: 0a 23 20 77 61 6c 2d 31 33 2e 33 2e 2a 3a 20 54  .# wal-13.3.*: T
5a70: 65 73 74 20 74 68 61 74 20 69 66 20 61 20 76 65  est that if a ve
5a80: 72 79 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c  ry large log fil
5a90: 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
5aa0: 64 20 74 68 65 6e 20 61 0a 23 20 20 20 20 20 20  d then a.#      
5ab0: 20 20 20 20 20 20 20 73 65 63 6f 6e 64 20 63 6f         second co
5ac0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
5ad0: 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ed on the databa
5ae0: 73 65 20 66 69 6c 65 2c 20 69 74 20 69 73 20 70  se file, it is p
5af0: 6f 73 73 69 62 6c 65 0a 23 20 20 20 20 20 20 20  ossible.#       
5b00: 20 20 20 20 20 20 74 6f 20 71 75 65 72 79 20 74        to query t
5b10: 68 65 20 64 61 74 61 62 61 73 65 20 28 61 6e 64  he database (and
5b20: 20 74 68 65 20 76 65 72 79 20 6c 61 72 67 65 20   the very large 
5b30: 6c 6f 67 29 20 75 73 69 6e 67 20 74 68 65 0a 23  log) using the.#
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 63               sec
5b50: 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ond connection..
5b60: 23 0a 23 20 77 61 6c 2d 31 33 2e 34 2e 2a 3a 20  #.# wal-13.4.*: 
5b70: 53 61 6d 65 20 74 65 73 74 20 61 73 20 77 61 6c  Same test as wal
5b80: 2d 31 33 2e 33 2e 2a 2e 20 45 78 63 65 70 74 20  -13.3.*. Except 
5b90: 69 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  in this case the
5ba0: 20 73 65 63 6f 6e 64 0a 23 20 20 20 20 20 20 20   second.#       
5bb0: 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
5bc0: 20 69 73 20 6f 70 65 6e 65 64 20 62 79 20 61 6e   is opened by an
5bd0: 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
5be0: 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c  s..#.do_test wal
5bf0: 2d 31 33 2e 31 2e 31 20 7b 0a 20 20 6c 69 73 74  -13.1.1 {.  list
5c00: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
5c10: 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 65 78 69  st.db] [file exi
5c20: 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  sts test.db-wal]
5c30: 0a 7d 20 7b 31 20 30 7d 0a 64 6f 5f 74 65 73 74  .} {1 0}.do_test
5c40: 20 77 61 6c 2d 31 33 2e 31 2e 32 20 7b 0a 20 20   wal-13.1.2 {.  
5c50: 73 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73  set fd [open tes
5c60: 74 2e 64 62 2d 77 61 6c 20 77 5d 0a 20 20 73 65  t.db-wal w].  se
5c70: 65 6b 20 24 66 64 20 5b 65 78 70 72 20 32 30 30  ek $fd [expr 200
5c80: 2a 31 30 32 34 2a 31 30 32 34 5d 0a 20 20 70 75  *1024*1024].  pu
5c90: 74 73 20 24 66 64 20 22 22 0a 20 20 63 6c 6f 73  ts $fd "".  clos
5ca0: 65 20 24 66 64 0a 20 20 73 71 6c 69 74 65 33 20  e $fd.  sqlite3 
5cb0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
5cc0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
5cd0: 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 42 20 32  FROM t2 }.} {B 2
5ce0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33  }.do_test wal-13
5cf0: 2e 31 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73  .1.3 {.  db clos
5d00: 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20  e.  file exists 
5d10: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 7b 30  test.db-wal.} {0
5d20: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  }..do_test wal-1
5d30: 33 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  3.2.1 {.  sqlite
5d40: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
5d50: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
5d60: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
5d70: 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74   }.} {1}.do_test
5d80: 20 77 61 6c 2d 31 33 2e 32 2e 32 20 7b 0a 20 20   wal-13.2.2 {.  
5d90: 64 62 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62  db function blob
5da0: 20 62 6c 6f 62 0a 20 20 66 6f 72 20 7b 73 65 74   blob.  for {set
5db0: 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 36 7d 20   i 0} {$i < 16} 
5dc0: 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65  {incr i} {.    e
5dd0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
5de0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
5df0: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
5e00: 30 30 29 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20  00) FROM t2 }.  
5e10: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
5e20: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5e30: 4f 4d 20 74 32 20 7d 0a 7d 20 5b 65 78 70 72 20  OM t2 }.} [expr 
5e40: 69 6e 74 28 70 6f 77 28 32 2c 20 31 36 29 29 5d  int(pow(2, 16))]
5e50: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e  .do_test wal-13.
5e60: 32 2e 33 20 7b 0a 20 20 65 78 70 72 20 5b 66 69  2.3 {.  expr [fi
5e70: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
5e80: 77 61 6c 5d 20 3e 20 5b 77 61 6c 5f 66 69 6c 65  wal] > [wal_file
5e90: 5f 73 69 7a 65 20 33 33 30 30 30 20 31 30 32 34  _size 33000 1024
5ea0: 5d 0a 7d 20 31 0a 0a 64 6f 5f 6d 75 6c 74 69 63  ].} 1..do_multic
5eb0: 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a  lient_test tn {.
5ec0: 20 20 69 6e 63 72 20 74 6e 20 32 0a 0a 20 20 64    incr tn 2..  d
5ed0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74  o_test wal-13.$t
5ee0: 6e 2e 30 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b  n.0 {.    sql1 {
5ef0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
5f00: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
5f10: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
5f20: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
5f30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5f40: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
5f50: 6f 62 28 38 30 30 29 3b 0a 20 20 20 20 7d 0a 20  ob(800);.    }. 
5f60: 20 20 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54     sql1 { SELECT
5f70: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
5f80: 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 20 20 66  1 }.  } {1}..  f
5f90: 6f 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24  or {set ii 1} {$
5fa0: 69 69 3c 31 36 7d 20 7b 69 6e 63 72 20 69 69 7d  ii<16} {incr ii}
5fb0: 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77   {.    do_test w
5fc0: 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e 61 20  al-13.$tn.$ii.a 
5fd0: 7b 0a 20 20 20 20 20 20 73 71 6c 32 20 7b 20 49  {.      sql2 { I
5fe0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
5ff0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
6000: 38 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20  800) FROM t1 }. 
6010: 20 20 20 20 20 73 71 6c 32 20 7b 20 53 45 4c 45       sql2 { SELE
6020: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
6030: 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70   t1 }.    } [exp
6040: 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20  r (1<<$ii)].    
6050: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24  do_test wal-13.$
6060: 74 6e 2e 24 69 69 2e 62 20 7b 0a 20 20 20 20 20  tn.$ii.b {.     
6070: 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 63   sql1 { SELECT c
6080: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
6090: 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 28 31  }.    } [expr (1
60a0: 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f 5f 74  <<$ii)].    do_t
60b0: 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24  est wal-13.$tn.$
60c0: 69 69 2e 63 20 7b 0a 20 20 20 20 20 20 73 71 6c  ii.c {.      sql
60d0: 31 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  1 { SELECT count
60e0: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  (*) FROM t1 }.  
60f0: 20 20 7d 20 5b 65 78 70 72 20 28 31 3c 3c 24 69    } [expr (1<<$i
6100: 69 29 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  i)].    do_test 
6110: 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e 64  wal-13.$tn.$ii.d
6120: 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20   {.      sql1 { 
6130: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
6140: 5f 63 68 65 63 6b 20 7d 0a 20 20 20 20 7d 20 7b  _check }.    } {
6150: 6f 6b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  ok}.  }.}..#----
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61a0: 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20 61 20  -----.# Check a 
61b0: 66 75 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 63  fun corruption c
61c0: 61 73 65 20 68 61 73 20 62 65 65 6e 20 66 69 78  ase has been fix
61d0: 65 64 2e 0a 23 0a 23 20 54 68 65 20 70 72 6f 62  ed..#.# The prob
61e0: 6c 65 6d 20 77 61 73 20 74 68 61 74 20 61 66 74  lem was that aft
61f0: 65 72 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20  er performing a 
6200: 63 68 65 63 6b 70 6f 69 6e 74 20 75 73 69 6e 67  checkpoint using
6210: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 23 20   a connection.# 
6220: 74 68 61 74 20 68 61 64 20 61 6e 20 6f 75 74 2d  that had an out-
6230: 6f 66 2d 64 61 74 65 20 70 61 67 65 72 2d 63 61  of-date pager-ca
6240: 63 68 65 2c 20 74 68 65 20 6e 65 78 74 20 74 69  che, the next ti
6250: 6d 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  me the connectio
6260: 6e 20 77 61 73 0a 23 20 75 73 65 64 20 69 74 20  n was.# used it 
6270: 64 69 64 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20  did not realize 
6280: 74 68 65 20 63 61 63 68 65 20 77 61 73 20 6f 75  the cache was ou
6290: 74 2d 6f 66 2d 64 61 74 65 20 61 6e 64 20 70 72  t-of-date and pr
62a0: 6f 63 65 65 64 65 64 20 74 6f 0a 23 20 6f 70 65  oceeded to.# ope
62b0: 72 61 74 65 20 77 69 74 68 20 61 6e 20 69 6e 63  rate with an inc
62c0: 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
62d0: 20 4c 65 61 64 69 6e 67 20 74 6f 20 63 6f 72 72   Leading to corr
62e0: 75 70 74 69 6f 6e 2e 0a 23 0a 63 61 74 63 68 20  uption..#.catch 
62f0: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 63 61 74  { db close }.cat
6300: 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d  ch { db2 close }
6310: 0a 63 61 74 63 68 20 7b 20 64 62 33 20 63 6c 6f  .catch { db3 clo
6320: 73 65 20 7d 0a 66 69 6c 65 20 64 65 6c 65 74 65  se }.file delete
6330: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
6340: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 73 71 6c 69  test.db-wal.sqli
6350: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 73  te3 db test.db.s
6360: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
6370: 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  db.do_test wal-1
6380: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
6390: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
63a0: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
63b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
63c0: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
63d0: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
63e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
63f0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20  randomblob(10), 
6400: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29  randomblob(100))
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 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT 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 20 46 52 4f 4d  omblob(100) FROM
6450: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
6460: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
6470: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72  andomblob(10), r
6480: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46  andomblob(100) F
6490: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
64a0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
64b0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29  T randomblob(10)
64c0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
64d0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a  ) FROM t1;.  }..
64e0: 20 20 64 62 32 20 65 76 61 6c 20 7b 20 0a 20 20    db2 eval { .  
64f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6500: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6510: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
6520: 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53  ob(100);.    INS
6530: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
6540: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  CT randomblob(10
6550: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
6560: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
6570: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
6580: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
6590: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20  ndomblob(100);. 
65a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
65b0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
65c0: 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62  lob(10), randomb
65d0: 6c 6f 62 28 31 30 30 29 3b 0a 20 20 7d 0a 0a 20  lob(100);.  }.. 
65e0: 20 23 20 41 66 74 65 72 20 65 78 65 63 75 74 69   # After executi
65f0: 6e 67 20 74 68 65 20 22 50 52 41 47 4d 41 20 77  ng the "PRAGMA w
6600: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20  al_checkpoint", 
6610: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 20  connection [db] 
6620: 77 61 73 20 62 65 69 6e 67 0a 20 20 23 20 6c 65  was being.  # le
6630: 66 74 20 77 69 74 68 20 61 6e 20 69 6e 63 6f 6e  ft with an incon
6640: 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 52  sistent cache. R
6650: 75 6e 6e 69 6e 67 20 74 68 65 20 43 52 45 41 54  unning the CREAT
6660: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
6670: 74 0a 20 20 23 20 69 6e 20 74 68 69 73 20 73 74  t.  # in this st
6680: 61 74 65 20 6c 65 64 20 74 6f 20 64 61 74 61 62  ate led to datab
6690: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
66a0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 0a 20 20    catchsql { .  
66b0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
66c0: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 43 52 45  ckpoint;.    CRE
66d0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 6f 6e 20  ATE INDEX i1 on 
66e0: 74 31 28 62 29 3b 0a 20 20 7d 0a 20 20 20 0a 20  t1(b);.  }.   . 
66f0: 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47   db2 eval { PRAG
6700: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
6710: 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 63 61 74  ck }.} {ok}..cat
6720: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
6730: 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73  catch { db2 clos
6740: 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e }..#----------
6750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6790: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
67a0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
67b0: 20 77 61 6c 2d 31 35 2e 2a 20 2d 20 66 6f 63 75   wal-15.* - focu
67c0: 73 20 6f 6e 20 74 65 73 74 69 6e 67 20 74 68 65  s on testing the
67d0: 20 0a 23 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   .# implementati
67e0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
67f0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
6800: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 23 0a  () interface..#.
6810: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
6820: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  ce test.db test.
6830: 64 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20 64  db-wal.sqlite3 d
6840: 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73  b test.db.do_tes
6850: 74 20 77 61 6c 2d 31 35 2e 31 20 7b 0a 20 20 65  t wal-15.1 {.  e
6860: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6870: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
6880: 3d 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  = 0;.    PRAGMA 
6890: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
68a0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
68b0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
68c0: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
68d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
68e0: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
68f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
6900: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
6910: 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68  .} {}..# Test th
6920: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  at an error is r
6930: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
6940: 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20  atabase name is 
6950: 6e 6f 74 20 72 65 63 6f 67 6e 69 7a 65 64 0a 23  not recognized.#
6960: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
6970: 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  2.1 {.  sqlite3_
6980: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
6990: 62 20 61 75 78 0a 7d 20 7b 53 51 4c 49 54 45 5f  b aux.} {SQLITE_
69a0: 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 77  ERROR}.do_test w
69b0: 61 6c 2d 31 35 2e 32 2e 32 20 7b 0a 20 20 73 71  al-15.2.2 {.  sq
69c0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62  lite3_errcode db
69d0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52  .} {SQLITE_ERROR
69e0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
69f0: 2e 32 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  .2.3 {.  sqlite3
6a00: 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 75 6e  _errmsg db.} {un
6a10: 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20  known database: 
6a20: 61 75 78 7d 0a 0a 23 20 54 65 73 74 20 74 68 61  aux}..# Test tha
6a30: 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
6a40: 74 75 72 6e 65 64 20 69 66 20 61 6e 20 61 74 74  turned if an att
6a50: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
6a60: 63 68 65 63 6b 70 6f 69 6e 74 0a 23 20 69 66 20  checkpoint.# if 
6a70: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
6a80: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
6a90: 61 62 61 73 65 2e 0a 23 0a 64 6f 5f 74 65 73 74  abase..#.do_test
6aa0: 20 77 61 6c 2d 31 35 2e 33 2e 31 20 7b 0a 20 20   wal-15.3.1 {.  
6ab0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45  execsql {.    BE
6ac0: 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  GIN;.    INSERT 
6ad0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
6ae0: 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 4);.  }.  sqli
6af0: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
6b00: 6e 74 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 53 51  nt db main.} {SQ
6b10: 4c 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f  LITE_LOCKED}.do_
6b20: 74 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e 32 20  test wal-15.3.2 
6b30: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 63  {.  sqlite3_errc
6b40: 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45  ode db.} {SQLITE
6b50: 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74  _LOCKED}.do_test
6b60: 20 77 61 6c 2d 31 35 2e 33 2e 33 20 7b 0a 20 20   wal-15.3.3 {.  
6b70: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64  sqlite3_errmsg d
6b80: 62 0a 7d 20 7b 64 61 74 61 62 61 73 65 20 74 61  b.} {database ta
6b90: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 7d 0a 0a  ble is locked}..
6ba0: 23 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f  # Earlier versio
6bb0: 6e 73 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65  ns returned an e
6bc0: 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
6bd0: 20 69 66 20 74 68 65 20 64 62 20 63 61 6e 6e 6f   if the db canno
6be0: 74 20 62 65 20 0a 23 20 63 68 65 63 6b 70 6f 69  t be .# checkpoi
6bf0: 6e 74 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  nted because of 
6c00: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 61 6e  locks held by an
6c10: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
6c20: 2e 20 43 68 65 63 6b 20 74 68 61 74 0a 23 20 74  . Check that.# t
6c30: 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  his is no longer
6c40: 20 74 68 65 20 63 61 73 65 2e 0a 23 0a 73 71 6c   the case..#.sql
6c50: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
6c60: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
6c70: 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.1 {.  execsql 
6c80: 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  {.    BEGIN;.   
6c90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
6ca0: 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20  1;.  } db2.} {1 
6cb0: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  2}.do_test wal-1
6cc0: 35 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  5.4.2 {.  execsq
6cd0: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 73  l { COMMIT }.  s
6ce0: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
6cf0: 70 6f 69 6e 74 20 64 62 0a 7d 20 7b 53 51 4c 49  point db.} {SQLI
6d00: 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 77  TE_OK}.do_test w
6d10: 61 6c 2d 31 35 2e 34 2e 33 20 7b 0a 20 20 73 71  al-15.4.3 {.  sq
6d20: 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a  lite3_errmsg db.
6d30: 7d 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d  } {not an error}
6d40: 0a 0a 23 20 41 66 74 65 72 20 5b 64 62 32 5d 20  ..# After [db2] 
6d50: 64 72 6f 70 73 20 69 74 73 20 6c 6f 63 6b 2c 20  drops its lock, 
6d60: 5b 64 62 5d 20 6d 61 79 20 63 68 65 63 6b 70 6f  [db] may checkpo
6d70: 69 6e 74 20 74 68 65 20 64 62 2e 0a 23 0a 64 6f  int the db..#.do
6d80: 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 34  _test wal-15.4.4
6d90: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
6da0: 4f 4d 4d 49 54 20 7d 20 64 62 32 0a 20 20 73 71  OMMIT } db2.  sq
6db0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
6dc0: 6f 69 6e 74 20 64 62 0a 7d 20 7b 53 51 4c 49 54  oint db.} {SQLIT
6dd0: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  E_OK}.do_test wa
6de0: 6c 2d 31 35 2e 34 2e 35 20 7b 0a 20 20 73 71 6c  l-15.4.5 {.  sql
6df0: 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d  ite3_errmsg db.}
6e00: 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a   {not an error}.
6e10: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34  do_test wal-15.4
6e20: 2e 36 20 7b 0a 20 20 66 69 6c 65 20 73 69 7a 65  .6 {.  file size
6e30: 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72   test.db.} [expr
6e40: 20 31 30 32 34 2a 32 5d 0a 0a 63 61 74 63 68 20   1024*2]..catch 
6e50: 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61  { db2 close }.ca
6e60: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
6e70: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
6ec0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
6ed0: 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77 61  ck of tests - wa
6ee0: 6c 2d 31 36 2e 2a 20 2d 20 74 65 73 74 20 74 68  l-16.* - test th
6ef0: 61 74 20 69 66 20 61 20 4e 55 4c 4c 20 70 6f 69  at if a NULL poi
6f00: 6e 74 65 72 20 6f 72 0a 23 20 61 6e 20 65 6d 70  nter or.# an emp
6f10: 74 79 20 73 74 72 69 6e 67 20 69 73 20 70 61 73  ty string is pas
6f20: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
6f30: 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 68  d argument of th
6f40: 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  e wal_checkpoint
6f50: 28 29 0a 23 20 41 50 49 2c 20 61 6e 20 61 74 74  ().# API, an att
6f60: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
6f70: 63 68 65 63 6b 70 6f 69 6e 74 20 61 6c 6c 20 61  checkpoint all a
6f80: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
6f90: 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e  s..#.foreach {tn
6fa0: 20 63 6b 70 74 5f 63 6d 64 20 63 6b 70 74 5f 72   ckpt_cmd ckpt_r
6fb0: 65 73 20 63 6b 70 74 5f 6d 61 69 6e 20 63 6b 70  es ckpt_main ckp
6fc0: 74 5f 61 75 78 7d 20 7b 0a 20 20 31 20 7b 73 71  t_aux} {.  1 {sq
6fd0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
6fe0: 6f 69 6e 74 20 64 62 7d 20 20 20 20 20 20 20 20  oint db}        
6ff0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20        SQLITE_OK 
7000: 20 20 20 20 31 20 31 0a 20 20 32 20 7b 73 71 6c      1 1.  2 {sql
7010: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
7020: 69 6e 74 20 64 62 20 22 22 7d 20 20 20 20 20 20  int db ""}      
7030: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20       SQLITE_OK  
7040: 20 20 20 31 20 31 0a 20 20 33 20 7b 64 62 20 65     1 1.  3 {db e
7050: 76 61 6c 20 22 50 52 41 47 4d 41 20 77 61 6c 5f  val "PRAGMA wal_
7060: 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 20  checkpoint"}    
7070: 20 20 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20      {}          
7080: 20 20 31 20 31 0a 0a 20 20 34 20 7b 73 71 6c 69    1 1..  4 {sqli
7090: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
70a0: 6e 74 20 64 62 20 6d 61 69 6e 7d 20 20 20 20 20  nt db main}     
70b0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
70c0: 20 20 31 20 30 0a 20 20 35 20 7b 73 71 6c 69 74    1 0.  5 {sqlit
70d0: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
70e0: 74 20 64 62 20 61 75 78 7d 20 20 20 20 20 20 20  t db aux}       
70f0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
7100: 20 30 20 31 0a 20 20 36 20 7b 73 71 6c 69 74 65   0 1.  6 {sqlite
7110: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
7120: 20 64 62 20 74 65 6d 70 7d 20 20 20 20 20 20 20   db temp}       
7130: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
7140: 30 20 30 0a 20 20 37 20 7b 64 62 20 65 76 61 6c  0 0.  7 {db eval
7150: 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77 61   "PRAGMA main.wa
7160: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20  l_checkpoint"}  
7170: 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20 31   {}            1
7180: 20 30 0a 20 20 38 20 7b 64 62 20 65 76 61 6c 20   0.  8 {db eval 
7190: 22 50 52 41 47 4d 41 20 61 75 78 2e 77 61 6c 5f  "PRAGMA aux.wal_
71a0: 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 20  checkpoint"}    
71b0: 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20 30 20  {}            0 
71c0: 31 0a 20 20 39 20 7b 64 62 20 65 76 61 6c 20 22  1.  9 {db eval "
71d0: 50 52 41 47 4d 41 20 74 65 6d 70 2e 77 61 6c 5f  PRAGMA temp.wal_
71e0: 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 7b  checkpoint"}   {
71f0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 30 20 30  }            0 0
7200: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77  .} {.  do_test w
7210: 61 6c 2d 31 36 2e 24 74 6e 2e 31 20 7b 0a 20 20  al-16.$tn.1 {.  
7220: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
7230: 6f 72 63 65 20 74 65 73 74 32 2e 64 62 20 74 65  orce test2.db te
7240: 73 74 32 2e 64 62 2d 77 61 6c 20 74 65 73 74 32  st2.db-wal test2
7250: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  .db-journal.    
7260: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
7270: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  ce test.db test.
7280: 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a  db-wal test.db-j
7290: 6f 75 72 6e 61 6c 0a 0a 20 20 20 20 73 71 6c 69  ournal..    sqli
72a0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
72b0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
72c0: 20 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32     ATTACH 'test2
72d0: 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20 20 20  .db' AS aux;.   
72e0: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 61     PRAGMA main.a
72f0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
7300: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
7310: 2e 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30  .auto_vacuum = 0
7320: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d  ;.      PRAGMA m
7330: 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ain.journal_mode
7340: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50 52   = WAL;.      PR
7350: 41 47 4d 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c  AGMA aux.journal
7360: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
7370: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
7380: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a  onous = NORMAL;.
7390: 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 20 77      }.  } {wal w
73a0: 61 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77  al}..  do_test w
73b0: 61 6c 2d 31 36 2e 24 74 6e 2e 32 20 7b 0a 20 20  al-16.$tn.2 {.  
73c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
73d0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d    CREATE TABLE m
73e0: 61 69 6e 2e 74 31 28 61 2c 20 62 2c 20 50 52 49  ain.t1(a, b, PRI
73f0: 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b  MARY KEY(a, b));
7400: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
7410: 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62 2c  BLE aux.t2(a, b,
7420: 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20   PRIMARY KEY(a, 
7430: 62 29 29 3b 0a 0a 20 20 20 20 20 20 49 4e 53 45  b));..      INSE
7440: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
7450: 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  S(1, randomblob(
7460: 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e  1000));.      IN
7470: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
7480: 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(2, randomblo
7490: 62 28 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  b(1000));.      
74a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
74b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
74c0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 6c 69  .    }.  .    li
74d0: 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  st [file size te
74e0: 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a  st.db] [file siz
74f0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20  e test.db-wal]. 
7500: 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 31   } [list [expr 1
7510: 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65  *1024] [wal_file
7520: 5f 73 69 7a 65 20 31 30 20 31 30 32 34 5d 5d 0a  _size 10 1024]].
7530: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36    do_test wal-16
7540: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 6c 69 73  .$tn.3 {.    lis
7550: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
7560: 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a  t2.db] [file siz
7570: 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a  e test2.db-wal].
7580: 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20    } [list [expr 
7590: 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c  1*1024] [wal_fil
75a0: 65 5f 73 69 7a 65 20 31 36 20 31 30 32 34 5d 5d  e_size 16 1024]]
75b0: 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  .  .  do_test wa
75c0: 6c 2d 31 36 2e 24 74 6e 2e 34 20 5b 6c 69 73 74  l-16.$tn.4 [list
75d0: 20 65 76 61 6c 20 24 63 6b 70 74 5f 63 6d 64 5d   eval $ckpt_cmd]
75e0: 20 24 63 6b 70 74 5f 72 65 73 0a 20 20 0a 20 20   $ckpt_res.  .  
75f0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24  do_test wal-16.$
7600: 74 6e 2e 35 20 7b 0a 20 20 20 20 6c 69 73 74 20  tn.5 {.    list 
7610: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
7620: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
7630: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20  est.db-wal].  } 
7640: 5b 6c 69 73 74 20 5b 65 78 70 72 20 28 24 63 6b  [list [expr ($ck
7650: 70 74 5f 6d 61 69 6e 20 3f 20 37 20 3a 20 31 29  pt_main ? 7 : 1)
7660: 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65  *1024] [wal_file
7670: 5f 73 69 7a 65 20 31 30 20 31 30 32 34 5d 5d 0a  _size 10 1024]].
7680: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
7690: 36 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 6c 69  6.$tn.6 {.    li
76a0: 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  st [file size te
76b0: 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69  st2.db] [file si
76c0: 7a 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 5d  ze test2.db-wal]
76d0: 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72  .  } [list [expr
76e0: 20 28 24 63 6b 70 74 5f 61 75 78 20 3f 20 37 20   ($ckpt_aux ? 7 
76f0: 3a 20 31 29 2a 31 30 32 34 5d 20 5b 77 61 6c 5f  : 1)*1024] [wal_
7700: 66 69 6c 65 5f 73 69 7a 65 20 31 36 20 31 30 32  file_size 16 102
7710: 34 5d 5d 0a 0a 20 20 63 61 74 63 68 20 7b 20 64  4]]..  catch { d
7720: 62 20 63 6c 6f 73 65 20 7d 0a 7d 0a 0a 23 2d 2d  b close }.}..#--
7730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7770: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
7780: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20  llowing tests - 
7790: 77 61 6c 2d 31 37 2e 2a 20 2d 20 61 74 74 65 6d  wal-17.* - attem
77a0: 70 74 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  pt to verify tha
77b0: 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a 23 20  t the correct.# 
77c0: 6e 75 6d 62 65 72 20 6f 66 20 22 70 61 64 64 69  number of "paddi
77d0: 6e 67 22 20 66 72 61 6d 65 73 20 61 72 65 20 61  ng" frames are a
77e0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6c  ppended to the l
77f0: 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 74  og file when a t
7800: 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 69 73 20  ransaction.# is 
7810: 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 73 79 6e  committed in syn
7820: 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 6d 6f  chronous=FULL mo
7830: 64 65 2e 0a 23 20 0a 23 20 44 6f 20 74 68 69 73  de..# .# Do this
7840: 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 64   by creating a d
7850: 61 74 61 62 61 73 65 20 74 68 61 74 20 75 73 65  atabase that use
7860: 73 20 35 31 32 20 62 79 74 65 20 70 61 67 65 73  s 512 byte pages
7870: 2e 20 54 68 65 6e 20 77 72 69 74 69 6e 67 0a 23  . Then writing.#
7880: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
7890: 68 61 74 20 6d 6f 64 69 66 69 65 73 20 31 37 31  hat modifies 171
78a0: 20 70 61 67 65 73 2e 20 49 6e 20 73 79 6e 63 68   pages. In synch
78b0: 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 6d 6f  ronous=NORMAL mo
78c0: 64 65 2c 20 74 68 69 73 0a 23 20 70 72 6f 64 75  de, this.# produ
78d0: 63 65 73 20 61 20 6c 6f 67 20 66 69 6c 65 20 6f  ces a log file o
78e0: 66 3a 0a 23 0a 23 20 20 20 33 32 20 2b 20 28 32  f:.#.#   32 + (2
78f0: 34 2b 35 31 32 29 2a 31 37 31 20 3d 20 39 30 33  4+512)*171 = 903
7900: 31 32 20 62 79 74 65 73 2e 0a 23 0a 23 20 53 6c  12 bytes..#.# Sl
7910: 69 67 68 74 6c 79 20 6c 61 72 67 65 72 20 74 68  ightly larger th
7920: 61 6e 20 31 31 2a 38 31 39 32 20 3d 20 39 30 31  an 11*8192 = 901
7930: 31 32 20 62 79 74 65 73 2e 0a 23 0a 23 20 52 75  12 bytes..#.# Ru
7940: 6e 20 74 68 65 20 74 65 73 74 20 75 73 69 6e 67  n the test using
7950: 20 76 61 72 69 6f 75 73 20 64 69 66 66 65 72 65   various differe
7960: 6e 74 20 73 65 63 74 6f 72 2d 73 69 7a 65 73 2e  nt sector-sizes.
7970: 20 49 6e 20 65 61 63 68 20 63 61 73 65 2c 20 74   In each case, t
7980: 68 65 0a 23 20 57 41 4c 20 63 6f 64 65 20 73 68  he.# WAL code sh
7990: 6f 75 6c 64 20 77 72 69 74 65 20 74 68 65 20 39  ould write the 9
79a0: 30 33 30 30 20 62 79 74 65 73 20 6f 66 20 6c 6f  0300 bytes of lo
79b0: 67 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e  g file containin
79c0: 67 20 74 68 65 20 0a 23 20 74 72 61 6e 73 61 63  g the .# transac
79d0: 74 69 6f 6e 2c 20 74 68 65 6e 20 61 70 70 65 6e  tion, then appen
79e0: 64 20 61 73 20 6d 61 79 20 66 72 61 6d 65 73 20  d as may frames 
79f0: 61 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20  as are required 
7a00: 74 6f 20 65 78 74 65 6e 64 20 74 68 65 0a 23 20  to extend the.# 
7a10: 6c 6f 67 20 66 69 6c 65 20 73 6f 20 74 68 61 74  log file so that
7a20: 20 6e 6f 20 70 61 72 74 20 6f 66 20 74 68 65 20   no part of the 
7a30: 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
7a40: 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e   will be written
7a50: 20 69 6e 74 6f 0a 23 20 61 20 64 69 73 6b 2d 73   into.# a disk-s
7a60: 65 63 74 6f 72 20 75 73 65 64 20 62 79 20 74 72  ector used by tr
7a70: 61 6e 73 61 63 74 69 6f 6e 20 6a 75 73 74 20 63  ansaction just c
7a80: 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a 73 65 74 20  ommitted..#.set 
7a90: 6f 6c 64 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65  old_pending_byte
7aa0: 20 5b 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63   [sqlite3_test_c
7ab0: 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62  ontrol_pending_b
7ac0: 79 74 65 20 30 78 31 30 30 30 30 30 30 30 5d 0a  yte 0x10000000].
7ad0: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
7ae0: 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73   }.foreach {tn s
7af0: 65 63 74 6f 72 73 69 7a 65 20 6c 6f 67 73 69 7a  ectorsize logsiz
7b00: 65 7d 20 22 0a 20 20 31 20 20 20 31 32 38 20 20  e} ".  1   128  
7b10: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
7b20: 37 32 20 35 31 32 5d 0a 20 20 32 20 20 20 32 35  72 512].  2   25
7b30: 36 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  6  [wal_file_siz
7b40: 65 20 31 37 32 20 35 31 32 5d 0a 20 20 33 20 20  e 172 512].  3  
7b50: 20 35 31 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f   512  [wal_file_
7b60: 73 69 7a 65 20 31 37 32 20 35 31 32 5d 20 0a 20  size 172 512] . 
7b70: 20 34 20 20 31 30 32 34 20 20 5b 77 61 6c 5f 66   4  1024  [wal_f
7b80: 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32  ile_size 172 512
7b90: 5d 0a 20 20 35 20 20 32 30 34 38 20 20 5b 77 61  ].  5  2048  [wa
7ba0: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20  l_file_size 172 
7bb0: 35 31 32 5d 0a 20 20 36 20 20 34 30 39 36 20 20  512].  6  4096  
7bc0: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [wal_file_size 1
7bd0: 37 36 20 35 31 32 5d 0a 20 20 37 20 20 38 31 39  76 512].  7  819
7be0: 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  2  [wal_file_siz
7bf0: 65 20 31 38 34 20 35 31 32 5d 0a 22 20 7b 0a 20  e 184 512]." {. 
7c00: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
7c10: 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  rce test.db test
7c20: 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d  .db-wal test.db-
7c30: 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65  journal.  sqlite
7c40: 33 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76 69 63  3_simulate_devic
7c50: 65 20 2d 73 65 63 74 6f 72 73 69 7a 65 20 24 73  e -sectorsize $s
7c60: 65 63 74 6f 72 73 69 7a 65 0a 20 20 73 71 6c 69  ectorsize.  sqli
7c70: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
7c80: 76 66 73 20 64 65 76 73 79 6d 0a 0a 20 20 64 6f  vfs devsym..  do
7c90: 5f 74 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e  _test wal-17.$tn
7ca0: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
7cb0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
7cc0: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b  auto_vacuum = 0;
7cd0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61  .      PRAGMA pa
7ce0: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
7cf0: 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72       PRAGMA jour
7d00: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
7d10: 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e        PRAGMA syn
7d20: 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b  chronous = FULL;
7d30: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
7d40: 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  ql {.      BEGIN
7d50: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
7d60: 41 42 4c 45 20 74 28 78 29 3b 0a 20 20 20 20 7d  ABLE t(x);.    }
7d70: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
7d80: 30 7d 20 7b 24 69 3c 31 36 36 7d 20 7b 69 6e 63  0} {$i<166} {inc
7d90: 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 65 78 65  r i} {.      exe
7da0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
7db0: 54 4f 20 74 20 56 41 4c 55 45 53 28 72 61 6e 64  TO t VALUES(rand
7dc0: 6f 6d 62 6c 6f 62 28 34 30 30 29 29 20 7d 0a 20  omblob(400)) }. 
7dd0: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
7de0: 20 43 4f 4d 4d 49 54 0a 0a 20 20 20 20 66 69 6c   COMMIT..    fil
7df0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
7e00: 61 6c 0a 20 20 7d 20 24 6c 6f 67 73 69 7a 65 0a  al.  } $logsize.
7e10: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
7e20: 37 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 66 69  7.$tn.2 {.    fi
7e30: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
7e40: 20 20 7d 20 35 31 32 0a 0a 20 20 64 6f 5f 74 65    } 512..  do_te
7e50: 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 33 20  st wal-17.$tn.3 
7e60: 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20  {.    db close. 
7e70: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
7e80: 74 2e 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 35  t.db.  } [expr 5
7e90: 31 32 2a 31 37 31 5d 0a 7d 0a 73 71 6c 69 74 65  12*171].}.sqlite
7ea0: 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70  3_test_control_p
7eb0: 65 6e 64 69 6e 67 5f 62 79 74 65 20 24 6f 6c 64  ending_byte $old
7ec0: 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 0a 0a 23  _pending_byte..#
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73  ---------.# This
7f20: 20 74 65 73 74 20 2d 20 77 61 6c 2d 31 38 2e 2a   test - wal-18.*
7f30: 20 2d 20 76 65 72 69 66 69 65 73 20 61 20 63 6f   - verifies a co
7f40: 75 70 6c 65 20 6f 66 20 73 70 65 63 69 66 69 63  uple of specific
7f50: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74   conditions that
7f60: 0a 23 20 6d 61 79 20 62 65 20 65 6e 63 6f 75 6e  .# may be encoun
7f70: 74 65 72 65 64 20 77 68 69 6c 65 20 72 65 63 6f  tered while reco
7f80: 76 65 72 69 6e 67 20 61 20 6c 6f 67 20 66 69 6c  vering a log fil
7f90: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 63 6f  e are handled co
7fa0: 72 72 65 63 74 6c 79 3a 0a 23 0a 23 20 20 20 77  rrectly:.#.#   w
7fb0: 61 6c 2d 31 38 2e 31 2e 2a 20 57 68 65 6e 20 74  al-18.1.* When t
7fc0: 68 65 20 66 69 72 73 74 20 33 32 2d 62 69 74 73  he first 32-bits
7fd0: 20 6f 66 20 61 20 66 72 61 6d 65 20 63 68 65 63   of a frame chec
7fe0: 6b 73 75 6d 20 69 73 20 63 6f 72 72 65 63 74 20  ksum is correct 
7ff0: 62 75 74 20 0a 23 20 20 20 20 20 20 20 20 20 20  but .#          
8000: 20 20 20 20 74 68 65 20 73 65 63 6f 6e 64 20 33      the second 3
8010: 32 2d 62 69 74 73 20 61 72 65 20 66 61 6c 73 65  2-bits are false
8020: 2c 20 61 6e 64 0a 23 0a 23 20 20 20 77 61 6c 2d  , and.#.#   wal-
8030: 31 38 2e 32 2e 2a 20 57 68 65 6e 20 74 68 65 20  18.2.* When the 
8040: 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20  page-size field 
8050: 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74  that occurs at t
8060: 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6c 6f  he start of a lo
8070: 67 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  g.#             
8080: 20 66 69 6c 65 20 69 73 20 61 20 70 6f 77 65 72   file is a power
8090: 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
80a0: 61 6e 20 31 36 33 38 34 20 6f 72 20 73 6d 61 6c  an 16384 or smal
80b0: 6c 65 72 20 74 68 61 6e 20 35 31 32 2e 0a 23 0a  ler than 512..#.
80c0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
80d0: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  ce test.db test.
80e0: 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a  db-wal test.db-j
80f0: 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65 73 74 20 77  ournal.do_test w
8100: 61 6c 2d 31 38 2e 30 20 7b 0a 20 20 73 71 6c 69  al-18.0 {.  sqli
8110: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
8120: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
8130: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
8140: 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47  = 1024;.    PRAG
8150: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
8160: 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a   0;.    PRAGMA j
8170: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
8180: 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79  L;.    PRAGMA sy
8190: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b  nchronous = OFF;
81a0: 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ..    CREATE TAB
81b0: 4c 45 20 74 31 28 61 2c 20 62 2c 20 55 4e 49 51  LE t1(a, b, UNIQ
81c0: 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 49  UE(a, b));.    I
81d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
81e0: 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20  LUES(0, 0);.    
81f0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
8200: 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 49 4e 53 45  point;..    INSE
8210: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8220: 53 28 31 2c 20 32 29 3b 20 20 20 20 20 20 20 20  S(1, 2);        
8230: 20 20 2d 2d 20 66 72 61 6d 65 73 20 31 20 61 6e    -- frames 1 an
8240: 64 20 32 0a 20 20 20 20 49 4e 53 45 52 54 20 49  d 2.    INSERT I
8250: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
8260: 20 34 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d   4);          --
8270: 20 66 72 61 6d 65 73 20 33 20 61 6e 64 20 34 0a   frames 3 and 4.
8280: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8290: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
82a0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 66 72 61            -- fra
82b0: 6d 65 73 20 35 20 61 6e 64 20 36 0a 20 20 7d 0a  mes 5 and 6.  }.
82c0: 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f  .  file copy -fo
82d0: 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  rce test.db test
82e0: 58 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79  X.db.  file copy
82f0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d   -force test.db-
8300: 77 61 6c 20 74 65 73 74 58 2e 64 62 2d 77 61 6c  wal testX.db-wal
8310: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69  .  db close.  li
8320: 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  st [file size te
8330: 73 74 58 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69  stX.db] [file si
8340: 7a 65 20 74 65 73 74 58 2e 64 62 2d 77 61 6c 5d  ze testX.db-wal]
8350: 0a 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 33  .} [list [expr 3
8360: 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65  *1024] [wal_file
8370: 5f 73 69 7a 65 20 36 20 31 30 32 34 5d 5d 0a 0a  _size 6 1024]]..
8380: 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69  unset -nocomplai
8390: 6e 20 6e 46 72 61 6d 65 20 72 65 73 75 6c 74 0a  n nFrame result.
83a0: 66 6f 72 65 61 63 68 20 7b 6e 46 72 61 6d 65 20  foreach {nFrame 
83b0: 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20  result} {.      
83c0: 20 20 20 30 20 20 20 20 20 20 7b 30 20 30 7d 0a     0      {0 0}.
83d0: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
83e0: 7b 30 20 30 7d 0a 20 20 20 20 20 20 20 20 20 32  {0 0}.         2
83f0: 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 7d 0a        {0 0 1 2}.
8400: 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
8410: 7b 30 20 30 20 31 20 32 7d 0a 20 20 20 20 20 20  {0 0 1 2}.      
8420: 20 20 20 34 20 20 20 20 20 20 7b 30 20 30 20 31     4      {0 0 1
8430: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
8440: 20 35 20 20 20 20 20 20 7b 30 20 30 20 31 20 32   5      {0 0 1 2
8450: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 36   3 4}.         6
8460: 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 20 33        {0 0 1 2 3
8470: 20 34 20 35 20 36 7d 0a 7d 20 7b 0a 20 20 64 6f   4 5 6}.} {.  do
8480: 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 31 2e 24  _test wal-18.1.$
8490: 6e 46 72 61 6d 65 20 7b 0a 20 20 20 20 66 69 6c  nFrame {.    fil
84a0: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65  e copy -force te
84b0: 73 74 58 2e 64 62 20 74 65 73 74 2e 64 62 0a 20  stX.db test.db. 
84c0: 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f     file copy -fo
84d0: 72 63 65 20 74 65 73 74 58 2e 64 62 2d 77 61 6c  rce testX.db-wal
84e0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20   test.db-wal..  
84f0: 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65    hexio_write te
8500: 73 74 2e 64 62 2d 77 61 6c 20 5b 65 78 70 72 20  st.db-wal [expr 
8510: 32 34 20 2b 20 24 6e 46 72 61 6d 65 2a 28 32 34  24 + $nFrame*(24
8520: 2b 31 30 32 34 29 20 2b 20 32 30 5d 20 30 30 30  +1024) + 20] 000
8530: 30 30 30 30 30 0a 0a 20 20 20 20 73 71 6c 69 74  00000..    sqlit
8540: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
8550: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
8560: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
8570: 20 74 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d   t1;.      PRAGM
8580: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
8590: 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 63  k; .    }.  } [c
85a0: 6f 6e 63 61 74 20 24 72 65 73 75 6c 74 20 6f 6b  oncat $result ok
85b0: 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 0a  ].  db close.} .
85c0: 0a 70 72 6f 63 20 72 61 6e 64 6f 6d 62 6c 6f 62  .proc randomblob
85d0: 20 7b 70 67 73 7a 7d 20 7b 0a 20 20 73 71 6c 69   {pgsz} {.  sqli
85e0: 74 65 33 20 72 62 64 62 20 3a 6d 65 6d 6f 72 79  te3 rbdb :memory
85f0: 3a 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b 72 62  :.  set blob [rb
8600: 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 72  db one {SELECT r
8610: 61 6e 64 6f 6d 62 6c 6f 62 28 24 70 67 73 7a 29  andomblob($pgsz)
8620: 7d 5d 0a 20 20 72 62 64 62 20 63 6c 6f 73 65 0a  }].  rbdb close.
8630: 20 20 73 65 74 20 62 6c 6f 62 0a 7d 0a 0a 70 72    set blob.}..pr
8640: 6f 63 20 6c 6f 67 63 6b 73 75 6d 20 7b 63 6b 76  oc logcksum {ckv
8650: 31 20 63 6b 76 32 20 62 6c 6f 62 7d 20 7b 0a 20  1 ckv2 blob} {. 
8660: 20 75 70 76 61 72 20 24 63 6b 76 31 20 63 31 0a   upvar $ckv1 c1.
8670: 20 20 75 70 76 61 72 20 24 63 6b 76 32 20 63 32    upvar $ckv2 c2
8680: 0a 0a 20 20 73 65 74 20 73 63 61 6e 70 61 74 74  ..  set scanpatt
8690: 65 72 6e 20 49 2a 0a 20 20 69 66 20 7b 24 3a 3a  ern I*.  if {$::
86a0: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 62 79 74  tcl_platform(byt
86b0: 65 4f 72 64 65 72 29 20 65 71 20 22 6c 69 74 74  eOrder) eq "litt
86c0: 6c 65 45 6e 64 69 61 6e 22 7d 20 7b 0a 20 20 20  leEndian"} {.   
86d0: 20 73 65 74 20 73 63 61 6e 70 61 74 74 65 72 6e   set scanpattern
86e0: 20 69 2a 0a 20 20 7d 0a 0a 20 20 62 69 6e 61 72   i*.  }..  binar
86f0: 79 20 73 63 61 6e 20 24 62 6c 6f 62 20 24 73 63  y scan $blob $sc
8700: 61 6e 70 61 74 74 65 72 6e 20 76 61 6c 75 65 73  anpattern values
8710: 0a 20 20 66 6f 72 65 61 63 68 20 7b 76 31 20 76  .  foreach {v1 v
8720: 32 7d 20 24 76 61 6c 75 65 73 20 7b 0a 20 20 20  2} $values {.   
8730: 20 73 65 74 20 63 31 20 5b 65 78 70 72 20 7b 28   set c1 [expr {(
8740: 24 63 31 20 2b 20 24 76 31 20 2b 20 24 63 32 29  $c1 + $v1 + $c2)
8750: 26 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20  &0xFFFFFFFF}].  
8760: 20 20 73 65 74 20 63 32 20 5b 65 78 70 72 20 7b    set c2 [expr {
8770: 28 24 63 32 20 2b 20 24 76 32 20 2b 20 24 63 31  ($c2 + $v2 + $c1
8780: 29 26 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20  )&0xFFFFFFFF}]. 
8790: 20 7d 0a 7d 0a 0a 66 69 6c 65 20 63 6f 70 79 20   }.}..file copy 
87a0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74  -force test.db t
87b0: 65 73 74 58 2e 64 62 0a 66 6f 72 65 61 63 68 20  estX.db.foreach 
87c0: 7b 74 6e 20 70 67 73 7a 20 77 6f 72 6b 73 7d 20  {tn pgsz works} 
87d0: 7b 20 0a 20 20 31 20 20 20 20 31 32 38 20 20 20  { .  1    128   
87e0: 20 30 0a 20 20 32 20 20 20 20 32 35 36 20 20 20   0.  2    256   
87f0: 20 30 0a 20 20 33 20 20 20 20 35 31 32 20 20 20   0.  3    512   
8800: 20 31 0a 20 20 34 20 20 20 31 30 32 34 20 20 20   1.  4   1024   
8810: 20 31 0a 20 20 35 20 20 20 32 30 34 38 20 20 20   1.  5   2048   
8820: 20 31 0a 20 20 36 20 20 20 34 30 39 36 20 20 20   1.  6   4096   
8830: 20 31 0a 20 20 37 20 20 20 38 31 39 32 20 20 20   1.  7   8192   
8840: 20 31 0a 20 20 38 20 20 31 36 33 38 34 20 20 20   1.  8  16384   
8850: 20 31 0a 20 20 39 20 20 33 32 37 36 38 20 20 20   1.  9  32768   
8860: 20 31 0a 20 31 30 20 20 36 35 35 33 36 20 20 20   1. 10  65536   
8870: 20 31 0a 20 31 31 20 31 33 31 30 37 32 20 20 20   1. 11 131072   
8880: 20 30 0a 20 31 31 20 20 20 31 30 31 36 20 20 20   0. 11   1016   
8890: 20 30 0a 7d 20 7b 0a 0a 20 20 69 66 20 7b 24 3a   0.} {..  if {$:
88a0: 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  :SQLITE_MAX_PAGE
88b0: 5f 53 49 5a 45 20 3c 20 24 70 67 73 7a 7d 20 7b  _SIZE < $pgsz} {
88c0: 0a 20 20 20 20 73 65 74 20 77 6f 72 6b 73 20 30  .    set works 0
88d0: 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74  .  }..  for {set
88e0: 20 70 67 20 31 7d 20 7b 24 70 67 20 3c 3d 20 33   pg 1} {$pg <= 3
88f0: 7d 20 7b 69 6e 63 72 20 70 67 7d 20 7b 0a 20 20  } {incr pg} {.  
8900: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
8910: 63 65 20 74 65 73 74 58 2e 64 62 20 74 65 73 74  ce testX.db test
8920: 2e 64 62 0a 20 20 20 20 66 69 6c 65 20 64 65 6c  .db.    file del
8930: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
8940: 64 62 2d 77 61 6c 0a 20 20 0a 20 20 20 20 23 20  db-wal.  .    # 
8950: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 64  Check that the d
8960: 61 74 61 62 61 73 65 20 6e 6f 77 20 65 78 69 73  atabase now exis
8970: 74 73 20 61 6e 64 20 63 6f 6e 73 69 73 74 73 20  ts and consists 
8980: 6f 66 20 74 68 72 65 65 20 70 61 67 65 73 2e 20  of three pages. 
8990: 41 6e 64 0a 20 20 20 20 23 20 74 68 61 74 20 74  And.    # that t
89a0: 68 65 72 65 20 69 73 20 6e 6f 20 61 73 73 6f 63  here is no assoc
89b0: 69 61 74 65 64 20 77 61 6c 20 66 69 6c 65 2e 0a  iated wal file..
89c0: 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73      #.    do_tes
89d0: 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24  t wal-18.2.$tn.$
89e0: 70 67 2e 31 20 7b 20 66 69 6c 65 20 65 78 69 73  pg.1 { file exis
89f0: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 7d  ts test.db-wal }
8a00: 20 30 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77   0.    do_test w
8a10: 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e  al-18.2.$tn.$pg.
8a20: 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  2 { file exists 
8a30: 74 65 73 74 2e 64 62 20 7d 20 31 0a 20 20 20 20  test.db } 1.    
8a40: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32  do_test wal-18.2
8a50: 2e 24 74 6e 2e 24 70 67 2e 33 20 7b 20 66 69 6c  .$tn.$pg.3 { fil
8a60: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 20 7d  e size test.db }
8a70: 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d 0a 20   [expr 1024*3]. 
8a80: 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61   .    do_test wa
8a90: 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 34  l-18.2.$tn.$pg.4
8aa0: 20 7b 0a 0a 20 20 20 20 20 20 23 20 43 72 65 61   {..      # Crea
8ab0: 74 65 20 61 20 77 61 6c 20 66 69 6c 65 20 74 68  te a wal file th
8ac0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69  at contains a si
8ad0: 6e 67 6c 65 20 66 72 61 6d 65 20 28 64 61 74 61  ngle frame (data
8ae0: 62 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20  base page.      
8af0: 23 20 6e 75 6d 62 65 72 20 24 70 67 29 20 77 69  # number $pg) wi
8b00: 74 68 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 6c  th the commit fl
8b10: 61 67 20 73 65 74 2e 20 54 68 65 20 66 72 61 6d  ag set. The fram
8b20: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 0a 20 20  e checksum is.  
8b30: 20 20 20 20 23 20 63 6f 72 72 65 63 74 2c 20 62      # correct, b
8b40: 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ut the contents 
8b50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
8b60: 70 61 67 65 20 61 72 65 20 63 6f 72 72 75 70 74  page are corrupt
8b70: 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20  ..      #.      
8b80: 23 20 54 68 65 20 70 61 67 65 2d 73 69 7a 65 20  # The page-size 
8b90: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  in the log file 
8ba0: 68 65 61 64 65 72 20 69 73 20 73 65 74 20 74 6f  header is set to
8bb0: 20 24 70 67 73 7a 2e 20 49 66 20 74 68 65 0a 20   $pgsz. If the. 
8bc0: 20 20 20 20 20 23 20 57 41 4c 20 63 6f 64 65 20       # WAL code 
8bd0: 63 6f 6e 73 69 64 65 72 73 20 24 70 67 73 7a 20  considers $pgsz 
8be0: 74 6f 20 62 65 20 61 20 76 61 6c 69 64 20 53 51  to be a valid SQ
8bf0: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
8c00: 6c 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20  le page-size,.  
8c10: 20 20 20 20 23 20 74 68 65 20 64 61 74 61 62 61      # the databa
8c20: 73 65 20 77 69 6c 6c 20 62 65 20 63 6f 72 72 75  se will be corru
8c30: 70 74 20 28 62 65 63 61 75 73 65 20 74 68 65 20  pt (because the 
8c40: 67 61 72 62 61 67 65 20 66 72 61 6d 65 20 63 6f  garbage frame co
8c50: 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 23 20 77  ntents.      # w
8c60: 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61  ill be treated a
8c70: 73 20 76 61 6c 69 64 20 63 6f 6e 74 65 6e 74 29  s valid content)
8c80: 2e 20 49 66 20 24 70 67 73 7a 20 69 73 20 69 6e  . If $pgsz is in
8c90: 76 61 6c 69 64 20 28 74 6f 6f 20 73 6d 61 6c 6c  valid (too small
8ca0: 0a 20 20 20 20 20 20 23 20 6f 72 20 74 6f 6f 20  .      # or too 
8cb0: 6c 61 72 67 65 29 2c 20 74 68 65 20 64 62 20 77  large), the db w
8cc0: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
8cd0: 70 74 20 61 73 20 74 68 65 20 6c 6f 67 20 66 69  pt as the log fi
8ce0: 6c 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 23 20  le will.      # 
8cf0: 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20  be ignored..    
8d00: 20 20 23 0a 20 20 20 20 20 20 73 65 74 20 77 61    #.      set wa
8d10: 6c 68 64 72 20 5b 62 69 6e 61 72 79 20 66 6f 72  lhdr [binary for
8d20: 6d 61 74 20 49 49 49 49 49 49 20 39 33 31 30 37  mat IIIIII 93107
8d30: 31 36 31 38 20 33 30 30 37 30 30 30 20 24 70 67  1618 3007000 $pg
8d40: 73 7a 20 31 32 33 34 20 32 32 20 32 33 5d 0a 20  sz 1234 22 23]. 
8d50: 20 20 20 20 20 73 65 74 20 66 72 61 6d 65 62 6f       set framebo
8d60: 64 79 20 5b 72 61 6e 64 6f 6d 62 6c 6f 62 20 24  dy [randomblob $
8d70: 70 67 73 7a 5d 0a 20 20 20 20 20 20 73 65 74 20  pgsz].      set 
8d80: 66 72 61 6d 65 68 64 72 20 20 5b 62 69 6e 61 72  framehdr  [binar
8d90: 79 20 66 6f 72 6d 61 74 20 49 49 49 49 20 24 70  y format IIII $p
8da0: 67 20 35 20 32 32 20 32 33 5d 0a 20 20 20 20 20  g 5 22 23].     
8db0: 20 73 65 74 20 63 31 20 30 0a 20 20 20 20 20 20   set c1 0.      
8dc0: 73 65 74 20 63 32 20 30 0a 20 20 20 20 20 20 6c  set c2 0.      l
8dd0: 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20 24 77  ogcksum c1 c2 $w
8de0: 61 6c 68 64 72 0a 0a 20 20 20 20 20 20 61 70 70  alhdr..      app
8df0: 65 6e 64 20 77 61 6c 68 64 72 20 5b 62 69 6e 61  end walhdr [bina
8e00: 72 79 20 66 6f 72 6d 61 74 20 49 49 20 24 63 31  ry format II $c1
8e10: 20 24 63 32 5d 0a 20 20 20 20 20 20 6c 6f 67 63   $c2].      logc
8e20: 6b 73 75 6d 20 63 31 20 63 32 20 5b 73 74 72 69  ksum c1 c2 [stri
8e30: 6e 67 20 72 61 6e 67 65 20 24 66 72 61 6d 65 68  ng range $frameh
8e40: 64 72 20 30 20 37 5d 0a 20 20 20 20 20 20 6c 6f  dr 0 7].      lo
8e50: 67 63 6b 73 75 6d 20 63 31 20 63 32 20 24 66 72  gcksum c1 c2 $fr
8e60: 61 6d 65 62 6f 64 79 0a 20 20 20 20 20 20 73 65  amebody.      se
8e70: 74 20 66 72 61 6d 65 68 64 72 20 5b 62 69 6e 61  t framehdr [bina
8e80: 72 79 20 66 6f 72 6d 61 74 20 49 49 49 49 49 49  ry format IIIIII
8e90: 20 24 70 67 20 35 20 32 32 20 32 33 20 24 63 31   $pg 5 22 23 $c1
8ea0: 20 24 63 32 5d 0a 0a 20 20 20 20 20 20 73 65 74   $c2]..      set
8eb0: 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64   fd [open test.d
8ec0: 62 2d 77 61 6c 20 77 5d 0a 20 20 20 20 20 20 66  b-wal w].      f
8ed0: 63 6f 6e 66 69 67 75 72 65 20 24 66 64 20 2d 65  configure $fd -e
8ee0: 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 20 2d  ncoding binary -
8ef0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61  translation bina
8f00: 72 79 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e  ry.      puts -n
8f10: 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24 77 61  onewline $fd $wa
8f20: 6c 68 64 72 0a 20 20 20 20 20 20 70 75 74 73 20  lhdr.      puts 
8f30: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24  -nonewline $fd $
8f40: 66 72 61 6d 65 68 64 72 0a 20 20 20 20 20 20 70  framehdr.      p
8f50: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
8f60: 66 64 20 24 66 72 61 6d 65 62 6f 64 79 0a 20 20  fd $framebody.  
8f70: 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20      close $fd.  
8f80: 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65  .      file size
8f90: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20   test.db-wal.   
8fa0: 20 7d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a   } [wal_file_siz
8fb0: 65 20 31 20 24 70 67 73 7a 5d 0a 20 20 0a 20 20  e 1 $pgsz].  .  
8fc0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38    do_test wal-18
8fd0: 2e 32 2e 24 74 6e 2e 24 70 67 2e 35 20 7b 0a 20  .2.$tn.$pg.5 {. 
8fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20       sqlite3 db 
8ff0: 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20 73 65  test.db.      se
9000: 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20 64 62  t rc [catch { db
9010: 20 6f 6e 65 20 7b 50 52 41 47 4d 41 20 69 6e 74   one {PRAGMA int
9020: 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 20 7d 20  egrity_check} } 
9030: 6d 73 67 5d 0a 20 20 20 20 20 20 65 78 70 72 20  msg].      expr 
9040: 7b 20 24 72 63 21 3d 30 20 7c 7c 20 24 6d 73 67  { $rc!=0 || $msg
9050: 21 3d 22 6f 6b 22 20 7d 0a 20 20 20 20 7d 20 24  !="ok" }.    } $
9060: 77 6f 72 6b 73 0a 20 20 0a 20 20 20 20 64 62 20  works.  .    db 
9070: 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d  close.  }.}..#--
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
90d0: 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 2d 20 77  llowing test - w
90e0: 61 6c 2d 31 39 2e 2a 20 2d 20 66 69 78 65 73 20  al-19.* - fixes 
90f0: 61 20 62 75 67 20 74 68 61 74 20 77 61 73 20 70  a bug that was p
9100: 72 65 73 65 6e 74 20 64 75 72 69 6e 67 0a 23 20  resent during.# 
9110: 64 65 76 65 6c 6f 70 6d 65 6e 74 2e 0a 23 0a 23  development..#.#
9120: 20 57 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   When a database
9130: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 57   connection in W
9140: 41 4c 20 6d 6f 64 65 20 69 73 20 63 6c 6f 73 65  AL mode is close
9150: 64 2c 20 69 74 20 61 74 74 65 6d 70 74 73 20 61  d, it attempts a
9160: 6e 0a 23 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  n.# EXCLUSIVE lo
9170: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
9180: 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  se file. If the 
9190: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
91a0: 2c 20 74 68 65 0a 23 20 63 6f 6e 6e 65 63 74 69  , the.# connecti
91b0: 6f 6e 20 6b 6e 6f 77 73 20 74 68 61 74 20 69 74  on knows that it
91c0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6e   is the last con
91d0: 6e 65 63 74 69 6f 6e 20 74 6f 20 64 69 73 63 6f  nection to disco
91e0: 6e 6e 65 63 74 20 66 72 6f 6d 0a 23 20 74 68 65  nnect from.# the
91f0: 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20 69 74   database, so it
9200: 20 72 75 6e 73 20 61 20 63 68 65 63 6b 70 6f 69   runs a checkpoi
9210: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  nt operation. Th
9220: 65 20 62 75 67 20 77 61 73 20 74 68 61 74 0a 23  e bug was that.#
9230: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
9240: 77 61 73 20 6e 6f 74 20 75 70 64 61 74 69 6e 67  was not updating
9250: 20 69 74 73 20 70 72 69 76 61 74 65 20 63 6f 70   its private cop
9260: 79 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  y of the wal-ind
9270: 65 78 20 0a 23 20 68 65 61 64 65 72 20 62 65 66  ex .# header bef
9280: 6f 72 65 20 64 6f 69 6e 67 20 73 6f 2c 20 6d 65  ore doing so, me
9290: 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20 63 6f  aning that it co
92a0: 75 6c 64 20 63 68 65 63 6b 70 6f 69 6e 74 20 61  uld checkpoint a
92b0: 6e 20 6f 6c 64 0a 23 20 73 6e 61 70 73 68 6f 74  n old.# snapshot
92c0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..#.do_test wal-
92d0: 31 39 2e 31 20 7b 0a 20 20 66 69 6c 65 20 64 65  19.1 {.  file de
92e0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
92f0: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  .db test.db-wal 
9300: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
9310: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
9320: 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64  t.db.  sqlite3 d
9330: 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  b2 test.db.  exe
9340: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
9350: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
9360: 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45   WAL;.    CREATE
9370: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
9380: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
9390: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
93a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
93b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
93c0: 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  );.  }.  execsql
93d0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
93e0: 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32   t1 } db2.} {1 2
93f0: 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61   3 4}.do_test wa
9400: 6c 2d 31 39 2e 32 20 7b 0a 20 20 65 78 65 63 73  l-19.2 {.  execs
9410: 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20  ql {.    INSERT 
9420: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35  INTO t1 VALUES(5
9430: 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  , 6);.    SELECT
9440: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
9450: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
9460: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e 33  do_test wal-19.3
9470: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
9480: 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65  db2 close.  file
9490: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
94a0: 77 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  wal.} {0}.do_tes
94b0: 74 20 77 61 6c 2d 31 39 2e 34 20 7b 0a 20 20 23  t wal-19.4 {.  #
94c0: 20 57 68 65 6e 20 74 68 65 20 62 75 67 20 77 61   When the bug wa
94d0: 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 20 66  s present, the f
94e0: 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 72 65 74  ollowing was ret
94f0: 75 72 6e 69 6e 67 20 7b 31 20 32 20 33 20 34 7d  urning {1 2 3 4}
9500: 20 6f 6e 6c 79 2c 0a 20 20 23 20 61 73 20 5b 64   only,.  # as [d
9510: 62 32 5d 20 68 61 64 20 61 6e 20 6f 75 74 2d 6f  b2] had an out-o
9520: 66 2d 64 61 74 65 20 63 6f 70 79 20 6f 66 20 74  f-date copy of t
9530: 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61  he wal-index hea
9540: 64 65 72 20 77 68 65 6e 20 69 74 20 77 61 73 0a  der when it was.
9550: 20 20 23 20 63 6c 6f 73 65 64 2e 0a 20 20 23 0a    # closed..  #.
9560: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
9570: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
9580: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
9590: 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35  1 }.} {1 2 3 4 5
95a0: 20 36 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   6}..#----------
95b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
95c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
95d0: 2d 2d 2d 2d 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 0a  ---------------.
95f0: 23 20 54 68 69 73 20 74 65 73 74 20 2d 20 77 61  # This test - wa
9600: 6c 2d 32 30 2e 2a 20 2d 20 75 73 65 73 20 74 77  l-20.* - uses tw
9610: 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 4f  o connections. O
9620: 6e 65 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ne in this proce
9630: 73 73 20 61 6e 64 0a 23 20 74 68 65 20 6f 74 68  ss and.# the oth
9640: 65 72 20 69 6e 20 61 6e 20 65 78 74 65 72 6e 61  er in an externa
9650: 6c 20 70 72 6f 63 65 73 73 2e 20 54 68 65 20 70  l process. The p
9660: 72 6f 63 65 64 75 72 65 20 69 73 3a 0a 23 0a 23  rocedure is:.#.#
9670: 20 20 20 31 2e 20 55 73 69 6e 67 20 63 6f 6e 6e     1. Using conn
9680: 65 63 74 69 6f 6e 20 31 2c 20 63 72 65 61 74 65  ection 1, create
9690: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
96a0: 68 65 6d 61 2e 0a 23 0a 23 20 20 20 32 2e 20 55  hema..#.#   2. U
96b0: 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  sing connection 
96c0: 32 20 28 69 6e 20 61 6e 20 65 78 74 65 72 6e 61  2 (in an externa
96d0: 6c 20 70 72 6f 63 65 73 73 29 2c 20 61 64 64 20  l process), add 
96e0: 73 6f 20 6d 75 63 68 0a 23 20 20 20 20 20 20 64  so much.#      d
96f0: 61 74 61 20 74 6f 20 74 68 65 20 64 61 74 61 62  ata to the datab
9700: 61 73 65 20 77 69 74 68 6f 75 74 20 63 68 65 63  ase without chec
9710: 6b 70 6f 69 6e 74 69 6e 67 20 74 68 61 74 20 61  kpointing that a
9720: 20 77 61 6c 2d 69 6e 64 65 78 20 0a 23 20 20 20   wal-index .#   
9730: 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36     larger than 6
9740: 34 4b 42 20 69 73 20 72 65 71 75 69 72 65 64 2e  4KB is required.
9750: 0a 23 0a 23 20 20 20 33 2e 20 55 73 69 6e 67 20  .#.#   3. Using 
9760: 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 2c 20 63 68  connection 1, ch
9770: 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74  eckpoint the dat
9780: 61 62 61 73 65 2e 20 4d 61 6b 65 20 73 75 72 65  abase. Make sure
9790: 20 61 6c 6c 0a 23 20 20 20 20 20 20 74 68 65 20   all.#      the 
97a0: 64 61 74 61 20 69 73 20 70 72 65 73 65 6e 74 20  data is present 
97b0: 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
97c0: 20 69 73 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e   is not corrupt.
97d0: 0a 23 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e  .#.# At one poin
97e0: 74 2c 20 53 51 4c 69 74 65 20 77 61 73 20 66 61  t, SQLite was fa
97f0: 69 6c 69 6e 67 20 74 6f 20 67 72 6f 77 20 74 68  iling to grow th
9800: 65 20 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65  e mapping of the
9810: 20 77 61 6c 2d 69 6e 64 65 78 0a 23 20 66 69 6c   wal-index.# fil
9820: 65 20 69 6e 20 73 74 65 70 20 33 20 61 6e 64 20  e in step 3 and 
9830: 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 77  the checkpoint w
9840: 61 73 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68  as corrupting th
9850: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
9860: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  .#.do_test wal-2
9870: 30 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64  0.1 {.  catch {d
9880: 62 20 63 6c 6f 73 65 7d 0a 20 20 66 69 6c 65 20  b close}.  file 
9890: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
98a0: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
98b0: 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  l test.db-journa
98c0: 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  l.  sqlite3 db t
98d0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
98e0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
98f0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
9900: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9910: 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e  LE t1(x);.    IN
9920: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
9930: 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  UES(randomblob(9
9940: 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  00));.    SELECT
9950: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
9960: 31 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20 31 7d  1;.  }.} {wal 1}
9970: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e  .do_test wal-20.
9980: 32 20 7b 0a 20 20 73 65 74 20 3a 3a 62 75 64 64  2 {.  set ::budd
9990: 79 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74 66 69  y [launch_testfi
99a0: 78 74 75 72 65 5d 0a 20 20 74 65 73 74 66 69 78  xture].  testfix
99b0: 74 75 72 65 20 24 3a 3a 62 75 64 64 79 20 7b 0a  ture $::buddy {.
99c0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
99d0: 65 73 74 2e 64 62 0a 20 20 20 20 64 62 20 74 72  est.db.    db tr
99e0: 61 6e 73 61 63 74 69 6f 6e 20 7b 20 64 62 20 65  ansaction { db e
99f0: 76 61 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  val {.      PRAG
9a00: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
9a10: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  point = 0;.     
9a20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9a30: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9a40: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9a50: 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20        /* 2 */.  
9a60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9a70: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9a80: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
9a90: 31 3b 20 20 20 20 20 20 20 2f 2a 20 34 20 2a 2f  1;       /* 4 */
9aa0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9ab0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
9ac0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
9ad0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 38  M t1;       /* 8
9ae0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9af0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
9b00: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
9b10: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
9b20: 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e  * 16 */.      IN
9b30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
9b40: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
9b50: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
9b60: 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20     /* 32 */.    
9b70: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9b80: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9b90: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9ba0: 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a         /* 64 */.
9bb0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9bc0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9bd0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9be0: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 32   t1;       /* 12
9bf0: 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  8 */.      INSER
9c00: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9c10: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9c20: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9c30: 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 20 20 20 20  /* 256 */.      
9c40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
9c50: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
9c60: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
9c70: 20 20 20 20 20 2f 2a 20 35 31 32 20 2a 2f 0a 20       /* 512 */. 
9c80: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9c90: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9ca0: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
9cb0: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 30 32  t1;       /* 102
9cc0: 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  4 */.      INSER
9cd0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
9ce0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
9cf0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
9d00: 2f 2a 20 32 30 34 38 20 2a 2f 0a 20 20 20 20 20  /* 2048 */.     
9d10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9d20: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9d30: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9d40: 20 20 20 20 20 20 2f 2a 20 34 30 39 36 20 2a 2f        /* 4096 */
9d50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9d60: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
9d70: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
9d80: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 38  M t1;       /* 8
9d90: 31 39 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  192 */.      INS
9da0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9db0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9dc0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9dd0: 20 20 2f 2a 20 31 36 33 38 34 20 2a 2f 0a 20 20    /* 16384 */.  
9de0: 20 20 7d 20 7d 0a 20 20 7d 0a 7d 20 7b 30 7d 0a    } }.  }.} {0}.
9df0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 33  do_test wal-20.3
9e00: 20 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 62 75   {.  close $::bu
9e10: 64 64 79 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  ddy.  execsql {.
9e20: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
9e30: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 53  heckpoint;.    S
9e40: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
9e50: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
9e60: 36 33 38 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61  6384}.do_test wa
9e70: 6c 2d 32 30 2e 34 20 7b 0a 20 20 64 62 20 63 6c  l-20.4 {.  db cl
9e80: 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62  ose.  sqlite3 db
9e90: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
9ea0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
9eb0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  t(*) FROM t1 }.}
9ec0: 20 7b 31 36 33 38 34 7d 0a 69 6e 74 65 67 72 69   {16384}.integri
9ed0: 74 79 5f 63 68 65 63 6b 20 77 61 6c 2d 32 30 2e  ty_check wal-20.
9ee0: 35 0a 0a 63 61 74 63 68 20 7b 20 64 62 32 20 63  5..catch { db2 c
9ef0: 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64  lose }.catch { d
9f00: 62 20 63 6c 6f 73 65 20 7d 0a 0a 64 6f 5f 74 65  b close }..do_te
9f10: 73 74 20 77 61 6c 2d 32 31 2e 31 20 7b 0a 20 20  st wal-21.1 {.  
9f20: 66 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f  faultsim_delete_
9f30: 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65  and_reopen.  exe
9f40: 63 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  csql { .    PRAG
9f50: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
9f60: 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54  = WAL;.    CREAT
9f70: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
9f80: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
9f90: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
9fa0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
9fb0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
9fc0: 34 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  4);.    INSERT I
9fd0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
9fe0: 20 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   6);.    INSERT 
9ff0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37  INTO t1 VALUES(7
a000: 2c 20 38 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , 8);.    INSERT
a010: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
a020: 39 2c 20 31 30 29 3b 0a 20 20 20 20 49 4e 53 45  9, 10);.    INSE
a030: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
a040: 53 28 31 31 2c 20 31 32 29 3b 0a 20 20 7d 0a 7d  S(11, 12);.  }.}
a050: 20 7b 77 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 77   {wal}.do_test w
a060: 61 6c 2d 32 31 2e 32 20 7b 0a 20 20 65 78 65 63  al-21.2 {.  exec
a070: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
a080: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
a090: 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  0;.    PRAGMA wa
a0a0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
a0b0: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53    BEGIN;.      S
a0c0: 41 56 45 50 4f 49 4e 54 20 73 3b 0a 20 20 20 20  AVEPOINT s;.    
a0d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a0e0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
a0f0: 62 6c 6f 62 28 39 30 30 29 2c 20 72 61 6e 64 6f  blob(900), rando
a100: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
a110: 74 31 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41  t1;.      ROLLBA
a120: 43 4b 20 54 4f 20 73 3b 0a 20 20 20 20 43 4f 4d  CK TO s;.    COM
a130: 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  MIT;.    SELECT 
a140: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
a150: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
a160: 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 64 6f  8 9 10 11 12}.do
a170: 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 33 20 7b  _test wal-21.3 {
a180: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
a190: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
a1a0: 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 23 2d  eck }.} {ok}..#-
a1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a1f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20  --------.# Test 
a200: 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
a210: 69 6e 67 20 6f 66 20 64 61 74 61 62 61 73 65 73  ing of databases
a220: 20 77 69 74 68 20 64 69 66 66 65 72 65 6e 74 20   with different 
a230: 70 61 67 65 2d 73 69 7a 65 73 2e 0a 23 0a 66 6f  page-sizes..#.fo
a240: 72 65 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20  reach pgsz {512 
a250: 31 30 32 34 20 32 30 34 38 20 34 30 39 36 20 38  1024 2048 4096 8
a260: 31 39 32 20 31 36 33 38 34 20 33 32 37 36 38 20  192 16384 32768 
a270: 36 35 35 33 36 7d 20 7b 0a 20 20 64 6f 5f 6d 75  65536} {.  do_mu
a280: 6c 74 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74  lticlient_test t
a290: 6e 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c  n [string map [l
a2a0: 69 73 74 20 25 50 47 53 5a 25 20 24 70 67 73 7a  ist %PGSZ% $pgsz
a2b0: 5d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  ] {.    do_test 
a2c0: 77 61 6c 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74  wal-22.%PGSZ%.$t
a2d0: 6e 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 31  n.1 {.      sql1
a2e0: 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d   {.        PRAGM
a2f0: 41 20 6d 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65  A main.page_size
a300: 20 3d 20 25 50 47 53 5a 25 3b 0a 20 20 20 20 20   = %PGSZ%;.     
a310: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
a320: 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  acuum = 0;.     
a330: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
a340: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
a350: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
a360: 4c 45 20 74 31 28 78 20 55 4e 49 51 55 45 29 3b  LE t1(x UNIQUE);
a370: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
a380: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
a390: 61 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a  andomblob(800);.
a3a0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
a3b0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
a3c0: 6e 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20  ndomblob(800);. 
a3d0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
a3e0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
a3f0: 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20  domblob(800);.  
a400: 20 20 20 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c      }.    } {wal
a410: 7d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  }.    do_test wa
a420: 6c 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e  l-22.%PGSZ%.$tn.
a430: 32 20 7b 20 73 71 6c 32 20 7b 20 50 52 41 47 4d  2 { sql2 { PRAGM
a440: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
a450: 6b 20 7d 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64  k } } {ok}.    d
a460: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 32 2e 25 50  o_test wal-22.%P
a470: 47 53 5a 25 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  GSZ%.$tn.3 {.   
a480: 20 20 20 73 71 6c 31 20 7b 50 52 41 47 4d 41 20     sql1 {PRAGMA 
a490: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 7d 0a  wal_checkpoint}.
a4a0: 20 20 20 20 20 20 65 78 70 72 20 7b 5b 66 69 6c        expr {[fil
a4b0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20  e size test.db] 
a4c0: 25 20 25 50 47 53 5a 25 7d 0a 20 20 20 20 7d 20  % %PGSZ%}.    } 
a4d0: 7b 30 7d 0a 20 20 7d 5d 0a 7d 0a 0a 23 2d 2d 2d  {0}.  }].}..#---
a4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a520: 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68  ------.# Test th
a530: 61 74 20 77 68 65 6e 20 31 20 6f 72 20 6d 6f 72  at when 1 or mor
a540: 65 20 70 61 67 65 73 20 61 72 65 20 72 65 63 6f  e pages are reco
a550: 76 65 72 65 64 20 66 72 6f 6d 20 61 20 57 41 4c  vered from a WAL
a560: 20 66 69 6c 65 2c 20 0a 23 20 73 71 6c 69 74 65   file, .# sqlite
a570: 33 5f 6c 6f 67 28 29 20 69 73 20 69 6e 76 6f 6b  3_log() is invok
a580: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
a590: 73 20 74 6f 20 74 68 65 20 75 73 65 72 2e 0a 23  s to the user..#
a5a0: 0a 73 65 74 20 77 61 6c 66 69 6c 65 20 5b 66 69  .set walfile [fi
a5b0: 6c 65 20 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66  le nativename [f
a5c0: 69 6c 65 20 6a 6f 69 6e 20 5b 70 77 64 5d 20 74  ile join [pwd] t
a5d0: 65 73 74 2e 64 62 2d 77 61 6c 5d 5d 0a 63 61 74  est.db-wal]].cat
a5e0: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 69  ch {db close}.fi
a5f0: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
a600: 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74   test.db.do_test
a610: 20 77 61 6c 2d 32 33 2e 31 20 7b 0a 20 20 66 61   wal-23.1 {.  fa
a620: 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e  ultsim_delete_an
a630: 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73  d_reopen.  execs
a640: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
a650: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
a660: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
a670: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
a680: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a690: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
a6a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a6b0: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
a6c0: 0a 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f  .  }.  faultsim_
a6d0: 73 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a  save_and_close..
a6e0: 20 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f    sqlite3_shutdo
a6f0: 77 6e 0a 20 20 74 65 73 74 5f 73 71 6c 69 74 65  wn.  test_sqlite
a700: 33 5f 6c 6f 67 20 5b 6c 69 73 74 20 6c 61 70 70  3_log [list lapp
a710: 65 6e 64 20 3a 3a 6c 6f 67 5d 0a 20 20 73 65 74  end ::log].  set
a720: 20 3a 3a 6c 6f 67 20 5b 6c 69 73 74 5d 0a 20 20   ::log [list].  
a730: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
a740: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
a750: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
a760: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  }.} {1 2 3 4}.do
a770: 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e 32 20 7b  _test wal-23.2 {
a780: 20 73 65 74 20 3a 3a 6c 6f 67 20 7d 20 7b 7d 0a   set ::log } {}.
a790: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e  .do_test wal-23.
a7a0: 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  3 {.  db close. 
a7b0: 20 73 65 74 20 3a 3a 6c 6f 67 20 5b 6c 69 73 74   set ::log [list
a7c0: 5d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73  ].  faultsim_res
a7d0: 74 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a  tore_and_reopen.
a7e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
a7f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
a800: 20 7b 31 20 32 20 33 20 34 7d 0a 73 65 74 20 6e   {1 2 3 4}.set n
a810: 50 61 67 65 20 5b 65 78 70 72 20 32 2b 24 41 55  Page [expr 2+$AU
a820: 54 4f 56 41 43 55 55 4d 5d 0a 64 6f 5f 74 65 73  TOVACUUM].do_tes
a830: 74 20 77 61 6c 2d 32 33 2e 34 20 7b 20 0a 20 20  t wal-23.4 { .  
a840: 73 65 74 20 3a 3a 6c 6f 67 20 0a 7d 20 5b 6c 69  set ::log .} [li
a850: 73 74 20 53 51 4c 49 54 45 5f 4f 4b 20 22 52 65  st SQLITE_OK "Re
a860: 63 6f 76 65 72 65 64 20 24 6e 50 61 67 65 20 66  covered $nPage f
a870: 72 61 6d 65 73 20 66 72 6f 6d 20 57 41 4c 20 66  rames from WAL f
a880: 69 6c 65 20 24 77 61 6c 66 69 6c 65 22 5d 0a 0a  ile $walfile"]..
a890: 64 62 20 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33  db close.sqlite3
a8a0: 5f 73 68 75 74 64 6f 77 6e 0a 74 65 73 74 5f 73  _shutdown.test_s
a8b0: 71 6c 69 74 65 33 5f 6c 6f 67 0a 73 71 6c 69 74  qlite3_log.sqlit
a8c0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 0a 0a 66  e3_initialize..f
a8d0: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.