/ Hex Artifact Content
Login

Artifact 0369e9ef9ac9b0f9a4a274819d83489578ccaef1:


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: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e 31  .do_test wal-0.1
06f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50   {.  execsql { P
0700: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
0710: 6d 20 3d 20 30 20 7d 0a 20 20 65 78 65 63 73 71  m = 0 }.  execsq
0720: 6c 20 7b 20 50 52 41 47 4d 41 20 73 79 6e 63 68  l { PRAGMA synch
0730: 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d 61 6c 20  ronous = normal 
0740: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  }.  execsql { PR
0750: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
0760: 65 20 3d 20 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c  e = wal }.} {wal
0770: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e  }.do_test wal-0.
0780: 32 20 7b 0a 20 20 66 69 6c 65 20 73 69 7a 65 20  2 {.  file size 
0790: 74 65 73 74 2e 64 62 0a 7d 20 7b 31 30 32 34 7d  test.db.} {1024}
07a0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e  ..do_test wal-1.
07b0: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  0 {.  execsql { 
07c0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
07d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
07e0: 61 2c 20 62 29 3b 20 0a 20 20 7d 0a 20 20 6c 69  a, b); .  }.  li
07f0: 73 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  st [file exists 
0800: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d  test.db-journal]
0810: 20 5c 0a 20 20 20 20 20 20 20 5b 66 69 6c 65 20   \.       [file 
0820: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
0830: 61 6c 5d 20 20 20 20 20 5c 0a 20 20 20 20 20 20  al]     \.      
0840: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
0850: 2e 64 62 5d 0a 7d 20 7b 30 20 31 20 31 30 32 34  .db].} {0 1 1024
0860: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e  }.do_test wal-1.
0870: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f  1 {.  execsql CO
0880: 4d 4d 49 54 0a 20 20 6c 69 73 74 20 5b 66 69 6c  MMIT.  list [fil
0890: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
08a0: 2d 6a 6f 75 72 6e 61 6c 5d 20 5b 66 69 6c 65 20  -journal] [file 
08b0: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
08c0: 61 6c 5d 0a 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74  al].} {0 1}.do_t
08d0: 65 73 74 20 77 61 6c 2d 31 2e 32 20 7b 0a 20 20  est wal-1.2 {.  
08e0: 23 20 54 68 65 72 65 20 61 72 65 20 6e 6f 77 20  # There are now 
08f0: 74 77 6f 20 70 61 67 65 73 20 69 6e 20 74 68 65  two pages in the
0900: 20 6c 6f 67 2e 0a 20 20 66 69 6c 65 20 73 69 7a   log..  file siz
0910: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20  e test.db-wal.} 
0920: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 32  [wal_file_size 2
0930: 20 31 30 32 34 5d 0a 0a 64 6f 5f 74 65 73 74 20   1024]..do_test 
0940: 77 61 6c 2d 31 2e 33 20 7b 0a 20 20 65 78 65 63  wal-1.3 {.  exec
0950: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0960: 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
0970: 72 20 7d 0a 7d 20 7b 74 61 62 6c 65 20 74 31 20  r }.} {table t1 
0980: 74 31 20 32 20 7b 43 52 45 41 54 45 20 54 41 42  t1 2 {CREATE TAB
0990: 4c 45 20 74 31 28 61 2c 20 62 29 7d 7d 0a 0a 64  LE t1(a, b)}}..d
09a0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 34 20 7b  o_test wal-1.4 {
09b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
09c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
09d0: 45 53 28 31 2c 20 32 29 20 7d 0a 20 20 65 78 65  ES(1, 2) }.  exe
09e0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
09f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
0a00: 34 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  4) }.  execsql {
0a10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0a20: 56 41 4c 55 45 53 28 35 2c 20 36 29 20 7d 0a 20  VALUES(5, 6) }. 
0a30: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0a40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0a50: 28 37 2c 20 38 29 20 7d 0a 20 20 65 78 65 63 73  (7, 8) }.  execs
0a60: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
0a70: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30   t1 VALUES(9, 10
0a80: 29 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73  ) }.} {}..do_tes
0a90: 74 20 77 61 6c 2d 31 2e 35 20 7b 0a 20 20 65 78  t wal-1.5 {.  ex
0aa0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
0ab0: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20   FROM t1 }.} {1 
0ac0: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
0ad0: 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  10}..do_test wal
0ae0: 2d 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  -2.1 {.  sqlite3
0af0: 5f 77 61 6c 20 64 62 32 20 2e 2f 74 65 73 74 2e  _wal db2 ./test.
0b00: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 42  db.  execsql { B
0b10: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
0b20: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b  ROM t1 } db2.} {
0b30: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
0b40: 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  9 10}..do_test w
0b50: 61 6c 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63 73  al-2.2 {.  execs
0b60: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
0b70: 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31   t1 VALUES(11, 1
0b80: 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  2) }.  execsql {
0b90: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0ba0: 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35  1 }.} {1 2 3 4 5
0bb0: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
0bc0: 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  2}..do_test wal-
0bd0: 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.3 {.  execsql 
0be0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0bf0: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20  t1 } db2.} {1 2 
0c00: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0c10: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0c20: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
0c30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0c40: 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d  VALUES(13, 14) }
0c50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0c60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0c70: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0c80: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
0c90: 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   14}..do_test wa
0ca0: 6c 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  l-2.5 {.  execsq
0cb0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0cc0: 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20  M t1 } db2.} {1 
0cd0: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
0ce0: 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  10}..do_test wal
0cf0: 2d 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.6 {.  execsql
0d00: 20 7b 20 43 4f 4d 4d 49 54 3b 20 53 45 4c 45 43   { COMMIT; SELEC
0d10: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  T * FROM t1 } db
0d20: 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  2.} {1 2 3 4 5 6
0d30: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
0d40: 31 33 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20  13 14}..do_test 
0d50: 77 61 6c 2d 33 2e 31 20 7b 0a 20 20 65 78 65 63  wal-3.1 {.  exec
0d60: 73 71 6c 20 7b 20 42 45 47 49 4e 3b 20 44 45 4c  sql { BEGIN; DEL
0d70: 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  ETE FROM t1 }.  
0d80: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
0d90: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b   * FROM t1 }.} {
0da0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33 2e  }.do_test wal-3.
0db0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
0dc0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0dd0: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
0de0: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
0df0: 31 20 31 32 20 31 33 20 31 34 7d 0a 64 6f 5f 74  1 12 13 14}.do_t
0e00: 65 73 74 20 77 61 6c 2d 33 2e 33 20 7b 0a 20 20  est wal-3.3 {.  
0e10: 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41  execsql { ROLLBA
0e20: 43 4b 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  CK }.  execsql {
0e30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0e40: 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35  1 }.} {1 2 3 4 5
0e50: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
0e60: 32 20 31 33 20 31 34 7d 0a 64 62 32 20 63 6c 6f  2 13 14}.db2 clo
0e70: 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  se..#-----------
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 0a 23  --------------.#
0ec0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
0ed0: 65 73 74 73 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74  ests, wal-4.*, t
0ee0: 65 73 74 20 74 68 61 74 20 73 61 76 65 70 6f 69  est that savepoi
0ef0: 6e 74 73 20 77 6f 72 6b 20 77 69 74 68 20 57 41  nts work with WA
0f00: 4c 20 0a 23 20 64 61 74 61 62 61 73 65 73 2e 0a  L .# databases..
0f10: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  #.do_test wal-4.
0f20: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
0f30: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0f40: 74 31 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  t1;.    BEGIN;. 
0f50: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0f60: 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t1 VALUES('a', 
0f70: 27 62 27 29 3b 0a 20 20 20 20 20 20 53 41 56 45  'b');.      SAVE
0f80: 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20 20 20 20  POINT sp;.      
0f90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0fa0: 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27   VALUES('c', 'd'
0fb0: 29 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  );.        SELEC
0fc0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
0fd0: 0a 7d 20 7b 61 20 62 20 63 20 64 7d 0a 64 6f 5f  .} {a b c d}.do_
0fe0: 74 65 73 74 20 77 61 6c 2d 34 2e 32 20 7b 0a 20  test wal-4.2 {. 
0ff0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
1000: 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 3b   ROLLBACK TO sp;
1010: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20  .      SELECT * 
1020: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
1030: 61 20 62 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  a b}.do_test wal
1040: 2d 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -4.3 {.  execsql
1050: 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20   {.    COMMIT;. 
1060: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1070: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d   t1;.  }.} {a b}
1080: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  ..do_test wal-4.
1090: 34 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  4.1 {.  db close
10a0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
10b0: 73 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63 20  st.db.  db func 
10c0: 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73 74  blob blob.  list
10d0: 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45   [execsql { SELE
10e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20  CT * FROM t1 }] 
10f0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
1100: 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d  db-wal].} {{a b}
1110: 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   0}.do_test wal-
1120: 34 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  4.4.2 {.  execsq
1130: 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65  l { PRAGMA cache
1140: 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 65  _size = 10 }.  e
1150: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45  xecsql {.    CRE
1160: 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20  ATE TABLE t2(a, 
1170: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
1180: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c  NTO t2 VALUES(bl
1190: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
11a0: 30 29 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49  0));.    SAVEPOI
11b0: 4e 54 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53  NT tr;.      INS
11c0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
11d0: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
11e0: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b  ob(400) FROM t2;
11f0: 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20   /*  2 */.      
1200: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
1210: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1220: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1230: 74 32 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20  t2; /*  4 */.   
1240: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1250: 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  2 SELECT blob(40
1260: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1270: 4f 4d 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a  OM t2; /*  8 */.
1280: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1290: 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t2 SELECT blob
12a0: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
12b0: 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20   FROM t2; /* 16 
12c0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
12d0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
12e0: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
12f0: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
1300: 33 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  32 */.      INSE
1310: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1320: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1330: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(400) FROM t1; 
1340: 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49  /*  2 */.      I
1350: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1360: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1370: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1380: 31 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20  1; /*  4 */.    
1390: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
13a0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
13b0: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
13c0: 4d 20 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20  M t1; /*  8 */. 
13d0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
13e0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
13f0: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
1400: 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a  FROM t1; /* 16 *
1410: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
1420: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
1430: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1440: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33  0) FROM t1; /* 3
1450: 32 20 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43  2 */.      SELEC
1460: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1470: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64  t2;.  }.} {32}.d
1480: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 33  o_test wal-4.4.3
1490: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52   {.  execsql { R
14a0: 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a  OLLBACK TO tr }.
14b0: 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  } {}.do_test wal
14c0: 2d 34 2e 34 2e 34 20 7b 0a 20 20 73 65 74 20 6c  -4.4.4 {.  set l
14d0: 6f 67 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a  ogsize [file siz
14e0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20  e test.db-wal]. 
14f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
1500: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1510: 56 41 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29  VALUES('x', 'y')
1520: 3b 0a 20 20 20 20 52 45 4c 45 41 53 45 20 74 72  ;.    RELEASE tr
1530: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 20 24  ;.  }.  expr { $
1540: 6c 6f 67 73 69 7a 65 20 3d 3d 20 5b 66 69 6c 65  logsize == [file
1550: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
1560: 6c 5d 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  l] }.} {1}.do_te
1570: 73 74 20 77 61 6c 2d 34 2e 34 2e 35 20 7b 0a 20  st wal-4.4.5 {. 
1580: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1590: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
15a0: 74 32 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  t2 }.} {1}.do_te
15b0: 73 74 20 77 61 6c 2d 34 2e 34 2e 36 20 7b 0a 20  st wal-4.4.6 {. 
15c0: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
15d0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e  e test.db test2.
15e0: 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d  db.  file copy -
15f0: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77 61  force test.db-wa
1600: 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  l test2.db-wal. 
1610: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
1620: 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  t2.db.  execsql 
1630: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
1640: 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c 45  ) FROM t2 ; SELE
1650: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1660: 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32   t1 } db2.} {1 2
1670: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1680: 34 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  4.7 {.  execsql 
1690: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
16a0: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d  ty_check } db2.}
16b0: 20 7b 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73 65 0a   {ok}.db2 close.
16c0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
16d0: 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64 62  .1 {.  reopen_db
16e0: 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62 20  .  db func blob 
16f0: 62 6c 6f 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  blob.  execsql {
1700: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
1710: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
1720: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1730: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
1740: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1750: 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a  LUES('a', 'b');.
1760: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62    }.  sqlite3 db
1770: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75   test.db.  db fu
1780: 6e 63 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c  nc blob blob.  l
1790: 69 73 74 20 5b 65 78 65 63 73 71 6c 20 7b 20 53  ist [execsql { S
17a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
17b0: 7d 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  }] [file size te
17c0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61  st.db-wal].} {{a
17d0: 20 62 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77   b} 0}.do_test w
17e0: 61 6c 2d 34 2e 35 2e 32 20 7b 0a 20 20 65 78 65  al-4.5.2 {.  exe
17f0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61  csql { PRAGMA ca
1800: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a  che_size = 10 }.
1810: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1820: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28  CREATE TABLE t2(
1830: 61 2c 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e  a, b);.    BEGIN
1840: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1850: 4f 20 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62  O t2 VALUES(blob
1860: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1870: 29 3b 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54  );.    SAVEPOINT
1880: 20 74 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   tr;.      INSER
1890: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
18a0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
18b0: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f  (400) FROM t2; /
18c0: 2a 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  2 */.      IN
18d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
18e0: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
18f0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32  lob(400) FROM t2
1900: 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20  ; /*  4 */.     
1910: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1920: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1930: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1940: 20 74 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20   t2; /*  8 */.  
1950: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1960: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
1970: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1980: 52 4f 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f  ROM t2; /* 16 */
1990: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
19a0: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
19b0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
19c0: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32  ) FROM t2; /* 32
19d0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
19e0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
19f0: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1a00: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a  400) FROM t1; /*
1a10: 20 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    2 */.      INS
1a20: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1a30: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1a40: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1a50: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20   /*  4 */.      
1a60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1a70: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1a80: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1a90: 74 31 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20  t1; /*  8 */.   
1aa0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1ab0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
1ac0: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1ad0: 4f 4d 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a  OM t1; /* 16 */.
1ae0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1af0: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
1b00: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1b10: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20   FROM t1; /* 32 
1b20: 2a 2f 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  */.      SELECT 
1b30: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
1b40: 3b 0a 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f  ;.  }.} {32}.do_
1b50: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 33 20 7b  test wal-4.5.3 {
1b60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c  .  execsql { ROL
1b70: 4c 42 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20  LBACK TO tr }.} 
1b80: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  {}.do_test wal-4
1b90: 2e 35 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67  .5.4 {.  set log
1ba0: 73 69 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20  size [file size 
1bb0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65  test.db-wal].  e
1bc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49  xecsql {.      I
1bd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1be0: 4c 55 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a  LUES('x', 'y');.
1bf0: 20 20 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a      RELEASE tr;.
1c00: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
1c10: 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73 69 7a    expr { $logsiz
1c20: 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a 65 20  e == [file size 
1c30: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d  test.db-wal] }.}
1c40: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   {1}.do_test wal
1c50: 2d 34 2e 35 2e 35 20 7b 0a 20 20 65 78 65 63 73  -4.5.5 {.  execs
1c60: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
1c70: 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53  t(*) FROM t2 ; S
1c80: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1c90: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 7d  ROM t1 }.} {1 2}
1ca0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
1cb0: 2e 36 20 7b 0a 20 20 66 69 6c 65 20 63 6f 70 79  .6 {.  file copy
1cc0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
1cd0: 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65 20  test2.db.  file 
1ce0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74  copy -force test
1cf0: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
1d00: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64  -wal.  sqlite3 d
1d10: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78  b2 test2.db.  ex
1d20: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
1d30: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
1d40: 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ; SELECT count(*
1d50: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
1d60: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
1d70: 77 61 6c 2d 34 2e 35 2e 37 20 7b 0a 20 20 65 78  wal-4.5.7 {.  ex
1d80: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
1d90: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
1da0: 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20   db2.} {ok}.db2 
1db0: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
1dc0: 61 6c 2d 34 2e 36 2e 31 20 7b 0a 20 20 65 78 65  al-4.6.1 {.  exe
1dd0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
1de0: 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 50  E FROM t2;.    P
1df0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
1e00: 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e 3b  oint;.    BEGIN;
1e10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1e20: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 77 27  TO t2 VALUES('w'
1e30: 2c 20 27 78 27 29 3b 0a 20 20 20 20 20 20 53 41  , 'x');.      SA
1e40: 56 45 50 4f 49 4e 54 20 73 61 76 65 3b 0a 20 20  VEPOINT save;.  
1e50: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1e60: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 79 27 2c  O t2 VALUES('y',
1e70: 20 27 7a 27 29 3b 0a 20 20 20 20 20 20 52 4f 4c   'z');.      ROL
1e80: 4c 42 41 43 4b 20 54 4f 20 73 61 76 65 3b 0a 20  LBACK TO save;. 
1e90: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53     COMMIT;.    S
1ea0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
1eb0: 0a 20 20 7d 0a 7d 20 7b 77 20 78 7d 0a 0a 0a 72  .  }.} {w x}...r
1ec0: 65 6f 70 65 6e 5f 64 62 0a 64 6f 5f 74 65 73 74  eopen_db.do_test
1ed0: 20 77 61 6c 2d 35 2e 31 20 7b 0a 20 20 65 78 65   wal-5.1 {.  exe
1ee0: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
1ef0: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 32 28  E TEMP TABLE t2(
1f00: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
1f10: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1f20: 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d  (1, 2);.  }.} {}
1f30: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 32  .do_test wal-5.2
1f40: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1f50: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
1f60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1f70: 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20  ALUES(3, 4);.   
1f80: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1f90: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20   t2;.  }.} {1 2 
1fa0: 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  3 4}.do_test wal
1fb0: 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.3 {.  execsql
1fc0: 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b   {.    ROLLBACK;
1fd0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1fe0: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
1ff0: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35  2}.do_test wal-5
2000: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
2010: 0a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50  .    CREATE TEMP
2020: 20 54 41 42 4c 45 20 74 33 28 78 20 55 4e 49 51   TABLE t3(x UNIQ
2030: 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  UE);.    BEGIN;.
2040: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
2050: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
2060: 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  );.      INSERT 
2070: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
2080: 61 62 63 27 29 3b 0a 20 20 7d 0a 20 20 63 61 74  abc');.  }.  cat
2090: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
20a0: 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 61  NTO t3 VALUES('a
20b0: 62 63 27 29 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6c  bc') }.} {1 {col
20c0: 75 6d 6e 20 78 20 69 73 20 6e 6f 74 20 75 6e 69  umn x is not uni
20d0: 71 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 61  que}}.do_test wa
20e0: 6c 2d 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  l-5.5 {.  execsq
20f0: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  l {.    COMMIT;.
2100: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2110: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  M t2;.  }.} {1 2
2120: 20 33 20 34 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a   3 4}.db close..
2130: 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 20 7b  foreach sector {
2140: 35 31 32 20 34 30 39 36 7d 20 7b 0a 20 20 73 71  512 4096} {.  sq
2150: 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f 64  lite3_simulate_d
2160: 65 76 69 63 65 20 2d 73 65 63 74 6f 72 73 69 7a  evice -sectorsiz
2170: 65 20 24 73 65 63 74 6f 72 0a 20 20 66 6f 72 65  e $sector.  fore
2180: 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31 30  ach pgsz {512 10
2190: 32 34 20 32 30 34 38 20 34 30 39 36 7d 20 7b 0a  24 2048 4096} {.
21a0: 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20      file delete 
21b0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74  -force test.db t
21c0: 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20 64  est.db-wal.    d
21d0: 6f 5f 74 65 73 74 20 77 61 6c 2d 36 2e 24 73 65  o_test wal-6.$se
21e0: 63 74 6f 72 2e 24 70 67 73 7a 2e 31 20 7b 0a 20  ctor.$pgsz.1 {. 
21f0: 20 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20       sqlite3 db 
2200: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 64 65 76  test.db -vfs dev
2210: 73 79 6d 0a 20 20 20 20 20 20 65 78 65 63 73 71  sym.      execsq
2220: 6c 20 22 0a 20 20 20 20 20 20 20 20 50 52 41 47  l ".        PRAG
2230: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24  MA page_size = $
2240: 70 67 73 7a 3b 0a 20 20 20 20 20 20 20 20 50 52  pgsz;.        PR
2250: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
2260: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 50 52   = 0;.        PR
2270: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
2280: 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 22  e = wal;.      "
2290: 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22  .      execsql "
22a0: 0a 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20  .        CREATE 
22b0: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
22c0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
22d0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
22e0: 20 32 29 3b 0a 20 20 20 20 20 20 22 0a 20 20 20   2);.      ".   
22f0: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20     db close.    
2300: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
2310: 2e 64 62 0a 20 20 20 20 7d 20 5b 65 78 70 72 20  .db.    } [expr 
2320: 24 70 67 73 7a 2a 32 5d 0a 20 20 0a 20 20 20 20  $pgsz*2].  .    
2330: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 36 2e 24 73  do_test wal-6.$s
2340: 65 63 74 6f 72 2e 24 70 67 73 7a 2e 32 20 7b 0a  ector.$pgsz.2 {.
2350: 20 20 20 20 20 20 6c 6f 67 5f 64 65 6c 65 74 65        log_delete
2360: 64 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20  d test.db-wal.  
2370: 20 20 7d 20 7b 31 7d 0a 20 20 7d 0a 7d 0a 0a 64    } {1}.  }.}..d
2380: 6f 5f 74 65 73 74 20 77 61 6c 2d 37 2e 31 20 7b  o_test wal-7.1 {
2390: 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  .  file delete -
23a0: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
23b0: 73 74 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69  st.db-wal.  sqli
23c0: 74 65 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e  te3_wal db test.
23d0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
23e0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
23f0: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
2400: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
2410: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
2420: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2430: 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 6c 69  (1, 2);.  }.  li
2440: 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  st [file size te
2450: 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a  st.db] [file siz
2460: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
2470: 20 5b 6c 69 73 74 20 31 30 32 34 20 5b 77 61 6c   [list 1024 [wal
2480: 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32  _file_size 3 102
2490: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
24a0: 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
24b0: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
24c0: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74  ckpoint }.  list
24d0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
24e0: 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  .db] [file size 
24f0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
2500: 6c 69 73 74 20 32 30 34 38 20 5b 77 61 6c 5f 66  list 2048 [wal_f
2510: 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d  ile_size 3 1024]
2520: 5d 0a 0a 23 20 45 78 65 63 75 74 65 20 73 6f 6d  ]..# Execute som
2530: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 69  e transactions i
2540: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
2550: 64 65 20 74 6f 20 74 65 73 74 20 64 61 74 61 62  de to test datab
2560: 61 73 65 20 66 69 6c 65 0a 23 20 74 72 75 6e 63  ase file.# trunc
2570: 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74  ation..#.do_test
2580: 20 77 61 6c 2d 38 2e 31 20 7b 0a 20 20 72 65 6f   wal-8.1 {.  reo
2590: 70 65 6e 5f 64 62 0a 20 20 63 61 74 63 68 20 7b  pen_db.  catch {
25a0: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 69   db close }.  fi
25b0: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
25c0: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
25d0: 2d 77 61 6c 0a 0a 20 20 73 71 6c 69 74 65 33 20  -wal..  sqlite3 
25e0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
25f0: 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 20 62 6c  function blob bl
2600: 6f 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ob.  execsql {. 
2610: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
2620: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 50  acuum = 1;.    P
2630: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
2640: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 50 52  de = wal;.    PR
2650: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
2660: 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20 31 7d 0a  ;.  }.} {wal 1}.
2670: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 38 2e 32 20  do_test wal-8.2 
2680: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
2690: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
26a0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
26b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
26c0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
26d0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 62 6c 6f  TO t1 VALUES(blo
26e0: 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  b(900));.    INS
26f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2700: 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  ES(blob(900));. 
2710: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2720: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
2730: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
2740: 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 49    /*  4 */.    I
2750: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2760: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
2770: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
2780: 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52    8 */.    INSER
2790: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
27a0: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
27b0: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 36 20  t1;       /* 16 
27c0: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
27d0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
27e0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
27f0: 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20        /* 32 */. 
2800: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2810: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
2820: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
2830: 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20 20 20 50    /* 64 */.    P
2840: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
2850: 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  oint;.  }.  file
2860: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
2870: 5b 65 78 70 72 20 36 38 2a 31 30 32 34 5d 0a 64  [expr 68*1024].d
2880: 6f 5f 74 65 73 74 20 77 61 6c 2d 38 2e 33 20 7b  o_test wal-8.3 {
2890: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
28a0: 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31    DELETE FROM t1
28b0: 20 57 48 45 52 45 20 72 6f 77 69 64 3c 35 34 3b   WHERE rowid<54;
28c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
28d0: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a  checkpoint;.  }.
28e0: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
28f0: 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 34 2a 31  .db.} [expr 14*1
2900: 30 32 34 5d 0a 0a 23 20 52 75 6e 20 73 6f 6d 65  024]..# Run some
2910: 20 22 77 61 72 6d 2d 62 6f 64 79 22 20 74 65 73   "warm-body" tes
2920: 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61  ts to ensure tha
2930: 74 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66 69  t log-summary fi
2940: 6c 65 73 20 77 69 74 68 20 6d 6f 72 65 0a 23 20  les with more.# 
2950: 74 68 61 6e 20 32 35 36 20 65 6e 74 72 69 65 73  than 256 entries
2960: 20 28 6c 6f 67 20 73 75 6d 6d 61 72 69 65 73 20   (log summaries 
2970: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 69 6e 64  that contain ind
2980: 65 78 20 62 6c 6f 63 6b 73 29 20 77 6f 72 6b 20  ex blocks) work 
2990: 4f 6b 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  Ok..#.do_test wa
29a0: 6c 2d 39 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e  l-9.1 {.  reopen
29b0: 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  _db.  execsql {.
29c0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
29d0: 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t1(x PRIMARY KE
29e0: 59 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  Y);.    INSERT I
29f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 62 6c  NTO t1 VALUES(bl
2a00: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e  ob(900));.    IN
2a10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2a20: 55 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a  UES(blob(900));.
2a30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a40: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
2a50: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
2a60: 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20     /*  4 */.    
2a70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2a80: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
2a90: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
2aa0: 2a 20 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45  *  8 */.    INSE
2ab0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2ac0: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
2ad0: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 36   t1;       /* 16
2ae0: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
2af0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
2b00: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
2b10: 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a         /* 32 */.
2b20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2b30: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
2b40: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
2b50: 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20 20 20     /* 64 */.    
2b60: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2b70: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
2b80: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
2b90: 2a 20 31 32 38 20 2a 2f 0a 20 20 20 20 49 4e 53  * 128 */.    INS
2ba0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2bb0: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
2bc0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 32  M t1;       /* 2
2bd0: 35 36 20 2a 2f 0a 20 20 7d 0a 20 20 66 69 6c 65  56 */.  }.  file
2be0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
2bf0: 31 30 32 34 0a 64 6f 5f 74 65 73 74 20 77 61 6c  1024.do_test wal
2c00: 2d 39 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33  -9.2 {.  sqlite3
2c10: 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e 64 62  _wal db2 test.db
2c20: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
2c30: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2c40: 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a  ck } db2.} {ok}.
2c50: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e 33  .do_test wal-9.3
2c60: 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65   {.  file delete
2c70: 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62   -force test2.db
2c80: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20   test2.db-wal.  
2c90: 66 69 6c 65 20 63 6f 70 79 20 74 65 73 74 2e 64  file copy test.d
2ca0: 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c  b test2.db.  fil
2cb0: 65 20 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 77  e copy test.db-w
2cc0: 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a  al test2.db-wal.
2cd0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62    sqlite3_wal db
2ce0: 33 20 74 65 73 74 32 2e 64 62 20 0a 20 20 65 78  3 test2.db .  ex
2cf0: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e  ecsql {PRAGMA in
2d00: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
2d10: 64 62 33 0a 7d 20 7b 6f 6b 7d 0a 64 62 33 20 63  db3.} {ok}.db3 c
2d20: 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77 61  lose..do_test wa
2d30: 6c 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  l-9.4 {.  execsq
2d40: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
2d50: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 64 62  heckpoint }.  db
2d60: 32 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  2 close.  sqlite
2d70: 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e 64  3_wal db2 test.d
2d80: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  b.  execsql {PRA
2d90: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
2da0: 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d  eck } db2.} {ok}
2db0: 0a 0a 66 6f 72 65 61 63 68 20 68 61 6e 64 6c 65  ..foreach handle
2dc0: 20 7b 64 62 20 64 62 32 20 64 62 33 7d 20 7b 20   {db db2 db3} { 
2dd0: 63 61 74 63 68 20 7b 20 24 68 61 6e 64 6c 65 20  catch { $handle 
2de0: 63 6c 6f 73 65 20 7d 20 7d 0a 75 6e 73 65 74 20  close } }.unset 
2df0: 68 61 6e 64 6c 65 0a 0a 23 2d 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 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
2e50: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74  ng block of test
2e60: 73 20 2d 20 77 61 6c 2d 31 30 2e 2a 20 2d 20 74  s - wal-10.* - t
2e70: 65 73 74 20 74 68 61 74 20 74 68 65 20 57 41 4c  est that the WAL
2e80: 20 6c 6f 63 6b 69 6e 67 20 0a 23 20 73 63 68 65   locking .# sche
2e90: 6d 65 20 77 6f 72 6b 73 20 69 6e 20 73 69 6d 70  me works in simp
2ea0: 6c 65 20 63 61 73 65 73 2e 20 54 68 69 73 20 62  le cases. This b
2eb0: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 69 73  lock of tests is
2ec0: 20 72 75 6e 20 74 77 69 63 65 2e 20 4f 6e 63 65   run twice. Once
2ed0: 0a 23 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  .# using multipl
2ee0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 69 6e  e connections in
2ef0: 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70 61   the address spa
2f00: 63 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ce of the curren
2f10: 74 20 70 72 6f 63 65 73 73 2c 0a 23 20 61 6e 64  t process,.# and
2f20: 20 6f 6e 63 65 20 77 69 74 68 20 61 6c 6c 20 63   once with all c
2f30: 6f 6e 6e 65 63 74 69 6f 6e 73 20 65 78 63 65 70  onnections excep
2f40: 74 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e  t one running in
2f50: 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73   external proces
2f60: 73 65 73 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63  ses..#.do_multic
2f70: 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a  lient_test tn {.
2f80: 0a 20 20 23 20 49 6e 69 74 69 61 6c 69 7a 65 20  .  # Initialize 
2f90: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
2fa0: 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73  ema and contents
2fb0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
2fc0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 20 7b 0a 20  wal-10.$tn.1 {. 
2fd0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
2fe0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
2ff0: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
3000: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
3010: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
3020: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3030: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
3040: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
3050: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
3060: 7b 77 61 6c 20 31 20 32 7d 0a 0a 20 20 23 20 4f  {wal 1 2}..  # O
3070: 70 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  pen a transactio
3080: 6e 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 74  n and write to t
3090: 68 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  he database usin
30a0: 67 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 74 68  g [db]. Check th
30b0: 61 74 20 5b 64 62 32 5d 0a 20 20 23 20 69 73 20  at [db2].  # is 
30c0: 73 74 69 6c 6c 20 61 62 6c 65 20 74 6f 20 72 65  still able to re
30d0: 61 64 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20  ad the snapshot 
30e0: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
30f0: 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
3100: 64 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  d..  #.  do_test
3110: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 20 7b 0a   wal-10.$tn.2 {.
3120: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45      execsql { BE
3130: 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f  GIN; INSERT INTO
3140: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
3150: 3b 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45  ; }.    sql2 {SE
3160: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
3170: 20 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 23 20 48    } {1 2}..  # H
3180: 61 76 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20  ave [db] commit 
3190: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
31a0: 20 43 68 65 63 6b 20 74 68 61 74 20 5b 64 62 32   Check that [db2
31b0: 5d 20 69 73 20 6e 6f 77 20 73 65 65 69 6e 67 20  ] is now seeing 
31c0: 74 68 65 20 0a 20 20 23 20 6e 65 77 2c 20 75 70  the .  # new, up
31d0: 64 61 74 65 64 20 73 6e 61 70 73 68 6f 74 2e 0a  dated snapshot..
31e0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
31f0: 6c 2d 31 30 2e 24 74 6e 2e 33 20 7b 0a 20 20 20  l-10.$tn.3 {.   
3200: 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49   execsql { COMMI
3210: 54 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45  T }.    sql2 {SE
3220: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
3230: 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20    } {1 2 3 4}.. 
3240: 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f 70   # Have [db2] op
3250: 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  en a read transa
3260: 63 74 69 6f 6e 2e 20 54 68 65 6e 20 77 72 69 74  ction. Then writ
3270: 65 20 74 6f 20 74 68 65 20 64 62 20 76 69 61 20  e to the db via 
3280: 5b 64 62 5d 2e 20 43 68 65 63 6b 0a 20 20 23 20  [db]. Check.  # 
3290: 74 68 61 74 20 5b 64 62 32 5d 20 69 73 20 73 74  that [db2] is st
32a0: 69 6c 6c 20 73 65 65 69 6e 67 20 74 68 65 20 6f  ill seeing the o
32b0: 72 69 67 69 6e 61 6c 20 73 6e 61 70 73 68 6f 74  riginal snapshot
32c0: 2e 20 54 68 65 6e 20 72 65 61 64 20 77 69 74 68  . Then read with
32d0: 20 5b 64 62 33 5d 2e 0a 20 20 23 20 5b 64 62 33   [db3]..  # [db3
32e0: 5d 20 73 68 6f 75 6c 64 20 73 65 65 20 74 68 65  ] should see the
32f0: 20 6e 65 77 6c 79 20 63 6f 6d 6d 69 74 74 65 64   newly committed
3300: 20 64 61 74 61 2e 0a 20 20 23 0a 20 20 64 6f 5f   data..  #.  do_
3310: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3320: 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  4 {.    sql2 { B
3330: 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20  EGIN ; SELECT * 
3340: 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20  FROM t1}.  } {1 
3350: 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74  2 3 4}.  do_test
3360: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 35 20 7b 0a   wal-10.$tn.5 {.
3370: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
3380: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3390: 55 45 53 28 35 2c 20 36 29 3b 20 7d 0a 20 20 20  UES(5, 6); }.   
33a0: 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20   sql2 {SELECT * 
33b0: 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20  FROM t1}.  } {1 
33c0: 32 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74  2 3 4}.  do_test
33d0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 36 20 7b 0a   wal-10.$tn.6 {.
33e0: 20 20 20 20 73 71 6c 33 20 7b 53 45 4c 45 43 54      sql3 {SELECT
33f0: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20   * FROM t1}.  } 
3400: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20  {1 2 3 4 5 6}.  
3410: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3420: 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20  tn.7 {.    sql2 
3430: 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 0a 20  COMMIT.  } {}.. 
3440: 20 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f 70   # Have [db2] op
3450: 65 6e 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  en a write trans
3460: 61 63 74 69 6f 6e 2e 20 54 68 65 6e 20 61 74 74  action. Then att
3470: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f  empt to write to
3480: 20 74 68 65 20 0a 20 20 23 20 64 61 74 61 62 61   the .  # databa
3490: 73 65 20 76 69 61 20 5b 64 62 5d 2e 20 54 68 69  se via [db]. Thi
34a0: 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 20 28 77  s should fail (w
34b0: 72 69 74 65 72 20 6c 6f 63 6b 20 63 61 6e 6e 6f  riter lock canno
34c0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 29 2e 0a  t be obtained)..
34d0: 20 20 23 0a 20 20 23 20 54 68 65 6e 20 6f 70 65    #.  # Then ope
34e0: 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
34f0: 74 69 6f 6e 20 77 69 74 68 20 5b 64 62 5d 2e 20  tion with [db]. 
3500: 43 6f 6d 6d 69 74 20 74 68 65 20 5b 64 62 32 5d  Commit the [db2]
3510: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 23   transaction.  #
3520: 20 74 6f 20 64 69 73 6b 2e 20 56 65 72 69 66 79   to disk. Verify
3530: 20 74 68 61 74 20 5b 64 62 5d 20 73 74 69 6c 6c   that [db] still
3540: 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
3550: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 62   the database (b
3560: 65 63 61 75 73 65 0a 20 20 23 20 69 74 20 69 73  ecause.  # it is
3570: 20 72 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20   reading an old 
3580: 73 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a 20  snapshot)..  #. 
3590: 20 23 20 43 6c 6f 73 65 20 74 68 65 20 63 75 72   # Close the cur
35a0: 72 65 6e 74 20 5b 64 62 5d 20 74 72 61 6e 73 61  rent [db] transa
35b0: 63 74 69 6f 6e 2e 20 4f 70 65 6e 20 61 20 6e 65  ction. Open a ne
35c0: 77 20 6f 6e 65 2e 20 5b 64 62 5d 20 63 61 6e 20  w one. [db] can 
35d0: 6e 6f 77 20 77 72 69 74 65 0a 20 20 23 20 74 6f  now write.  # to
35e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 61   the database (a
35f0: 73 20 69 74 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  s it is not lock
3600: 65 64 20 61 6e 64 20 5b 64 62 5d 20 69 73 20 72  ed and [db] is r
3610: 65 61 64 69 6e 67 20 74 68 65 20 6c 61 74 65 73  eading the lates
3620: 74 0a 20 20 23 20 73 6e 61 70 73 68 6f 74 29 2e  t.  # snapshot).
3630: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
3640: 61 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20 20  al-10.$tn.7 {.  
3650: 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20    sql2 { BEGIN; 
3660: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3670: 41 4c 55 45 53 28 37 2c 20 38 29 20 3b 20 7d 0a  ALUES(7, 8) ; }.
3680: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
3690: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
36a0: 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20  LUES(9, 10) }.  
36b0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
36c0: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f  s locked}}.  do_
36d0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
36e0: 38 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  8 {.    execsql 
36f0: 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54  { BEGIN ; SELECT
3700: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d   * FROM t1 }.  }
3710: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20   {1 2 3 4 5 6}. 
3720: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3730: 24 74 6e 2e 39 20 7b 0a 20 20 20 20 73 71 6c 32  $tn.9 {.    sql2
3740: 20 43 4f 4d 4d 49 54 0a 20 20 20 20 63 61 74 63   COMMIT.    catc
3750: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
3760: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20  TO t1 VALUES(9, 
3770: 31 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61  10) }.  } {1 {da
3780: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
3790: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  }}.  do_test wal
37a0: 2d 31 30 2e 24 74 6e 2e 31 30 20 7b 0a 20 20 20  -10.$tn.10 {.   
37b0: 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49   execsql { COMMI
37c0: 54 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20  T }.    execsql 
37d0: 7b 20 42 45 47 49 4e 20 7d 0a 20 20 20 20 65 78  { BEGIN }.    ex
37e0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
37f0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c  NTO t1 VALUES(9,
3800: 20 31 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73   10) }.    execs
3810: 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  ql { COMMIT }.  
3820: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
3830: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
3840: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
3850: 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 4f  7 8 9 10}..  # O
3860: 70 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  pen a read trans
3870: 61 63 74 69 6f 6e 20 77 69 74 68 20 5b 64 62 32  action with [db2
3880: 5d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ]. Check that th
3890: 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64 62 5d  is prevents [db]
38a0: 20 66 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b 70   from.  # checkp
38b0: 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74 61  ointing the data
38c0: 62 61 73 65 2e 20 42 75 74 20 6e 6f 74 20 66 72  base. But not fr
38d0: 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 69 74  om writing to it
38e0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
38f0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 31 20 7b 0a  wal-10.$tn.11 {.
3900: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
3910: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
3920: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  t1 }.  } {1 2 3 
3930: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
3940: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3950: 2e 24 74 6e 2e 31 32 20 7b 0a 20 20 20 20 63 61  .$tn.12 {.    ca
3960: 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  tchsql { PRAGMA 
3970: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
3980: 20 0a 20 20 7d 20 7b 30 20 7b 7d 7d 20 20 20 3b   .  } {0 {}}   ;
3990: 23 20 52 65 61 64 65 72 20 6e 6f 20 6c 6f 6e 67  # Reader no long
39a0: 65 72 20 62 6c 6f 63 6b 20 63 68 65 63 6b 70 6f  er block checkpo
39b0: 69 6e 74 73 0a 20 20 64 6f 5f 74 65 73 74 20 77  ints.  do_test w
39c0: 61 6c 2d 31 30 2e 24 74 6e 2e 31 33 20 7b 0a 20  al-10.$tn.13 {. 
39d0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
39e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
39f0: 45 53 28 31 31 2c 20 31 32 29 20 7d 0a 20 20 20  ES(11, 12) }.   
3a00: 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20   sql2 {SELECT * 
3a10: 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20  FROM t1}.  } {1 
3a20: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
3a30: 31 30 7d 0a 0a 20 20 23 20 57 72 69 74 65 72 73  10}..  # Writers
3a40: 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 63 68   do not block ch
3a50: 65 63 6b 70 6f 69 6e 74 73 20 61 6e 79 20 6d 6f  eckpoints any mo
3a60: 72 65 20 65 69 74 68 65 72 2e 0a 20 20 23 0a 20  re either..  #. 
3a70: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3a80: 24 74 6e 2e 31 34 20 7b 0a 20 20 20 20 63 61 74  $tn.14 {.    cat
3a90: 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  chsql { PRAGMA w
3aa0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20  al_checkpoint } 
3ab0: 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 0a 20 20 23  .  } {0 {}}..  #
3ac0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
3ad0: 65 72 69 65 73 20 6f 66 20 74 65 73 74 20 63 61  eries of test ca
3ae0: 73 65 73 20 75 73 65 64 20 74 6f 20 76 65 72 69  ses used to veri
3af0: 66 79 20 61 6e 6f 74 68 65 72 20 62 6c 6f 63 6b  fy another block
3b00: 69 6e 67 0a 20 20 23 20 63 61 73 65 20 69 6e 20  ing.  # case in 
3b10: 57 41 4c 20 2d 20 61 20 63 61 73 65 20 77 68 69  WAL - a case whi
3b20: 63 68 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 6c 6f  ch no longer blo
3b30: 63 6b 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  cks..  #.  do_te
3b40: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 35  st wal-10.$tn.15
3b50: 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 43 4f   {.    sql2 { CO
3b60: 4d 4d 49 54 3b 20 42 45 47 49 4e 3b 20 53 45 4c  MMIT; BEGIN; SEL
3b70: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 7d  ECT * FROM t1; }
3b80: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
3b90: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
3ba0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
3bb0: 31 30 2e 24 74 6e 2e 31 36 20 7b 0a 20 20 20 20  10.$tn.16 {.    
3bc0: 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d  catchsql { PRAGM
3bd0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
3be0: 20 7d 20 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20   } .  } {0 {}}. 
3bf0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3c00: 24 74 6e 2e 31 37 20 7b 0a 20 20 20 20 65 78 65  $tn.17 {.    exe
3c10: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
3c20: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a  l_checkpoint } .
3c30: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
3c40: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 38 20 7b   wal-10.$tn.18 {
3c50: 0a 20 20 20 20 73 71 6c 33 20 7b 20 42 45 47 49  .    sql3 { BEGI
3c60: 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N; SELECT * FROM
3c70: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3c80: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
3c90: 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74  11 12}.  do_test
3ca0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 39 20 7b   wal-10.$tn.19 {
3cb0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
3cc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3cd0: 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d 0a  ALUES(13, 14) }.
3ce0: 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f    } {0 {}}.  do_
3cf0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3d00: 32 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  20 {.    execsql
3d10: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
3d20: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3d30: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
3d40: 31 31 20 31 32 20 31 33 20 31 34 7d 0a 20 20 64  11 12 13 14}.  d
3d50: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3d60: 6e 2e 32 31 20 7b 0a 20 20 20 20 73 71 6c 33 20  n.21 {.    sql3 
3d70: 43 4f 4d 4d 49 54 0a 20 20 20 20 73 71 6c 32 20  COMMIT.    sql2 
3d80: 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 20 20  COMMIT.  } {}.  
3d90: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3da0: 74 6e 2e 32 32 20 7b 0a 20 20 20 20 65 78 65 63  tn.22 {.    exec
3db0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
3dc0: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3dd0: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
3de0: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a  10 11 12 13 14}.
3df0: 0a 20 20 23 20 41 6e 6f 74 68 65 72 20 73 65 72  .  # Another ser
3e00: 69 65 73 20 6f 66 20 74 65 73 74 73 20 74 68 61  ies of tests tha
3e10: 74 20 75 73 65 64 20 74 6f 20 64 65 6d 6f 6e 73  t used to demons
3e20: 74 72 61 74 65 20 62 6c 6f 63 6b 69 6e 67 20 62  trate blocking b
3e30: 65 68 61 76 69 6f 72 0a 20 20 23 20 62 75 74 20  ehavior.  # but 
3e40: 77 68 69 63 68 20 6e 6f 77 20 77 6f 72 6b 2e 0a  which now work..
3e50: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
3e60: 6c 2d 31 30 2e 24 74 6e 2e 32 33 20 7b 0a 20 20  l-10.$tn.23 {.  
3e70: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
3e80: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
3e90: 74 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  t }.  } {}.  do_
3ea0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3eb0: 32 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  24 {.    sql2 { 
3ec0: 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20  BEGIN; SELECT * 
3ed0: 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b  FROM t1; }.  } {
3ee0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
3ef0: 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34  9 10 11 12 13 14
3f00: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
3f10: 31 30 2e 24 74 6e 2e 32 35 20 7b 0a 20 20 20 20  10.$tn.25 {.    
3f20: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
3f30: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
3f40: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
3f50: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36  st wal-10.$tn.26
3f60: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
3f70: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
3f80: 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36 29 20   VALUES(15, 16) 
3f90: 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64  }.  } {0 {}}.  d
3fa0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3fb0: 6e 2e 32 37 20 7b 0a 20 20 20 20 73 71 6c 33 20  n.27 {.    sql3 
3fc0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
3fd0: 20 56 41 4c 55 45 53 28 31 37 2c 20 31 38 29 20   VALUES(17, 18) 
3fe0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
3ff0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 38  st wal-10.$tn.28
4000: 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b 0a 20   {.    code3 {. 
4010: 20 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 20       set ::STMT 
4020: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
4030: 20 64 62 33 20 22 53 45 4c 45 43 54 20 2a 20 46   db3 "SELECT * F
4040: 52 4f 4d 20 74 31 22 20 2d 31 20 54 41 49 4c 5d  ROM t1" -1 TAIL]
4050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
4060: 74 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20 20 20  tep $::STMT.    
4070: 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  }.    execsql { 
4080: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4090: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
40a0: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
40b0: 31 32 20 31 33 20 31 34 20 31 35 20 31 36 20 31  12 13 14 15 16 1
40c0: 37 20 31 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20  7 18}.  do_test 
40d0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 39 20 7b 0a  wal-10.$tn.29 {.
40e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
40f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4100: 55 45 53 28 31 39 2c 20 32 30 29 20 7d 0a 20 20  UES(19, 20) }.  
4110: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41    catchsql { PRA
4120: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
4130: 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a  nt }.  } {0 {}}.
4140: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
4150: 2e 24 74 6e 2e 33 30 20 7b 0a 20 20 20 20 63 6f  .$tn.30 {.    co
4160: 64 65 33 20 7b 20 73 71 6c 69 74 65 33 5f 66 69  de3 { sqlite3_fi
4170: 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54 20 7d  nalize $::STMT }
4180: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
4190: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
41a0: 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  oint }.  } {}.. 
41b0: 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c   # At one point,
41c0: 20 69 66 20 61 20 72 65 61 64 65 72 20 66 61 69   if a reader fai
41d0: 6c 65 64 20 74 6f 20 75 70 67 72 61 64 65 20 74  led to upgrade t
41e0: 6f 20 61 20 77 72 69 74 65 72 20 62 65 63 61 75  o a writer becau
41f0: 73 65 20 69 74 0a 20 20 23 20 77 61 73 20 72 65  se it.  # was re
4200: 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e 61  ading an old sna
4210: 70 73 68 6f 74 2c 20 74 68 65 20 77 72 69 74 65  pshot, the write
4220: 2d 6c 6f 63 6b 73 20 77 65 72 65 20 6e 6f 74 20  -locks were not 
4230: 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 2e 0a  being released..
4240: 20 20 23 20 54 65 73 74 20 74 68 61 74 20 74 68    # Test that th
4250: 69 73 20 62 75 67 20 68 61 73 20 62 65 65 6e 20  is bug has been 
4260: 66 69 78 65 64 2e 0a 20 20 23 0a 20 20 64 6f 5f  fixed..  #.  do_
4270: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4280: 33 31 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f  31 {.    sql2 CO
4290: 4d 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71 6c  MMIT.    execsql
42a0: 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45 43   { BEGIN ; SELEC
42b0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
42c0: 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52 54 20    sql2 { INSERT 
42d0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
42e0: 31 2c 20 32 32 29 20 7d 0a 20 20 20 20 63 61 74  1, 22) }.    cat
42f0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
4300: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 33  NTO t1 VALUES(23
4310: 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b  , 24) }.  } {1 {
4320: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
4330: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  ed}}.  do_test w
4340: 61 6c 2d 31 30 2e 24 74 6e 2e 33 32 20 7b 0a 20  al-10.$tn.32 {. 
4350: 20 20 20 23 20 54 68 69 73 20 73 74 61 74 65 6d     # This statem
4360: 65 6e 74 20 77 6f 75 6c 64 20 66 61 69 6c 20 77  ent would fail w
4370: 68 65 6e 20 74 68 65 20 62 75 67 20 77 61 73 20  hen the bug was 
4380: 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 73 71 6c  present..    sql
4390: 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  2 { INSERT INTO 
43a0: 74 31 20 56 41 4c 55 45 53 28 32 33 2c 20 32 34  t1 VALUES(23, 24
43b0: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ) }.  } {}.  do_
43c0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
43d0: 33 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  33 {.    execsql
43e0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
43f0: 20 74 31 20 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20   t1 ; COMMIT }. 
4400: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
4410: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
4420: 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31 38  3 14 15 16 17 18
4430: 20 31 39 20 32 30 7d 0a 20 20 64 6f 5f 74 65 73   19 20}.  do_tes
4440: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 34 20  t wal-10.$tn.34 
4450: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
4460: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4470: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
4480: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
4490: 31 32 20 31 33 20 31 34 20 31 35 20 31 36 20 31  12 13 14 15 16 1
44a0: 37 20 31 38 20 31 39 20 32 30 20 32 31 20 32 32  7 18 19 20 21 22
44b0: 20 32 33 20 32 34 7d 0a 0a 20 20 23 20 54 65 73   23 24}..  # Tes
44c0: 74 20 74 68 61 74 20 69 66 20 61 20 63 68 65 63  t that if a chec
44d0: 6b 70 6f 69 6e 74 65 72 20 63 61 6e 6e 6f 74 20  kpointer cannot 
44e0: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
44f0: 72 65 64 20 6c 6f 63 6b 73 2c 20 69 74 0a 20 20  red locks, it.  
4500: 23 20 72 65 6c 65 61 73 65 73 20 61 6c 6c 20 6c  # releases all l
4510: 6f 63 6b 73 20 62 65 66 6f 72 65 20 72 65 74 75  ocks before retu
4520: 72 6e 69 6e 67 20 61 20 62 75 73 79 20 65 72 72  rning a busy err
4530: 6f 72 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  or..  #.  do_tes
4540: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 35 20  t wal-10.$tn.35 
4550: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
4560: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
4570: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
4580: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4590: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
45a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
45b0: 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27  t1 VALUES('c', '
45c0: 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  d');.    }.    s
45d0: 71 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47 49  ql2 {.      BEGI
45e0: 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  N;.        SELEC
45f0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
4600: 20 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64 7d   }.  } {a b c d}
4610: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
4620: 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20 20 63  0.$tn.36 {.    c
4630: 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41  atchsql { PRAGMA
4640: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4650: 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64  }.  } {0 {}}.  d
4660: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
4670: 6e 2e 33 36 20 7b 0a 20 20 20 20 73 71 6c 33 20  n.36 {.    sql3 
4680: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
4690: 20 56 41 4c 55 45 53 28 27 65 27 2c 20 27 66 27   VALUES('e', 'f'
46a0: 29 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20 53  ) }.    sql2 { S
46b0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
46c0: 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64 7d 0a  }.  } {a b c d}.
46d0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
46e0: 2e 24 74 6e 2e 33 37 20 7b 0a 20 20 20 20 73 71  .$tn.37 {.    sq
46f0: 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 20 20 65 78  l2 COMMIT.    ex
4700: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
4710: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
4720: 20 20 7d 20 7b 7d 0a 7d 0a 0a 23 2d 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 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
4780: 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d  k of tests, wal-
4790: 31 31 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20  11.*, test that 
47a0: 6e 6f 74 68 69 6e 67 20 67 6f 65 73 20 74 65 72  nothing goes ter
47b0: 72 69 62 6c 79 20 77 72 6f 6e 67 0a 23 20 69 66  ribly wrong.# if
47c0: 20 66 72 61 6d 65 73 20 6d 75 73 74 20 62 65 20   frames must be 
47d0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c  written to the l
47e0: 6f 67 20 66 69 6c 65 20 62 65 66 6f 72 65 20 61  og file before a
47f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
4800: 23 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 20  # committed (in 
4810: 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
4820: 20 6d 65 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74   memory)..#.do_t
4830: 65 73 74 20 77 61 6c 2d 31 31 2e 31 20 7b 0a 20  est wal-11.1 {. 
4840: 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65   reopen_db.  exe
4850: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
4860: 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31  A cache_size = 1
4870: 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61  0;.    PRAGMA pa
4880: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
4890: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
48a0: 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45   t1(x PRIMARY KE
48b0: 59 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  Y);.  }.  list [
48c0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
48d0: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
48e0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
48f0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34  test.db-wal]/104
4900: 34 5d 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74 65  4].} {1 3}.do_te
4910: 73 74 20 77 61 6c 2d 31 31 2e 32 20 7b 0a 20 20  st wal-11.2 {.  
4920: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4930: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4940: 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  }.  list [expr [
4950: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4960: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
4970: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4980: 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f  .} [list 3 [wal_
4990: 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34  file_size 3 1024
49a0: 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  ]].do_test wal-1
49b0: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
49c0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
49d0: 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39 30   VALUES( blob(90
49e0: 30 29 20 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65  0) ) }.  list [e
49f0: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
4a00: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66  est.db]/1024] [f
4a10: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4a20: 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20  -wal].} [list 3 
4a30: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 34  [wal_file_size 4
4a40: 20 31 30 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73 74   1024]]..do_test
4a50: 20 77 61 6c 2d 31 31 2e 34 20 7b 0a 20 20 65 78   wal-11.4 {.  ex
4a60: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47  ecsql { .    BEG
4a70: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
4a80: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
4a90: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
4aa0: 31 3b 20 20 20 2d 2d 20 32 0a 20 20 20 20 20 20  1;   -- 2.      
4ab0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
4ac0: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
4ad0: 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 34 0a  FROM t1;   -- 4.
4ae0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
4af0: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
4b00: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
4b10: 20 2d 2d 20 38 0a 20 20 20 20 20 20 49 4e 53 45   -- 8.      INSE
4b20: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
4b30: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
4b40: 20 74 31 3b 20 20 20 2d 2d 20 31 36 0a 20 20 7d   t1;   -- 16.  }
4b50: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4b60: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4b70: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
4b80: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
4b90: 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66  } [list 3 [wal_f
4ba0: 69 6c 65 5f 73 69 7a 65 20 33 32 20 31 30 32 34  ile_size 32 1024
4bb0: 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  ]].do_test wal-1
4bc0: 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.5 {.  execsql 
4bd0: 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  { .    SELECT co
4be0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
4bf0: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
4c00: 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a  rity_check;.  }.
4c10: 7d 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73  } {16 ok}.do_tes
4c20: 74 20 77 61 6c 2d 31 31 2e 36 20 7b 0a 20 20 65  t wal-11.6 {.  e
4c30: 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20  xecsql COMMIT.  
4c40: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
4c50: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
4c60: 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  024] [file size 
4c70: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
4c80: 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c 65  list 3 [wal_file
4c90: 5f 73 69 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a  _size 41 1024]].
4ca0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 37  do_test wal-11.7
4cb0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
4cc0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
4cd0: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
4ce0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
4cf0: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b  y_check;.  }.} {
4d00: 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77  16 ok}.do_test w
4d10: 61 6c 2d 31 31 2e 38 20 7b 0a 20 20 65 78 65 63  al-11.8 {.  exec
4d20: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
4d30: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20  _checkpoint }.  
4d40: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
4d50: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
4d60: 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  024] [file size 
4d70: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
4d80: 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c  list 37 [wal_fil
4d90: 65 5f 73 69 7a 65 20 34 31 20 31 30 32 34 5d 5d  e_size 41 1024]]
4da0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
4db0: 39 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20  9 {.  db close. 
4dc0: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4dd0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4de0: 31 30 32 34 5d 20 5b 6c 6f 67 5f 64 65 6c 65 74  1024] [log_delet
4df0: 65 64 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ed test.db-wal].
4e00: 7d 20 7b 33 37 20 31 7d 0a 73 71 6c 69 74 65 33  } {37 1}.sqlite3
4e10: 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a  _wal db test.db.
4e20: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31  do_test wal-11.1
4e30: 30 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  0 {.  execsql {.
4e40: 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65      PRAGMA cache
4e50: 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20  _size = 10;.    
4e60: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
4e70: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4e80: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
4e90: 4d 20 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20 20  M t1;   -- 32.  
4ea0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
4eb0: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  (*) FROM t1;.  }
4ec0: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4ed0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4ee0: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
4ef0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
4f00: 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f  } [list 37 [wal_
4f10: 66 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32  file_size 37 102
4f20: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
4f30: 31 31 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71  11.11 {.  execsq
4f40: 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  l {.      SELECT
4f50: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
4f60: 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b  1;.    ROLLBACK;
4f70: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
4f80: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4f90: 7d 0a 7d 20 7b 33 32 20 31 36 7d 0a 64 6f 5f 74  }.} {32 16}.do_t
4fa0: 65 73 74 20 77 61 6c 2d 31 31 2e 31 32 20 7b 0a  est wal-11.12 {.
4fb0: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
4fc0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
4fd0: 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a  /1024] [file siz
4fe0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
4ff0: 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f 66   [list 37 [wal_f
5000: 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32 34  ile_size 37 1024
5010: 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  ]].do_test wal-1
5020: 31 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.13 {.  execsql
5030: 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   {.    INSERT IN
5040: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 20 62 6c  TO t1 VALUES( bl
5050: 6f 62 28 39 30 30 29 20 29 3b 0a 20 20 20 20 53  ob(900) );.    S
5060: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
5070: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47  ROM t1;.    PRAG
5080: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
5090: 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b  ck;.  }.} {17 ok
50a0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  }.do_test wal-11
50b0: 2e 31 34 20 7b 0a 20 20 6c 69 73 74 20 5b 65 78  .14 {.  list [ex
50c0: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
50d0: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69  st.db]/1024] [fi
50e0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
50f0: 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 37 20  wal].} [list 37 
5100: 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33  [wal_file_size 3
5110: 37 20 31 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d  7 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 0a 23 20 54 68 69 73 20 62 6c 6f  -----.# This blo
5170: 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c  ck of tests, wal
5180: 2d 31 32 2e 2a 2c 20 74 65 73 74 73 20 74 68 65  -12.*, tests the
5190: 20 66 69 78 20 66 6f 72 20 61 20 70 72 6f 62 6c   fix for a probl
51a0: 65 6d 20 74 68 61 74 20 0a 23 20 63 6f 75 6c 64  em that .# could
51b0: 20 6f 63 63 75 72 20 69 66 20 61 20 6c 6f 67 20   occur if a log 
51c0: 74 68 61 74 20 69 73 20 61 20 70 72 65 66 69 78  that is a prefix
51d0: 20 6f 66 20 61 6e 20 6f 6c 64 65 72 20 6c 6f 67   of an older log
51e0: 20 69 73 20 77 72 69 74 74 65 6e 20 0a 23 20 69   is written .# i
51f0: 6e 74 6f 20 61 20 72 65 75 73 65 64 20 6c 6f 67  nto a reused log
5200: 20 66 69 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f   file..#.reopen_
5210: 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  db.do_test wal-1
5220: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
5230: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
5240: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
5250: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5260: 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52  t1(x, y);.    CR
5270: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c  EATE TABLE t2(x,
5280: 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
5290: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
52a0: 41 27 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c 69  A', 1);.  }.  li
52b0: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
52c0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
52d0: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
52e0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
52f0: 73 74 20 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  st 1 [wal_file_s
5300: 69 7a 65 20 35 20 31 30 32 34 5d 5d 0a 64 6f 5f  ize 5 1024]].do_
5310: 74 65 73 74 20 77 61 6c 2d 31 32 2e 32 20 7b 0a  test wal-12.2 {.
5320: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c    db close.  sql
5330: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
5340: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5350: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
5360: 75 73 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20  us = normal;.   
5370: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79   UPDATE t1 SET y
5380: 20 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27   = 0 WHERE x = '
5390: 41 27 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  A';.  }.  list [
53a0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
53b0: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
53c0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
53d0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34  test.db-wal]/104
53e0: 34 5d 0a 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74 65  4].} {3 1}.do_te
53f0: 73 74 20 77 61 6c 2d 31 32 2e 33 20 7b 0a 20 20  st wal-12.3 {.  
5400: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
5410: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
5420: 27 42 27 2c 20 31 29 20 7d 0a 20 20 6c 69 73 74  'B', 1) }.  list
5430: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
5440: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
5450: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
5460: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31  e test.db-wal]/1
5470: 30 34 34 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f  044].} {3 2}.do_
5480: 74 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a  test wal-12.4 {.
5490: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
54a0: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 32  ce test.db test2
54b0: 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20  .db.  file copy 
54c0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77  -force test.db-w
54d0: 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a  al test2.db-wal.
54e0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62    sqlite3_wal db
54f0: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65  2 test2.db.  exe
5500: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
5510: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
5520: 7b 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  {B 1}.db2 close.
5530: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 35  do_test wal-12.5
5540: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5550: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
5560: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50  eckpoint;.    UP
5570: 44 41 54 45 20 74 32 20 53 45 54 20 79 20 3d 20  DATE t2 SET y = 
5580: 32 20 57 48 45 52 45 20 78 20 3d 20 27 42 27 3b  2 WHERE x = 'B';
5590: 20 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c   .    PRAGMA wal
55a0: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20  _checkpoint;.   
55b0: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79   UPDATE t1 SET y
55c0: 20 3d 20 31 20 57 48 45 52 45 20 78 20 3d 20 27   = 1 WHERE x = '
55d0: 41 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77  A';.    PRAGMA w
55e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20  al_checkpoint;. 
55f0: 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54     UPDATE t1 SET
5600: 20 79 20 3d 20 30 20 57 48 45 52 45 20 78 20 3d   y = 0 WHERE x =
5610: 20 27 41 27 3b 0a 20 20 20 20 53 45 4c 45 43 54   'A';.    SELECT
5620: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
5630: 7d 20 7b 42 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {B 2}.do_test 
5640: 77 61 6c 2d 31 32 2e 36 20 7b 0a 20 20 66 69 6c  wal-12.6 {.  fil
5650: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65  e copy -force te
5660: 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20  st.db test2.db. 
5670: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
5680: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  e test.db-wal te
5690: 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c  st2.db-wal.  sql
56a0: 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73  ite3_wal db2 tes
56b0: 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  t2.db.  execsql 
56c0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
56d0: 74 32 20 7d 20 64 62 32 0a 7d 20 7b 42 20 32 7d  t2 } db2.} {B 2}
56e0: 0a 64 62 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c  .db2 close.db cl
56f0: 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ose..#----------
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 0a  ---------------.
5740: 23 20 54 65 73 74 20 6c 61 72 67 65 20 6c 6f 67  # Test large log
5750: 20 73 75 6d 6d 61 72 69 65 73 2e 0a 23 0a 23 20   summaries..#.# 
5760: 49 6e 20 74 68 69 73 20 63 61 73 65 20 22 6c 61  In this case "la
5770: 72 67 65 22 20 75 73 75 61 6c 6c 79 20 6d 65 61  rge" usually mea
5780: 6e 73 20 61 20 6c 6f 67 20 66 69 6c 65 20 74 68  ns a log file th
5790: 61 74 20 72 65 71 75 69 72 65 73 20 61 20 77 61  at requires a wa
57a0: 6c 2d 69 6e 64 65 78 0a 23 20 6d 61 70 70 69 6e  l-index.# mappin
57b0: 67 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34  g larger than 64
57c0: 4b 42 20 28 74 68 65 20 64 65 66 61 75 6c 74 20  KB (the default 
57d0: 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69  initial allocati
57e0: 6f 6e 29 2e 20 41 20 36 34 4b 42 20 77 61 6c 2d  on). A 64KB wal-
57f0: 69 6e 64 65 78 0a 23 20 69 73 20 6c 61 72 67 65  index.# is large
5800: 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6c 6f   enough for a lo
5810: 67 20 66 69 6c 65 20 74 68 61 74 20 63 6f 6e 74  g file that cont
5820: 61 69 6e 73 20 61 70 70 72 6f 78 69 6d 61 74 65  ains approximate
5830: 6c 79 20 31 33 31 30 30 20 66 72 61 6d 65 73 2e  ly 13100 frames.
5840: 0a 23 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  .# So the follow
5850: 69 6e 67 20 74 65 73 74 73 20 63 72 65 61 74 65  ing tests create
5860: 20 6c 6f 67 73 20 63 6f 6e 74 61 69 6e 69 6e 67   logs containing
5870: 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 6d   at least this m
5880: 61 6e 79 20 66 72 61 6d 65 73 2e 0a 23 0a 23 20  any frames..#.# 
5890: 77 61 6c 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73  wal-13.1.*: This
58a0: 20 74 65 73 74 20 63 61 73 65 20 63 72 65 61 74   test case creat
58b0: 65 73 20 61 20 76 65 72 79 20 6c 61 72 67 65 20  es a very large 
58c0: 6c 6f 67 20 66 69 6c 65 20 77 69 74 68 69 6e 20  log file within 
58d0: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  the.#           
58e0: 20 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 28 61    file-system (a
58f0: 72 6f 75 6e 64 20 32 30 30 4d 42 29 2e 20 54 68  round 200MB). Th
5900: 65 20 6c 6f 67 20 66 69 6c 65 20 64 6f 65 73 20  e log file does 
5910: 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 23 20 20 20  not contain.#   
5920: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 76 61            any va
5930: 6c 69 64 20 66 72 61 6d 65 73 2e 20 54 65 73 74  lid frames. Test
5940: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
5950: 73 65 20 66 69 6c 65 20 63 61 6e 20 73 74 69 6c  se file can stil
5960: 6c 20 62 65 0a 23 20 20 20 20 20 20 20 20 20 20  l be.#          
5970: 20 20 20 6f 70 65 6e 65 64 20 61 6e 64 20 71 75     opened and qu
5980: 65 72 69 65 64 2c 20 61 6e 64 20 74 68 61 74 20  eried, and that 
5990: 74 68 65 20 69 6e 76 61 6c 69 64 20 6c 6f 67 20  the invalid log 
59a0: 66 69 6c 65 20 63 61 75 73 65 73 20 6e 6f 20 0a  file causes no .
59b0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72  #             pr
59c0: 6f 62 6c 65 6d 73 2e 0a 23 0a 23 20 77 61 6c 2d  oblems..#.# wal-
59d0: 31 33 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61  13.2.*: Test tha
59e0: 74 20 61 20 70 72 6f 63 65 73 73 20 6d 61 79 20  t a process may 
59f0: 63 72 65 61 74 65 20 61 20 6c 61 72 67 65 20 6c  create a large l
5a00: 6f 67 20 66 69 6c 65 20 61 6e 64 20 71 75 65 72  og file and quer
5a10: 79 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  y.#             
5a20: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
5a30: 63 6c 75 64 69 6e 67 20 74 68 65 20 6c 6f 67 20  cluding the log 
5a40: 66 69 6c 65 20 74 68 61 74 20 69 74 20 69 74 73  file that it its
5a50: 65 6c 66 20 63 72 65 61 74 65 64 29 2e 0a 23 0a  elf created)..#.
5a60: 23 20 77 61 6c 2d 31 33 2e 33 2e 2a 3a 20 54 65  # wal-13.3.*: Te
5a70: 73 74 20 74 68 61 74 20 69 66 20 61 20 76 65 72  st that if a ver
5a80: 79 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c 65  y large log file
5a90: 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 64   is created, and
5aa0: 20 74 68 65 6e 20 61 0a 23 20 20 20 20 20 20 20   then a.#       
5ab0: 20 20 20 20 20 20 73 65 63 6f 6e 64 20 63 6f 6e        second con
5ac0: 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  nection is opene
5ad0: 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
5ae0: 65 20 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f  e file, it is po
5af0: 73 73 69 62 6c 65 0a 23 20 20 20 20 20 20 20 20  ssible.#        
5b00: 20 20 20 20 20 74 6f 20 71 75 65 72 79 20 74 68       to query th
5b10: 65 20 64 61 74 61 62 61 73 65 20 28 61 6e 64 20  e database (and 
5b20: 74 68 65 20 76 65 72 79 20 6c 61 72 67 65 20 6c  the very large l
5b30: 6f 67 29 20 75 73 69 6e 67 20 74 68 65 0a 23 20  og) using the.# 
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 63 6f              seco
5b50: 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23  nd connection..#
5b60: 0a 23 20 77 61 6c 2d 31 33 2e 34 2e 2a 3a 20 53  .# wal-13.4.*: S
5b70: 61 6d 65 20 74 65 73 74 20 61 73 20 77 61 6c 2d  ame test as wal-
5b80: 31 33 2e 33 2e 2a 2e 20 45 78 63 65 70 74 20 69  13.3.*. Except i
5b90: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
5ba0: 73 65 63 6f 6e 64 0a 23 20 20 20 20 20 20 20 20  second.#        
5bb0: 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20       connection 
5bc0: 69 73 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  is opened by an 
5bd0: 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73  external process
5be0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..#.do_test wal-
5bf0: 31 33 2e 31 2e 31 20 7b 0a 20 20 6c 69 73 74 20  13.1.1 {.  list 
5c00: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
5c10: 74 2e 64 62 5d 20 5b 66 69 6c 65 20 65 78 69 73  t.db] [file exis
5c20: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ts test.db-wal].
5c30: 7d 20 7b 31 20 30 7d 0a 64 6f 5f 74 65 73 74 20  } {1 0}.do_test 
5c40: 77 61 6c 2d 31 33 2e 31 2e 32 20 7b 0a 20 20 73  wal-13.1.2 {.  s
5c50: 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74  et fd [open test
5c60: 2e 64 62 2d 77 61 6c 20 77 5d 0a 20 20 73 65 65  .db-wal w].  see
5c70: 6b 20 24 66 64 20 5b 65 78 70 72 20 32 30 30 2a  k $fd [expr 200*
5c80: 31 30 32 34 2a 31 30 32 34 5d 0a 20 20 70 75 74  1024*1024].  put
5c90: 73 20 24 66 64 20 22 22 0a 20 20 63 6c 6f 73 65  s $fd "".  close
5ca0: 20 24 66 64 0a 20 20 73 71 6c 69 74 65 33 20 64   $fd.  sqlite3 d
5cb0: 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  b test.db.  exec
5cc0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
5cd0: 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 42 20 32 7d  ROM t2 }.} {B 2}
5ce0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e  .do_test wal-13.
5cf0: 31 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  1.3 {.  db close
5d00: 0a 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74  .  file exists t
5d10: 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d  est.db-wal.} {0}
5d20: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33  ..do_test wal-13
5d30: 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33  .2.1 {.  sqlite3
5d40: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
5d50: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
5d60: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
5d70: 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20  }.} {1}.do_test 
5d80: 77 61 6c 2d 31 33 2e 32 2e 32 20 7b 0a 20 20 64  wal-13.2.2 {.  d
5d90: 62 20 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 20  b function blob 
5da0: 62 6c 6f 62 0a 20 20 66 6f 72 20 7b 73 65 74 20  blob.  for {set 
5db0: 69 20 30 7d 20 7b 24 69 20 3c 20 31 36 7d 20 7b  i 0} {$i < 16} {
5dc0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78  incr i} {.    ex
5dd0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
5de0: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c  NTO t2 SELECT bl
5df0: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
5e00: 30 29 20 46 52 4f 4d 20 74 32 20 7d 0a 20 20 7d  0) FROM t2 }.  }
5e10: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
5e20: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
5e30: 4d 20 74 32 20 7d 0a 7d 20 5b 65 78 70 72 20 69  M t2 }.} [expr i
5e40: 6e 74 28 70 6f 77 28 32 2c 20 31 36 29 29 5d 0a  nt(pow(2, 16))].
5e50: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 32  do_test wal-13.2
5e60: 2e 33 20 7b 0a 20 20 65 78 70 72 20 5b 66 69 6c  .3 {.  expr [fil
5e70: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
5e80: 61 6c 5d 20 3e 20 5b 77 61 6c 5f 66 69 6c 65 5f  al] > [wal_file_
5e90: 73 69 7a 65 20 33 33 30 30 30 20 31 30 32 34 5d  size 33000 1024]
5ea0: 0a 7d 20 31 0a 0a 64 6f 5f 6d 75 6c 74 69 63 6c  .} 1..do_multicl
5eb0: 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 20  ient_test tn {. 
5ec0: 20 69 6e 63 72 20 74 6e 20 32 0a 0a 20 20 64 6f   incr tn 2..  do
5ed0: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e  _test wal-13.$tn
5ee0: 2e 30 20 7b 0a 20 20 20 20 73 71 6c 31 20 7b 0a  .0 {.    sql1 {.
5ef0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
5f00: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
5f10: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
5f20: 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20 20  BLE t1(x);.     
5f30: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5f40: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
5f50: 62 28 38 30 30 29 3b 0a 20 20 20 20 7d 0a 20 20  b(800);.    }.  
5f60: 20 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20    sql1 { SELECT 
5f70: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
5f80: 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 20 20 66 6f   }.  } {1}..  fo
5f90: 72 20 7b 73 65 74 20 69 69 20 31 7d 20 7b 24 69  r {set ii 1} {$i
5fa0: 69 3c 31 36 7d 20 7b 69 6e 63 72 20 69 69 7d 20  i<16} {incr ii} 
5fb0: 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  {.    do_test wa
5fc0: 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e 61 20 7b  l-13.$tn.$ii.a {
5fd0: 0a 20 20 20 20 20 20 73 71 6c 32 20 7b 20 49 4e  .      sql2 { IN
5fe0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
5ff0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38  ECT randomblob(8
6000: 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  00) FROM t1 }.  
6010: 20 20 20 20 73 71 6c 32 20 7b 20 53 45 4c 45 43      sql2 { SELEC
6020: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
6030: 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72  t1 }.    } [expr
6040: 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64   (1<<$ii)].    d
6050: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74  o_test wal-13.$t
6060: 6e 2e 24 69 69 2e 62 20 7b 0a 20 20 20 20 20 20  n.$ii.b {.      
6070: 73 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 63 6f  sql1 { SELECT co
6080: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d  unt(*) FROM t1 }
6090: 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 28 31 3c  .    } [expr (1<
60a0: 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f 5f 74 65  <$ii)].    do_te
60b0: 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69  st wal-13.$tn.$i
60c0: 69 2e 63 20 7b 0a 20 20 20 20 20 20 73 71 6c 31  i.c {.      sql1
60d0: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
60e0: 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 20  *) FROM t1 }.   
60f0: 20 7d 20 5b 65 78 70 72 20 28 31 3c 3c 24 69 69   } [expr (1<<$ii
6100: 29 5d 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77  )].    do_test w
6110: 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e 64 20  al-13.$tn.$ii.d 
6120: 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 20 50  {.      sql1 { P
6130: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
6140: 63 68 65 63 6b 20 7d 0a 20 20 20 20 7d 20 7b 6f  check }.    } {o
6150: 6b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  k}.  }.}..#-----
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 0a 23 20 43 68 65 63 6b 20 61 20 66  ----.# Check a f
61b0: 75 6e 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 61  un corruption ca
61c0: 73 65 20 68 61 73 20 62 65 65 6e 20 66 69 78 65  se has been fixe
61d0: 64 2e 0a 23 0a 23 20 54 68 65 20 70 72 6f 62 6c  d..#.# The probl
61e0: 65 6d 20 77 61 73 20 74 68 61 74 20 61 66 74 65  em was that afte
61f0: 72 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 20 63  r performing a c
6200: 68 65 63 6b 70 6f 69 6e 74 20 75 73 69 6e 67 20  heckpoint using 
6210: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 23 20 74  a connection.# t
6220: 68 61 74 20 68 61 64 20 61 6e 20 6f 75 74 2d 6f  hat had an out-o
6230: 66 2d 64 61 74 65 20 70 61 67 65 72 2d 63 61 63  f-date pager-cac
6240: 68 65 2c 20 74 68 65 20 6e 65 78 74 20 74 69 6d  he, the next tim
6250: 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
6260: 20 77 61 73 0a 23 20 75 73 65 64 20 69 74 20 64   was.# used it d
6270: 69 64 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  id not realize t
6280: 68 65 20 63 61 63 68 65 20 77 61 73 20 6f 75 74  he cache was out
6290: 2d 6f 66 2d 64 61 74 65 20 61 6e 64 20 70 72 6f  -of-date and pro
62a0: 63 65 65 64 65 64 20 74 6f 0a 23 20 6f 70 65 72  ceeded to.# oper
62b0: 61 74 65 20 77 69 74 68 20 61 6e 20 69 6e 63 6f  ate with an inco
62c0: 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20  nsistent cache. 
62d0: 4c 65 61 64 69 6e 67 20 74 6f 20 63 6f 72 72 75  Leading to corru
62e0: 70 74 69 6f 6e 2e 0a 23 0a 63 61 74 63 68 20 7b  ption..#.catch {
62f0: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63   db close }.catc
6300: 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a  h { db2 close }.
6310: 63 61 74 63 68 20 7b 20 64 62 33 20 63 6c 6f 73  catch { db3 clos
6320: 65 20 7d 0a 66 69 6c 65 20 64 65 6c 65 74 65 20  e }.file delete 
6330: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74  -force test.db t
6340: 65 73 74 2e 64 62 2d 77 61 6c 0a 73 71 6c 69 74  est.db-wal.sqlit
6350: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 73 71  e3 db test.db.sq
6360: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
6370: 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 34  b.do_test wal-14
6380: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
6390: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
63a0: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
63b0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
63c0: 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  1(a PRIMARY KEY,
63d0: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
63e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
63f0: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72  andomblob(10), r
6400: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 3b  andomblob(100));
6410: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6420: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
6430: 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f  mblob(10), rando
6440: 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20  mblob(100) FROM 
6450: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
6460: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
6470: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
6480: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52  ndomblob(100) FR
6490: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
64a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
64b0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c   randomblob(10),
64c0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
64d0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a 20   FROM t1;.  }.. 
64e0: 20 64 62 32 20 65 76 61 6c 20 7b 20 0a 20 20 20   db2 eval { .   
64f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6500: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
6510: 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  b(10), randomblo
6520: 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45  b(100);.    INSE
6530: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
6540: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29  T randomblob(10)
6550: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
6560: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
6570: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
6580: 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e  domblob(10), ran
6590: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20  domblob(100);.  
65a0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
65b0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
65c0: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
65d0: 6f 62 28 31 30 30 29 3b 0a 20 20 7d 0a 0a 20 20  ob(100);.  }..  
65e0: 23 20 41 66 74 65 72 20 65 78 65 63 75 74 69 6e  # After executin
65f0: 67 20 74 68 65 20 22 50 52 41 47 4d 41 20 77 61  g the "PRAGMA wa
6600: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 63  l_checkpoint", c
6610: 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 20 77  onnection [db] w
6620: 61 73 20 62 65 69 6e 67 0a 20 20 23 20 6c 65 66  as being.  # lef
6630: 74 20 77 69 74 68 20 61 6e 20 69 6e 63 6f 6e 73  t with an incons
6640: 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 52 75  istent cache. Ru
6650: 6e 6e 69 6e 67 20 74 68 65 20 43 52 45 41 54 45  nning the CREATE
6660: 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
6670: 0a 20 20 23 20 69 6e 20 74 68 69 73 20 73 74 61  .  # in this sta
6680: 74 65 20 6c 65 64 20 74 6f 20 64 61 74 61 62 61  te led to databa
6690: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
66a0: 20 63 61 74 63 68 73 71 6c 20 7b 20 0a 20 20 20   catchsql { .   
66b0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
66c0: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 43 52 45 41  kpoint;.    CREA
66d0: 54 45 20 49 4e 44 45 58 20 69 31 20 6f 6e 20 74  TE INDEX i1 on t
66e0: 31 28 62 29 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  1(b);.  }.   .  
66f0: 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47 4d  db2 eval { PRAGM
6700: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
6710: 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 63 61 74 63  k }.} {ok}..catc
6720: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 63  h { db close }.c
6730: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
6740: 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   }..#-----------
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 0a 23  --------------.#
6790: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
67a0: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
67b0: 77 61 6c 2d 31 35 2e 2a 20 2d 20 66 6f 63 75 73  wal-15.* - focus
67c0: 20 6f 6e 20 74 65 73 74 69 6e 67 20 74 68 65 20   on testing the 
67d0: 0a 23 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  .# implementatio
67e0: 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  n of the sqlite3
67f0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
6800: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 23 0a 66  ) interface..#.f
6810: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
6820: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
6830: 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20 64 62  b-wal.sqlite3 db
6840: 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74   test.db.do_test
6850: 20 77 61 6c 2d 31 35 2e 31 20 7b 0a 20 20 65 78   wal-15.1 {.  ex
6860: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
6870: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
6880: 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70   0;.    PRAGMA p
6890: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
68a0: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
68b0: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a  nal_mode = WAL;.
68c0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a    }.  execsql {.
68d0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
68e0: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49   t1(a, b);.    I
68f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6900: 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a  LUES(1, 2);.  }.
6910: 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 20 74 68 61  } {}..# Test tha
6920: 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  t an error is re
6930: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
6940: 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 6e  tabase name is n
6950: 6f 74 20 72 65 63 6f 67 6e 69 7a 65 64 0a 23 0a  ot recognized.#.
6960: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 32  do_test wal-15.2
6970: 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77  .1 {.  sqlite3_w
6980: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
6990: 20 61 75 78 0a 7d 20 7b 53 51 4c 49 54 45 5f 45   aux.} {SQLITE_E
69a0: 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 77 61  RROR}.do_test wa
69b0: 6c 2d 31 35 2e 32 2e 32 20 7b 0a 20 20 73 71 6c  l-15.2.2 {.  sql
69c0: 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62 0a  ite3_errcode db.
69d0: 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d  } {SQLITE_ERROR}
69e0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
69f0: 32 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  2.3 {.  sqlite3_
6a00: 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 75 6e 6b  errmsg db.} {unk
6a10: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 61  nown database: a
6a20: 75 78 7d 0a 0a 23 20 54 65 73 74 20 74 68 61 74  ux}..# Test that
6a30: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
6a40: 75 72 6e 65 64 20 69 66 20 61 6e 20 61 74 74 65  urned if an atte
6a50: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
6a60: 68 65 63 6b 70 6f 69 6e 74 0a 23 20 69 66 20 61  heckpoint.# if a
6a70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
6a80: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
6a90: 62 61 73 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  base..#.do_test 
6aa0: 77 61 6c 2d 31 35 2e 33 2e 31 20 7b 0a 20 20 65  wal-15.3.1 {.  e
6ab0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47  xecsql {.    BEG
6ac0: 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  IN;.    INSERT I
6ad0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
6ae0: 20 34 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   4);.  }.  sqlit
6af0: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
6b00: 74 20 64 62 20 6d 61 69 6e 0a 7d 20 7b 53 51 4c  t db main.} {SQL
6b10: 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74  ITE_LOCKED}.do_t
6b20: 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e 32 20 7b  est wal-15.3.2 {
6b30: 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  .  sqlite3_errco
6b40: 64 65 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f  de db.} {SQLITE_
6b50: 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20  LOCKED}.do_test 
6b60: 77 61 6c 2d 31 35 2e 33 2e 33 20 7b 0a 20 20 73  wal-15.3.3 {.  s
6b70: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62  qlite3_errmsg db
6b80: 0a 7d 20 7b 64 61 74 61 62 61 73 65 20 74 61 62  .} {database tab
6b90: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 7d 0a 0a 23  le is locked}..#
6ba0: 20 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e   Earlier version
6bb0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 20 65 72  s returned an er
6bc0: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
6bd0: 69 66 20 74 68 65 20 64 62 20 63 61 6e 6e 6f 74  if the db cannot
6be0: 20 62 65 20 0a 23 20 63 68 65 63 6b 70 6f 69 6e   be .# checkpoin
6bf0: 74 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ted because of l
6c00: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 61 6e 6f  ocks held by ano
6c10: 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
6c20: 20 43 68 65 63 6b 20 74 68 61 74 0a 23 20 74 68   Check that.# th
6c30: 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  is is no longer 
6c40: 74 68 65 20 63 61 73 65 2e 0a 23 0a 73 71 6c 69  the case..#.sqli
6c50: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
6c60: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34  do_test wal-15.4
6c70: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
6c80: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
6c90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
6ca0: 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32  ;.  } db2.} {1 2
6cb0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
6cc0: 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .4.2 {.  execsql
6cd0: 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 73 71   { COMMIT }.  sq
6ce0: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
6cf0: 6f 69 6e 74 20 64 62 0a 7d 20 7b 53 51 4c 49 54  oint db.} {SQLIT
6d00: 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  E_OK}.do_test wa
6d10: 6c 2d 31 35 2e 34 2e 33 20 7b 0a 20 20 73 71 6c  l-15.4.3 {.  sql
6d20: 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d  ite3_errmsg db.}
6d30: 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a   {not an error}.
6d40: 0a 23 20 41 66 74 65 72 20 5b 64 62 32 5d 20 64  .# After [db2] d
6d50: 72 6f 70 73 20 69 74 73 20 6c 6f 63 6b 2c 20 5b  rops its lock, [
6d60: 64 62 5d 20 6d 61 79 20 63 68 65 63 6b 70 6f 69  db] may checkpoi
6d70: 6e 74 20 74 68 65 20 64 62 2e 0a 23 0a 64 6f 5f  nt the db..#.do_
6d80: 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 34 20  test wal-15.4.4 
6d90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f  {.  execsql { CO
6da0: 4d 4d 49 54 20 7d 20 64 62 32 0a 20 20 73 71 6c  MMIT } db2.  sql
6db0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
6dc0: 69 6e 74 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45  int db.} {SQLITE
6dd0: 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  _OK}.do_test wal
6de0: 2d 31 35 2e 34 2e 35 20 7b 0a 20 20 73 71 6c 69  -15.4.5 {.  sqli
6df0: 74 65 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20  te3_errmsg db.} 
6e00: 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72 7d 0a 64  {not an error}.d
6e10: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e  o_test wal-15.4.
6e20: 36 20 7b 0a 20 20 66 69 6c 65 20 73 69 7a 65 20  6 {.  file size 
6e30: 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20  test.db.} [expr 
6e40: 31 30 32 34 2a 32 5d 0a 0a 63 61 74 63 68 20 7b  1024*2]..catch {
6e50: 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74   db2 close }.cat
6e60: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
6e70: 0a 23 2d 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 0a 23 20 54 68  -----------.# Th
6ec0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
6ed0: 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77 61 6c  k of tests - wal
6ee0: 2d 31 36 2e 2a 20 2d 20 74 65 73 74 20 74 68 61  -16.* - test tha
6ef0: 74 20 69 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  t if a NULL poin
6f00: 74 65 72 20 6f 72 0a 23 20 61 6e 20 65 6d 70 74  ter or.# an empt
6f10: 79 20 73 74 72 69 6e 67 20 69 73 20 70 61 73 73  y string is pass
6f20: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
6f30: 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 68 65   argument of the
6f40: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28   wal_checkpoint(
6f50: 29 0a 23 20 41 50 49 2c 20 61 6e 20 61 74 74 65  ).# API, an atte
6f60: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
6f70: 68 65 63 6b 70 6f 69 6e 74 20 61 6c 6c 20 61 74  heckpoint all at
6f80: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
6f90: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  ..#.foreach {tn 
6fa0: 63 6b 70 74 5f 63 6d 64 20 63 6b 70 74 5f 72 65  ckpt_cmd ckpt_re
6fb0: 73 20 63 6b 70 74 5f 6d 61 69 6e 20 63 6b 70 74  s ckpt_main ckpt
6fc0: 5f 61 75 78 7d 20 7b 0a 20 20 31 20 7b 73 71 6c  _aux} {.  1 {sql
6fd0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
6fe0: 69 6e 74 20 64 62 7d 20 20 20 20 20 20 20 20 20  int db}         
6ff0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20       SQLITE_OK  
7000: 20 20 20 31 20 31 0a 20 20 32 20 7b 73 71 6c 69     1 1.  2 {sqli
7010: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
7020: 6e 74 20 64 62 20 22 22 7d 20 20 20 20 20 20 20  nt db ""}       
7030: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
7040: 20 20 31 20 31 0a 20 20 33 20 7b 64 62 20 65 76    1 1.  3 {db ev
7050: 61 6c 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63  al "PRAGMA wal_c
7060: 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 20 20  heckpoint"}     
7070: 20 20 20 7b 7d 20 20 20 20 20 20 20 20 20 20 20     {}           
7080: 20 31 20 31 0a 0a 20 20 34 20 7b 73 71 6c 69 74   1 1..  4 {sqlit
7090: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
70a0: 74 20 64 62 20 6d 61 69 6e 7d 20 20 20 20 20 20  t db main}      
70b0: 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20     SQLITE_OK    
70c0: 20 31 20 30 0a 20 20 35 20 7b 73 71 6c 69 74 65   1 0.  5 {sqlite
70d0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
70e0: 20 64 62 20 61 75 78 7d 20 20 20 20 20 20 20 20   db aux}        
70f0: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
7100: 30 20 31 0a 20 20 36 20 7b 73 71 6c 69 74 65 33  0 1.  6 {sqlite3
7110: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
7120: 64 62 20 74 65 6d 70 7d 20 20 20 20 20 20 20 20  db temp}        
7130: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 30   SQLITE_OK     0
7140: 20 30 0a 20 20 37 20 7b 64 62 20 65 76 61 6c 20   0.  7 {db eval 
7150: 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e 77 61 6c  "PRAGMA main.wal
7160: 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20  _checkpoint"}   
7170: 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20 31 20  {}            1 
7180: 30 0a 20 20 38 20 7b 64 62 20 65 76 61 6c 20 22  0.  8 {db eval "
7190: 50 52 41 47 4d 41 20 61 75 78 2e 77 61 6c 5f 63  PRAGMA aux.wal_c
71a0: 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 20 7b  heckpoint"}    {
71b0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 30 20 31  }            0 1
71c0: 0a 20 20 39 20 7b 64 62 20 65 76 61 6c 20 22 50  .  9 {db eval "P
71d0: 52 41 47 4d 41 20 74 65 6d 70 2e 77 61 6c 5f 63  RAGMA temp.wal_c
71e0: 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 7b 7d  heckpoint"}   {}
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 30 0a              0 0.
7200: 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  } {.  do_test wa
7210: 6c 2d 31 36 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  l-16.$tn.1 {.   
7220: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
7230: 72 63 65 20 74 65 73 74 32 2e 64 62 20 74 65 73  rce test2.db tes
7240: 74 32 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e  t2.db-wal test2.
7250: 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 66  db-journal.    f
7260: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
7270: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
7280: 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f  b-wal test.db-jo
7290: 75 72 6e 61 6c 0a 0a 20 20 20 20 73 71 6c 69 74  urnal..    sqlit
72a0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
72b0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
72c0: 20 20 41 54 54 41 43 48 20 27 74 65 73 74 32 2e    ATTACH 'test2.
72d0: 64 62 27 20 41 53 20 61 75 78 3b 0a 20 20 20 20  db' AS aux;.    
72e0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 61 75    PRAGMA main.au
72f0: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20  to_vacuum = 0;. 
7300: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
7310: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b  auto_vacuum = 0;
7320: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61  .      PRAGMA ma
7330: 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  in.journal_mode 
7340: 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  = WAL;.      PRA
7350: 47 4d 41 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f  GMA aux.journal_
7360: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
7370: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
7380: 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20  nous = NORMAL;. 
7390: 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c 20 77 61     }.  } {wal wa
73a0: 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  l}..  do_test wa
73b0: 6c 2d 31 36 2e 24 74 6e 2e 32 20 7b 0a 20 20 20  l-16.$tn.2 {.   
73c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
73d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 6d 61   CREATE TABLE ma
73e0: 69 6e 2e 74 31 28 61 2c 20 62 2c 20 50 52 49 4d  in.t1(a, b, PRIM
73f0: 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a  ARY KEY(a, b));.
7400: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
7410: 4c 45 20 61 75 78 2e 74 32 28 61 2c 20 62 2c 20  LE aux.t2(a, b, 
7420: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62  PRIMARY KEY(a, b
7430: 29 29 3b 0a 0a 20 20 20 20 20 20 49 4e 53 45 52  ));..      INSER
7440: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
7450: 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  (1, randomblob(1
7460: 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53  000));.      INS
7470: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
7480: 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  ES(2, randomblob
7490: 28 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20 49  (1000));.      I
74a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
74b0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
74c0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 6c 69 73      }.  .    lis
74d0: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
74e0: 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65  t.db] [file size
74f0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20   test.db-wal].  
7500: 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 31 2a  } [list [expr 1*
7510: 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f  1024] [wal_file_
7520: 73 69 7a 65 20 31 30 20 31 30 32 34 5d 5d 0a 20  size 10 1024]]. 
7530: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e   do_test wal-16.
7540: 24 74 6e 2e 33 20 7b 0a 20 20 20 20 6c 69 73 74  $tn.3 {.    list
7550: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
7560: 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65  2.db] [file size
7570: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a 20   test2.db-wal]. 
7580: 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 31   } [list [expr 1
7590: 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65  *1024] [wal_file
75a0: 5f 73 69 7a 65 20 31 36 20 31 30 32 34 5d 5d 0a  _size 16 1024]].
75b0: 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c    .  do_test wal
75c0: 2d 31 36 2e 24 74 6e 2e 34 20 5b 6c 69 73 74 20  -16.$tn.4 [list 
75d0: 65 76 61 6c 20 24 63 6b 70 74 5f 63 6d 64 5d 20  eval $ckpt_cmd] 
75e0: 24 63 6b 70 74 5f 72 65 73 0a 20 20 0a 20 20 64  $ckpt_res.  .  d
75f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74  o_test wal-16.$t
7600: 6e 2e 35 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  n.5 {.    list [
7610: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7620: 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  b] [file size te
7630: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b  st.db-wal].  } [
7640: 6c 69 73 74 20 5b 65 78 70 72 20 28 24 63 6b 70  list [expr ($ckp
7650: 74 5f 6d 61 69 6e 20 3f 20 37 20 3a 20 31 29 2a  t_main ? 7 : 1)*
7660: 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f  1024] [wal_file_
7670: 73 69 7a 65 20 31 30 20 31 30 32 34 5d 5d 0a 0a  size 10 1024]]..
7680: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36    do_test wal-16
7690: 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20 6c 69 73  .$tn.6 {.    lis
76a0: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
76b0: 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a  t2.db] [file siz
76c0: 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a  e test2.db-wal].
76d0: 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20    } [list [expr 
76e0: 28 24 63 6b 70 74 5f 61 75 78 20 3f 20 37 20 3a  ($ckpt_aux ? 7 :
76f0: 20 31 29 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66   1)*1024] [wal_f
7700: 69 6c 65 5f 73 69 7a 65 20 31 36 20 31 30 32 34  ile_size 16 1024
7710: 5d 5d 0a 0a 20 20 63 61 74 63 68 20 7b 20 64 62  ]]..  catch { db
7720: 20 63 6c 6f 73 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d   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 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
7780: 6c 6f 77 69 6e 67 20 74 65 73 74 73 20 2d 20 77  lowing tests - w
7790: 61 6c 2d 31 37 2e 2a 20 2d 20 61 74 74 65 6d 70  al-17.* - attemp
77a0: 74 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  t to verify that
77b0: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 23 20 6e   the correct.# n
77c0: 75 6d 62 65 72 20 6f 66 20 22 70 61 64 64 69 6e  umber of "paddin
77d0: 67 22 20 66 72 61 6d 65 73 20 61 72 65 20 61 70  g" frames are ap
77e0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6c 6f  pended to the lo
77f0: 67 20 66 69 6c 65 20 77 68 65 6e 20 61 20 74 72  g file when a tr
7800: 61 6e 73 61 63 74 69 6f 6e 0a 23 20 69 73 20 63  ansaction.# is c
7810: 6f 6d 6d 69 74 74 65 64 20 69 6e 20 73 79 6e 63  ommitted in sync
7820: 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20 6d 6f 64  hronous=FULL mod
7830: 65 2e 0a 23 20 0a 23 20 44 6f 20 74 68 69 73 20  e..# .# Do this 
7840: 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 64 61  by creating a da
7850: 74 61 62 61 73 65 20 74 68 61 74 20 75 73 65 73  tabase that uses
7860: 20 35 31 32 20 62 79 74 65 20 70 61 67 65 73 2e   512 byte pages.
7870: 20 54 68 65 6e 20 77 72 69 74 69 6e 67 0a 23 20   Then writing.# 
7880: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
7890: 61 74 20 6d 6f 64 69 66 69 65 73 20 31 37 31 20  at modifies 171 
78a0: 70 61 67 65 73 2e 20 49 6e 20 73 79 6e 63 68 72  pages. In synchr
78b0: 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20 6d 6f 64  onous=NORMAL mod
78c0: 65 2c 20 74 68 69 73 0a 23 20 70 72 6f 64 75 63  e, this.# produc
78d0: 65 73 20 61 20 6c 6f 67 20 66 69 6c 65 20 6f 66  es a log file of
78e0: 3a 0a 23 0a 23 20 20 20 33 32 20 2b 20 28 32 34  :.#.#   32 + (24
78f0: 2b 35 31 32 29 2a 31 37 31 20 3d 20 39 30 33 31  +512)*171 = 9031
7900: 32 20 62 79 74 65 73 2e 0a 23 0a 23 20 53 6c 69  2 bytes..#.# Sli
7910: 67 68 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61  ghtly larger tha
7920: 6e 20 31 31 2a 38 31 39 32 20 3d 20 39 30 31 31  n 11*8192 = 9011
7930: 32 20 62 79 74 65 73 2e 0a 23 0a 23 20 52 75 6e  2 bytes..#.# Run
7940: 20 74 68 65 20 74 65 73 74 20 75 73 69 6e 67 20   the test using 
7950: 76 61 72 69 6f 75 73 20 64 69 66 66 65 72 65 6e  various differen
7960: 74 20 73 65 63 74 6f 72 2d 73 69 7a 65 73 2e 20  t sector-sizes. 
7970: 49 6e 20 65 61 63 68 20 63 61 73 65 2c 20 74 68  In each case, th
7980: 65 0a 23 20 57 41 4c 20 63 6f 64 65 20 73 68 6f  e.# WAL code sho
7990: 75 6c 64 20 77 72 69 74 65 20 74 68 65 20 39 30  uld write the 90
79a0: 33 30 30 20 62 79 74 65 73 20 6f 66 20 6c 6f 67  300 bytes of log
79b0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67   file containing
79c0: 20 74 68 65 20 0a 23 20 74 72 61 6e 73 61 63 74   the .# transact
79d0: 69 6f 6e 2c 20 74 68 65 6e 20 61 70 70 65 6e 64  ion, then append
79e0: 20 61 73 20 6d 61 79 20 66 72 61 6d 65 73 20 61   as may frames a
79f0: 73 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  s are required t
7a00: 6f 20 65 78 74 65 6e 64 20 74 68 65 0a 23 20 6c  o extend the.# l
7a10: 6f 67 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  og file so that 
7a20: 6e 6f 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  no part of the n
7a30: 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ext transaction 
7a40: 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 20  will be written 
7a50: 69 6e 74 6f 0a 23 20 61 20 64 69 73 6b 2d 73 65  into.# a disk-se
7a60: 63 74 6f 72 20 75 73 65 64 20 62 79 20 74 72 61  ctor used by tra
7a70: 6e 73 61 63 74 69 6f 6e 20 6a 75 73 74 20 63 6f  nsaction just co
7a80: 6d 6d 69 74 74 65 64 2e 0a 23 0a 73 65 74 20 6f  mmitted..#.set o
7a90: 6c 64 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20  ld_pending_byte 
7aa0: 5b 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f  [sqlite3_test_co
7ab0: 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79  ntrol_pending_by
7ac0: 74 65 20 30 78 31 30 30 30 30 30 30 30 5d 0a 63  te 0x10000000].c
7ad0: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
7ae0: 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 73 65  }.foreach {tn se
7af0: 63 74 6f 72 73 69 7a 65 20 6c 6f 67 73 69 7a 65  ctorsize logsize
7b00: 7d 20 22 0a 20 20 31 20 20 20 31 32 38 20 20 5b  } ".  1   128  [
7b10: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37  wal_file_size 17
7b20: 32 20 35 31 32 5d 0a 20 20 32 20 20 20 32 35 36  2 512].  2   256
7b30: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
7b40: 20 31 37 32 20 35 31 32 5d 0a 20 20 33 20 20 20   172 512].  3   
7b50: 35 31 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  512  [wal_file_s
7b60: 69 7a 65 20 31 37 32 20 35 31 32 5d 20 0a 20 20  ize 172 512] .  
7b70: 34 20 20 31 30 32 34 20 20 5b 77 61 6c 5f 66 69  4  1024  [wal_fi
7b80: 6c 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d  le_size 172 512]
7b90: 0a 20 20 35 20 20 32 30 34 38 20 20 5b 77 61 6c  .  5  2048  [wal
7ba0: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35  _file_size 172 5
7bb0: 31 32 5d 0a 20 20 36 20 20 34 30 39 36 20 20 5b  12].  6  4096  [
7bc0: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37  wal_file_size 17
7bd0: 36 20 35 31 32 5d 0a 20 20 37 20 20 38 31 39 32  6 512].  7  8192
7be0: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
7bf0: 20 31 38 34 20 35 31 32 5d 0a 22 20 7b 0a 20 20   184 512]." {.  
7c00: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
7c10: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  ce test.db test.
7c20: 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a  db-wal test.db-j
7c30: 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33  ournal.  sqlite3
7c40: 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76 69 63 65  _simulate_device
7c50: 20 2d 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65   -sectorsize $se
7c60: 63 74 6f 72 73 69 7a 65 0a 20 20 73 71 6c 69 74  ctorsize.  sqlit
7c70: 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76  e3 db test.db -v
7c80: 66 73 20 64 65 76 73 79 6d 0a 0a 20 20 64 6f 5f  fs devsym..  do_
7c90: 74 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e  test wal-17.$tn.
7ca0: 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  1 {.    execsql 
7cb0: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  {.      PRAGMA a
7cc0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
7cd0: 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
7ce0: 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20  e_size = 512;.  
7cf0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
7d00: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
7d10: 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63       PRAGMA sync
7d20: 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 0a  hronous = FULL;.
7d30: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
7d40: 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b  l {.      BEGIN;
7d50: 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41  .      CREATE TA
7d60: 42 4c 45 20 74 28 78 29 3b 0a 20 20 20 20 7d 0a  BLE t(x);.    }.
7d70: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30      for {set i 0
7d80: 7d 20 7b 24 69 3c 31 36 36 7d 20 7b 69 6e 63 72  } {$i<166} {incr
7d90: 20 69 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63   i} {.      exec
7da0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
7db0: 4f 20 74 20 56 41 4c 55 45 53 28 72 61 6e 64 6f  O t VALUES(rando
7dc0: 6d 62 6c 6f 62 28 34 30 30 29 29 20 7d 0a 20 20  mblob(400)) }.  
7dd0: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
7de0: 43 4f 4d 4d 49 54 0a 0a 20 20 20 20 66 69 6c 65  COMMIT..    file
7df0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
7e00: 6c 0a 20 20 7d 20 24 6c 6f 67 73 69 7a 65 0a 0a  l.  } $logsize..
7e10: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 37    do_test wal-17
7e20: 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 66 69 6c  .$tn.2 {.    fil
7e30: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20  e size test.db. 
7e40: 20 7d 20 35 31 32 0a 0a 20 20 64 6f 5f 74 65 73   } 512..  do_tes
7e50: 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 33 20 7b  t wal-17.$tn.3 {
7e60: 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  .    db close.  
7e70: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
7e80: 2e 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 35 31  .db.  } [expr 51
7e90: 32 2a 31 37 31 5d 0a 7d 0a 73 71 6c 69 74 65 33  2*171].}.sqlite3
7ea0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65  _test_control_pe
7eb0: 6e 64 69 6e 67 5f 62 79 74 65 20 24 6f 6c 64 5f  nding_byte $old_
7ec0: 70 65 6e 64 69 6e 67 5f 62 79 74 65 0a 0a 23 2d  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 0a 23 20 54 68 69 73 20  --------.# This 
7f20: 74 65 73 74 20 2d 20 77 61 6c 2d 31 38 2e 2a 20  test - wal-18.* 
7f30: 2d 20 76 65 72 69 66 69 65 73 20 61 20 63 6f 75  - verifies a cou
7f40: 70 6c 65 20 6f 66 20 73 70 65 63 69 66 69 63 20  ple of specific 
7f50: 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 0a  conditions that.
7f60: 23 20 6d 61 79 20 62 65 20 65 6e 63 6f 75 6e 74  # may be encount
7f70: 65 72 65 64 20 77 68 69 6c 65 20 72 65 63 6f 76  ered while recov
7f80: 65 72 69 6e 67 20 61 20 6c 6f 67 20 66 69 6c 65  ering a log file
7f90: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 63 6f 72   are handled cor
7fa0: 72 65 63 74 6c 79 3a 0a 23 0a 23 20 20 20 77 61  rectly:.#.#   wa
7fb0: 6c 2d 31 38 2e 31 2e 2a 20 57 68 65 6e 20 74 68  l-18.1.* When th
7fc0: 65 20 66 69 72 73 74 20 33 32 2d 62 69 74 73 20  e first 32-bits 
7fd0: 6f 66 20 61 20 66 72 61 6d 65 20 63 68 65 63 6b  of a frame check
7fe0: 73 75 6d 20 69 73 20 63 6f 72 72 65 63 74 20 62  sum is correct b
7ff0: 75 74 20 0a 23 20 20 20 20 20 20 20 20 20 20 20  ut .#           
8000: 20 20 20 74 68 65 20 73 65 63 6f 6e 64 20 33 32     the second 32
8010: 2d 62 69 74 73 20 61 72 65 20 66 61 6c 73 65 2c  -bits are false,
8020: 20 61 6e 64 0a 23 0a 23 20 20 20 77 61 6c 2d 31   and.#.#   wal-1
8030: 38 2e 32 2e 2a 20 57 68 65 6e 20 74 68 65 20 70  8.2.* When the p
8040: 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 74  age-size field t
8050: 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  hat occurs at th
8060: 65 20 73 74 61 72 74 20 6f 66 20 61 20 6c 6f 67  e start of a log
8070: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
8080: 66 69 6c 65 20 69 73 20 61 20 70 6f 77 65 72 20  file is a power 
8090: 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
80a0: 6e 20 31 36 33 38 34 20 6f 72 20 73 6d 61 6c 6c  n 16384 or small
80b0: 65 72 20 74 68 61 6e 20 35 31 32 2e 0a 23 0a 66  er than 512..#.f
80c0: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
80d0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
80e0: 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f  b-wal test.db-jo
80f0: 75 72 6e 61 6c 0a 64 6f 5f 74 65 73 74 20 77 61  urnal.do_test wa
8100: 6c 2d 31 38 2e 30 20 7b 0a 20 20 73 71 6c 69 74  l-18.0 {.  sqlit
8110: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
8120: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
8130: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
8140: 20 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d   1024;.    PRAGM
8150: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
8160: 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  0;.    PRAGMA jo
8170: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
8180: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e  ;.    PRAGMA syn
8190: 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a  chronous = OFF;.
81a0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
81b0: 45 20 74 31 28 61 2c 20 62 2c 20 55 4e 49 51 55  E t1(a, b, UNIQU
81c0: 45 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 49 4e  E(a, b));.    IN
81d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
81e0: 55 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 50  UES(0, 0);.    P
81f0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
8200: 6f 69 6e 74 3b 0a 0a 20 20 20 20 49 4e 53 45 52  oint;..    INSER
8210: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
8220: 28 31 2c 20 32 29 3b 20 20 20 20 20 20 20 20 20  (1, 2);         
8230: 20 2d 2d 20 66 72 61 6d 65 73 20 31 20 61 6e 64   -- frames 1 and
8240: 20 32 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e   2.    INSERT IN
8250: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20  TO t1 VALUES(3, 
8260: 34 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20  4);          -- 
8270: 66 72 61 6d 65 73 20 33 20 61 6e 64 20 34 0a 20  frames 3 and 4. 
8280: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
8290: 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 20  1 VALUES(5, 6); 
82a0: 20 20 20 20 20 20 20 20 20 2d 2d 20 66 72 61 6d           -- fram
82b0: 65 73 20 35 20 61 6e 64 20 36 0a 20 20 7d 0a 0a  es 5 and 6.  }..
82c0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
82d0: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 58  ce test.db testX
82e0: 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20  .db.  file copy 
82f0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77  -force test.db-w
8300: 61 6c 20 74 65 73 74 58 2e 64 62 2d 77 61 6c 0a  al testX.db-wal.
8310: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73    db close.  lis
8320: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
8330: 74 58 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a  tX.db] [file siz
8340: 65 20 74 65 73 74 58 2e 64 62 2d 77 61 6c 5d 0a  e testX.db-wal].
8350: 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 33 2a  } [list [expr 3*
8360: 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f  1024] [wal_file_
8370: 73 69 7a 65 20 36 20 31 30 32 34 5d 5d 0a 0a 75  size 6 1024]]..u
8380: 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  nset -nocomplain
8390: 20 6e 46 72 61 6d 65 20 72 65 73 75 6c 74 0a 66   nFrame result.f
83a0: 6f 72 65 61 63 68 20 7b 6e 46 72 61 6d 65 20 72  oreach {nFrame r
83b0: 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20  esult} {.       
83c0: 20 20 30 20 20 20 20 20 20 7b 30 20 30 7d 0a 20    0      {0 0}. 
83d0: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 7b          1      {
83e0: 30 20 30 7d 0a 20 20 20 20 20 20 20 20 20 32 20  0 0}.         2 
83f0: 20 20 20 20 20 7b 30 20 30 20 31 20 32 7d 0a 20       {0 0 1 2}. 
8400: 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 7b          3      {
8410: 30 20 30 20 31 20 32 7d 0a 20 20 20 20 20 20 20  0 0 1 2}.       
8420: 20 20 34 20 20 20 20 20 20 7b 30 20 30 20 31 20    4      {0 0 1 
8430: 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20  2 3 4}.         
8440: 35 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 20  5      {0 0 1 2 
8450: 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 36 20  3 4}.         6 
8460: 20 20 20 20 20 7b 30 20 30 20 31 20 32 20 33 20       {0 0 1 2 3 
8470: 34 20 35 20 36 7d 0a 7d 20 7b 0a 20 20 64 6f 5f  4 5 6}.} {.  do_
8480: 74 65 73 74 20 77 61 6c 2d 31 38 2e 31 2e 24 6e  test wal-18.1.$n
8490: 46 72 61 6d 65 20 7b 0a 20 20 20 20 66 69 6c 65  Frame {.    file
84a0: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
84b0: 74 58 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20  tX.db test.db.  
84c0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
84d0: 63 65 20 74 65 73 74 58 2e 64 62 2d 77 61 6c 20  ce testX.db-wal 
84e0: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 20  test.db-wal..   
84f0: 20 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73   hexio_write tes
8500: 74 2e 64 62 2d 77 61 6c 20 5b 65 78 70 72 20 32  t.db-wal [expr 2
8510: 34 20 2b 20 24 6e 46 72 61 6d 65 2a 28 32 34 2b  4 + $nFrame*(24+
8520: 31 30 32 34 29 20 2b 20 32 30 5d 20 30 30 30 30  1024) + 20] 0000
8530: 30 30 30 30 0a 0a 20 20 20 20 73 71 6c 69 74 65  0000..    sqlite
8540: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
8550: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
8560: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
8570: 74 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  t1;.      PRAGMA
8580: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
8590: 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 63 6f  ; .    }.  } [co
85a0: 6e 63 61 74 20 24 72 65 73 75 6c 74 20 6f 6b 5d  ncat $result ok]
85b0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 0a 0a  .  db close.} ..
85c0: 70 72 6f 63 20 72 61 6e 64 6f 6d 62 6c 6f 62 20  proc randomblob 
85d0: 7b 70 67 73 7a 7d 20 7b 0a 20 20 73 71 6c 69 74  {pgsz} {.  sqlit
85e0: 65 33 20 72 62 64 62 20 3a 6d 65 6d 6f 72 79 3a  e3 rbdb :memory:
85f0: 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b 72 62 64  .  set blob [rbd
8600: 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 72 61  b one {SELECT ra
8610: 6e 64 6f 6d 62 6c 6f 62 28 24 70 67 73 7a 29 7d  ndomblob($pgsz)}
8620: 5d 0a 20 20 72 62 64 62 20 63 6c 6f 73 65 0a 20  ].  rbdb close. 
8630: 20 73 65 74 20 62 6c 6f 62 0a 7d 0a 0a 70 72 6f   set blob.}..pro
8640: 63 20 6c 6f 67 63 6b 73 75 6d 20 7b 63 6b 76 31  c logcksum {ckv1
8650: 20 63 6b 76 32 20 62 6c 6f 62 7d 20 7b 0a 20 20   ckv2 blob} {.  
8660: 75 70 76 61 72 20 24 63 6b 76 31 20 63 31 0a 20  upvar $ckv1 c1. 
8670: 20 75 70 76 61 72 20 24 63 6b 76 32 20 63 32 0a   upvar $ckv2 c2.
8680: 0a 20 20 73 65 74 20 73 63 61 6e 70 61 74 74 65  .  set scanpatte
8690: 72 6e 20 49 2a 0a 20 20 69 66 20 7b 24 3a 3a 74  rn I*.  if {$::t
86a0: 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 62 79 74 65  cl_platform(byte
86b0: 4f 72 64 65 72 29 20 65 71 20 22 6c 69 74 74 6c  Order) eq "littl
86c0: 65 45 6e 64 69 61 6e 22 7d 20 7b 0a 20 20 20 20  eEndian"} {.    
86d0: 73 65 74 20 73 63 61 6e 70 61 74 74 65 72 6e 20  set scanpattern 
86e0: 69 2a 0a 20 20 7d 0a 0a 20 20 62 69 6e 61 72 79  i*.  }..  binary
86f0: 20 73 63 61 6e 20 24 62 6c 6f 62 20 24 73 63 61   scan $blob $sca
8700: 6e 70 61 74 74 65 72 6e 20 76 61 6c 75 65 73 0a  npattern values.
8710: 20 20 66 6f 72 65 61 63 68 20 7b 76 31 20 76 32    foreach {v1 v2
8720: 7d 20 24 76 61 6c 75 65 73 20 7b 0a 20 20 20 20  } $values {.    
8730: 73 65 74 20 63 31 20 5b 65 78 70 72 20 7b 28 24  set c1 [expr {($
8740: 63 31 20 2b 20 24 76 31 20 2b 20 24 63 32 29 26  c1 + $v1 + $c2)&
8750: 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 20  0xFFFFFFFF}].   
8760: 20 73 65 74 20 63 32 20 5b 65 78 70 72 20 7b 28   set c2 [expr {(
8770: 24 63 32 20 2b 20 24 76 32 20 2b 20 24 63 31 29  $c2 + $v2 + $c1)
8780: 26 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20  &0xFFFFFFFF}].  
8790: 7d 0a 7d 0a 0a 66 69 6c 65 20 63 6f 70 79 20 2d  }.}..file copy -
87a0: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
87b0: 73 74 58 2e 64 62 0a 66 6f 72 65 61 63 68 20 7b  stX.db.foreach {
87c0: 74 6e 20 70 67 73 7a 20 77 6f 72 6b 73 7d 20 7b  tn pgsz works} {
87d0: 20 0a 20 20 31 20 20 20 20 31 32 38 20 20 20 20   .  1    128    
87e0: 30 0a 20 20 32 20 20 20 20 32 35 36 20 20 20 20  0.  2    256    
87f0: 30 0a 20 20 33 20 20 20 20 35 31 32 20 20 20 20  0.  3    512    
8800: 31 0a 20 20 34 20 20 20 31 30 32 34 20 20 20 20  1.  4   1024    
8810: 31 0a 20 20 35 20 20 20 32 30 34 38 20 20 20 20  1.  5   2048    
8820: 31 0a 20 20 36 20 20 20 34 30 39 36 20 20 20 20  1.  6   4096    
8830: 31 0a 20 20 37 20 20 20 38 31 39 32 20 20 20 20  1.  7   8192    
8840: 31 0a 20 20 38 20 20 31 36 33 38 34 20 20 20 20  1.  8  16384    
8850: 31 0a 20 20 39 20 20 33 32 37 36 38 20 20 20 20  1.  9  32768    
8860: 31 0a 20 31 30 20 20 36 35 35 33 36 20 20 20 20  1. 10  65536    
8870: 31 0a 20 31 31 20 31 33 31 30 37 32 20 20 20 20  1. 11 131072    
8880: 30 0a 20 31 31 20 20 20 31 30 31 36 20 20 20 20  0. 11   1016    
8890: 30 0a 7d 20 7b 0a 0a 20 20 69 66 20 7b 24 3a 3a  0.} {..  if {$::
88a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
88b0: 53 49 5a 45 20 3c 20 24 70 67 73 7a 7d 20 7b 0a  SIZE < $pgsz} {.
88c0: 20 20 20 20 73 65 74 20 77 6f 72 6b 73 20 30 0a      set works 0.
88d0: 20 20 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20    }..  for {set 
88e0: 70 67 20 31 7d 20 7b 24 70 67 20 3c 3d 20 33 7d  pg 1} {$pg <= 3}
88f0: 20 7b 69 6e 63 72 20 70 67 7d 20 7b 0a 20 20 20   {incr pg} {.   
8900: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
8910: 65 20 74 65 73 74 58 2e 64 62 20 74 65 73 74 2e  e testX.db test.
8920: 64 62 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65  db.    file dele
8930: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  te -force test.d
8940: 62 2d 77 61 6c 0a 20 20 0a 20 20 20 20 23 20 43  b-wal.  .    # C
8950: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 64 61  heck that the da
8960: 74 61 62 61 73 65 20 6e 6f 77 20 65 78 69 73 74  tabase now exist
8970: 73 20 61 6e 64 20 63 6f 6e 73 69 73 74 73 20 6f  s and consists o
8980: 66 20 74 68 72 65 65 20 70 61 67 65 73 2e 20 41  f three pages. A
8990: 6e 64 0a 20 20 20 20 23 20 74 68 61 74 20 74 68  nd.    # that th
89a0: 65 72 65 20 69 73 20 6e 6f 20 61 73 73 6f 63 69  ere is no associ
89b0: 61 74 65 64 20 77 61 6c 20 66 69 6c 65 2e 0a 20  ated wal file.. 
89c0: 20 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74     #.    do_test
89d0: 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70   wal-18.2.$tn.$p
89e0: 67 2e 31 20 7b 20 66 69 6c 65 20 65 78 69 73 74  g.1 { file exist
89f0: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 7d 20  s test.db-wal } 
8a00: 30 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  0.    do_test wa
8a10: 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 32  l-18.2.$tn.$pg.2
8a20: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
8a30: 65 73 74 2e 64 62 20 7d 20 31 0a 20 20 20 20 64  est.db } 1.    d
8a40: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e  o_test wal-18.2.
8a50: 24 74 6e 2e 24 70 67 2e 33 20 7b 20 66 69 6c 65  $tn.$pg.3 { file
8a60: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 20 7d 20   size test.db } 
8a70: 5b 65 78 70 72 20 31 30 32 34 2a 33 5d 0a 20 20  [expr 1024*3].  
8a80: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
8a90: 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 34 20  -18.2.$tn.$pg.4 
8aa0: 7b 0a 0a 20 20 20 20 20 20 23 20 43 72 65 61 74  {..      # Creat
8ab0: 65 20 61 20 77 61 6c 20 66 69 6c 65 20 74 68 61  e a wal file tha
8ac0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e  t contains a sin
8ad0: 67 6c 65 20 66 72 61 6d 65 20 28 64 61 74 61 62  gle frame (datab
8ae0: 61 73 65 20 70 61 67 65 0a 20 20 20 20 20 20 23  ase page.      #
8af0: 20 6e 75 6d 62 65 72 20 24 70 67 29 20 77 69 74   number $pg) wit
8b00: 68 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 6c 61  h the commit fla
8b10: 67 20 73 65 74 2e 20 54 68 65 20 66 72 61 6d 65  g set. The frame
8b20: 20 63 68 65 63 6b 73 75 6d 20 69 73 0a 20 20 20   checksum is.   
8b30: 20 20 20 23 20 63 6f 72 72 65 63 74 2c 20 62 75     # correct, bu
8b40: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
8b50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  f the database p
8b60: 61 67 65 20 61 72 65 20 63 6f 72 72 75 70 74 2e  age are corrupt.
8b70: 0a 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 23  .      #.      #
8b80: 20 54 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   The page-size i
8b90: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 68  n the log file h
8ba0: 65 61 64 65 72 20 69 73 20 73 65 74 20 74 6f 20  eader is set to 
8bb0: 24 70 67 73 7a 2e 20 49 66 20 74 68 65 0a 20 20  $pgsz. If the.  
8bc0: 20 20 20 20 23 20 57 41 4c 20 63 6f 64 65 20 63      # WAL code c
8bd0: 6f 6e 73 69 64 65 72 73 20 24 70 67 73 7a 20 74  onsiders $pgsz t
8be0: 6f 20 62 65 20 61 20 76 61 6c 69 64 20 53 51 4c  o be a valid SQL
8bf0: 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ite database fil
8c00: 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 20  e page-size,.   
8c10: 20 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73     # the databas
8c20: 65 20 77 69 6c 6c 20 62 65 20 63 6f 72 72 75 70  e will be corrup
8c30: 74 20 28 62 65 63 61 75 73 65 20 74 68 65 20 67  t (because the g
8c40: 61 72 62 61 67 65 20 66 72 61 6d 65 20 63 6f 6e  arbage frame con
8c50: 74 65 6e 74 73 0a 20 20 20 20 20 20 23 20 77 69  tents.      # wi
8c60: 6c 6c 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ll be treated as
8c70: 20 76 61 6c 69 64 20 63 6f 6e 74 65 6e 74 29 2e   valid content).
8c80: 20 49 66 20 24 70 67 73 7a 20 69 73 20 69 6e 76   If $pgsz is inv
8c90: 61 6c 69 64 20 28 74 6f 6f 20 73 6d 61 6c 6c 0a  alid (too small.
8ca0: 20 20 20 20 20 20 23 20 6f 72 20 74 6f 6f 20 6c        # or too l
8cb0: 61 72 67 65 29 2c 20 74 68 65 20 64 62 20 77 69  arge), the db wi
8cc0: 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
8cd0: 74 20 61 73 20 74 68 65 20 6c 6f 67 20 66 69 6c  t as the log fil
8ce0: 65 20 77 69 6c 6c 0a 20 20 20 20 20 20 23 20 62  e will.      # b
8cf0: 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20  e ignored..     
8d00: 20 23 0a 20 20 20 20 20 20 73 65 74 20 77 61 6c   #.      set wal
8d10: 68 64 72 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  hdr [binary form
8d20: 61 74 20 49 49 49 49 49 49 20 39 33 31 30 37 31  at IIIIII 931071
8d30: 36 31 38 20 33 30 30 37 30 30 30 20 24 70 67 73  618 3007000 $pgs
8d40: 7a 20 31 32 33 34 20 32 32 20 32 33 5d 0a 20 20  z 1234 22 23].  
8d50: 20 20 20 20 73 65 74 20 66 72 61 6d 65 62 6f 64      set framebod
8d60: 79 20 5b 72 61 6e 64 6f 6d 62 6c 6f 62 20 24 70  y [randomblob $p
8d70: 67 73 7a 5d 0a 20 20 20 20 20 20 73 65 74 20 66  gsz].      set f
8d80: 72 61 6d 65 68 64 72 20 20 5b 62 69 6e 61 72 79  ramehdr  [binary
8d90: 20 66 6f 72 6d 61 74 20 49 49 49 49 20 24 70 67   format IIII $pg
8da0: 20 35 20 32 32 20 32 33 5d 0a 20 20 20 20 20 20   5 22 23].      
8db0: 73 65 74 20 63 31 20 30 0a 20 20 20 20 20 20 73  set c1 0.      s
8dc0: 65 74 20 63 32 20 30 0a 20 20 20 20 20 20 6c 6f  et c2 0.      lo
8dd0: 67 63 6b 73 75 6d 20 63 31 20 63 32 20 24 77 61  gcksum c1 c2 $wa
8de0: 6c 68 64 72 0a 0a 20 20 20 20 20 20 61 70 70 65  lhdr..      appe
8df0: 6e 64 20 77 61 6c 68 64 72 20 5b 62 69 6e 61 72  nd walhdr [binar
8e00: 79 20 66 6f 72 6d 61 74 20 49 49 20 24 63 31 20  y format II $c1 
8e10: 24 63 32 5d 0a 20 20 20 20 20 20 6c 6f 67 63 6b  $c2].      logck
8e20: 73 75 6d 20 63 31 20 63 32 20 5b 73 74 72 69 6e  sum c1 c2 [strin
8e30: 67 20 72 61 6e 67 65 20 24 66 72 61 6d 65 68 64  g range $framehd
8e40: 72 20 30 20 37 5d 0a 20 20 20 20 20 20 6c 6f 67  r 0 7].      log
8e50: 63 6b 73 75 6d 20 63 31 20 63 32 20 24 66 72 61  cksum c1 c2 $fra
8e60: 6d 65 62 6f 64 79 0a 20 20 20 20 20 20 73 65 74  mebody.      set
8e70: 20 66 72 61 6d 65 68 64 72 20 5b 62 69 6e 61 72   framehdr [binar
8e80: 79 20 66 6f 72 6d 61 74 20 49 49 49 49 49 49 20  y format IIIIII 
8e90: 24 70 67 20 35 20 32 32 20 32 33 20 24 63 31 20  $pg 5 22 23 $c1 
8ea0: 24 63 32 5d 0a 0a 20 20 20 20 20 20 73 65 74 20  $c2]..      set 
8eb0: 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62  fd [open test.db
8ec0: 2d 77 61 6c 20 77 5d 0a 20 20 20 20 20 20 66 63  -wal w].      fc
8ed0: 6f 6e 66 69 67 75 72 65 20 24 66 64 20 2d 65 6e  onfigure $fd -en
8ee0: 63 6f 64 69 6e 67 20 62 69 6e 61 72 79 20 2d 74  coding binary -t
8ef0: 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72  ranslation binar
8f00: 79 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f  y.      puts -no
8f10: 6e 65 77 6c 69 6e 65 20 24 66 64 20 24 77 61 6c  newline $fd $wal
8f20: 68 64 72 0a 20 20 20 20 20 20 70 75 74 73 20 2d  hdr.      puts -
8f30: 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24 66  nonewline $fd $f
8f40: 72 61 6d 65 68 64 72 0a 20 20 20 20 20 20 70 75  ramehdr.      pu
8f50: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66  ts -nonewline $f
8f60: 64 20 24 66 72 61 6d 65 62 6f 64 79 0a 20 20 20  d $framebody.   
8f70: 20 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 0a     close $fd.  .
8f80: 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20        file size 
8f90: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20  test.db-wal.    
8fa0: 7d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  } [wal_file_size
8fb0: 20 31 20 24 70 67 73 7a 5d 0a 20 20 0a 20 20 20   1 $pgsz].  .   
8fc0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e   do_test wal-18.
8fd0: 32 2e 24 74 6e 2e 24 70 67 2e 35 20 7b 0a 20 20  2.$tn.$pg.5 {.  
8fe0: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
8ff0: 65 73 74 2e 64 62 0a 20 20 20 20 20 20 73 65 74  est.db.      set
9000: 20 72 63 20 5b 63 61 74 63 68 20 7b 20 64 62 20   rc [catch { db 
9010: 6f 6e 65 20 7b 50 52 41 47 4d 41 20 69 6e 74 65  one {PRAGMA inte
9020: 67 72 69 74 79 5f 63 68 65 63 6b 7d 20 7d 20 6d  grity_check} } m
9030: 73 67 5d 0a 20 20 20 20 20 20 65 78 70 72 20 7b  sg].      expr {
9040: 20 24 72 63 21 3d 30 20 7c 7c 20 24 6d 73 67 21   $rc!=0 || $msg!
9050: 3d 22 6f 6b 22 20 7d 0a 20 20 20 20 7d 20 24 77  ="ok" }.    } $w
9060: 6f 72 6b 73 0a 20 20 0a 20 20 20 20 64 62 20 63  orks.  .    db c
9070: 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d  lose.  }.}..#---
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 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
90d0: 6c 6f 77 69 6e 67 20 74 65 73 74 20 2d 20 77 61  lowing test - wa
90e0: 6c 2d 31 39 2e 2a 20 2d 20 66 69 78 65 73 20 61  l-19.* - fixes a
90f0: 20 62 75 67 20 74 68 61 74 20 77 61 73 20 70 72   bug that was pr
9100: 65 73 65 6e 74 20 64 75 72 69 6e 67 0a 23 20 64  esent during.# d
9110: 65 76 65 6c 6f 70 6d 65 6e 74 2e 0a 23 0a 23 20  evelopment..#.# 
9120: 57 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  When a database 
9130: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 57 41  connection in WA
9140: 4c 20 6d 6f 64 65 20 69 73 20 63 6c 6f 73 65 64  L mode is closed
9150: 2c 20 69 74 20 61 74 74 65 6d 70 74 73 20 61 6e  , it attempts an
9160: 0a 23 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  .# EXCLUSIVE loc
9170: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
9180: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 6c  e file. If the l
9190: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 2c  ock is obtained,
91a0: 20 74 68 65 0a 23 20 63 6f 6e 6e 65 63 74 69 6f   the.# connectio
91b0: 6e 20 6b 6e 6f 77 73 20 74 68 61 74 20 69 74 20  n knows that it 
91c0: 69 73 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e  is the last conn
91d0: 65 63 74 69 6f 6e 20 74 6f 20 64 69 73 63 6f 6e  ection to discon
91e0: 6e 65 63 74 20 66 72 6f 6d 0a 23 20 74 68 65 20  nect from.# the 
91f0: 64 61 74 61 62 61 73 65 2c 20 73 6f 20 69 74 20  database, so it 
9200: 72 75 6e 73 20 61 20 63 68 65 63 6b 70 6f 69 6e  runs a checkpoin
9210: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  t operation. The
9220: 20 62 75 67 20 77 61 73 20 74 68 61 74 0a 23 20   bug was that.# 
9230: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  the connection w
9240: 61 73 20 6e 6f 74 20 75 70 64 61 74 69 6e 67 20  as not updating 
9250: 69 74 73 20 70 72 69 76 61 74 65 20 63 6f 70 79  its private copy
9260: 20 6f 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   of the wal-inde
9270: 78 20 0a 23 20 68 65 61 64 65 72 20 62 65 66 6f  x .# header befo
9280: 72 65 20 64 6f 69 6e 67 20 73 6f 2c 20 6d 65 61  re doing so, mea
9290: 6e 69 6e 67 20 74 68 61 74 20 69 74 20 63 6f 75  ning that it cou
92a0: 6c 64 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e  ld checkpoint an
92b0: 20 6f 6c 64 0a 23 20 73 6e 61 70 73 68 6f 74 2e   old.# snapshot.
92c0: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .#.do_test wal-1
92d0: 39 2e 31 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c  9.1 {.  file del
92e0: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
92f0: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  db test.db-wal t
9300: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  est.db-journal. 
9310: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
9320: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
9330: 32 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63  2 test.db.  exec
9340: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
9350: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
9360: 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  WAL;.    CREATE 
9370: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
9380: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9390: 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t1 VALUES(1, 2);
93a0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
93b0: 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t1 VALUES(3, 4)
93c0: 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ;.  }.  execsql 
93d0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
93e0: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20  t1 } db2.} {1 2 
93f0: 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  3 4}.do_test wal
9400: 2d 31 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  -19.2 {.  execsq
9410: 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  l {.    INSERT I
9420: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c  NTO t1 VALUES(5,
9430: 20 36 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20   6);.    SELECT 
9440: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
9450: 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64   {1 2 3 4 5 6}.d
9460: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e 33 20  o_test wal-19.3 
9470: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64  {.  db close.  d
9480: 62 32 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20  b2 close.  file 
9490: 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77  exists test.db-w
94a0: 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74  al.} {0}.do_test
94b0: 20 77 61 6c 2d 31 39 2e 34 20 7b 0a 20 20 23 20   wal-19.4 {.  # 
94c0: 57 68 65 6e 20 74 68 65 20 62 75 67 20 77 61 73  When the bug was
94d0: 20 70 72 65 73 65 6e 74 2c 20 74 68 65 20 66 6f   present, the fo
94e0: 6c 6c 6f 77 69 6e 67 20 77 61 73 20 72 65 74 75  llowing was retu
94f0: 72 6e 69 6e 67 20 7b 31 20 32 20 33 20 34 7d 20  rning {1 2 3 4} 
9500: 6f 6e 6c 79 2c 0a 20 20 23 20 61 73 20 5b 64 62  only,.  # as [db
9510: 32 5d 20 68 61 64 20 61 6e 20 6f 75 74 2d 6f 66  2] had an out-of
9520: 2d 64 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68  -date copy of th
9530: 65 20 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64  e wal-index head
9540: 65 72 20 77 68 65 6e 20 69 74 20 77 61 73 0a 20  er when it was. 
9550: 20 23 20 63 6c 6f 73 65 64 2e 0a 20 20 23 0a 20   # closed..  #. 
9560: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
9570: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
9580: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
9590: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20   }.} {1 2 3 4 5 
95a0: 36 7d 0a 0a 23 2d 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 0a 23  --------------.#
95f0: 20 54 68 69 73 20 74 65 73 74 20 2d 20 77 61 6c   This test - wal
9600: 2d 32 30 2e 2a 20 2d 20 75 73 65 73 20 74 77 6f  -20.* - uses two
9610: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 4f 6e   connections. On
9620: 65 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  e in this proces
9630: 73 20 61 6e 64 0a 23 20 74 68 65 20 6f 74 68 65  s and.# the othe
9640: 72 20 69 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c  r in an external
9650: 20 70 72 6f 63 65 73 73 2e 20 54 68 65 20 70 72   process. The pr
9660: 6f 63 65 64 75 72 65 20 69 73 3a 0a 23 0a 23 20  ocedure is:.#.# 
9670: 20 20 31 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65    1. Using conne
9680: 63 74 69 6f 6e 20 31 2c 20 63 72 65 61 74 65 20  ction 1, create 
9690: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
96a0: 65 6d 61 2e 0a 23 0a 23 20 20 20 32 2e 20 55 73  ema..#.#   2. Us
96b0: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32  ing connection 2
96c0: 20 28 69 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c   (in an external
96d0: 20 70 72 6f 63 65 73 73 29 2c 20 61 64 64 20 73   process), add s
96e0: 6f 20 6d 75 63 68 0a 23 20 20 20 20 20 20 64 61  o much.#      da
96f0: 74 61 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ta to the databa
9700: 73 65 20 77 69 74 68 6f 75 74 20 63 68 65 63 6b  se without check
9710: 70 6f 69 6e 74 69 6e 67 20 74 68 61 74 20 61 20  pointing that a 
9720: 77 61 6c 2d 69 6e 64 65 78 20 0a 23 20 20 20 20  wal-index .#    
9730: 20 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34    larger than 64
9740: 4b 42 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  KB is required..
9750: 23 0a 23 20 20 20 33 2e 20 55 73 69 6e 67 20 63  #.#   3. Using c
9760: 6f 6e 6e 65 63 74 69 6f 6e 20 31 2c 20 63 68 65  onnection 1, che
9770: 63 6b 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61  ckpoint the data
9780: 62 61 73 65 2e 20 4d 61 6b 65 20 73 75 72 65 20  base. Make sure 
9790: 61 6c 6c 0a 23 20 20 20 20 20 20 74 68 65 20 64  all.#      the d
97a0: 61 74 61 20 69 73 20 70 72 65 73 65 6e 74 20 61  ata is present a
97b0: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
97c0: 69 73 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e 0a  is not corrupt..
97d0: 23 0a 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74  #.# At one point
97e0: 2c 20 53 51 4c 69 74 65 20 77 61 73 20 66 61 69  , SQLite was fai
97f0: 6c 69 6e 67 20 74 6f 20 67 72 6f 77 20 74 68 65  ling to grow the
9800: 20 6d 61 70 70 69 6e 67 20 6f 66 20 74 68 65 20   mapping of the 
9810: 77 61 6c 2d 69 6e 64 65 78 0a 23 20 66 69 6c 65  wal-index.# file
9820: 20 69 6e 20 73 74 65 70 20 33 20 61 6e 64 20 74   in step 3 and t
9830: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 61  he checkpoint wa
9840: 73 20 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65  s corrupting the
9850: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
9860: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30  #.do_test wal-20
9870: 2e 31 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62  .1 {.  catch {db
9880: 20 63 6c 6f 73 65 7d 0a 20 20 66 69 6c 65 20 64   close}.  file d
9890: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
98a0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
98b0: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
98c0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
98d0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
98e0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
98f0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
9900: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
9910: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53  E t1(x);.    INS
9920: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
9930: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  ES(randomblob(90
9940: 30 29 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  0));.    SELECT 
9950: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
9960: 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20 31 7d 0a  ;.  }.} {wal 1}.
9970: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 32  do_test wal-20.2
9980: 20 7b 0a 20 20 73 65 74 20 3a 3a 62 75 64 64 79   {.  set ::buddy
9990: 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74 66 69 78   [launch_testfix
99a0: 74 75 72 65 5d 0a 20 20 74 65 73 74 66 69 78 74  ture].  testfixt
99b0: 75 72 65 20 24 3a 3a 62 75 64 64 79 20 7b 0a 20  ure $::buddy {. 
99c0: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
99d0: 73 74 2e 64 62 0a 20 20 20 20 64 62 20 74 72 61  st.db.    db tra
99e0: 6e 73 61 63 74 69 6f 6e 20 7b 20 64 62 20 65 76  nsaction { db ev
99f0: 61 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  al {.      PRAGM
9a00: 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  A wal_autocheckp
9a10: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  oint = 0;.      
9a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
9a30: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
9a40: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
9a50: 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20       /* 2 */.   
9a60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9a70: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
9a80: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
9a90: 3b 20 20 20 20 20 20 20 2f 2a 20 34 20 2a 2f 0a  ;       /* 4 */.
9aa0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9ab0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9ac0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9ad0: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 38 20   t1;       /* 8 
9ae0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
9af0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9b00: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9b10: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9b20: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
9b30: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9b40: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9b50: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9b60: 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20    /* 32 */.     
9b70: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9b80: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9b90: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9ba0: 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20        /* 64 */. 
9bb0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9bc0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9bd0: 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20  mblob(900) FROM 
9be0: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 32 38  t1;       /* 128
9bf0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9c00: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
9c10: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
9c20: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
9c30: 2a 20 32 35 36 20 2a 2f 0a 20 20 20 20 20 20 49  * 256 */.      I
9c40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
9c50: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
9c60: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
9c70: 20 20 20 20 2f 2a 20 35 31 32 20 2a 2f 0a 20 20      /* 512 */.  
9c80: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9c90: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9ca0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
9cb0: 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 30 32 34  1;       /* 1024
9cc0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9cd0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
9ce0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
9cf0: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
9d00: 2a 20 32 30 34 38 20 2a 2f 0a 20 20 20 20 20 20  * 2048 */.      
9d10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
9d20: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
9d30: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
9d40: 20 20 20 20 20 2f 2a 20 34 30 39 36 20 2a 2f 0a       /* 4096 */.
9d50: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9d60: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9d70: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9d80: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 38 31   t1;       /* 81
9d90: 39 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  92 */.      INSE
9da0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
9db0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
9dc0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
9dd0: 20 2f 2a 20 31 36 33 38 34 20 2a 2f 0a 20 20 20   /* 16384 */.   
9de0: 20 7d 20 7d 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64   } }.  }.} {0}.d
9df0: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 33 20  o_test wal-20.3 
9e00: 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a 62 75 64  {.  close $::bud
9e10: 64 79 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  dy.  execsql {. 
9e20: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
9e30: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 53 45  eckpoint;.    SE
9e40: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9e50: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 36  OM t1;.  }.} {16
9e60: 33 38 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  384}.do_test wal
9e70: 2d 32 30 2e 34 20 7b 0a 20 20 64 62 20 63 6c 6f  -20.4 {.  db clo
9e80: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  se.  sqlite3 db 
9e90: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
9ea0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
9eb0: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  (*) FROM t1 }.} 
9ec0: 7b 31 36 33 38 34 7d 0a 69 6e 74 65 67 72 69 74  {16384}.integrit
9ed0: 79 5f 63 68 65 63 6b 20 77 61 6c 2d 32 30 2e 35  y_check wal-20.5
9ee0: 0a 0a 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c  ..catch { db2 cl
9ef0: 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62  ose }.catch { db
9f00: 20 63 6c 6f 73 65 20 7d 0a 0a 64 6f 5f 74 65 73   close }..do_tes
9f10: 74 20 77 61 6c 2d 32 31 2e 31 20 7b 0a 20 20 66  t wal-21.1 {.  f
9f20: 61 75 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61  aultsim_delete_a
9f30: 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63  nd_reopen.  exec
9f40: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
9f50: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
9f60: 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45   WAL;.    CREATE
9f70: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
9f80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
9f90: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
9fa0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
9fb0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
9fc0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
9fd0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
9fe0: 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  6);.    INSERT I
9ff0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c  NTO t1 VALUES(7,
a000: 20 38 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   8);.    INSERT 
a010: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39  INTO t1 VALUES(9
a020: 2c 20 31 30 29 3b 0a 20 20 20 20 49 4e 53 45 52  , 10);.    INSER
a030: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a040: 28 31 31 2c 20 31 32 29 3b 0a 20 20 7d 0a 7d 20  (11, 12);.  }.} 
a050: 7b 77 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {wal}.do_test wa
a060: 6c 2d 32 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  l-21.2 {.  execs
a070: 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41  ql { .    PRAGMA
a080: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
a090: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  ;.    PRAGMA wal
a0a0: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20  _checkpoint;.   
a0b0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 53 41   BEGIN;.      SA
a0c0: 56 45 50 4f 49 4e 54 20 73 3b 0a 20 20 20 20 20  VEPOINT s;.     
a0d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a0e0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
a0f0: 6c 6f 62 28 39 30 30 29 2c 20 72 61 6e 64 6f 6d  lob(900), random
a100: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
a110: 31 3b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43  1;.      ROLLBAC
a120: 4b 20 54 4f 20 73 3b 0a 20 20 20 20 43 4f 4d 4d  K TO s;.    COMM
a130: 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  IT;.    SELECT *
a140: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
a150: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
a160: 20 39 20 31 30 20 31 31 20 31 32 7d 0a 64 6f 5f   9 10 11 12}.do_
a170: 74 65 73 74 20 77 61 6c 2d 32 31 2e 33 20 7b 0a  test wal-21.3 {.
a180: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
a190: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
a1a0: 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 66 69 6e  ck }.} {ok}..fin
a1b0: 69 73 68 5f 74 65 73 74 0a                       ish_test.