/ Hex Artifact Content
Login

Artifact bac92a13276ce9b65d3d5c9ff3411d24c795826c:


0000: 23 20 32 30 31 30 20 41 70 72 69 6c 20 31 33 0a  # 2010 April 13.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f  .  The.# focus o
01b0: 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74  f this file is t
01c0: 65 73 74 69 6e 67 20 74 68 65 20 6f 70 65 72 61  esting the opera
01d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
01e0: 61 72 79 20 69 6e 0a 23 20 22 50 52 41 47 4d 41  ary in.# "PRAGMA
01f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41   journal_mode=WA
0200: 4c 22 20 6d 6f 64 65 2e 0a 23 0a 0a 73 65 74 20  L" mode..#..set 
0210: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0220: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0230: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0240: 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20  ster.tcl.source 
0250: 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f  $testdir/lock_co
0260: 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63 65 20  mmon.tcl.source 
0270: 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f  $testdir/malloc_
0280: 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63  common.tcl.sourc
0290: 65 20 24 74 65 73 74 64 69 72 2f 77 61 6c 5f 63  e $testdir/wal_c
02a0: 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 74  ommon.tcl..set t
02b0: 65 73 74 70 72 65 66 69 78 20 77 61 6c 0a 0a 69  estprefix wal..i
02c0: 66 63 61 70 61 62 6c 65 20 21 77 61 6c 20 7b 66  fcapable !wal {f
02d0: 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74  inish_test ; ret
02e0: 75 72 6e 20 7d 0a 0a 70 72 6f 63 20 72 65 6f 70  urn }..proc reop
02f0: 65 6e 5f 64 62 20 7b 7d 20 7b 0a 20 20 63 61 74  en_db {} {.  cat
0300: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
0310: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
0320: 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73  orce test.db tes
0330: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  t.db-wal test.db
0340: 2d 77 61 6c 2d 73 75 6d 6d 61 72 79 0a 20 20 73  -wal-summary.  s
0350: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65  qlite3_wal db te
0360: 73 74 2e 64 62 0a 7d 0a 0a 73 65 74 20 3a 3a 62  st.db.}..set ::b
0370: 6c 6f 62 63 6e 74 20 30 0a 70 72 6f 63 20 62 6c  lobcnt 0.proc bl
0380: 6f 62 20 7b 6e 42 79 74 65 7d 20 7b 0a 20 20 69  ob {nByte} {.  i
0390: 6e 63 72 20 3a 3a 62 6c 6f 62 63 6e 74 0a 20 20  ncr ::blobcnt.  
03a0: 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20 72  return [string r
03b0: 61 6e 67 65 20 5b 73 74 72 69 6e 67 20 72 65 70  ange [string rep
03c0: 65 61 74 20 22 24 7b 3a 3a 62 6c 6f 62 63 6e 74  eat "${::blobcnt
03d0: 7d 78 22 20 24 6e 42 79 74 65 5d 20 31 20 24 6e  }x" $nByte] 1 $n
03e0: 42 79 74 65 5d 0a 7d 0a 0a 70 72 6f 63 20 73 71  Byte].}..proc sq
03f0: 6c 69 74 65 33 5f 77 61 6c 20 7b 61 72 67 73 7d  lite3_wal {args}
0400: 20 7b 0a 20 20 65 76 61 6c 20 73 71 6c 69 74 65   {.  eval sqlite
0410: 33 20 24 61 72 67 73 0a 20 20 5b 6c 69 6e 64 65  3 $args.  [linde
0420: 78 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20  x $args 0] eval 
0430: 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61  { PRAGMA auto_va
0440: 63 75 75 6d 20 3d 20 30 20 7d 0a 20 20 5b 6c 69  cuum = 0 }.  [li
0450: 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20 65 76  ndex $args 0] ev
0460: 61 6c 20 7b 20 50 52 41 47 4d 41 20 70 61 67 65  al { PRAGMA page
0470: 5f 73 69 7a 65 20 3d 20 31 30 32 34 20 7d 0a 20  _size = 1024 }. 
0480: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
0490: 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  ] eval { PRAGMA 
04a0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77  journal_mode = w
04b0: 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24  al }.  [lindex $
04c0: 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b 20 50  args 0] eval { P
04d0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
04e0: 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a 20 20 5b  s = normal }.  [
04f0: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20  lindex $args 0] 
0500: 66 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 20 62 6c  function blob bl
0510: 6f 62 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67 5f 64  ob.}..proc log_d
0520: 65 6c 65 74 65 64 20 7b 6c 6f 67 66 69 6c 65 7d  eleted {logfile}
0530: 20 7b 0a 20 20 72 65 74 75 72 6e 20 5b 65 78 70   {.  return [exp
0540: 72 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24  r [file exists $
0550: 6c 6f 67 66 69 6c 65 5d 3d 3d 30 5d 0a 7d 0a 0a  logfile]==0].}..
0560: 23 0a 23 20 54 68 65 73 65 20 61 72 65 20 27 77  #.# These are 'w
0570: 61 72 6d 2d 62 6f 64 79 27 20 74 65 73 74 73 20  arm-body' tests 
0580: 75 73 65 64 20 77 68 69 6c 65 20 64 65 76 65 6c  used while devel
0590: 6f 70 69 6e 67 20 74 68 65 20 57 41 4c 20 63 6f  oping the WAL co
05a0: 64 65 2e 20 54 68 65 79 0a 23 20 73 65 72 76 65  de. They.# serve
05b0: 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 61   to prove that a
05c0: 20 66 65 77 20 72 65 61 6c 6c 79 20 73 69 6d 70   few really simp
05d0: 6c 65 20 63 61 73 65 73 20 77 6f 72 6b 3a 0a 23  le cases work:.#
05e0: 0a 23 20 77 61 6c 2d 31 2e 2a 3a 20 52 65 61 64  .# wal-1.*: Read
05f0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 64   and write the d
0600: 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c 2d 32  atabase..# wal-2
0610: 2e 2a 3a 20 54 65 73 74 20 4d 56 43 43 20 77 69  .*: Test MVCC wi
0620: 74 68 20 6f 6e 65 20 72 65 61 64 65 72 2c 20 6f  th one reader, o
0630: 6e 65 20 77 72 69 74 65 72 2e 0a 23 20 77 61 6c  ne writer..# wal
0640: 2d 33 2e 2a 3a 20 54 65 73 74 20 74 72 61 6e 73  -3.*: Test trans
0650: 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2e  action rollback.
0660: 0a 23 20 77 61 6c 2d 34 2e 2a 3a 20 54 65 73 74  .# wal-4.*: Test
0670: 20 73 61 76 65 70 6f 69 6e 74 2f 73 74 61 74 65   savepoint/state
0680: 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23  ment rollback..#
0690: 20 77 61 6c 2d 35 2e 2a 3a 20 54 65 73 74 20 74   wal-5.*: Test t
06a0: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
06b0: 2e 0a 23 20 77 61 6c 2d 36 2e 2a 3a 20 54 65 73  ..# wal-6.*: Tes
06c0: 74 20 63 72 65 61 74 69 6e 67 20 64 61 74 61 62  t creating datab
06d0: 61 73 65 73 20 77 69 74 68 20 64 69 66 66 65 72  ases with differ
06e0: 65 6e 74 20 70 61 67 65 20 73 69 7a 65 73 2e 0a  ent page sizes..
06f0: 23 0a 23 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  #.#.#.do_test wa
0700: 6c 2d 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  l-0.1 {.  execsq
0710: 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74 6f 5f  l { PRAGMA auto_
0720: 76 61 63 75 75 6d 20 3d 20 30 20 7d 0a 20 20 65  vacuum = 0 }.  e
0730: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
0740: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f  synchronous = no
0750: 72 6d 61 6c 20 7d 0a 20 20 65 78 65 63 73 71 6c  rmal }.  execsql
0760: 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61   { PRAGMA journa
0770: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 7d  l_mode = wal }.}
0780: 20 7b 77 61 6c 7d 0a 64 6f 5f 74 65 73 74 20 77   {wal}.do_test w
0790: 61 6c 2d 30 2e 32 20 7b 0a 20 20 66 69 6c 65 20  al-0.2 {.  file 
07a0: 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 7b  size test.db.} {
07b0: 31 30 32 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  1024}..do_test w
07c0: 61 6c 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63 73  al-1.0 {.  execs
07d0: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
07e0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
07f0: 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 7d  E t1(a, b); .  }
0800: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78  .  list [file ex
0810: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
0820: 72 6e 61 6c 5d 20 5c 0a 20 20 20 20 20 20 20 5b  rnal] \.       [
0830: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
0840: 2e 64 62 2d 77 61 6c 5d 20 20 20 20 20 5c 0a 20  .db-wal]     \. 
0850: 20 20 20 20 20 20 5b 66 69 6c 65 20 73 69 7a 65        [file size
0860: 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20 31   test.db].} {0 1
0870: 20 31 30 32 34 7d 0a 64 6f 5f 74 65 73 74 20 77   1024}.do_test w
0880: 61 6c 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  al-1.1 {.  execs
0890: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73 74  ql COMMIT.  list
08a0: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
08b0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5b  st.db-journal] [
08c0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
08d0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 30 20 31 7d  .db-wal].} {0 1}
08e0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 32  .do_test wal-1.2
08f0: 20 7b 0a 20 20 23 20 54 68 65 72 65 20 61 72 65   {.  # There are
0900: 20 6e 6f 77 20 74 77 6f 20 70 61 67 65 73 20 69   now two pages i
0910: 6e 20 74 68 65 20 6c 6f 67 2e 0a 20 20 66 69 6c  n the log..  fil
0920: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
0930: 61 6c 0a 7d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  al.} [wal_file_s
0940: 69 7a 65 20 32 20 31 30 32 34 5d 0a 0a 64 6f 5f  ize 2 1024]..do_
0950: 74 65 73 74 20 77 61 6c 2d 31 2e 33 20 7b 0a 20  test wal-1.3 {. 
0960: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
0970: 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
0980: 6d 61 73 74 65 72 20 7d 0a 7d 20 7b 74 61 62 6c  master }.} {tabl
0990: 65 20 74 31 20 74 31 20 32 20 7b 43 52 45 41 54  e t1 t1 2 {CREAT
09a0: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
09b0: 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }}..do_test wal-
09c0: 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.4 {.  execsql 
09d0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
09e0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d 0a   VALUES(1, 2) }.
09f0: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
0a00: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0a10: 53 28 33 2c 20 34 29 20 7d 0a 20 20 65 78 65 63  S(3, 4) }.  exec
0a20: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0a30: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36  O t1 VALUES(5, 6
0a40: 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  ) }.  execsql { 
0a50: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0a60: 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 0a 20 20  ALUES(7, 8) }.  
0a70: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0a80: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0a90: 39 2c 20 31 30 29 20 7d 0a 7d 20 7b 7d 0a 0a 64  9, 10) }.} {}..d
0aa0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 35 20 7b  o_test wal-1.5 {
0ab0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0ac0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0ad0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0ae0: 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73   8 9 10}..do_tes
0af0: 74 20 77 61 6c 2d 32 2e 31 20 7b 0a 20 20 73 71  t wal-2.1 {.  sq
0b00: 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 2e 2f  lite3_wal db2 ./
0b10: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
0b20: 6c 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43  l { BEGIN; SELEC
0b30: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62  T * FROM t1 } db
0b40: 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  2.} {1 2 3 4 5 6
0b50: 20 37 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74   7 8 9 10}..do_t
0b60: 65 73 74 20 77 61 6c 2d 32 2e 32 20 7b 0a 20 20  est wal-2.2 {.  
0b70: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
0b80: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0b90: 31 31 2c 20 31 32 29 20 7d 0a 20 20 65 78 65 63  11, 12) }.  exec
0ba0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0bb0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20  ROM t1 }.} {1 2 
0bc0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0bd0: 20 31 31 20 31 32 7d 0a 0a 64 6f 5f 74 65 73 74   11 12}..do_test
0be0: 20 77 61 6c 2d 32 2e 33 20 7b 0a 20 20 65 78 65   wal-2.3 {.  exe
0bf0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0c00: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
0c10: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0c20: 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20   9 10}..do_test 
0c30: 77 61 6c 2d 32 2e 34 20 7b 0a 20 20 65 78 65 63  wal-2.4 {.  exec
0c40: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
0c50: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c 20  O t1 VALUES(13, 
0c60: 31 34 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  14) }.  execsql 
0c70: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0c80: 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  t1 }.} {1 2 3 4 
0c90: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
0ca0: 31 32 20 31 33 20 31 34 7d 0a 0a 64 6f 5f 74 65  12 13 14}..do_te
0cb0: 73 74 20 77 61 6c 2d 32 2e 35 20 7b 0a 20 20 65  st wal-2.5 {.  e
0cc0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0cd0: 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  * FROM t1 } db2.
0ce0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0cf0: 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73   8 9 10}..do_tes
0d00: 74 20 77 61 6c 2d 32 2e 36 20 7b 0a 20 20 65 78  t wal-2.6 {.  ex
0d10: 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 3b 20  ecsql { COMMIT; 
0d20: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0d30: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
0d40: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
0d50: 31 20 31 32 20 31 33 20 31 34 7d 0a 0a 64 6f 5f  1 12 13 14}..do_
0d60: 74 65 73 74 20 77 61 6c 2d 33 2e 31 20 7b 0a 20  test wal-3.1 {. 
0d70: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
0d80: 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31  ; DELETE FROM t1
0d90: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
0da0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0db0: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77  }.} {}.do_test w
0dc0: 61 6c 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63 73  al-3.2 {.  execs
0dd0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0de0: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t1 } db2.} {1
0df0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0e00: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d   10 11 12 13 14}
0e10: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33 2e 33  .do_test wal-3.3
0e20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 52   {.  execsql { R
0e30: 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20 65 78 65 63  OLLBACK }.  exec
0e40: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0e50: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20  ROM t1 }.} {1 2 
0e60: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0e70: 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a 64 62   11 12 13 14}.db
0e80: 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d  2 close..#------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
0ee0: 69 6e 67 20 74 65 73 74 73 2c 20 77 61 6c 2d 34  ing tests, wal-4
0ef0: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 73 61  .*, test that sa
0f00: 76 65 70 6f 69 6e 74 73 20 77 6f 72 6b 20 77 69  vepoints work wi
0f10: 74 68 20 57 41 4c 20 0a 23 20 64 61 74 61 62 61  th WAL .# databa
0f20: 73 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ses..#.do_test w
0f30: 61 6c 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73  al-4.1 {.  execs
0f40: 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20  ql {.    DELETE 
0f50: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47  FROM t1;.    BEG
0f60: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
0f70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0f80: 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20  'a', 'b');.     
0f90: 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20   SAVEPOINT sp;. 
0fa0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
0fb0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63 27  TO t1 VALUES('c'
0fc0: 2c 20 27 64 27 29 3b 0a 20 20 20 20 20 20 20 20  , 'd');.        
0fd0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0fe0: 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 20 63 20 64  ;.  }.} {a b c d
0ff0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1000: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
1010: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
1020: 4f 20 73 70 3b 0a 20 20 20 20 20 20 53 45 4c 45  O sp;.      SELE
1030: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
1040: 7d 0a 7d 20 7b 61 20 62 7d 0a 64 6f 5f 74 65 73  }.} {a b}.do_tes
1050: 74 20 77 61 6c 2d 34 2e 33 20 7b 0a 20 20 65 78  t wal-4.3 {.  ex
1060: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d  ecsql {.    COMM
1070: 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a  IT;.    SELECT *
1080: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
1090: 7b 61 20 62 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  {a b}..do_test w
10a0: 61 6c 2d 34 2e 34 2e 31 20 7b 0a 20 20 64 62 20  al-4.4.1 {.  db 
10b0: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 20  close.  sqlite3 
10c0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20  db test.db.  db 
10d0: 66 75 6e 63 20 62 6c 6f 62 20 62 6c 6f 62 0a 20  func blob blob. 
10e0: 20 6c 69 73 74 20 5b 65 78 65 63 73 71 6c 20 7b   list [execsql {
10f0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1100: 31 20 7d 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  1 }] [file size 
1110: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b  test.db-wal].} {
1120: 7b 61 20 62 7d 20 30 7d 0a 64 6f 5f 74 65 73 74  {a b} 0}.do_test
1130: 20 77 61 6c 2d 34 2e 34 2e 32 20 7b 0a 20 20 65   wal-4.4.2 {.  e
1140: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
1150: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 20  cache_size = 10 
1160: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  }.  execsql {.  
1170: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1180: 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  2(a, b);.    INS
1190: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
11a0: 45 53 28 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  ES(blob(400), bl
11b0: 6f 62 28 34 30 30 29 29 3b 0a 20 20 20 20 53 41  ob(400));.    SA
11c0: 56 45 50 4f 49 4e 54 20 74 72 3b 0a 20 20 20 20  VEPOINT tr;.    
11d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
11e0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
11f0: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1200: 4d 20 74 32 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20  M t2; /*  2 */. 
1210: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1220: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
1230: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
1240: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 34 20 2a  FROM t2; /*  4 *
1250: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
1260: 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c  NTO t2 SELECT bl
1270: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1280: 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20  0) FROM t2; /*  
1290: 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  8 */.      INSER
12a0: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
12b0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
12c0: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f  (400) FROM t2; /
12d0: 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e  * 16 */.      IN
12e0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c  SERT INTO t2 SEL
12f0: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1300: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32  lob(400) FROM t2
1310: 3b 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20  ; /* 32 */.     
1320: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1330: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1340: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1350: 20 74 31 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20 20   t1; /*  2 */.  
1360: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1370: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
1380: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1390: 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 34 20 2a 2f  ROM t1; /*  4 */
13a0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
13b0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
13c0: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
13d0: 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 38  ) FROM t1; /*  8
13e0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
13f0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
1400: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1410: 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a  400) FROM t1; /*
1420: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
1430: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1440: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
1450: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(400) FROM t1;
1460: 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20   /* 32 */.      
1470: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1480: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
1490: 33 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  32}.do_test wal-
14a0: 34 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  4.4.3 {.  execsq
14b0: 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  l { ROLLBACK TO 
14c0: 74 72 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  tr }.} {}.do_tes
14d0: 74 20 77 61 6c 2d 34 2e 34 2e 34 20 7b 0a 20 20  t wal-4.4.4 {.  
14e0: 73 65 74 20 6c 6f 67 73 69 7a 65 20 5b 66 69 6c  set logsize [fil
14f0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
1500: 61 6c 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  al].  execsql {.
1510: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1520: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27 2c  O t1 VALUES('x',
1530: 20 27 79 27 29 3b 0a 20 20 20 20 52 45 4c 45 41   'y');.    RELEA
1540: 53 45 20 74 72 3b 0a 20 20 7d 0a 20 20 65 78 70  SE tr;.  }.  exp
1550: 72 20 7b 20 24 6c 6f 67 73 69 7a 65 20 3d 3d 20  r { $logsize == 
1560: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
1570: 64 62 2d 77 61 6c 5d 20 7d 0a 7d 20 7b 31 7d 0a  db-wal] }.} {1}.
1580: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
1590: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
15a0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
15b0: 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 31 7d 0a  FROM t2 }.} {1}.
15c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
15d0: 36 20 7b 0a 20 20 66 69 6c 65 20 63 6f 70 79 20  6 {.  file copy 
15e0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74  -force test.db t
15f0: 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65 20 63  est2.db.  file c
1600: 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  opy -force test.
1610: 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d  db-wal test2.db-
1620: 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62  wal.  sqlite3 db
1630: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65  2 test2.db.  exe
1640: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
1650: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b  unt(*) FROM t2 ;
1660: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1670: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d   FROM t1 } db2.}
1680: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77   {1 2}.do_test w
1690: 61 6c 2d 34 2e 34 2e 37 20 7b 0a 20 20 65 78 65  al-4.4.7 {.  exe
16a0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  csql { PRAGMA in
16b0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20  tegrity_check } 
16c0: 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20 63  db2.} {ok}.db2 c
16d0: 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77 61  lose..do_test wa
16e0: 6c 2d 34 2e 35 2e 31 20 7b 0a 20 20 72 65 6f 70  l-4.5.1 {.  reop
16f0: 65 6e 5f 64 62 0a 20 20 64 62 20 66 75 6e 63 20  en_db.  db func 
1700: 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 65 78 65 63  blob blob.  exec
1710: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
1720: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
1730: 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20  WAL;.    CREATE 
1740: 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a  TABLE t1(a, b);.
1750: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1760: 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
1770: 62 27 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  b');.  }.  sqlit
1780: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
1790: 64 62 20 66 75 6e 63 20 62 6c 6f 62 20 62 6c 6f  db func blob blo
17a0: 62 0a 20 20 6c 69 73 74 20 5b 65 78 65 63 73 71  b.  list [execsq
17b0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
17c0: 4d 20 74 31 20 7d 5d 20 5b 66 69 6c 65 20 73 69  M t1 }] [file si
17d0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
17e0: 7d 20 7b 7b 61 20 62 7d 20 30 7d 0a 64 6f 5f 74  } {{a b} 0}.do_t
17f0: 65 73 74 20 77 61 6c 2d 34 2e 35 2e 32 20 7b 0a  est wal-4.5.2 {.
1800: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
1810: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
1820: 31 30 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  10 }.  execsql {
1830: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
1840: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
1850: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
1860: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1870: 28 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62  (blob(400), blob
1880: 28 34 30 30 29 29 3b 0a 20 20 20 20 53 41 56 45  (400));.    SAVE
1890: 50 4f 49 4e 54 20 74 72 3b 0a 20 20 20 20 20 20  POINT tr;.      
18a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
18b0: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
18c0: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
18d0: 74 32 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20  t2; /*  2 */.   
18e0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
18f0: 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  2 SELECT blob(40
1900: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1910: 4f 4d 20 74 32 3b 20 2f 2a 20 20 34 20 2a 2f 0a  OM t2; /*  4 */.
1920: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1930: 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t2 SELECT blob
1940: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1950: 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 38 20   FROM t2; /*  8 
1960: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
1970: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
1980: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
1990: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
19a0: 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  16 */.      INSE
19b0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
19c0: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
19d0: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
19e0: 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 49  /* 32 */.      I
19f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1a00: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1a10: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1a20: 31 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20 20  1; /*  2 */.    
1a30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1a40: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1a50: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1a60: 4d 20 74 31 3b 20 2f 2a 20 20 34 20 2a 2f 0a 20  M t1; /*  4 */. 
1a70: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1a80: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
1a90: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
1aa0: 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 38 20 2a  FROM t1; /*  8 *
1ab0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
1ac0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
1ad0: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1ae0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 31  0) FROM t1; /* 1
1af0: 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  6 */.      INSER
1b00: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1b10: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1b20: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1b30: 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 53 45  * 32 */.      SE
1b40: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1b50: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 33 32  OM t2;.  }.} {32
1b60: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e  }.do_test wal-4.
1b70: 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.3 {.  execsql 
1b80: 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74 72  { ROLLBACK TO tr
1b90: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
1ba0: 77 61 6c 2d 34 2e 35 2e 34 20 7b 0a 20 20 73 65  wal-4.5.4 {.  se
1bb0: 74 20 6c 6f 67 73 69 7a 65 20 5b 66 69 6c 65 20  t logsize [file 
1bc0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
1bd0: 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  ].  execsql {.  
1be0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1bf0: 74 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20 27  t1 VALUES('x', '
1c00: 79 27 29 3b 0a 20 20 20 20 52 45 4c 45 41 53 45  y');.    RELEASE
1c10: 20 74 72 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b   tr;.    COMMIT;
1c20: 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 20 24 6c  .  }.  expr { $l
1c30: 6f 67 73 69 7a 65 20 3d 3d 20 5b 66 69 6c 65 20  ogsize == [file 
1c40: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
1c50: 5d 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73  ] }.} {1}.do_tes
1c60: 74 20 77 61 6c 2d 34 2e 35 2e 35 20 7b 0a 20 20  t wal-4.5.5 {.  
1c70: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
1c80: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1c90: 32 20 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  2 ; SELECT count
1ca0: 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  (*) FROM t1 }.} 
1cb0: 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61  {1 2}.do_test wa
1cc0: 6c 2d 34 2e 35 2e 36 20 7b 0a 20 20 66 69 6c 65  l-4.5.6 {.  file
1cd0: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
1ce0: 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20  t.db test2.db.  
1cf0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
1d00: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
1d10: 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69  t2.db-wal.  sqli
1d20: 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64 62  te3 db2 test2.db
1d30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
1d40: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1d50: 4d 20 74 32 20 3b 20 53 45 4c 45 43 54 20 63 6f  M t2 ; SELECT co
1d60: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d  unt(*) FROM t1 }
1d70: 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f   db2.} {1 2}.do_
1d80: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 37 20 7b  test wal-4.5.7 {
1d90: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
1da0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
1db0: 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d  eck } db2.} {ok}
1dc0: 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74  .db2 close..do_t
1dd0: 65 73 74 20 77 61 6c 2d 34 2e 36 2e 31 20 7b 0a  est wal-4.6.1 {.
1de0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1df0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b 0a  DELETE FROM t2;.
1e00: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
1e10: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 42  heckpoint;.    B
1e20: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
1e30: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1e40: 53 28 27 77 27 2c 20 27 78 27 29 3b 0a 20 20 20  S('w', 'x');.   
1e50: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 61 76     SAVEPOINT sav
1e60: 65 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  e;.        INSER
1e70: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1e80: 28 27 79 27 2c 20 27 7a 27 29 3b 0a 20 20 20 20  ('y', 'z');.    
1e90: 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 61    ROLLBACK TO sa
1ea0: 76 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  ve;.    COMMIT;.
1eb0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
1ec0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
1ed0: 20 7d 0a 7d 20 7b 77 20 78 7d 0a 0a 0a 72 65 6f   }.} {w x}...reo
1ee0: 70 65 6e 5f 64 62 0a 64 6f 5f 74 65 73 74 20 77  pen_db.do_test w
1ef0: 61 6c 2d 35 2e 31 20 7b 0a 20 20 65 78 65 63 73  al-5.1 {.  execs
1f00: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1f10: 54 45 4d 50 20 54 41 42 4c 45 20 74 32 28 61 2c  TEMP TABLE t2(a,
1f20: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
1f30: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31  INTO t2 VALUES(1
1f40: 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64  , 2);.  }.} {}.d
1f50: 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 32 20 7b  o_test wal-5.2 {
1f60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1f70: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
1f80: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1f90: 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 20  UES(3, 4);.     
1fa0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1fb0: 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20  2;.  }.} {1 2 3 
1fc0: 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35  4}.do_test wal-5
1fd0: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
1fe0: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
1ff0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
2000: 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d   t2;.  }.} {1 2}
2010: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 34  .do_test wal-5.4
2020: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
2030: 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20 54     CREATE TEMP T
2040: 41 42 4c 45 20 74 33 28 78 20 55 4e 49 51 55 45  ABLE t3(x UNIQUE
2050: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
2060: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2070: 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t2 VALUES(3, 4);
2080: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
2090: 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27 61 62  TO t3 VALUES('ab
20a0: 63 27 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68  c');.  }.  catch
20b0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
20c0: 4f 20 74 33 20 56 41 4c 55 45 53 28 27 61 62 63  O t3 VALUES('abc
20d0: 27 29 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d  ') }.} {1 {colum
20e0: 6e 20 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75  n x is not uniqu
20f0: 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  e}}.do_test wal-
2100: 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.5 {.  execsql 
2110: 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20  {.    COMMIT;.  
2120: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
2130: 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33  t2;.  }.} {1 2 3
2140: 20 34 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 66 6f   4}.db close..fo
2150: 72 65 61 63 68 20 73 65 63 74 6f 72 20 7b 35 31  reach sector {51
2160: 32 20 34 30 39 36 7d 20 7b 0a 20 20 73 71 6c 69  2 4096} {.  sqli
2170: 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76  te3_simulate_dev
2180: 69 63 65 20 2d 73 65 63 74 6f 72 73 69 7a 65 20  ice -sectorsize 
2190: 24 73 65 63 74 6f 72 0a 20 20 66 6f 72 65 61 63  $sector.  foreac
21a0: 68 20 70 67 73 7a 20 7b 35 31 32 20 31 30 32 34  h pgsz {512 1024
21b0: 20 32 30 34 38 20 34 30 39 36 7d 20 7b 0a 20 20   2048 4096} {.  
21c0: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
21d0: 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73  orce test.db tes
21e0: 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20 64 6f 5f  t.db-wal.    do_
21f0: 74 65 73 74 20 77 61 6c 2d 36 2e 24 73 65 63 74  test wal-6.$sect
2200: 6f 72 2e 24 70 67 73 7a 2e 31 20 7b 0a 20 20 20  or.$pgsz.1 {.   
2210: 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65     sqlite3 db te
2220: 73 74 2e 64 62 20 2d 76 66 73 20 64 65 76 73 79  st.db -vfs devsy
2230: 6d 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c 20  m.      execsql 
2240: 22 0a 20 20 20 20 20 20 20 20 50 52 41 47 4d 41  ".        PRAGMA
2250: 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 24 70 67   page_size = $pg
2260: 73 7a 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47  sz;.        PRAG
2270: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  MA auto_vacuum =
2280: 20 30 3b 0a 20 20 20 20 20 20 20 20 50 52 41 47   0;.        PRAG
2290: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
22a0: 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20 22 0a 20  = wal;.      ". 
22b0: 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20       execsql ". 
22c0: 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41         CREATE TA
22d0: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
22e0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
22f0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
2300: 29 3b 0a 20 20 20 20 20 20 22 0a 20 20 20 20 20  );.      ".     
2310: 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 20 20   db close.      
2320: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
2330: 62 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 24 70  b.    } [expr $p
2340: 67 73 7a 2a 32 5d 0a 20 20 0a 20 20 20 20 64 6f  gsz*2].  .    do
2350: 5f 74 65 73 74 20 77 61 6c 2d 36 2e 24 73 65 63  _test wal-6.$sec
2360: 74 6f 72 2e 24 70 67 73 7a 2e 32 20 7b 0a 20 20  tor.$pgsz.2 {.  
2370: 20 20 20 20 6c 6f 67 5f 64 65 6c 65 74 65 64 20      log_deleted 
2380: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20  test.db-wal.    
2390: 7d 20 7b 31 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f  } {1}.  }.}..do_
23a0: 74 65 73 74 20 77 61 6c 2d 37 2e 31 20 7b 0a 20  test wal-7.1 {. 
23b0: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
23c0: 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  rce test.db test
23d0: 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65  .db-wal.  sqlite
23e0: 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62  3_wal db test.db
23f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2400: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
2410: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
2420: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2430: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
2440: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
2450: 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  , 2);.  }.  list
2460: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
2470: 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  .db] [file size 
2480: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
2490: 6c 69 73 74 20 31 30 32 34 20 5b 77 61 6c 5f 66  list 1024 [wal_f
24a0: 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d  ile_size 3 1024]
24b0: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 37 2e  ].do_test wal-7.
24c0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
24d0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
24e0: 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74 20 5b  point }.  list [
24f0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
2500: 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  b] [file size te
2510: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
2520: 73 74 20 32 30 34 38 20 5b 77 61 6c 5f 66 69 6c  st 2048 [wal_fil
2530: 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a  e_size 3 1024]].
2540: 0a 23 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20  .# Execute some 
2550: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20  transactions in 
2560: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
2570: 20 74 6f 20 74 65 73 74 20 64 61 74 61 62 61 73   to test databas
2580: 65 20 66 69 6c 65 0a 23 20 74 72 75 6e 63 61 74  e file.# truncat
2590: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ion..#.do_test w
25a0: 61 6c 2d 38 2e 31 20 7b 0a 20 20 72 65 6f 70 65  al-8.1 {.  reope
25b0: 6e 5f 64 62 0a 20 20 63 61 74 63 68 20 7b 20 64  n_db.  catch { d
25c0: 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 69 6c 65  b close }.  file
25d0: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74   delete -force t
25e0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
25f0: 61 6c 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62  al..  sqlite3 db
2600: 20 74 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75   test.db.  db fu
2610: 6e 63 74 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f 62  nction blob blob
2620: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2630: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
2640: 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 50 52 41  uum = 1;.    PRA
2650: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
2660: 20 3d 20 77 61 6c 3b 0a 20 20 20 20 50 52 41 47   = wal;.    PRAG
2670: 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 3b 0a  MA auto_vacuum;.
2680: 20 20 7d 0a 7d 20 7b 77 61 6c 20 31 7d 0a 64 6f    }.} {wal 1}.do
2690: 5f 74 65 73 74 20 77 61 6c 2d 38 2e 32 20 7b 0a  _test wal-8.2 {.
26a0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
26b0: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
26c0: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
26d0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
26e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
26f0: 20 74 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28   t1 VALUES(blob(
2700: 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  900));.    INSER
2710: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
2720: 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20  (blob(900));.   
2730: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2740: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2750: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
2760: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53  /*  4 */.    INS
2770: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2780: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
2790: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 20  M t1;       /*  
27a0: 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  8 */.    INSERT 
27b0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
27c0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
27d0: 3b 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f  ;       /* 16 */
27e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
27f0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2800: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2810: 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20      /* 32 */.   
2820: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2830: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2840: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
2850: 2f 2a 20 36 34 20 2a 2f 0a 20 20 20 20 50 52 41  /* 64 */.    PRA
2860: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
2870: 6e 74 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73  nt;.  }.  file s
2880: 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65  ize test.db.} [e
2890: 78 70 72 20 36 38 2a 31 30 32 34 5d 0a 64 6f 5f  xpr 68*1024].do_
28a0: 74 65 73 74 20 77 61 6c 2d 38 2e 33 20 7b 0a 20  test wal-8.3 {. 
28b0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
28c0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57  DELETE FROM t1 W
28d0: 48 45 52 45 20 72 6f 77 69 64 3c 35 34 3b 0a 20  HERE rowid<54;. 
28e0: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
28f0: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20  eckpoint;.  }.  
2900: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
2910: 62 0a 7d 20 5b 65 78 70 72 20 31 34 2a 31 30 32  b.} [expr 14*102
2920: 34 5d 0a 0a 23 20 52 75 6e 20 73 6f 6d 65 20 22  4]..# Run some "
2930: 77 61 72 6d 2d 62 6f 64 79 22 20 74 65 73 74 73  warm-body" tests
2940: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
2950: 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66 69 6c 65  log-summary file
2960: 73 20 77 69 74 68 20 6d 6f 72 65 0a 23 20 74 68  s with more.# th
2970: 61 6e 20 32 35 36 20 65 6e 74 72 69 65 73 20 28  an 256 entries (
2980: 6c 6f 67 20 73 75 6d 6d 61 72 69 65 73 20 74 68  log summaries th
2990: 61 74 20 63 6f 6e 74 61 69 6e 20 69 6e 64 65 78  at contain index
29a0: 20 62 6c 6f 63 6b 73 29 20 77 6f 72 6b 20 4f 6b   blocks) work Ok
29b0: 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..#.do_test wal-
29c0: 39 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64  9.1 {.  reopen_d
29d0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  b.  execsql {.  
29e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
29f0: 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  1(x PRIMARY KEY)
2a00: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2a10: 4f 20 74 31 20 56 41 4c 55 45 53 28 62 6c 6f 62  O t1 VALUES(blob
2a20: 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (900));.    INSE
2a30: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2a40: 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20  S(blob(900));.  
2a50: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2a60: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2a70: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2a80: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e   /*  4 */.    IN
2a90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2aa0: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2ab0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2ac0: 20 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54   8 */.    INSERT
2ad0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2ae0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2af0: 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a  1;       /* 16 *
2b00: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
2b10: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2b20: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2b30: 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20       /* 32 */.  
2b40: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2b50: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2b60: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2b70: 20 2f 2a 20 36 34 20 2a 2f 0a 20 20 20 20 49 4e   /* 64 */.    IN
2b80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2b90: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2ba0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2bb0: 31 32 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52  128 */.    INSER
2bc0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
2bd0: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
2be0: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 32 35 36  t1;       /* 256
2bf0: 20 2a 2f 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73   */.  }.  file s
2c00: 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 31 30  ize test.db.} 10
2c10: 32 34 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39  24.do_test wal-9
2c20: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77  .2 {.  sqlite3_w
2c30: 61 6c 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  al db2 test.db. 
2c40: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
2c50: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
2c60: 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 64   } db2.} {ok}..d
2c70: 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e 33 20 7b  o_test wal-9.3 {
2c80: 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  .  file delete -
2c90: 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 20 74  force test2.db t
2ca0: 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 66 69  est2.db-wal.  fi
2cb0: 6c 65 20 63 6f 70 79 20 74 65 73 74 2e 64 62 20  le copy test.db 
2cc0: 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65 20  test2.db.  file 
2cd0: 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61 6c  copy test.db-wal
2ce0: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20   test2.db-wal.  
2cf0: 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 33 20  sqlite3_wal db3 
2d00: 74 65 73 74 32 2e 64 62 20 0a 20 20 65 78 65 63  test2.db .  exec
2d10: 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65  sql {PRAGMA inte
2d20: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62  grity_check } db
2d30: 33 0a 7d 20 7b 6f 6b 7d 0a 64 62 33 20 63 6c 6f  3.} {ok}.db3 clo
2d40: 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  se..do_test wal-
2d50: 39 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.4 {.  execsql 
2d60: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
2d70: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 64 62 32 20  ckpoint }.  db2 
2d80: 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f  close.  sqlite3_
2d90: 77 61 6c 20 64 62 32 20 74 65 73 74 2e 64 62 0a  wal db2 test.db.
2da0: 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
2db0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
2dc0: 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a  k } db2.} {ok}..
2dd0: 66 6f 72 65 61 63 68 20 68 61 6e 64 6c 65 20 7b  foreach handle {
2de0: 64 62 20 64 62 32 20 64 62 33 7d 20 7b 20 63 61  db db2 db3} { ca
2df0: 74 63 68 20 7b 20 24 68 61 6e 64 6c 65 20 63 6c  tch { $handle cl
2e00: 6f 73 65 20 7d 20 7d 0a 75 6e 73 65 74 20 68 61  ose } }.unset ha
2e10: 6e 64 6c 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d  ndle..#---------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
2e70: 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20   block of tests 
2e80: 2d 20 77 61 6c 2d 31 30 2e 2a 20 2d 20 74 65 73  - wal-10.* - tes
2e90: 74 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 6c  t that the WAL l
2ea0: 6f 63 6b 69 6e 67 20 0a 23 20 73 63 68 65 6d 65  ocking .# scheme
2eb0: 20 77 6f 72 6b 73 20 69 6e 20 73 69 6d 70 6c 65   works in simple
2ec0: 20 63 61 73 65 73 2e 20 54 68 69 73 20 62 6c 6f   cases. This blo
2ed0: 63 6b 20 6f 66 20 74 65 73 74 73 20 69 73 20 72  ck of tests is r
2ee0: 75 6e 20 74 77 69 63 65 2e 20 4f 6e 63 65 0a 23  un twice. Once.#
2ef0: 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20   using multiple 
2f00: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 69 6e 20 74  connections in t
2f10: 68 65 20 61 64 64 72 65 73 73 20 73 70 61 63 65  he address space
2f20: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2f30: 70 72 6f 63 65 73 73 2c 0a 23 20 61 6e 64 20 6f  process,.# and o
2f40: 6e 63 65 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e  nce with all con
2f50: 6e 65 63 74 69 6f 6e 73 20 65 78 63 65 70 74 20  nections except 
2f60: 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65  one running in e
2f70: 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65  xternal processe
2f80: 73 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69 63 6c 69  s..#.do_multicli
2f90: 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b 0a 0a 20  ent_test tn {.. 
2fa0: 20 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68   # Initialize th
2fb0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
2fc0: 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 2e 0a  a and contents..
2fd0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
2fe0: 6c 2d 31 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20  l-10.$tn.1 {.   
2ff0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
3000: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
3010: 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  uum = 0;.      P
3020: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
3030: 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20 20 20 20  de = wal;.      
3040: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
3050: 61 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53  a, b);.      INS
3060: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
3070: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  ES(1, 2);.      
3080: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3090: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c  ;.    }.  } {wal
30a0: 20 31 20 32 7d 0a 0a 20 20 23 20 4f 70 65 6e 20   1 2}..  # Open 
30b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
30c0: 64 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  d write to the d
30d0: 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 5b 64  atabase using [d
30e0: 62 5d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 5b  b]. Check that [
30f0: 64 62 32 5d 0a 20 20 23 20 69 73 20 73 74 69 6c  db2].  # is stil
3100: 6c 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 74  l able to read t
3110: 68 65 20 73 6e 61 70 73 68 6f 74 20 62 65 66 6f  he snapshot befo
3120: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
3130: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  on was opened.. 
3140: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
3150: 2d 31 30 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  -10.$tn.2 {.    
3160: 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 3b  execsql { BEGIN;
3170: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3180: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 20 7d 0a  VALUES(3, 4); }.
3190: 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54      sql2 {SELECT
31a0: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20   * FROM t1}.  } 
31b0: 7b 31 20 32 7d 0a 0a 20 20 23 20 48 61 76 65 20  {1 2}..  # Have 
31c0: 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 74 68 65 20  [db] commit the 
31d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65  transaction. Che
31e0: 63 6b 20 74 68 61 74 20 5b 64 62 32 5d 20 69 73  ck that [db2] is
31f0: 20 6e 6f 77 20 73 65 65 69 6e 67 20 74 68 65 20   now seeing the 
3200: 0a 20 20 23 20 6e 65 77 2c 20 75 70 64 61 74 65  .  # new, update
3210: 64 20 73 6e 61 70 73 68 6f 74 2e 0a 20 20 23 0a  d snapshot..  #.
3220: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3230: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 65 78 65  .$tn.3 {.    exe
3240: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  csql { COMMIT }.
3250: 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54      sql2 {SELECT
3260: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20   * FROM t1}.  } 
3270: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 23 20 48  {1 2 3 4}..  # H
3280: 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61  ave [db2] open a
3290: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
32a0: 6e 2e 20 54 68 65 6e 20 77 72 69 74 65 20 74 6f  n. Then write to
32b0: 20 74 68 65 20 64 62 20 76 69 61 20 5b 64 62 5d   the db via [db]
32c0: 2e 20 43 68 65 63 6b 0a 20 20 23 20 74 68 61 74  . Check.  # that
32d0: 20 5b 64 62 32 5d 20 69 73 20 73 74 69 6c 6c 20   [db2] is still 
32e0: 73 65 65 69 6e 67 20 74 68 65 20 6f 72 69 67 69  seeing the origi
32f0: 6e 61 6c 20 73 6e 61 70 73 68 6f 74 2e 20 54 68  nal snapshot. Th
3300: 65 6e 20 72 65 61 64 20 77 69 74 68 20 5b 64 62  en read with [db
3310: 33 5d 2e 0a 20 20 23 20 5b 64 62 33 5d 20 73 68  3]..  # [db3] sh
3320: 6f 75 6c 64 20 73 65 65 20 74 68 65 20 6e 65 77  ould see the new
3330: 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 64 61 74  ly committed dat
3340: 61 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  a..  #.  do_test
3350: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 34 20 7b 0a   wal-10.$tn.4 {.
3360: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
3370: 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   ; SELECT * FROM
3380: 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20   t1}.  } {1 2 3 
3390: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  4}.  do_test wal
33a0: 2d 31 30 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  -10.$tn.5 {.    
33b0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
33c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
33d0: 35 2c 20 36 29 3b 20 7d 0a 20 20 20 20 73 71 6c  5, 6); }.    sql
33e0: 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  2 {SELECT * FROM
33f0: 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20   t1}.  } {1 2 3 
3400: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  4}.  do_test wal
3410: 2d 31 30 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20  -10.$tn.6 {.    
3420: 73 71 6c 33 20 7b 53 45 4c 45 43 54 20 2a 20 46  sql3 {SELECT * F
3430: 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32  ROM t1}.  } {1 2
3440: 20 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74   3 4 5 6}.  do_t
3450: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 37  est wal-10.$tn.7
3460: 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d   {.    sql2 COMM
3470: 49 54 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 48  IT.  } {}..  # H
3480: 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61  ave [db2] open a
3490: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
34a0: 6f 6e 2e 20 54 68 65 6e 20 61 74 74 65 6d 70 74  on. Then attempt
34b0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
34c0: 20 0a 20 20 23 20 64 61 74 61 62 61 73 65 20 76   .  # database v
34d0: 69 61 20 5b 64 62 5d 2e 20 54 68 69 73 20 73 68  ia [db]. This sh
34e0: 6f 75 6c 64 20 66 61 69 6c 20 28 77 72 69 74 65  ould fail (write
34f0: 72 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  r lock cannot be
3500: 20 6f 62 74 61 69 6e 65 64 29 2e 0a 20 20 23 0a   obtained)..  #.
3510: 20 20 23 20 54 68 65 6e 20 6f 70 65 6e 20 61 20    # Then open a 
3520: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
3530: 20 77 69 74 68 20 5b 64 62 5d 2e 20 43 6f 6d 6d   with [db]. Comm
3540: 69 74 20 74 68 65 20 5b 64 62 32 5d 20 74 72 61  it the [db2] tra
3550: 6e 73 61 63 74 69 6f 6e 0a 20 20 23 20 74 6f 20  nsaction.  # to 
3560: 64 69 73 6b 2e 20 56 65 72 69 66 79 20 74 68 61  disk. Verify tha
3570: 74 20 5b 64 62 5d 20 73 74 69 6c 6c 20 63 61 6e  t [db] still can
3580: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
3590: 20 64 61 74 61 62 61 73 65 20 28 62 65 63 61 75   database (becau
35a0: 73 65 0a 20 20 23 20 69 74 20 69 73 20 72 65 61  se.  # it is rea
35b0: 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e 61 70  ding an old snap
35c0: 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20 23 20 43  shot)..  #.  # C
35d0: 6c 6f 73 65 20 74 68 65 20 63 75 72 72 65 6e 74  lose the current
35e0: 20 5b 64 62 5d 20 74 72 61 6e 73 61 63 74 69 6f   [db] transactio
35f0: 6e 2e 20 4f 70 65 6e 20 61 20 6e 65 77 20 6f 6e  n. Open a new on
3600: 65 2e 20 5b 64 62 5d 20 63 61 6e 20 6e 6f 77 20  e. [db] can now 
3610: 77 72 69 74 65 0a 20 20 23 20 74 6f 20 74 68 65  write.  # to the
3620: 20 64 61 74 61 62 61 73 65 20 28 61 73 20 69 74   database (as it
3630: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 61   is not locked a
3640: 6e 64 20 5b 64 62 5d 20 69 73 20 72 65 61 64 69  nd [db] is readi
3650: 6e 67 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20  ng the latest.  
3660: 23 20 73 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23  # snapshot)..  #
3670: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3680: 30 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71  0.$tn.7 {.    sq
3690: 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45  l2 { BEGIN; INSE
36a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
36b0: 53 28 37 2c 20 38 29 20 3b 20 7d 0a 20 20 20 20  S(7, 8) ; }.    
36c0: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
36d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
36e0: 28 39 2c 20 31 30 29 20 7d 0a 20 20 7d 20 7b 31  (9, 10) }.  } {1
36f0: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
3700: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
3710: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 38 20 7b 0a   wal-10.$tn.8 {.
3720: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45      execsql { BE
3730: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  GIN ; SELECT * F
3740: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3750: 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f  2 3 4 5 6}.  do_
3760: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3770: 39 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d  9 {.    sql2 COM
3780: 4d 49 54 0a 20 20 20 20 63 61 74 63 68 73 71 6c  MIT.    catchsql
3790: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
37a0: 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20  1 VALUES(9, 10) 
37b0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
37c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
37d0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
37e0: 24 74 6e 2e 31 30 20 7b 0a 20 20 20 20 65 78 65  $tn.10 {.    exe
37f0: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  csql { COMMIT }.
3800: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45      execsql { BE
3810: 47 49 4e 20 7d 0a 20 20 20 20 65 78 65 63 73 71  GIN }.    execsq
3820: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
3830: 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29  t1 VALUES(9, 10)
3840: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
3850: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 65 78   COMMIT }.    ex
3860: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
3870: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
3880: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
3890: 39 20 31 30 7d 0a 0a 20 20 23 20 4f 70 65 6e 20  9 10}..  # Open 
38a0: 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  a read transacti
38b0: 6f 6e 20 77 69 74 68 20 5b 64 62 32 5d 2e 20 43  on with [db2]. C
38c0: 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 70  heck that this p
38d0: 72 65 76 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f  revents [db] fro
38e0: 6d 0a 20 20 23 20 63 68 65 63 6b 70 6f 69 6e 74  m.  # checkpoint
38f0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
3900: 2e 20 42 75 74 20 6e 6f 74 20 66 72 6f 6d 20 77  . But not from w
3910: 72 69 74 69 6e 67 20 74 6f 20 69 74 2e 0a 20 20  riting to it..  
3920: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
3930: 31 30 2e 24 74 6e 2e 31 31 20 7b 0a 20 20 20 20  10.$tn.11 {.    
3940: 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53 45  sql2 { BEGIN; SE
3950: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
3960: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
3970: 36 20 37 20 38 20 39 20 31 30 7d 0a 20 20 64 6f  6 7 8 9 10}.  do
3980: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3990: 2e 31 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73  .12 {.    catchs
39a0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
39b0: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20  checkpoint } .  
39c0: 7d 20 7b 30 20 7b 30 20 31 33 20 31 33 7d 7d 20  } {0 {0 13 13}} 
39d0: 20 20 3b 23 20 52 65 61 64 65 72 20 6e 6f 20 6c    ;# Reader no l
39e0: 6f 6e 67 65 72 20 62 6c 6f 63 6b 20 63 68 65 63  onger block chec
39f0: 6b 70 6f 69 6e 74 73 0a 20 20 64 6f 5f 74 65 73  kpoints.  do_tes
3a00: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 33 20  t wal-10.$tn.13 
3a10: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
3a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3a30: 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d 0a  ALUES(11, 12) }.
3a40: 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54      sql2 {SELECT
3a50: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20   * FROM t1}.  } 
3a60: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
3a70: 20 39 20 31 30 7d 0a 0a 20 20 23 20 57 72 69 74   9 10}..  # Writ
3a80: 65 72 73 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b  ers do not block
3a90: 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e 79   checkpoints any
3aa0: 20 6d 6f 72 65 20 65 69 74 68 65 72 2e 0a 20 20   more either..  
3ab0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
3ac0: 31 30 2e 24 74 6e 2e 31 34 20 7b 0a 20 20 20 20  10.$tn.14 {.    
3ad0: 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d  catchsql { PRAGM
3ae0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
3af0: 20 7d 20 0a 20 20 7d 20 7b 30 20 7b 30 20 31 35   } .  } {0 {0 15
3b00: 20 31 33 7d 7d 0a 0a 20 20 23 20 54 68 65 20 66   13}}..  # The f
3b10: 6f 6c 6c 6f 77 69 6e 67 20 73 65 72 69 65 73 20  ollowing series 
3b20: 6f 66 20 74 65 73 74 20 63 61 73 65 73 20 75 73  of test cases us
3b30: 65 64 20 74 6f 20 76 65 72 69 66 79 20 61 6e 6f  ed to verify ano
3b40: 74 68 65 72 20 62 6c 6f 63 6b 69 6e 67 0a 20 20  ther blocking.  
3b50: 23 20 63 61 73 65 20 69 6e 20 57 41 4c 20 2d 20  # case in WAL - 
3b60: 61 20 63 61 73 65 20 77 68 69 63 68 20 6e 6f 20  a case which no 
3b70: 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b 73 2e 0a 20  longer blocks.. 
3b80: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
3b90: 2d 31 30 2e 24 74 6e 2e 31 35 20 7b 0a 20 20 20  -10.$tn.15 {.   
3ba0: 20 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 3b 20   sql2 { COMMIT; 
3bb0: 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20  BEGIN; SELECT * 
3bc0: 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b  FROM t1; }.  } {
3bd0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
3be0: 39 20 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f  9 10 11 12}.  do
3bf0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3c00: 2e 31 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73  .16 {.    catchs
3c10: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
3c20: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20  checkpoint } .  
3c30: 7d 20 7b 30 20 7b 30 20 31 35 20 31 35 7d 7d 0a  } {0 {0 15 15}}.
3c40: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3c50: 2e 24 74 6e 2e 31 37 20 7b 0a 20 20 20 20 65 78  .$tn.17 {.    ex
3c60: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
3c70: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20  al_checkpoint } 
3c80: 0a 20 20 7d 20 7b 30 20 31 35 20 31 35 7d 0a 20  .  } {0 15 15}. 
3c90: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3ca0: 24 74 6e 2e 31 38 20 7b 0a 20 20 20 20 73 71 6c  $tn.18 {.    sql
3cb0: 33 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43  3 { BEGIN; SELEC
3cc0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3cd0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
3ce0: 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 20   8 9 10 11 12}. 
3cf0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3d00: 24 74 6e 2e 31 39 20 7b 0a 20 20 20 20 63 61 74  $tn.19 {.    cat
3d10: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
3d20: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33  NTO t1 VALUES(13
3d30: 2c 20 31 34 29 20 7d 0a 20 20 7d 20 7b 30 20 7b  , 14) }.  } {0 {
3d40: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  }}.  do_test wal
3d50: 2d 31 30 2e 24 74 6e 2e 32 30 20 7b 0a 20 20 20  -10.$tn.20 {.   
3d60: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
3d70: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3d80: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
3d90: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
3da0: 20 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   14}.  do_test w
3db0: 61 6c 2d 31 30 2e 24 74 6e 2e 32 31 20 7b 0a 20  al-10.$tn.21 {. 
3dc0: 20 20 20 73 71 6c 33 20 43 4f 4d 4d 49 54 0a 20     sql3 COMMIT. 
3dd0: 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20     sql2 COMMIT. 
3de0: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
3df0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 32 20 7b 0a  wal-10.$tn.22 {.
3e00: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
3e10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
3e20: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
3e30: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
3e40: 20 31 33 20 31 34 7d 0a 0a 20 20 23 20 41 6e 6f   13 14}..  # Ano
3e50: 74 68 65 72 20 73 65 72 69 65 73 20 6f 66 20 74  ther series of t
3e60: 65 73 74 73 20 74 68 61 74 20 75 73 65 64 20 74  ests that used t
3e70: 6f 20 64 65 6d 6f 6e 73 74 72 61 74 65 20 62 6c  o demonstrate bl
3e80: 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 0a  ocking behavior.
3e90: 20 20 23 20 62 75 74 20 77 68 69 63 68 20 6e 6f    # but which no
3ea0: 77 20 77 6f 72 6b 2e 0a 20 20 23 0a 20 20 64 6f  w work..  #.  do
3eb0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3ec0: 2e 32 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .23 {.    execsq
3ed0: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
3ee0: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
3ef0: 7b 30 20 31 37 20 31 37 7d 0a 20 20 64 6f 5f 74  {0 17 17}.  do_t
3f00: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
3f10: 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  4 {.    sql2 { B
3f20: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
3f30: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31  ROM t1; }.  } {1
3f40: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
3f50: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d   10 11 12 13 14}
3f60: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3f70: 30 2e 24 74 6e 2e 32 35 20 7b 0a 20 20 20 20 65  0.$tn.25 {.    e
3f80: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
3f90: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
3fa0: 0a 20 20 7d 20 7b 30 20 31 37 20 31 37 7d 0a 20  .  } {0 17 17}. 
3fb0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3fc0: 24 74 6e 2e 32 36 20 7b 0a 20 20 20 20 63 61 74  $tn.26 {.    cat
3fd0: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
3fe0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 35  NTO t1 VALUES(15
3ff0: 2c 20 31 36 29 20 7d 0a 20 20 7d 20 7b 30 20 7b  , 16) }.  } {0 {
4000: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  }}.  do_test wal
4010: 2d 31 30 2e 24 74 6e 2e 32 37 20 7b 0a 20 20 20  -10.$tn.27 {.   
4020: 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20 49   sql3 { INSERT I
4030: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 37  NTO t1 VALUES(17
4040: 2c 20 31 38 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20  , 18) }.  } {}. 
4050: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4060: 24 74 6e 2e 32 38 20 7b 0a 20 20 20 20 63 6f 64  $tn.28 {.    cod
4070: 65 33 20 7b 0a 20 20 20 20 20 20 73 65 74 20 3a  e3 {.      set :
4080: 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f 70  :STMT [sqlite3_p
4090: 72 65 70 61 72 65 20 64 62 33 20 22 53 45 4c 45  repare db3 "SELE
40a0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 2d 31  CT * FROM t1" -1
40b0: 20 54 41 49 4c 5d 0a 20 20 20 20 20 20 73 71 6c   TAIL].      sql
40c0: 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54 4d  ite3_step $::STM
40d0: 54 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63  T.    }.    exec
40e0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
40f0: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
4100: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
4110: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31  10 11 12 13 14 1
4120: 35 20 31 36 20 31 37 20 31 38 7d 0a 20 20 64 6f  5 16 17 18}.  do
4130: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4140: 2e 32 39 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .29 {.    execsq
4150: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
4160: 74 31 20 56 41 4c 55 45 53 28 31 39 2c 20 32 30  t1 VALUES(19, 20
4170: 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ) }.    catchsql
4180: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
4190: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b  eckpoint }.  } {
41a0: 30 20 7b 30 20 36 20 30 7d 7d 0a 20 20 64 6f 5f  0 {0 6 0}}.  do_
41b0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
41c0: 33 30 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b  30 {.    code3 {
41d0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
41e0: 65 20 24 3a 3a 53 54 4d 54 20 7d 0a 20 20 20 20  e $::STMT }.    
41f0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4200: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4210: 7d 0a 20 20 7d 20 7b 30 20 36 20 30 7d 0a 0a 20  }.  } {0 6 0}.. 
4220: 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c   # At one point,
4230: 20 69 66 20 61 20 72 65 61 64 65 72 20 66 61 69   if a reader fai
4240: 6c 65 64 20 74 6f 20 75 70 67 72 61 64 65 20 74  led to upgrade t
4250: 6f 20 61 20 77 72 69 74 65 72 20 62 65 63 61 75  o a writer becau
4260: 73 65 20 69 74 0a 20 20 23 20 77 61 73 20 72 65  se it.  # was re
4270: 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e 61  ading an old sna
4280: 70 73 68 6f 74 2c 20 74 68 65 20 77 72 69 74 65  pshot, the write
4290: 2d 6c 6f 63 6b 73 20 77 65 72 65 20 6e 6f 74 20  -locks were not 
42a0: 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 2e 0a  being released..
42b0: 20 20 23 20 54 65 73 74 20 74 68 61 74 20 74 68    # Test that th
42c0: 69 73 20 62 75 67 20 68 61 73 20 62 65 65 6e 20  is bug has been 
42d0: 66 69 78 65 64 2e 0a 20 20 23 0a 20 20 64 6f 5f  fixed..  #.  do_
42e0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
42f0: 33 31 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f  31 {.    sql2 CO
4300: 4d 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71 6c  MMIT.    execsql
4310: 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45 43   { BEGIN ; SELEC
4320: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
4330: 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52 54 20    sql2 { INSERT 
4340: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
4350: 31 2c 20 32 32 29 20 7d 0a 20 20 20 20 63 61 74  1, 22) }.    cat
4360: 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  chsql { INSERT I
4370: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 33  NTO t1 VALUES(23
4380: 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b  , 24) }.  } {1 {
4390: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
43a0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  ed}}.  do_test w
43b0: 61 6c 2d 31 30 2e 24 74 6e 2e 33 32 20 7b 0a 20  al-10.$tn.32 {. 
43c0: 20 20 20 23 20 54 68 69 73 20 73 74 61 74 65 6d     # This statem
43d0: 65 6e 74 20 77 6f 75 6c 64 20 66 61 69 6c 20 77  ent would fail w
43e0: 68 65 6e 20 74 68 65 20 62 75 67 20 77 61 73 20  hen the bug was 
43f0: 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 73 71 6c  present..    sql
4400: 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  2 { INSERT INTO 
4410: 74 31 20 56 41 4c 55 45 53 28 32 33 2c 20 32 34  t1 VALUES(23, 24
4420: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ) }.  } {}.  do_
4430: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4440: 33 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  33 {.    execsql
4450: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
4460: 20 74 31 20 3b 20 43 4f 4d 4d 49 54 20 7d 0a 20   t1 ; COMMIT }. 
4470: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
4480: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
4490: 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31 38  3 14 15 16 17 18
44a0: 20 31 39 20 32 30 7d 0a 20 20 64 6f 5f 74 65 73   19 20}.  do_tes
44b0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 34 20  t wal-10.$tn.34 
44c0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
44d0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
44e0: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
44f0: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
4500: 31 32 20 31 33 20 31 34 20 31 35 20 31 36 20 31  12 13 14 15 16 1
4510: 37 20 31 38 20 31 39 20 32 30 20 32 31 20 32 32  7 18 19 20 21 22
4520: 20 32 33 20 32 34 7d 0a 0a 20 20 23 20 54 65 73   23 24}..  # Tes
4530: 74 20 74 68 61 74 20 69 66 20 61 20 63 68 65 63  t that if a chec
4540: 6b 70 6f 69 6e 74 65 72 20 63 61 6e 6e 6f 74 20  kpointer cannot 
4550: 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69  obtain the requi
4560: 72 65 64 20 6c 6f 63 6b 73 2c 20 69 74 0a 20 20  red locks, it.  
4570: 23 20 72 65 6c 65 61 73 65 73 20 61 6c 6c 20 6c  # releases all l
4580: 6f 63 6b 73 20 62 65 66 6f 72 65 20 72 65 74 75  ocks before retu
4590: 72 6e 69 6e 67 20 61 20 62 75 73 79 20 65 72 72  rning a busy err
45a0: 6f 72 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  or..  #.  do_tes
45b0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 35 20  t wal-10.$tn.35 
45c0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
45d0: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
45e0: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53  OM t1;.      INS
45f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
4600: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
4610: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4620: 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27  t1 VALUES('c', '
4630: 64 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  d');.    }.    s
4640: 71 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47 49  ql2 {.      BEGI
4650: 4e 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  N;.        SELEC
4660: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
4670: 20 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64 7d   }.  } {a b c d}
4680: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
4690: 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20 20 63  0.$tn.36 {.    c
46a0: 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41  atchsql { PRAGMA
46b0: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
46c0: 7d 0a 20 20 7d 20 7b 30 20 7b 30 20 31 36 20 31  }.  } {0 {0 16 1
46d0: 36 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  6}}.  do_test wa
46e0: 6c 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20  l-10.$tn.36 {.  
46f0: 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20    sql3 { INSERT 
4700: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4710: 65 27 2c 20 27 66 27 29 20 7d 0a 20 20 20 20 73  e', 'f') }.    s
4720: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
4730: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 61 20  ROM t1 }.  } {a 
4740: 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73 74  b c d}.  do_test
4750: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 37 20 7b   wal-10.$tn.37 {
4760: 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54  .    sql2 COMMIT
4770: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
4780: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
4790: 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 31 38  oint }.  } {0 18
47a0: 20 31 38 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d   18}.}..#-------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20  --.# This block 
4800: 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 31  of tests, wal-11
4810: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 6e 6f  .*, test that no
4820: 74 68 69 6e 67 20 67 6f 65 73 20 74 65 72 72 69  thing goes terri
4830: 62 6c 79 20 77 72 6f 6e 67 0a 23 20 69 66 20 66  bly wrong.# if f
4840: 72 61 6d 65 73 20 6d 75 73 74 20 62 65 20 77 72  rames must be wr
4850: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
4860: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 61 20 74   file before a t
4870: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 23 20  ransaction is.# 
4880: 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 20 6f 72  committed (in or
4890: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
48a0: 65 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74 65 73  emory)..#.do_tes
48b0: 74 20 77 61 6c 2d 31 31 2e 31 20 7b 0a 20 20 72  t wal-11.1 {.  r
48c0: 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63 73  eopen_db.  execs
48d0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
48e0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
48f0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
4900: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
4910: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
4920: 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  1(x PRIMARY KEY)
4930: 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78  ;.  }.  list [ex
4940: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
4950: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78  st.db]/1024] [ex
4960: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
4970: 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d  st.db-wal]/1044]
4980: 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74  .} {1 3}.do_test
4990: 20 77 61 6c 2d 31 31 2e 32 20 7b 0a 20 20 65 78   wal-11.2 {.  ex
49a0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
49b0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
49c0: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
49d0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
49e0: 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a  /1024] [file siz
49f0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
4a00: 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66 69   [list 3 [wal_fi
4a10: 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d  le_size 3 1024]]
4a20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
4a30: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
4a40: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4a50: 41 4c 55 45 53 28 20 62 6c 6f 62 28 39 30 30 29  ALUES( blob(900)
4a60: 20 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70   ) }.  list [exp
4a70: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
4a80: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c  t.db]/1024] [fil
4a90: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
4aa0: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77  al].} [list 3 [w
4ab0: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 34 20 31  al_file_size 4 1
4ac0: 30 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 77  024]]..do_test w
4ad0: 61 6c 2d 31 31 2e 34 20 7b 0a 20 20 65 78 65 63  al-11.4 {.  exec
4ae0: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
4af0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4b00: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
4b10: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
4b20: 20 20 20 2d 2d 20 32 0a 20 20 20 20 20 20 49 4e     -- 2.      IN
4b30: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
4b40: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
4b50: 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 34 0a 20 20  OM t1;   -- 4.  
4b60: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4b70: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
4b80: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d  00) FROM t1;   -
4b90: 2d 20 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54  - 8.      INSERT
4ba0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
4bb0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
4bc0: 31 3b 20 20 20 2d 2d 20 31 36 0a 20 20 7d 0a 20  1;   -- 16.  }. 
4bd0: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4be0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4bf0: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4c00: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4c10: 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c  [list 3 [wal_fil
4c20: 65 5f 73 69 7a 65 20 33 32 20 31 30 32 34 5d 5d  e_size 32 1024]]
4c30: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
4c40: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
4c50: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
4c60: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4c70: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
4c80: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
4c90: 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  {16 ok}.do_test 
4ca0: 77 61 6c 2d 31 31 2e 36 20 7b 0a 20 20 65 78 65  wal-11.6 {.  exe
4cb0: 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69  csql COMMIT.  li
4cc0: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
4cd0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
4ce0: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
4cf0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
4d00: 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  st 3 [wal_file_s
4d10: 69 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f  ize 41 1024]].do
4d20: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 37 20 7b  _test wal-11.7 {
4d30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20  .  execsql { .  
4d40: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
4d50: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50  ) FROM t1;.    P
4d60: 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
4d70: 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 36  check;.  }.} {16
4d80: 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   ok}.do_test wal
4d90: 2d 31 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71  -11.8 {.  execsq
4da0: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
4db0: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69  heckpoint }.  li
4dc0: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
4dd0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
4de0: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
4df0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
4e00: 73 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f  st 37 [wal_file_
4e10: 73 69 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a 64  size 41 1024]].d
4e20: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 39 20  o_test wal-11.9 
4e30: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c  {.  db close.  l
4e40: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
4e50: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
4e60: 32 34 5d 20 5b 6c 6f 67 5f 64 65 6c 65 74 65 64  24] [log_deleted
4e70: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4e80: 7b 33 37 20 31 7d 0a 73 71 6c 69 74 65 33 5f 77  {37 1}.sqlite3_w
4e90: 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f  al db test.db.do
4ea0: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 30 20  _test wal-11.10 
4eb0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
4ec0: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
4ed0: 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45  ize = 10;.    BE
4ee0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
4ef0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4f00: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
4f10: 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20 20 20 20  t1;   -- 32.    
4f20: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
4f30: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20  ) FROM t1;.  }. 
4f40: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4f50: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4f60: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4f70: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4f80: 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f 66 69  [list 37 [wal_fi
4f90: 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32 34 5d  le_size 37 1024]
4fa0: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
4fb0: 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .11 {.  execsql 
4fc0: 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63  {.      SELECT c
4fd0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
4fe0: 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20  .    ROLLBACK;. 
4ff0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
5000: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  *) FROM t1;.  }.
5010: 7d 20 7b 33 32 20 31 36 7d 0a 64 6f 5f 74 65 73  } {32 16}.do_tes
5020: 74 20 77 61 6c 2d 31 31 2e 31 32 20 7b 0a 20 20  t wal-11.12 {.  
5030: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
5040: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
5050: 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  024] [file size 
5060: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
5070: 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f 66 69 6c  list 37 [wal_fil
5080: 65 5f 73 69 7a 65 20 33 37 20 31 30 32 34 5d 5d  e_size 37 1024]]
5090: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
50a0: 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  13 {.  execsql {
50b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
50c0: 20 74 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62   t1 VALUES( blob
50d0: 28 39 30 30 29 20 29 3b 0a 20 20 20 20 53 45 4c  (900) );.    SEL
50e0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
50f0: 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41  M t1;.    PRAGMA
5100: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
5110: 3b 0a 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d 0a  ;.  }.} {17 ok}.
5120: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31  do_test wal-11.1
5130: 34 20 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72  4 {.  list [expr
5140: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5150: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65  .db]/1024] [file
5160: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
5170: 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77  l].} [list 37 [w
5180: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 37 20  al_file_size 37 
5190: 31 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d  1024]]...#------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51e0: 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b  ---.# This block
51f0: 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31   of tests, wal-1
5200: 32 2e 2a 2c 20 74 65 73 74 73 20 74 68 65 20 66  2.*, tests the f
5210: 69 78 20 66 6f 72 20 61 20 70 72 6f 62 6c 65 6d  ix for a problem
5220: 20 74 68 61 74 20 0a 23 20 63 6f 75 6c 64 20 6f   that .# could o
5230: 63 63 75 72 20 69 66 20 61 20 6c 6f 67 20 74 68  ccur if a log th
5240: 61 74 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  at is a prefix o
5250: 66 20 61 6e 20 6f 6c 64 65 72 20 6c 6f 67 20 69  f an older log i
5260: 73 20 77 72 69 74 74 65 6e 20 0a 23 20 69 6e 74  s written .# int
5270: 6f 20 61 20 72 65 75 73 65 64 20 6c 6f 67 20 66  o a reused log f
5280: 69 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64 62  ile..#.reopen_db
5290: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e  .do_test wal-12.
52a0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
52b0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
52c0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
52d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
52e0: 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41  (x, y);.    CREA
52f0: 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20 79  TE TABLE t2(x, y
5300: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
5310: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41 27  TO t1 VALUES('A'
5320: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  , 1);.  }.  list
5330: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
5340: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
5350: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5360: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
5370: 20 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a   1 [wal_file_siz
5380: 65 20 35 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65  e 5 1024]].do_te
5390: 73 74 20 77 61 6c 2d 31 32 2e 32 20 7b 0a 20 20  st wal-12.2 {.  
53a0: 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  db close.  sqlit
53b0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
53c0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
53d0: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
53e0: 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 55   = normal;.    U
53f0: 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d  PDATE t1 SET y =
5400: 20 30 20 57 48 45 52 45 20 78 20 3d 20 27 41 27   0 WHERE x = 'A'
5410: 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78  ;.  }.  list [ex
5420: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
5430: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78  st.db]/1024] [ex
5440: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
5450: 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d  st.db-wal]/1044]
5460: 0a 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74 65 73 74  .} {3 1}.do_test
5470: 20 77 61 6c 2d 31 32 2e 33 20 7b 0a 20 20 65 78   wal-12.3 {.  ex
5480: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
5490: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 42  NTO t2 VALUES('B
54a0: 27 2c 20 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b  ', 1) }.  list [
54b0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
54c0: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
54d0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
54e0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34  test.db-wal]/104
54f0: 34 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74 65  4].} {3 2}.do_te
5500: 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20 20  st wal-12.4 {.  
5510: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
5520: 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64   test.db test2.d
5530: 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66  b.  file copy -f
5540: 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  orce test.db-wal
5550: 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20   test2.db-wal.  
5560: 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20  sqlite3_wal db2 
5570: 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73  test2.db.  execs
5580: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
5590: 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 42  OM t2 } db2.} {B
55a0: 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f   1}.db2 close.do
55b0: 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 35 20 7b  _test wal-12.5 {
55c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
55d0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
55e0: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41  kpoint;.    UPDA
55f0: 54 45 20 74 32 20 53 45 54 20 79 20 3d 20 32 20  TE t2 SET y = 2 
5600: 57 48 45 52 45 20 78 20 3d 20 27 42 27 3b 20 0a  WHERE x = 'B'; .
5610: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
5620: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55  heckpoint;.    U
5630: 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d  PDATE t1 SET y =
5640: 20 31 20 57 48 45 52 45 20 78 20 3d 20 27 41 27   1 WHERE x = 'A'
5650: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c  ;.    PRAGMA wal
5660: 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20  _checkpoint;.   
5670: 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79   UPDATE t1 SET y
5680: 20 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27   = 0 WHERE x = '
5690: 41 27 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  A';.  }.  execsq
56a0: 6c 20 7b 20 20 53 45 4c 45 43 54 20 2a 20 46 52  l {  SELECT * FR
56b0: 4f 4d 20 74 32 20 7d 0a 7d 20 7b 42 20 32 7d 0a  OM t2 }.} {B 2}.
56c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 36  do_test wal-12.6
56d0: 20 7b 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d   {.  file copy -
56e0: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
56f0: 73 74 32 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f  st2.db.  file co
5700: 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  py -force test.d
5710: 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77  b-wal test2.db-w
5720: 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  al.  sqlite3_wal
5730: 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20   db2 test2.db.  
5740: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
5750: 20 2a 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32   * FROM t2 } db2
5760: 0a 7d 20 7b 42 20 32 7d 0a 64 62 32 20 63 6c 6f  .} {B 2}.db2 clo
5770: 73 65 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 2d 2d  se.db close..#--
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 6c  -------.# Test l
57d0: 61 72 67 65 20 6c 6f 67 20 73 75 6d 6d 61 72 69  arge log summari
57e0: 65 73 2e 0a 23 0a 23 20 49 6e 20 74 68 69 73 20  es..#.# In this 
57f0: 63 61 73 65 20 22 6c 61 72 67 65 22 20 75 73 75  case "large" usu
5800: 61 6c 6c 79 20 6d 65 61 6e 73 20 61 20 6c 6f 67  ally means a log
5810: 20 66 69 6c 65 20 74 68 61 74 20 72 65 71 75 69   file that requi
5820: 72 65 73 20 61 20 77 61 6c 2d 69 6e 64 65 78 0a  res a wal-index.
5830: 23 20 6d 61 70 70 69 6e 67 20 6c 61 72 67 65 72  # mapping larger
5840: 20 74 68 61 6e 20 36 34 4b 42 20 28 74 68 65 20   than 64KB (the 
5850: 64 65 66 61 75 6c 74 20 69 6e 69 74 69 61 6c 20  default initial 
5860: 61 6c 6c 6f 63 61 74 69 6f 6e 29 2e 20 41 20 36  allocation). A 6
5870: 34 4b 42 20 77 61 6c 2d 69 6e 64 65 78 0a 23 20  4KB wal-index.# 
5880: 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  is large enough 
5890: 66 6f 72 20 61 20 6c 6f 67 20 66 69 6c 65 20 74  for a log file t
58a0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 70 70  hat contains app
58b0: 72 6f 78 69 6d 61 74 65 6c 79 20 31 33 31 30 30  roximately 13100
58c0: 20 66 72 61 6d 65 73 2e 0a 23 20 53 6f 20 74 68   frames..# So th
58d0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
58e0: 73 20 63 72 65 61 74 65 20 6c 6f 67 73 20 63 6f  s create logs co
58f0: 6e 74 61 69 6e 69 6e 67 20 61 74 20 6c 65 61 73  ntaining at leas
5900: 74 20 74 68 69 73 20 6d 61 6e 79 20 66 72 61 6d  t this many fram
5910: 65 73 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e 31  es..#.# wal-13.1
5920: 2e 2a 3a 20 54 68 69 73 20 74 65 73 74 20 63 61  .*: This test ca
5930: 73 65 20 63 72 65 61 74 65 73 20 61 20 76 65 72  se creates a ver
5940: 79 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c 65  y large log file
5950: 20 77 69 74 68 69 6e 20 74 68 65 0a 23 20 20 20   within the.#   
5960: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 2d 73            file-s
5970: 79 73 74 65 6d 20 28 61 72 6f 75 6e 64 20 32 30  ystem (around 20
5980: 30 4d 42 29 2e 20 54 68 65 20 6c 6f 67 20 66 69  0MB). The log fi
5990: 6c 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  le does not cont
59a0: 61 69 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20  ain.#           
59b0: 20 20 61 6e 79 20 76 61 6c 69 64 20 66 72 61 6d    any valid fram
59c0: 65 73 2e 20 54 65 73 74 20 74 68 61 74 20 74 68  es. Test that th
59d0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
59e0: 63 61 6e 20 73 74 69 6c 6c 20 62 65 0a 23 20 20  can still be.#  
59f0: 20 20 20 20 20 20 20 20 20 20 20 6f 70 65 6e 65             opene
5a00: 64 20 61 6e 64 20 71 75 65 72 69 65 64 2c 20 61  d and queried, a
5a10: 6e 64 20 74 68 61 74 20 74 68 65 20 69 6e 76 61  nd that the inva
5a20: 6c 69 64 20 6c 6f 67 20 66 69 6c 65 20 63 61 75  lid log file cau
5a30: 73 65 73 20 6e 6f 20 0a 23 20 20 20 20 20 20 20  ses no .#       
5a40: 20 20 20 20 20 20 70 72 6f 62 6c 65 6d 73 2e 0a        problems..
5a50: 23 0a 23 20 77 61 6c 2d 31 33 2e 32 2e 2a 3a 20  #.# wal-13.2.*: 
5a60: 54 65 73 74 20 74 68 61 74 20 61 20 70 72 6f 63  Test that a proc
5a70: 65 73 73 20 6d 61 79 20 63 72 65 61 74 65 20 61  ess may create a
5a80: 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c 65 20   large log file 
5a90: 61 6e 64 20 71 75 65 72 79 0a 23 20 20 20 20 20  and query.#     
5aa0: 20 20 20 20 20 20 20 20 74 68 65 20 64 61 74 61          the data
5ab0: 62 61 73 65 20 28 69 6e 63 6c 75 64 69 6e 67 20  base (including 
5ac0: 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 74 68 61  the log file tha
5ad0: 74 20 69 74 20 69 74 73 65 6c 66 20 63 72 65 61  t it itself crea
5ae0: 74 65 64 29 2e 0a 23 0a 23 20 77 61 6c 2d 31 33  ted)..#.# wal-13
5af0: 2e 33 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20  .3.*: Test that 
5b00: 69 66 20 61 20 76 65 72 79 20 6c 61 72 67 65 20  if a very large 
5b10: 6c 6f 67 20 66 69 6c 65 20 69 73 20 63 72 65 61  log file is crea
5b20: 74 65 64 2c 20 61 6e 64 20 74 68 65 6e 20 61 0a  ted, and then a.
5b30: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65  #             se
5b40: 63 6f 6e 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  cond connection 
5b50: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  is opened on the
5b60: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
5b70: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 0a 23  it is possible.#
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 20               to 
5b90: 71 75 65 72 79 20 74 68 65 20 64 61 74 61 62 61  query the databa
5ba0: 73 65 20 28 61 6e 64 20 74 68 65 20 76 65 72 79  se (and the very
5bb0: 20 6c 61 72 67 65 20 6c 6f 67 29 20 75 73 69 6e   large log) usin
5bc0: 67 20 74 68 65 0a 23 20 20 20 20 20 20 20 20 20  g the.#         
5bd0: 20 20 20 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65      second conne
5be0: 63 74 69 6f 6e 2e 0a 23 0a 23 20 77 61 6c 2d 31  ction..#.# wal-1
5bf0: 33 2e 34 2e 2a 3a 20 53 61 6d 65 20 74 65 73 74  3.4.*: Same test
5c00: 20 61 73 20 77 61 6c 2d 31 33 2e 33 2e 2a 2e 20   as wal-13.3.*. 
5c10: 45 78 63 65 70 74 20 69 6e 20 74 68 69 73 20 63  Except in this c
5c20: 61 73 65 20 74 68 65 20 73 65 63 6f 6e 64 0a 23  ase the second.#
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
5c40: 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  nection is opene
5c50: 64 20 62 79 20 61 6e 20 65 78 74 65 72 6e 61 6c  d by an external
5c60: 20 70 72 6f 63 65 73 73 2e 0a 23 0a 64 6f 5f 74   process..#.do_t
5c70: 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e 31 20 7b  est wal-13.1.1 {
5c80: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78  .  list [file ex
5c90: 69 73 74 73 20 74 65 73 74 2e 64 62 5d 20 5b 66  ists test.db] [f
5ca0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
5cb0: 64 62 2d 77 61 6c 5d 0a 7d 20 7b 31 20 30 7d 0a  db-wal].} {1 0}.
5cc0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 31  do_test wal-13.1
5cd0: 2e 32 20 7b 0a 20 20 73 65 74 20 66 64 20 5b 6f  .2 {.  set fd [o
5ce0: 70 65 6e 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  pen test.db-wal 
5cf0: 77 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b 65  w].  seek $fd [e
5d00: 78 70 72 20 32 30 30 2a 31 30 32 34 2a 31 30 32  xpr 200*1024*102
5d10: 34 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22 22  4].  puts $fd ""
5d20: 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 73  .  close $fd.  s
5d30: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
5d40: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
5d50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d  LECT * FROM t2 }
5d60: 0a 7d 20 7b 42 20 32 7d 0a 62 72 65 61 6b 70 6f  .} {B 2}.breakpo
5d70: 69 6e 74 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  int.do_test wal-
5d80: 31 33 2e 31 2e 33 20 7b 0a 20 20 64 62 20 63 6c  13.1.3 {.  db cl
5d90: 6f 73 65 0a 20 20 66 69 6c 65 20 65 78 69 73 74  ose.  file exist
5da0: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 7d 20  s test.db-wal.} 
5db0: 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  {0}..do_test wal
5dc0: 2d 31 33 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69  -13.2.1 {.  sqli
5dd0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
5de0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
5df0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
5e00: 74 32 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  t2 }.} {1}.do_te
5e10: 73 74 20 77 61 6c 2d 31 33 2e 32 2e 32 20 7b 0a  st wal-13.2.2 {.
5e20: 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 62 6c    db function bl
5e30: 6f 62 20 62 6c 6f 62 0a 20 20 66 6f 72 20 7b 73  ob blob.  for {s
5e40: 65 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 36  et i 0} {$i < 16
5e50: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
5e60: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
5e70: 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54  T INTO t2 SELECT
5e80: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
5e90: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 20 7d 0a  (400) FROM t2 }.
5ea0: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
5eb0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
5ec0: 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 5b 65 78 70  FROM t2 }.} [exp
5ed0: 72 20 69 6e 74 28 70 6f 77 28 32 2c 20 31 36 29  r int(pow(2, 16)
5ee0: 29 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  )].do_test wal-1
5ef0: 33 2e 32 2e 33 20 7b 0a 20 20 65 78 70 72 20 5b  3.2.3 {.  expr [
5f00: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
5f10: 62 2d 77 61 6c 5d 20 3e 20 5b 77 61 6c 5f 66 69  b-wal] > [wal_fi
5f20: 6c 65 5f 73 69 7a 65 20 33 33 30 30 30 20 31 30  le_size 33000 10
5f30: 32 34 5d 0a 7d 20 31 0a 0a 64 6f 5f 6d 75 6c 74  24].} 1..do_mult
5f40: 69 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20  iclient_test tn 
5f50: 7b 0a 20 20 69 6e 63 72 20 74 6e 20 32 0a 0a 20  {.  incr tn 2.. 
5f60: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e   do_test wal-13.
5f70: 24 74 6e 2e 30 20 7b 0a 20 20 20 20 73 71 6c 31  $tn.0 {.    sql1
5f80: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
5f90: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
5fa0: 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  AL;.      CREATE
5fb0: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
5fc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5fd0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
5fe0: 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20 7d  blob(800);.    }
5ff0: 0a 20 20 20 20 73 71 6c 31 20 7b 20 53 45 4c 45  .    sql1 { SELE
6000: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
6010: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a 20   t1 }.  } {1}.. 
6020: 20 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d 20   for {set ii 1} 
6030: 7b 24 69 69 3c 31 36 7d 20 7b 69 6e 63 72 20 69  {$ii<16} {incr i
6040: 69 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73 74  i} {.    do_test
6050: 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69 2e   wal-13.$tn.$ii.
6060: 61 20 7b 0a 20 20 20 20 20 20 73 71 6c 32 20 7b  a {.      sql2 {
6070: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6080: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
6090: 62 28 38 30 30 29 20 46 52 4f 4d 20 74 31 20 7d  b(800) FROM t1 }
60a0: 0a 20 20 20 20 20 20 73 71 6c 32 20 7b 20 53 45  .      sql2 { SE
60b0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
60c0: 4f 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65  OM t1 }.    } [e
60d0: 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20  xpr (1<<$ii)].  
60e0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33    do_test wal-13
60f0: 2e 24 74 6e 2e 24 69 69 2e 62 20 7b 0a 20 20 20  .$tn.$ii.b {.   
6100: 20 20 20 73 71 6c 31 20 7b 20 53 45 4c 45 43 54     sql1 { SELECT
6110: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
6120: 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72 20  1 }.    } [expr 
6130: 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f  (1<<$ii)].    do
6140: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e  _test wal-13.$tn
6150: 2e 24 69 69 2e 63 20 7b 0a 20 20 20 20 20 20 73  .$ii.c {.      s
6160: 71 6c 31 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  ql1 { SELECT cou
6170: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a  nt(*) FROM t1 }.
6180: 20 20 20 20 7d 20 5b 65 78 70 72 20 28 31 3c 3c      } [expr (1<<
6190: 24 69 69 29 5d 0a 20 20 20 20 64 6f 5f 74 65 73  $ii)].    do_tes
61a0: 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69  t wal-13.$tn.$ii
61b0: 2e 64 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20  .d {.      sql1 
61c0: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
61d0: 74 79 5f 63 68 65 63 6b 20 7d 0a 20 20 20 20 7d  ty_check }.    }
61e0: 20 7b 6f 6b 7d 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d   {ok}.  }.}..#--
61f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6230: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20  -------.# Check 
6240: 61 20 66 75 6e 20 63 6f 72 72 75 70 74 69 6f 6e  a fun corruption
6250: 20 63 61 73 65 20 68 61 73 20 62 65 65 6e 20 66   case has been f
6260: 69 78 65 64 2e 0a 23 0a 23 20 54 68 65 20 70 72  ixed..#.# The pr
6270: 6f 62 6c 65 6d 20 77 61 73 20 74 68 61 74 20 61  oblem was that a
6280: 66 74 65 72 20 70 65 72 66 6f 72 6d 69 6e 67 20  fter performing 
6290: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 75 73 69  a checkpoint usi
62a0: 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  ng a connection.
62b0: 23 20 74 68 61 74 20 68 61 64 20 61 6e 20 6f 75  # that had an ou
62c0: 74 2d 6f 66 2d 64 61 74 65 20 70 61 67 65 72 2d  t-of-date pager-
62d0: 63 61 63 68 65 2c 20 74 68 65 20 6e 65 78 74 20  cache, the next 
62e0: 74 69 6d 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  time the connect
62f0: 69 6f 6e 20 77 61 73 0a 23 20 75 73 65 64 20 69  ion was.# used i
6300: 74 20 64 69 64 20 6e 6f 74 20 72 65 61 6c 69 7a  t did not realiz
6310: 65 20 74 68 65 20 63 61 63 68 65 20 77 61 73 20  e the cache was 
6320: 6f 75 74 2d 6f 66 2d 64 61 74 65 20 61 6e 64 20  out-of-date and 
6330: 70 72 6f 63 65 65 64 65 64 20 74 6f 0a 23 20 6f  proceeded to.# o
6340: 70 65 72 61 74 65 20 77 69 74 68 20 61 6e 20 69  perate with an i
6350: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68  nconsistent cach
6360: 65 2e 20 4c 65 61 64 69 6e 67 20 74 6f 20 63 6f  e. Leading to co
6370: 72 72 75 70 74 69 6f 6e 2e 0a 23 0a 63 61 74 63  rruption..#.catc
6380: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 63  h { db close }.c
6390: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
63a0: 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 33 20 63   }.catch { db3 c
63b0: 6c 6f 73 65 20 7d 0a 66 69 6c 65 20 64 65 6c 65  lose }.file dele
63c0: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  te -force test.d
63d0: 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 73 71  b test.db-wal.sq
63e0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
63f0: 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73  .sqlite3 db2 tes
6400: 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c  t.db.do_test wal
6410: 2d 31 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  -14 {.  execsql 
6420: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  {.    PRAGMA jou
6430: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
6440: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
6450: 45 20 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b  E t1(a PRIMARY K
6460: 45 59 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  EY, b);.    INSE
6470: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
6480: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29  S(randomblob(10)
6490: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
64a0: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
64b0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
64c0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
64d0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52  ndomblob(100) FR
64e0: 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52  OM t1;.    INSER
64f0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
6500: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c   randomblob(10),
6510: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
6520: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
6530: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
6540: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
6550: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
6560: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  00) FROM t1;.  }
6570: 0a 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20 0a  ..  db2 eval { .
6580: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6590: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
65a0: 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d  blob(10), random
65b0: 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49  blob(100);.    I
65c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
65d0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
65e0: 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  10), randomblob(
65f0: 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  100);.    INSERT
6600: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
6610: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20  randomblob(10), 
6620: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b  randomblob(100);
6630: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6640: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
6650: 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f  mblob(10), rando
6660: 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20 7d 0a  mblob(100);.  }.
6670: 0a 20 20 23 20 41 66 74 65 72 20 65 78 65 63 75  .  # After execu
6680: 74 69 6e 67 20 74 68 65 20 22 50 52 41 47 4d 41  ting the "PRAGMA
6690: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22   wal_checkpoint"
66a0: 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62  , connection [db
66b0: 5d 20 77 61 73 20 62 65 69 6e 67 0a 20 20 23 20  ] was being.  # 
66c0: 6c 65 66 74 20 77 69 74 68 20 61 6e 20 69 6e 63  left with an inc
66d0: 6f 6e 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e  onsistent cache.
66e0: 20 52 75 6e 6e 69 6e 67 20 74 68 65 20 43 52 45   Running the CRE
66f0: 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
6700: 65 6e 74 0a 20 20 23 20 69 6e 20 74 68 69 73 20  ent.  # in this 
6710: 73 74 61 74 65 20 6c 65 64 20 74 6f 20 64 61 74  state led to dat
6720: 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
6730: 2e 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 0a  ..  catchsql { .
6740: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
6750: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 43  heckpoint;.    C
6760: 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 6f  REATE INDEX i1 o
6770: 6e 20 74 31 28 62 29 3b 0a 20 20 7d 0a 20 20 20  n t1(b);.  }.   
6780: 0a 20 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52  .  db2 eval { PR
6790: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
67a0: 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 63  heck }.} {ok}..c
67b0: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
67c0: 7d 0a 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c  }.catch { db2 cl
67d0: 6f 73 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  ose }..#--------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6820: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
6830: 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73  g block of tests
6840: 20 2d 20 77 61 6c 2d 31 35 2e 2a 20 2d 20 66 6f   - wal-15.* - fo
6850: 63 75 73 20 6f 6e 20 74 65 73 74 69 6e 67 20 74  cus on testing t
6860: 68 65 20 0a 23 20 69 6d 70 6c 65 6d 65 6e 74 61  he .# implementa
6870: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69  tion of the sqli
6880: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
6890: 6e 74 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  nt() interface..
68a0: 23 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66  #.file delete -f
68b0: 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73  orce test.db tes
68c0: 74 2e 64 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33  t.db-wal.sqlite3
68d0: 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74   db test.db.do_t
68e0: 65 73 74 20 77 61 6c 2d 31 35 2e 31 20 7b 0a 20  est wal-15.1 {. 
68f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
6900: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
6910: 6d 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47 4d  m = 0;.    PRAGM
6920: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
6930: 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  24;.    PRAGMA j
6940: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
6950: 4c 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c  L;.  }.  execsql
6960: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41   {.    CREATE TA
6970: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
6980: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6990: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
69a0: 20 7d 0a 7d 20 7b 7d 0a 0a 23 20 54 65 73 74 20   }.} {}..# Test 
69b0: 74 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69 73  that an error is
69c0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
69d0: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
69e0: 73 20 6e 6f 74 20 72 65 63 6f 67 6e 69 7a 65 64  s not recognized
69f0: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .#.do_test wal-1
6a00: 35 2e 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  5.2.1 {.  sqlite
6a10: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
6a20: 20 64 62 20 61 75 78 0a 7d 20 7b 53 51 4c 49 54   db aux.} {SQLIT
6a30: 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65 73 74  E_ERROR}.do_test
6a40: 20 77 61 6c 2d 31 35 2e 32 2e 32 20 7b 0a 20 20   wal-15.2.2 {.  
6a50: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20  sqlite3_errcode 
6a60: 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52  db.} {SQLITE_ERR
6a70: 4f 52 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  OR}.do_test wal-
6a80: 31 35 2e 32 2e 33 20 7b 0a 20 20 73 71 6c 69 74  15.2.3 {.  sqlit
6a90: 65 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b  e3_errmsg db.} {
6aa0: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
6ab0: 3a 20 61 75 78 7d 0a 0a 23 20 54 65 73 74 20 74  : aux}..# Test t
6ac0: 68 61 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  hat an error is 
6ad0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 6e 20 61  returned if an a
6ae0: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
6af0: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 0a 23 20 69  o checkpoint.# i
6b00: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
6b10: 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64  is open on the d
6b20: 61 74 61 62 61 73 65 2e 0a 23 0a 64 6f 5f 74 65  atabase..#.do_te
6b30: 73 74 20 77 61 6c 2d 31 35 2e 33 2e 31 20 7b 0a  st wal-15.3.1 {.
6b40: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
6b50: 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45 52  BEGIN;.    INSER
6b60: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
6b70: 28 33 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 73 71  (3, 4);.  }.  sq
6b80: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
6b90: 6f 69 6e 74 20 64 62 20 6d 61 69 6e 0a 7d 20 7b  oint db main.} {
6ba0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64  SQLITE_LOCKED}.d
6bb0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 33 2e  o_test wal-15.3.
6bc0: 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72  2 {.  sqlite3_er
6bd0: 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c 49  rcode db.} {SQLI
6be0: 54 45 5f 4c 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65  TE_LOCKED}.do_te
6bf0: 73 74 20 77 61 6c 2d 31 35 2e 33 2e 33 20 7b 0a  st wal-15.3.3 {.
6c00: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
6c10: 20 64 62 0a 7d 20 7b 64 61 74 61 62 61 73 65 20   db.} {database 
6c20: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 7d  table is locked}
6c30: 0a 0a 23 20 45 61 72 6c 69 65 72 20 76 65 72 73  ..# Earlier vers
6c40: 69 6f 6e 73 20 72 65 74 75 72 6e 65 64 20 61 6e  ions returned an
6c50: 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
6c60: 65 64 20 69 66 20 74 68 65 20 64 62 20 63 61 6e  ed if the db can
6c70: 6e 6f 74 20 62 65 20 0a 23 20 63 68 65 63 6b 70  not be .# checkp
6c80: 6f 69 6e 74 65 64 20 62 65 63 61 75 73 65 20 6f  ointed because o
6c90: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
6ca0: 61 6e 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  another connecti
6cb0: 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61 74 0a 23  on. Check that.#
6cc0: 20 74 68 69 73 20 69 73 20 6e 6f 20 6c 6f 6e 67   this is no long
6cd0: 65 72 20 74 68 65 20 63 61 73 65 2e 0a 23 0a 73  er the case..#.s
6ce0: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
6cf0: 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  db.do_test wal-1
6d00: 35 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.4.1 {.  execsq
6d10: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
6d20: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
6d30: 20 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d 20 7b   t1;.  } db2.} {
6d40: 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  1 2}.do_test wal
6d50: 2d 31 35 2e 34 2e 32 20 7b 0a 20 20 65 78 65 63  -15.4.2 {.  exec
6d60: 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20  sql { COMMIT }. 
6d70: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
6d80: 63 6b 70 6f 69 6e 74 20 64 62 0a 7d 20 7b 53 51  ckpoint db.} {SQ
6d90: 4c 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74  LITE_OK}.do_test
6da0: 20 77 61 6c 2d 31 35 2e 34 2e 33 20 7b 0a 20 20   wal-15.4.3 {.  
6db0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64  sqlite3_errmsg d
6dc0: 62 0a 7d 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f  b.} {not an erro
6dd0: 72 7d 0a 0a 23 20 41 66 74 65 72 20 5b 64 62 32  r}..# After [db2
6de0: 5d 20 64 72 6f 70 73 20 69 74 73 20 6c 6f 63 6b  ] drops its lock
6df0: 2c 20 5b 64 62 5d 20 6d 61 79 20 63 68 65 63 6b  , [db] may check
6e00: 70 6f 69 6e 74 20 74 68 65 20 64 62 2e 0a 23 0a  point the db..#.
6e10: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34  do_test wal-15.4
6e20: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
6e30: 20 43 4f 4d 4d 49 54 20 7d 20 64 62 32 0a 20 20   COMMIT } db2.  
6e40: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
6e50: 6b 70 6f 69 6e 74 20 64 62 0a 7d 20 7b 53 51 4c  kpoint db.} {SQL
6e60: 49 54 45 5f 4f 4b 7d 0a 64 6f 5f 74 65 73 74 20  ITE_OK}.do_test 
6e70: 77 61 6c 2d 31 35 2e 34 2e 35 20 7b 0a 20 20 73  wal-15.4.5 {.  s
6e80: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20 64 62  qlite3_errmsg db
6e90: 0a 7d 20 7b 6e 6f 74 20 61 6e 20 65 72 72 6f 72  .} {not an error
6ea0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
6eb0: 2e 34 2e 36 20 7b 0a 20 20 66 69 6c 65 20 73 69  .4.6 {.  file si
6ec0: 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78  ze test.db.} [ex
6ed0: 70 72 20 31 30 32 34 2a 32 5d 0a 0a 63 61 74 63  pr 1024*2]..catc
6ee0: 68 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a  h { db2 close }.
6ef0: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
6f00: 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   }..#-----------
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
6f50: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
6f60: 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20  lock of tests - 
6f70: 77 61 6c 2d 31 36 2e 2a 20 2d 20 74 65 73 74 20  wal-16.* - test 
6f80: 74 68 61 74 20 69 66 20 61 20 4e 55 4c 4c 20 70  that if a NULL p
6f90: 6f 69 6e 74 65 72 20 6f 72 0a 23 20 61 6e 20 65  ointer or.# an e
6fa0: 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 70  mpty string is p
6fb0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
6fc0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f 66 20  ond argument of 
6fd0: 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  the wal_checkpoi
6fe0: 6e 74 28 29 0a 23 20 41 50 49 2c 20 61 6e 20 61  nt().# API, an a
6ff0: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
7000: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6c 6c  o checkpoint all
7010: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
7020: 73 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 7b  ses..#.foreach {
7030: 74 6e 20 63 6b 70 74 5f 63 6d 64 20 63 6b 70 74  tn ckpt_cmd ckpt
7040: 5f 72 65 73 20 63 6b 70 74 5f 6d 61 69 6e 20 63  _res ckpt_main c
7050: 6b 70 74 5f 61 75 78 7d 20 7b 0a 20 20 31 20 7b  kpt_aux} {.  1 {
7060: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
7070: 6b 70 6f 69 6e 74 20 64 62 7d 20 20 20 20 20 20  kpoint db}      
7080: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
7090: 4b 20 20 20 20 20 31 20 31 0a 20 20 32 20 7b 73  K     1 1.  2 {s
70a0: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
70b0: 70 6f 69 6e 74 20 64 62 20 22 22 7d 20 20 20 20  point db ""}    
70c0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b         SQLITE_OK
70d0: 20 20 20 20 20 31 20 31 0a 20 20 33 20 7b 64 62       1 1.  3 {db
70e0: 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 77 61   eval "PRAGMA wa
70f0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20  l_checkpoint"}  
7100: 20 20 20 20 20 20 7b 30 20 31 30 20 31 30 7d 20        {0 10 10} 
7110: 20 20 20 20 31 20 31 0a 0a 20 20 34 20 7b 73 71      1 1..  4 {sq
7120: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
7130: 6f 69 6e 74 20 64 62 20 6d 61 69 6e 7d 20 20 20  oint db main}   
7140: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20        SQLITE_OK 
7150: 20 20 20 20 31 20 30 0a 20 20 35 20 7b 73 71 6c      1 0.  5 {sql
7160: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
7170: 69 6e 74 20 64 62 20 61 75 78 7d 20 20 20 20 20  int db aux}     
7180: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20       SQLITE_OK  
7190: 20 20 20 30 20 31 0a 20 20 36 20 7b 73 71 6c 69     0 1.  6 {sqli
71a0: 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
71b0: 6e 74 20 64 62 20 74 65 6d 70 7d 20 20 20 20 20  nt db temp}     
71c0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20      SQLITE_OK   
71d0: 20 20 30 20 30 0a 20 20 37 20 7b 64 62 20 65 76    0 0.  7 {db ev
71e0: 61 6c 20 22 50 52 41 47 4d 41 20 6d 61 69 6e 2e  al "PRAGMA main.
71f0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d  wal_checkpoint"}
7200: 20 20 20 7b 30 20 31 30 20 31 30 7d 20 20 20 20     {0 10 10}    
7210: 20 31 20 30 0a 20 20 38 20 7b 64 62 20 65 76 61   1 0.  8 {db eva
7220: 6c 20 22 50 52 41 47 4d 41 20 61 75 78 2e 77 61  l "PRAGMA aux.wa
7230: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20  l_checkpoint"}  
7240: 20 20 7b 30 20 31 36 20 31 36 7d 20 20 20 20 20    {0 16 16}     
7250: 30 20 31 0a 20 20 39 20 7b 64 62 20 65 76 61 6c  0 1.  9 {db eval
7260: 20 22 50 52 41 47 4d 41 20 74 65 6d 70 2e 77 61   "PRAGMA temp.wa
7270: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 7d 20 20  l_checkpoint"}  
7280: 20 7b 30 20 2d 31 20 2d 31 7d 20 20 20 20 20 30   {0 -1 -1}     0
7290: 20 30 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74   0.} {.  do_test
72a0: 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 31 20 7b 0a   wal-16.$tn.1 {.
72b0: 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20      file delete 
72c0: 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 20  -force test2.db 
72d0: 74 65 73 74 32 2e 64 62 2d 77 61 6c 20 74 65 73  test2.db-wal tes
72e0: 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  t2.db-journal.  
72f0: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66    file delete -f
7300: 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73  orce test.db tes
7310: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  t.db-wal test.db
7320: 2d 6a 6f 75 72 6e 61 6c 0a 0a 20 20 20 20 73 71  -journal..    sq
7330: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
7340: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
7350: 20 20 20 20 20 41 54 54 41 43 48 20 27 74 65 73       ATTACH 'tes
7360: 74 32 2e 64 62 27 20 41 53 20 61 75 78 3b 0a 20  t2.db' AS aux;. 
7370: 20 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e       PRAGMA main
7380: 2e 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30  .auto_vacuum = 0
7390: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
73a0: 75 78 2e 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d  ux.auto_vacuum =
73b0: 20 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41   0;.      PRAGMA
73c0: 20 6d 61 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f   main.journal_mo
73d0: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20  de = WAL;.      
73e0: 50 52 41 47 4d 41 20 61 75 78 2e 6a 6f 75 72 6e  PRAGMA aux.journ
73f0: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
7400: 20 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63       PRAGMA sync
7410: 68 72 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c  hronous = NORMAL
7420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61 6c  ;.    }.  } {wal
7430: 20 77 61 6c 7d 0a 0a 20 20 64 6f 5f 74 65 73 74   wal}..  do_test
7440: 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 32 20 7b 0a   wal-16.$tn.2 {.
7450: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
7460: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
7470: 20 6d 61 69 6e 2e 74 31 28 61 2c 20 62 2c 20 50   main.t1(a, b, P
7480: 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29  RIMARY KEY(a, b)
7490: 29 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  );.      CREATE 
74a0: 54 41 42 4c 45 20 61 75 78 2e 74 32 28 61 2c 20  TABLE aux.t2(a, 
74b0: 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 61  b, PRIMARY KEY(a
74c0: 2c 20 62 29 29 3b 0a 0a 20 20 20 20 20 20 49 4e  , b));..      IN
74d0: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
74e0: 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f  UES(1, randomblo
74f0: 62 28 31 30 30 30 29 29 3b 0a 20 20 20 20 20 20  b(1000));.      
7500: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
7510: 41 4c 55 45 53 28 32 2c 20 72 61 6e 64 6f 6d 62  ALUES(2, randomb
7520: 6c 6f 62 28 31 30 30 30 29 29 3b 0a 20 20 20 20  lob(1000));.    
7530: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7540: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
7550: 32 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  2;.    }.  .    
7560: 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20  list [file size 
7570: 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73  test.db] [file s
7580: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
7590: 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72  .  } [list [expr
75a0: 20 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69   1*1024] [wal_fi
75b0: 6c 65 5f 73 69 7a 65 20 31 30 20 31 30 32 34 5d  le_size 10 1024]
75c0: 5d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ].  do_test wal-
75d0: 31 36 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 6c  16.$tn.3 {.    l
75e0: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
75f0: 65 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20 73  est2.db] [file s
7600: 69 7a 65 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  ize test2.db-wal
7610: 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78 70  ].  } [list [exp
7620: 72 20 31 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66  r 1*1024] [wal_f
7630: 69 6c 65 5f 73 69 7a 65 20 31 36 20 31 30 32 34  ile_size 16 1024
7640: 5d 5d 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20  ]].  .  do_test 
7650: 77 61 6c 2d 31 36 2e 24 74 6e 2e 34 20 5b 6c 69  wal-16.$tn.4 [li
7660: 73 74 20 65 76 61 6c 20 24 63 6b 70 74 5f 63 6d  st eval $ckpt_cm
7670: 64 5d 20 24 63 6b 70 74 5f 72 65 73 0a 20 20 0a  d] $ckpt_res.  .
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 35 20 7b 0a 20 20 20 20 6c 69 73  .$tn.5 {.    lis
76a0: 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  t [file size tes
76b0: 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65  t.db] [file size
76c0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20   test.db-wal].  
76d0: 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 28 24  } [list [expr ($
76e0: 63 6b 70 74 5f 6d 61 69 6e 20 3f 20 37 20 3a 20  ckpt_main ? 7 : 
76f0: 31 29 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69  1)*1024] [wal_fi
7700: 6c 65 5f 73 69 7a 65 20 31 30 20 31 30 32 34 5d  le_size 10 1024]
7710: 5d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  ]..  do_test wal
7720: 2d 31 36 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20  -16.$tn.6 {.    
7730: 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20  list [file size 
7740: 74 65 73 74 32 2e 64 62 5d 20 5b 66 69 6c 65 20  test2.db] [file 
7750: 73 69 7a 65 20 74 65 73 74 32 2e 64 62 2d 77 61  size test2.db-wa
7760: 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78  l].  } [list [ex
7770: 70 72 20 28 24 63 6b 70 74 5f 61 75 78 20 3f 20  pr ($ckpt_aux ? 
7780: 37 20 3a 20 31 29 2a 31 30 32 34 5d 20 5b 77 61  7 : 1)*1024] [wa
7790: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 36 20 31  l_file_size 16 1
77a0: 30 32 34 5d 5d 0a 0a 20 20 63 61 74 63 68 20 7b  024]]..  catch {
77b0: 20 64 62 20 63 6c 6f 73 65 20 7d 0a 7d 0a 0a 23   db close }.}..#
77c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
7810: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73 20  following tests 
7820: 2d 20 77 61 6c 2d 31 37 2e 2a 20 2d 20 61 74 74  - wal-17.* - att
7830: 65 6d 70 74 20 74 6f 20 76 65 72 69 66 79 20 74  empt to verify t
7840: 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a  hat the correct.
7850: 23 20 6e 75 6d 62 65 72 20 6f 66 20 22 70 61 64  # number of "pad
7860: 64 69 6e 67 22 20 66 72 61 6d 65 73 20 61 72 65  ding" frames are
7870: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
7880: 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
7890: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 23 20 69   transaction.# i
78a0: 73 20 63 6f 6d 6d 69 74 74 65 64 20 69 6e 20 73  s committed in s
78b0: 79 6e 63 68 72 6f 6e 6f 75 73 3d 46 55 4c 4c 20  ynchronous=FULL 
78c0: 6d 6f 64 65 2e 0a 23 20 0a 23 20 44 6f 20 74 68  mode..# .# Do th
78d0: 69 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  is by creating a
78e0: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 75   database that u
78f0: 73 65 73 20 35 31 32 20 62 79 74 65 20 70 61 67  ses 512 byte pag
7900: 65 73 2e 20 54 68 65 6e 20 77 72 69 74 69 6e 67  es. Then writing
7910: 0a 23 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  .# a transaction
7920: 20 74 68 61 74 20 6d 6f 64 69 66 69 65 73 20 31   that modifies 1
7930: 37 31 20 70 61 67 65 73 2e 20 49 6e 20 73 79 6e  71 pages. In syn
7940: 63 68 72 6f 6e 6f 75 73 3d 4e 4f 52 4d 41 4c 20  chronous=NORMAL 
7950: 6d 6f 64 65 2c 20 74 68 69 73 0a 23 20 70 72 6f  mode, this.# pro
7960: 64 75 63 65 73 20 61 20 6c 6f 67 20 66 69 6c 65  duces a log file
7970: 20 6f 66 3a 0a 23 0a 23 20 20 20 33 32 20 2b 20   of:.#.#   32 + 
7980: 28 32 34 2b 35 31 32 29 2a 31 37 31 20 3d 20 39  (24+512)*171 = 9
7990: 30 33 31 32 20 62 79 74 65 73 2e 0a 23 0a 23 20  0312 bytes..#.# 
79a0: 53 6c 69 67 68 74 6c 79 20 6c 61 72 67 65 72 20  Slightly larger 
79b0: 74 68 61 6e 20 31 31 2a 38 31 39 32 20 3d 20 39  than 11*8192 = 9
79c0: 30 31 31 32 20 62 79 74 65 73 2e 0a 23 0a 23 20  0112 bytes..#.# 
79d0: 52 75 6e 20 74 68 65 20 74 65 73 74 20 75 73 69  Run the test usi
79e0: 6e 67 20 76 61 72 69 6f 75 73 20 64 69 66 66 65  ng various diffe
79f0: 72 65 6e 74 20 73 65 63 74 6f 72 2d 73 69 7a 65  rent sector-size
7a00: 73 2e 20 49 6e 20 65 61 63 68 20 63 61 73 65 2c  s. In each case,
7a10: 20 74 68 65 0a 23 20 57 41 4c 20 63 6f 64 65 20   the.# WAL code 
7a20: 73 68 6f 75 6c 64 20 77 72 69 74 65 20 74 68 65  should write the
7a30: 20 39 30 33 30 30 20 62 79 74 65 73 20 6f 66 20   90300 bytes of 
7a40: 6c 6f 67 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  log file contain
7a50: 69 6e 67 20 74 68 65 20 0a 23 20 74 72 61 6e 73  ing the .# trans
7a60: 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 70 70  action, then app
7a70: 65 6e 64 20 61 73 20 6d 61 79 20 66 72 61 6d 65  end as may frame
7a80: 73 20 61 73 20 61 72 65 20 72 65 71 75 69 72 65  s as are require
7a90: 64 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 0a  d to extend the.
7aa0: 23 20 6c 6f 67 20 66 69 6c 65 20 73 6f 20 74 68  # log file so th
7ab0: 61 74 20 6e 6f 20 70 61 72 74 20 6f 66 20 74 68  at no part of th
7ac0: 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69  e next transacti
7ad0: 6f 6e 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74  on will be writt
7ae0: 65 6e 20 69 6e 74 6f 0a 23 20 61 20 64 69 73 6b  en into.# a disk
7af0: 2d 73 65 63 74 6f 72 20 75 73 65 64 20 62 79 20  -sector used by 
7b00: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 75 73 74  transaction just
7b10: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 23 0a 73 65   committed..#.se
7b20: 74 20 6f 6c 64 5f 70 65 6e 64 69 6e 67 5f 62 79  t old_pending_by
7b30: 74 65 20 5b 73 71 6c 69 74 65 33 5f 74 65 73 74  te [sqlite3_test
7b40: 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67  _control_pending
7b50: 5f 62 79 74 65 20 30 78 31 30 30 30 30 30 30 30  _byte 0x10000000
7b60: 5d 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f  ].catch { db clo
7b70: 73 65 20 7d 0a 66 6f 72 65 61 63 68 20 7b 74 6e  se }.foreach {tn
7b80: 20 73 65 63 74 6f 72 73 69 7a 65 20 6c 6f 67 73   sectorsize logs
7b90: 69 7a 65 7d 20 22 0a 20 20 31 20 20 20 31 32 38  ize} ".  1   128
7ba0: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
7bb0: 20 31 37 32 20 35 31 32 5d 0a 20 20 32 20 20 20   172 512].  2   
7bc0: 32 35 36 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  256  [wal_file_s
7bd0: 69 7a 65 20 31 37 32 20 35 31 32 5d 0a 20 20 33  ize 172 512].  3
7be0: 20 20 20 35 31 32 20 20 5b 77 61 6c 5f 66 69 6c     512  [wal_fil
7bf0: 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d 20  e_size 172 512] 
7c00: 0a 20 20 34 20 20 31 30 32 34 20 20 5b 77 61 6c  .  4  1024  [wal
7c10: 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35  _file_size 172 5
7c20: 31 32 5d 0a 20 20 35 20 20 32 30 34 38 20 20 5b  12].  5  2048  [
7c30: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37  wal_file_size 17
7c40: 32 20 35 31 32 5d 0a 20 20 36 20 20 34 30 39 36  2 512].  6  4096
7c50: 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65    [wal_file_size
7c60: 20 31 37 36 20 35 31 32 5d 0a 20 20 37 20 20 38   176 512].  7  8
7c70: 31 39 32 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73  192  [wal_file_s
7c80: 69 7a 65 20 31 38 34 20 35 31 32 5d 0a 22 20 7b  ize 184 512]." {
7c90: 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  .  file delete -
7ca0: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
7cb0: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64  st.db-wal test.d
7cc0: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69  b-journal.  sqli
7cd0: 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76  te3_simulate_dev
7ce0: 69 63 65 20 2d 73 65 63 74 6f 72 73 69 7a 65 20  ice -sectorsize 
7cf0: 24 73 65 63 74 6f 72 73 69 7a 65 0a 20 20 73 71  $sectorsize.  sq
7d00: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
7d10: 20 2d 76 66 73 20 64 65 76 73 79 6d 0a 0a 20 20   -vfs devsym..  
7d20: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 37 2e 24  do_test wal-17.$
7d30: 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.1 {.    execs
7d40: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
7d50: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
7d60: 30 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  0;.      PRAGMA 
7d70: 70 61 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b  page_size = 512;
7d80: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
7d90: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
7da0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73  ;.      PRAGMA s
7db0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
7dc0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  L;.    }.    exe
7dd0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47  csql {.      BEG
7de0: 49 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45  IN;.      CREATE
7df0: 20 54 41 42 4c 45 20 74 28 78 29 3b 0a 20 20 20   TABLE t(x);.   
7e00: 20 7d 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20   }.    for {set 
7e10: 69 20 30 7d 20 7b 24 69 3c 31 36 36 7d 20 7b 69  i 0} {$i<166} {i
7e20: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 65  ncr i} {.      e
7e30: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
7e40: 49 4e 54 4f 20 74 20 56 41 4c 55 45 53 28 72 61  INTO t VALUES(ra
7e50: 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 20 7d  ndomblob(400)) }
7e60: 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73  .    }.    execs
7e70: 71 6c 20 43 4f 4d 4d 49 54 0a 0a 20 20 20 20 66  ql COMMIT..    f
7e80: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
7e90: 2d 77 61 6c 0a 20 20 7d 20 24 6c 6f 67 73 69 7a  -wal.  } $logsiz
7ea0: 65 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  e..  do_test wal
7eb0: 2d 31 37 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  -17.$tn.2 {.    
7ec0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7ed0: 62 0a 20 20 7d 20 35 31 32 0a 0a 20 20 64 6f 5f  b.  } 512..  do_
7ee0: 74 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e  test wal-17.$tn.
7ef0: 33 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65  3 {.    db close
7f00: 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74  .    file size t
7f10: 65 73 74 2e 64 62 0a 20 20 7d 20 5b 65 78 70 72  est.db.  } [expr
7f20: 20 35 31 32 2a 31 37 31 5d 0a 7d 0a 73 71 6c 69   512*171].}.sqli
7f30: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
7f40: 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 24 6f  _pending_byte $o
7f50: 6c 64 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 0a  ld_pending_byte.
7f60: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
7fb0: 69 73 20 74 65 73 74 20 2d 20 77 61 6c 2d 31 38  is test - wal-18
7fc0: 2e 2a 20 2d 20 76 65 72 69 66 69 65 73 20 61 20  .* - verifies a 
7fd0: 63 6f 75 70 6c 65 20 6f 66 20 73 70 65 63 69 66  couple of specif
7fe0: 69 63 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  ic conditions th
7ff0: 61 74 0a 23 20 6d 61 79 20 62 65 20 65 6e 63 6f  at.# may be enco
8000: 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 72 65  untered while re
8010: 63 6f 76 65 72 69 6e 67 20 61 20 6c 6f 67 20 66  covering a log f
8020: 69 6c 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ile are handled 
8030: 63 6f 72 72 65 63 74 6c 79 3a 0a 23 0a 23 20 20  correctly:.#.#  
8040: 20 77 61 6c 2d 31 38 2e 31 2e 2a 20 57 68 65 6e   wal-18.1.* When
8050: 20 74 68 65 20 66 69 72 73 74 20 33 32 2d 62 69   the first 32-bi
8060: 74 73 20 6f 66 20 61 20 66 72 61 6d 65 20 63 68  ts of a frame ch
8070: 65 63 6b 73 75 6d 20 69 73 20 63 6f 72 72 65 63  ecksum is correc
8080: 74 20 62 75 74 20 0a 23 20 20 20 20 20 20 20 20  t but .#        
8090: 20 20 20 20 20 20 74 68 65 20 73 65 63 6f 6e 64        the second
80a0: 20 33 32 2d 62 69 74 73 20 61 72 65 20 66 61 6c   32-bits are fal
80b0: 73 65 2c 20 61 6e 64 0a 23 0a 23 20 20 20 77 61  se, and.#.#   wa
80c0: 6c 2d 31 38 2e 32 2e 2a 20 57 68 65 6e 20 74 68  l-18.2.* When th
80d0: 65 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c  e page-size fiel
80e0: 64 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  d that occurs at
80f0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
8100: 6c 6f 67 0a 23 20 20 20 20 20 20 20 20 20 20 20  log.#           
8110: 20 20 20 66 69 6c 65 20 69 73 20 61 20 70 6f 77     file is a pow
8120: 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20  er of 2 greater 
8130: 74 68 61 6e 20 31 36 33 38 34 20 6f 72 20 73 6d  than 16384 or sm
8140: 61 6c 6c 65 72 20 74 68 61 6e 20 35 31 32 2e 0a  aller than 512..
8150: 23 0a 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66  #.file delete -f
8160: 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73  orce test.db tes
8170: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62  t.db-wal test.db
8180: 2d 6a 6f 75 72 6e 61 6c 0a 64 6f 5f 74 65 73 74  -journal.do_test
8190: 20 77 61 6c 2d 31 38 2e 30 20 7b 0a 20 20 73 71   wal-18.0 {.  sq
81a0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
81b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
81c0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
81d0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50 52  e = 1024;.    PR
81e0: 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d  AGMA auto_vacuum
81f0: 20 3d 20 30 3b 0a 20 20 20 20 50 52 41 47 4d 41   = 0;.    PRAGMA
8200: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
8210: 57 41 4c 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  WAL;.    PRAGMA 
8220: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46  synchronous = OF
8230: 46 3b 0a 0a 20 20 20 20 43 52 45 41 54 45 20 54  F;..    CREATE T
8240: 41 42 4c 45 20 74 31 28 61 2c 20 62 2c 20 55 4e  ABLE t1(a, b, UN
8250: 49 51 55 45 28 61 2c 20 62 29 29 3b 0a 20 20 20  IQUE(a, b));.   
8260: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
8270: 56 41 4c 55 45 53 28 30 2c 20 30 29 3b 0a 20 20  VALUES(0, 0);.  
8280: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
8290: 63 6b 70 6f 69 6e 74 3b 0a 0a 20 20 20 20 49 4e  ckpoint;..    IN
82a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
82b0: 55 45 53 28 31 2c 20 32 29 3b 20 20 20 20 20 20  UES(1, 2);      
82c0: 20 20 20 20 2d 2d 20 66 72 61 6d 65 73 20 31 20      -- frames 1 
82d0: 61 6e 64 20 32 0a 20 20 20 20 49 4e 53 45 52 54  and 2.    INSERT
82e0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
82f0: 33 2c 20 34 29 3b 20 20 20 20 20 20 20 20 20 20  3, 4);          
8300: 2d 2d 20 66 72 61 6d 65 73 20 33 20 61 6e 64 20  -- frames 3 and 
8310: 34 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  4.    INSERT INT
8320: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36  O t1 VALUES(5, 6
8330: 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20 66  );          -- f
8340: 72 61 6d 65 73 20 35 20 61 6e 64 20 36 0a 20 20  rames 5 and 6.  
8350: 7d 0a 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d  }..  file copy -
8360: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
8370: 73 74 58 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f  stX.db.  file co
8380: 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  py -force test.d
8390: 62 2d 77 61 6c 20 74 65 73 74 58 2e 64 62 2d 77  b-wal testX.db-w
83a0: 61 6c 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20  al.  db close.  
83b0: 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20  list [file size 
83c0: 74 65 73 74 58 2e 64 62 5d 20 5b 66 69 6c 65 20  testX.db] [file 
83d0: 73 69 7a 65 20 74 65 73 74 58 2e 64 62 2d 77 61  size testX.db-wa
83e0: 6c 5d 0a 7d 20 5b 6c 69 73 74 20 5b 65 78 70 72  l].} [list [expr
83f0: 20 33 2a 31 30 32 34 5d 20 5b 77 61 6c 5f 66 69   3*1024] [wal_fi
8400: 6c 65 5f 73 69 7a 65 20 36 20 31 30 32 34 5d 5d  le_size 6 1024]]
8410: 0a 0a 75 6e 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c  ..unset -nocompl
8420: 61 69 6e 20 6e 46 72 61 6d 65 20 72 65 73 75 6c  ain nFrame resul
8430: 74 0a 66 6f 72 65 61 63 68 20 7b 6e 46 72 61 6d  t.foreach {nFram
8440: 65 20 72 65 73 75 6c 74 7d 20 7b 0a 20 20 20 20  e result} {.    
8450: 20 20 20 20 20 30 20 20 20 20 20 20 7b 30 20 30       0      {0 0
8460: 7d 0a 20 20 20 20 20 20 20 20 20 31 20 20 20 20  }.         1    
8470: 20 20 7b 30 20 30 7d 0a 20 20 20 20 20 20 20 20    {0 0}.        
8480: 20 32 20 20 20 20 20 20 7b 30 20 30 20 31 20 32   2      {0 0 1 2
8490: 7d 0a 20 20 20 20 20 20 20 20 20 33 20 20 20 20  }.         3    
84a0: 20 20 7b 30 20 30 20 31 20 32 7d 0a 20 20 20 20    {0 0 1 2}.    
84b0: 20 20 20 20 20 34 20 20 20 20 20 20 7b 30 20 30       4      {0 0
84c0: 20 31 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20   1 2 3 4}.      
84d0: 20 20 20 35 20 20 20 20 20 20 7b 30 20 30 20 31     5      {0 0 1
84e0: 20 32 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20   2 3 4}.        
84f0: 20 36 20 20 20 20 20 20 7b 30 20 30 20 31 20 32   6      {0 0 1 2
8500: 20 33 20 34 20 35 20 36 7d 0a 7d 20 7b 0a 20 20   3 4 5 6}.} {.  
8510: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 31  do_test wal-18.1
8520: 2e 24 6e 46 72 61 6d 65 20 7b 0a 20 20 20 20 66  .$nFrame {.    f
8530: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
8540: 74 65 73 74 58 2e 64 62 20 74 65 73 74 2e 64 62  testX.db test.db
8550: 0a 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d  .    file copy -
8560: 66 6f 72 63 65 20 74 65 73 74 58 2e 64 62 2d 77  force testX.db-w
8570: 61 6c 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 0a  al test.db-wal..
8580: 20 20 20 20 68 65 78 69 6f 5f 77 72 69 74 65 20      hexio_write 
8590: 74 65 73 74 2e 64 62 2d 77 61 6c 20 5b 65 78 70  test.db-wal [exp
85a0: 72 20 32 34 20 2b 20 24 6e 46 72 61 6d 65 2a 28  r 24 + $nFrame*(
85b0: 32 34 2b 31 30 32 34 29 20 2b 20 32 30 5d 20 30  24+1024) + 20] 0
85c0: 30 30 30 30 30 30 30 0a 0a 20 20 20 20 73 71 6c  0000000..    sql
85d0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
85e0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20      execsql { . 
85f0: 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52       SELECT * FR
8600: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 50 52 41  OM t1;.      PRA
8610: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
8620: 65 63 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 7d 20  eck; .    }.  } 
8630: 5b 63 6f 6e 63 61 74 20 24 72 65 73 75 6c 74 20  [concat $result 
8640: 6f 6b 5d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d  ok].  db close.}
8650: 20 0a 0a 70 72 6f 63 20 72 61 6e 64 6f 6d 62 6c   ..proc randombl
8660: 6f 62 20 7b 70 67 73 7a 7d 20 7b 0a 20 20 73 71  ob {pgsz} {.  sq
8670: 6c 69 74 65 33 20 72 62 64 62 20 3a 6d 65 6d 6f  lite3 rbdb :memo
8680: 72 79 3a 0a 20 20 73 65 74 20 62 6c 6f 62 20 5b  ry:.  set blob [
8690: 72 62 64 62 20 6f 6e 65 20 7b 53 45 4c 45 43 54  rbdb one {SELECT
86a0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 24 70 67 73   randomblob($pgs
86b0: 7a 29 7d 5d 0a 20 20 72 62 64 62 20 63 6c 6f 73  z)}].  rbdb clos
86c0: 65 0a 20 20 73 65 74 20 62 6c 6f 62 0a 7d 0a 0a  e.  set blob.}..
86d0: 70 72 6f 63 20 6c 6f 67 63 6b 73 75 6d 20 7b 63  proc logcksum {c
86e0: 6b 76 31 20 63 6b 76 32 20 62 6c 6f 62 7d 20 7b  kv1 ckv2 blob} {
86f0: 0a 20 20 75 70 76 61 72 20 24 63 6b 76 31 20 63  .  upvar $ckv1 c
8700: 31 0a 20 20 75 70 76 61 72 20 24 63 6b 76 32 20  1.  upvar $ckv2 
8710: 63 32 0a 0a 20 20 73 65 74 20 73 63 61 6e 70 61  c2..  set scanpa
8720: 74 74 65 72 6e 20 49 2a 0a 20 20 69 66 20 7b 24  ttern I*.  if {$
8730: 3a 3a 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 62  ::tcl_platform(b
8740: 79 74 65 4f 72 64 65 72 29 20 65 71 20 22 6c 69  yteOrder) eq "li
8750: 74 74 6c 65 45 6e 64 69 61 6e 22 7d 20 7b 0a 20  ttleEndian"} {. 
8760: 20 20 20 73 65 74 20 73 63 61 6e 70 61 74 74 65     set scanpatte
8770: 72 6e 20 69 2a 0a 20 20 7d 0a 0a 20 20 62 69 6e  rn i*.  }..  bin
8780: 61 72 79 20 73 63 61 6e 20 24 62 6c 6f 62 20 24  ary scan $blob $
8790: 73 63 61 6e 70 61 74 74 65 72 6e 20 76 61 6c 75  scanpattern valu
87a0: 65 73 0a 20 20 66 6f 72 65 61 63 68 20 7b 76 31  es.  foreach {v1
87b0: 20 76 32 7d 20 24 76 61 6c 75 65 73 20 7b 0a 20   v2} $values {. 
87c0: 20 20 20 73 65 74 20 63 31 20 5b 65 78 70 72 20     set c1 [expr 
87d0: 7b 28 24 63 31 20 2b 20 24 76 31 20 2b 20 24 63  {($c1 + $v1 + $c
87e0: 32 29 26 30 78 46 46 46 46 46 46 46 46 7d 5d 0a  2)&0xFFFFFFFF}].
87f0: 20 20 20 20 73 65 74 20 63 32 20 5b 65 78 70 72      set c2 [expr
8800: 20 7b 28 24 63 32 20 2b 20 24 76 32 20 2b 20 24   {($c2 + $v2 + $
8810: 63 31 29 26 30 78 46 46 46 46 46 46 46 46 7d 5d  c1)&0xFFFFFFFF}]
8820: 0a 20 20 7d 0a 7d 0a 0a 66 69 6c 65 20 63 6f 70  .  }.}..file cop
8830: 79 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  y -force test.db
8840: 20 74 65 73 74 58 2e 64 62 0a 66 6f 72 65 61 63   testX.db.foreac
8850: 68 20 7b 74 6e 20 70 67 73 7a 20 77 6f 72 6b 73  h {tn pgsz works
8860: 7d 20 7b 20 0a 20 20 31 20 20 20 20 31 32 38 20  } { .  1    128 
8870: 20 20 20 30 0a 20 20 32 20 20 20 20 32 35 36 20     0.  2    256 
8880: 20 20 20 30 0a 20 20 33 20 20 20 20 35 31 32 20     0.  3    512 
8890: 20 20 20 31 0a 20 20 34 20 20 20 31 30 32 34 20     1.  4   1024 
88a0: 20 20 20 31 0a 20 20 35 20 20 20 32 30 34 38 20     1.  5   2048 
88b0: 20 20 20 31 0a 20 20 36 20 20 20 34 30 39 36 20     1.  6   4096 
88c0: 20 20 20 31 0a 20 20 37 20 20 20 38 31 39 32 20     1.  7   8192 
88d0: 20 20 20 31 0a 20 20 38 20 20 31 36 33 38 34 20     1.  8  16384 
88e0: 20 20 20 31 0a 20 20 39 20 20 33 32 37 36 38 20     1.  9  32768 
88f0: 20 20 20 31 0a 20 31 30 20 20 36 35 35 33 36 20     1. 10  65536 
8900: 20 20 20 31 0a 20 31 31 20 31 33 31 30 37 32 20     1. 11 131072 
8910: 20 20 20 30 0a 20 31 31 20 20 20 31 30 31 36 20     0. 11   1016 
8920: 20 20 20 30 0a 7d 20 7b 0a 0a 20 20 69 66 20 7b     0.} {..  if {
8930: 24 3a 3a 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  $::SQLITE_MAX_PA
8940: 47 45 5f 53 49 5a 45 20 3c 20 24 70 67 73 7a 7d  GE_SIZE < $pgsz}
8950: 20 7b 0a 20 20 20 20 73 65 74 20 77 6f 72 6b 73   {.    set works
8960: 20 30 0a 20 20 7d 0a 0a 20 20 66 6f 72 20 7b 73   0.  }..  for {s
8970: 65 74 20 70 67 20 31 7d 20 7b 24 70 67 20 3c 3d  et pg 1} {$pg <=
8980: 20 33 7d 20 7b 69 6e 63 72 20 70 67 7d 20 7b 0a   3} {incr pg} {.
8990: 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66      file copy -f
89a0: 6f 72 63 65 20 74 65 73 74 58 2e 64 62 20 74 65  orce testX.db te
89b0: 73 74 2e 64 62 0a 20 20 20 20 66 69 6c 65 20 64  st.db.    file d
89c0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
89d0: 74 2e 64 62 2d 77 61 6c 0a 20 20 0a 20 20 20 20  t.db-wal.  .    
89e0: 23 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  # Check that the
89f0: 20 64 61 74 61 62 61 73 65 20 6e 6f 77 20 65 78   database now ex
8a00: 69 73 74 73 20 61 6e 64 20 63 6f 6e 73 69 73 74  ists and consist
8a10: 73 20 6f 66 20 74 68 72 65 65 20 70 61 67 65 73  s of three pages
8a20: 2e 20 41 6e 64 0a 20 20 20 20 23 20 74 68 61 74  . And.    # that
8a30: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 61 73 73   there is no ass
8a40: 6f 63 69 61 74 65 64 20 77 61 6c 20 66 69 6c 65  ociated wal file
8a50: 2e 0a 20 20 20 20 23 0a 20 20 20 20 64 6f 5f 74  ..    #.    do_t
8a60: 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e  est wal-18.2.$tn
8a70: 2e 24 70 67 2e 31 20 7b 20 66 69 6c 65 20 65 78  .$pg.1 { file ex
8a80: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
8a90: 20 7d 20 30 0a 20 20 20 20 64 6f 5f 74 65 73 74   } 0.    do_test
8aa0: 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70   wal-18.2.$tn.$p
8ab0: 67 2e 32 20 7b 20 66 69 6c 65 20 65 78 69 73 74  g.2 { file exist
8ac0: 73 20 74 65 73 74 2e 64 62 20 7d 20 31 0a 20 20  s test.db } 1.  
8ad0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38    do_test wal-18
8ae0: 2e 32 2e 24 74 6e 2e 24 70 67 2e 33 20 7b 20 66  .2.$tn.$pg.3 { f
8af0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
8b00: 20 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 33 5d   } [expr 1024*3]
8b10: 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  .  .    do_test 
8b20: 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67  wal-18.2.$tn.$pg
8b30: 2e 34 20 7b 0a 0a 20 20 20 20 20 20 23 20 43 72  .4 {..      # Cr
8b40: 65 61 74 65 20 61 20 77 61 6c 20 66 69 6c 65 20  eate a wal file 
8b50: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
8b60: 73 69 6e 67 6c 65 20 66 72 61 6d 65 20 28 64 61  single frame (da
8b70: 74 61 62 61 73 65 20 70 61 67 65 0a 20 20 20 20  tabase page.    
8b80: 20 20 23 20 6e 75 6d 62 65 72 20 24 70 67 29 20    # number $pg) 
8b90: 77 69 74 68 20 74 68 65 20 63 6f 6d 6d 69 74 20  with the commit 
8ba0: 66 6c 61 67 20 73 65 74 2e 20 54 68 65 20 66 72  flag set. The fr
8bb0: 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69 73 0a  ame checksum is.
8bc0: 20 20 20 20 20 20 23 20 63 6f 72 72 65 63 74 2c        # correct,
8bd0: 20 62 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74   but the content
8be0: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
8bf0: 65 20 70 61 67 65 20 61 72 65 20 63 6f 72 72 75  e page are corru
8c00: 70 74 2e 0a 20 20 20 20 20 20 23 0a 20 20 20 20  pt..      #.    
8c10: 20 20 23 20 54 68 65 20 70 61 67 65 2d 73 69 7a    # The page-siz
8c20: 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c  e in the log fil
8c30: 65 20 68 65 61 64 65 72 20 69 73 20 73 65 74 20  e header is set 
8c40: 74 6f 20 24 70 67 73 7a 2e 20 49 66 20 74 68 65  to $pgsz. If the
8c50: 0a 20 20 20 20 20 20 23 20 57 41 4c 20 63 6f 64  .      # WAL cod
8c60: 65 20 63 6f 6e 73 69 64 65 72 73 20 24 70 67 73  e considers $pgs
8c70: 7a 20 74 6f 20 62 65 20 61 20 76 61 6c 69 64 20  z to be a valid 
8c80: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
8c90: 66 69 6c 65 20 70 61 67 65 2d 73 69 7a 65 2c 0a  file page-size,.
8ca0: 20 20 20 20 20 20 23 20 74 68 65 20 64 61 74 61        # the data
8cb0: 62 61 73 65 20 77 69 6c 6c 20 62 65 20 63 6f 72  base will be cor
8cc0: 72 75 70 74 20 28 62 65 63 61 75 73 65 20 74 68  rupt (because th
8cd0: 65 20 67 61 72 62 61 67 65 20 66 72 61 6d 65 20  e garbage frame 
8ce0: 63 6f 6e 74 65 6e 74 73 0a 20 20 20 20 20 20 23  contents.      #
8cf0: 20 77 69 6c 6c 20 62 65 20 74 72 65 61 74 65 64   will be treated
8d00: 20 61 73 20 76 61 6c 69 64 20 63 6f 6e 74 65 6e   as valid conten
8d10: 74 29 2e 20 49 66 20 24 70 67 73 7a 20 69 73 20  t). If $pgsz is 
8d20: 69 6e 76 61 6c 69 64 20 28 74 6f 6f 20 73 6d 61  invalid (too sma
8d30: 6c 6c 0a 20 20 20 20 20 20 23 20 6f 72 20 74 6f  ll.      # or to
8d40: 6f 20 6c 61 72 67 65 29 2c 20 74 68 65 20 64 62  o large), the db
8d50: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72   will not be cor
8d60: 72 75 70 74 20 61 73 20 74 68 65 20 6c 6f 67 20  rupt as the log 
8d70: 66 69 6c 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  file will.      
8d80: 23 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  # be ignored..  
8d90: 20 20 20 20 23 0a 20 20 20 20 20 20 73 65 74 20      #.      set 
8da0: 77 61 6c 68 64 72 20 5b 62 69 6e 61 72 79 20 66  walhdr [binary f
8db0: 6f 72 6d 61 74 20 49 49 49 49 49 49 20 39 33 31  ormat IIIIII 931
8dc0: 30 37 31 36 31 38 20 33 30 30 37 30 30 30 20 24  071618 3007000 $
8dd0: 70 67 73 7a 20 31 32 33 34 20 32 32 20 32 33 5d  pgsz 1234 22 23]
8de0: 0a 20 20 20 20 20 20 73 65 74 20 66 72 61 6d 65  .      set frame
8df0: 62 6f 64 79 20 5b 72 61 6e 64 6f 6d 62 6c 6f 62  body [randomblob
8e00: 20 24 70 67 73 7a 5d 0a 20 20 20 20 20 20 73 65   $pgsz].      se
8e10: 74 20 66 72 61 6d 65 68 64 72 20 20 5b 62 69 6e  t framehdr  [bin
8e20: 61 72 79 20 66 6f 72 6d 61 74 20 49 49 49 49 20  ary format IIII 
8e30: 24 70 67 20 35 20 32 32 20 32 33 5d 0a 20 20 20  $pg 5 22 23].   
8e40: 20 20 20 73 65 74 20 63 31 20 30 0a 20 20 20 20     set c1 0.    
8e50: 20 20 73 65 74 20 63 32 20 30 0a 20 20 20 20 20    set c2 0.     
8e60: 20 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20   logcksum c1 c2 
8e70: 24 77 61 6c 68 64 72 0a 0a 20 20 20 20 20 20 61  $walhdr..      a
8e80: 70 70 65 6e 64 20 77 61 6c 68 64 72 20 5b 62 69  ppend walhdr [bi
8e90: 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49 20 24  nary format II $
8ea0: 63 31 20 24 63 32 5d 0a 20 20 20 20 20 20 6c 6f  c1 $c2].      lo
8eb0: 67 63 6b 73 75 6d 20 63 31 20 63 32 20 5b 73 74  gcksum c1 c2 [st
8ec0: 72 69 6e 67 20 72 61 6e 67 65 20 24 66 72 61 6d  ring range $fram
8ed0: 65 68 64 72 20 30 20 37 5d 0a 20 20 20 20 20 20  ehdr 0 7].      
8ee0: 6c 6f 67 63 6b 73 75 6d 20 63 31 20 63 32 20 24  logcksum c1 c2 $
8ef0: 66 72 61 6d 65 62 6f 64 79 0a 20 20 20 20 20 20  framebody.      
8f00: 73 65 74 20 66 72 61 6d 65 68 64 72 20 5b 62 69  set framehdr [bi
8f10: 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49 49 49  nary format IIII
8f20: 49 49 20 24 70 67 20 35 20 32 32 20 32 33 20 24  II $pg 5 22 23 $
8f30: 63 31 20 24 63 32 5d 0a 0a 20 20 20 20 20 20 73  c1 $c2]..      s
8f40: 65 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74  et fd [open test
8f50: 2e 64 62 2d 77 61 6c 20 77 5d 0a 20 20 20 20 20  .db-wal w].     
8f60: 20 66 63 6f 6e 66 69 67 75 72 65 20 24 66 64 20   fconfigure $fd 
8f70: 2d 65 6e 63 6f 64 69 6e 67 20 62 69 6e 61 72 79  -encoding binary
8f80: 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69   -translation bi
8f90: 6e 61 72 79 0a 20 20 20 20 20 20 70 75 74 73 20  nary.      puts 
8fa0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24  -nonewline $fd $
8fb0: 77 61 6c 68 64 72 0a 20 20 20 20 20 20 70 75 74  walhdr.      put
8fc0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64  s -nonewline $fd
8fd0: 20 24 66 72 61 6d 65 68 64 72 0a 20 20 20 20 20   $framehdr.     
8fe0: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
8ff0: 20 24 66 64 20 24 66 72 61 6d 65 62 6f 64 79 0a   $fd $framebody.
9000: 20 20 20 20 20 20 63 6c 6f 73 65 20 24 66 64 0a        close $fd.
9010: 20 20 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69    .      file si
9020: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  ze test.db-wal. 
9030: 20 20 20 7d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73     } [wal_file_s
9040: 69 7a 65 20 31 20 24 70 67 73 7a 5d 0a 20 20 0a  ize 1 $pgsz].  .
9050: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
9060: 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 35 20 7b  18.2.$tn.$pg.5 {
9070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 64  .      sqlite3 d
9080: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 20 20  b test.db.      
9090: 73 65 74 20 72 63 20 5b 63 61 74 63 68 20 7b 20  set rc [catch { 
90a0: 64 62 20 6f 6e 65 20 7b 50 52 41 47 4d 41 20 69  db one {PRAGMA i
90b0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 20  ntegrity_check} 
90c0: 7d 20 6d 73 67 5d 0a 20 20 20 20 20 20 65 78 70  } msg].      exp
90d0: 72 20 7b 20 24 72 63 21 3d 30 20 7c 7c 20 24 6d  r { $rc!=0 || $m
90e0: 73 67 21 3d 22 6f 6b 22 20 7d 0a 20 20 20 20 7d  sg!="ok" }.    }
90f0: 20 24 77 6f 72 6b 73 0a 20 20 0a 20 20 20 20 64   $works.  .    d
9100: 62 20 63 6c 6f 73 65 0a 20 20 7d 0a 7d 0a 0a 23  b close.  }.}..#
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
9160: 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 2d  following test -
9170: 20 77 61 6c 2d 31 39 2e 2a 20 2d 20 66 69 78 65   wal-19.* - fixe
9180: 73 20 61 20 62 75 67 20 74 68 61 74 20 77 61 73  s a bug that was
9190: 20 70 72 65 73 65 6e 74 20 64 75 72 69 6e 67 0a   present during.
91a0: 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e 0a 23  # development..#
91b0: 0a 23 20 57 68 65 6e 20 61 20 64 61 74 61 62 61  .# When a databa
91c0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  se connection in
91d0: 20 57 41 4c 20 6d 6f 64 65 20 69 73 20 63 6c 6f   WAL mode is clo
91e0: 73 65 64 2c 20 69 74 20 61 74 74 65 6d 70 74 73  sed, it attempts
91f0: 20 61 6e 0a 23 20 45 58 43 4c 55 53 49 56 45 20   an.# EXCLUSIVE 
9200: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
9210: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
9220: 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
9230: 65 64 2c 20 74 68 65 0a 23 20 63 6f 6e 6e 65 63  ed, the.# connec
9240: 74 69 6f 6e 20 6b 6e 6f 77 73 20 74 68 61 74 20  tion knows that 
9250: 69 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 63  it is the last c
9260: 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 64 69 73  onnection to dis
9270: 63 6f 6e 6e 65 63 74 20 66 72 6f 6d 0a 23 20 74  connect from.# t
9280: 68 65 20 64 61 74 61 62 61 73 65 2c 20 73 6f 20  he database, so 
9290: 69 74 20 72 75 6e 73 20 61 20 63 68 65 63 6b 70  it runs a checkp
92a0: 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 20  oint operation. 
92b0: 54 68 65 20 62 75 67 20 77 61 73 20 74 68 61 74  The bug was that
92c0: 0a 23 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  .# the connectio
92d0: 6e 20 77 61 73 20 6e 6f 74 20 75 70 64 61 74 69  n was not updati
92e0: 6e 67 20 69 74 73 20 70 72 69 76 61 74 65 20 63  ng its private c
92f0: 6f 70 79 20 6f 66 20 74 68 65 20 77 61 6c 2d 69  opy of the wal-i
9300: 6e 64 65 78 20 0a 23 20 68 65 61 64 65 72 20 62  ndex .# header b
9310: 65 66 6f 72 65 20 64 6f 69 6e 67 20 73 6f 2c 20  efore doing so, 
9320: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 69 74 20  meaning that it 
9330: 63 6f 75 6c 64 20 63 68 65 63 6b 70 6f 69 6e 74  could checkpoint
9340: 20 61 6e 20 6f 6c 64 0a 23 20 73 6e 61 70 73 68   an old.# snapsh
9350: 6f 74 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61  ot..#.do_test wa
9360: 6c 2d 31 39 2e 31 20 7b 0a 20 20 66 69 6c 65 20  l-19.1 {.  file 
9370: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
9380: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
9390: 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  l test.db-journa
93a0: 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  l.  sqlite3 db t
93b0: 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65 33  est.db.  sqlite3
93c0: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
93d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
93e0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
93f0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41   = WAL;.    CREA
9400: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
9410: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
9420: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
9430: 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  2);.    INSERT I
9440: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
9450: 20 34 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63 73   4);.  }.  execs
9460: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
9470: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t1 } db2.} {1
9480: 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20   2 3 4}.do_test 
9490: 77 61 6c 2d 31 39 2e 32 20 7b 0a 20 20 65 78 65  wal-19.2 {.  exe
94a0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
94b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
94c0: 28 35 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c 45  (5, 6);.    SELE
94d0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
94e0: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  }.} {1 2 3 4 5 6
94f0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39  }.do_test wal-19
9500: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
9510: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66 69    db2 close.  fi
9520: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
9530: 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  b-wal.} {0}.do_t
9540: 65 73 74 20 77 61 6c 2d 31 39 2e 34 20 7b 0a 20  est wal-19.4 {. 
9550: 20 23 20 57 68 65 6e 20 74 68 65 20 62 75 67 20   # When the bug 
9560: 77 61 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65  was present, the
9570: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 72   following was r
9580: 65 74 75 72 6e 69 6e 67 20 7b 31 20 32 20 33 20  eturning {1 2 3 
9590: 34 7d 20 6f 6e 6c 79 2c 0a 20 20 23 20 61 73 20  4} only,.  # as 
95a0: 5b 64 62 32 5d 20 68 61 64 20 61 6e 20 6f 75 74  [db2] had an out
95b0: 2d 6f 66 2d 64 61 74 65 20 63 6f 70 79 20 6f 66  -of-date copy of
95c0: 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 68   the wal-index h
95d0: 65 61 64 65 72 20 77 68 65 6e 20 69 74 20 77 61  eader when it wa
95e0: 73 0a 20 20 23 20 63 6c 6f 73 65 64 2e 0a 20 20  s.  # closed..  
95f0: 23 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  #.  sqlite3 db t
9600: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
9610: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
9620: 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34   t1 }.} {1 2 3 4
9630: 20 35 20 36 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d   5 6}..#--------
9640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9680: 2d 0a 23 20 54 68 69 73 20 74 65 73 74 20 2d 20  -.# This test - 
9690: 77 61 6c 2d 32 30 2e 2a 20 2d 20 75 73 65 73 20  wal-20.* - uses 
96a0: 74 77 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  two connections.
96b0: 20 4f 6e 65 20 69 6e 20 74 68 69 73 20 70 72 6f   One in this pro
96c0: 63 65 73 73 20 61 6e 64 0a 23 20 74 68 65 20 6f  cess and.# the o
96d0: 74 68 65 72 20 69 6e 20 61 6e 20 65 78 74 65 72  ther in an exter
96e0: 6e 61 6c 20 70 72 6f 63 65 73 73 2e 20 54 68 65  nal process. The
96f0: 20 70 72 6f 63 65 64 75 72 65 20 69 73 3a 0a 23   procedure is:.#
9700: 0a 23 20 20 20 31 2e 20 55 73 69 6e 67 20 63 6f  .#   1. Using co
9710: 6e 6e 65 63 74 69 6f 6e 20 31 2c 20 63 72 65 61  nnection 1, crea
9720: 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
9730: 73 63 68 65 6d 61 2e 0a 23 0a 23 20 20 20 32 2e  schema..#.#   2.
9740: 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f   Using connectio
9750: 6e 20 32 20 28 69 6e 20 61 6e 20 65 78 74 65 72  n 2 (in an exter
9760: 6e 61 6c 20 70 72 6f 63 65 73 73 29 2c 20 61 64  nal process), ad
9770: 64 20 73 6f 20 6d 75 63 68 0a 23 20 20 20 20 20  d so much.#     
9780: 20 64 61 74 61 20 74 6f 20 74 68 65 20 64 61 74   data to the dat
9790: 61 62 61 73 65 20 77 69 74 68 6f 75 74 20 63 68  abase without ch
97a0: 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 61 74  eckpointing that
97b0: 20 61 20 77 61 6c 2d 69 6e 64 65 78 20 0a 23 20   a wal-index .# 
97c0: 20 20 20 20 20 6c 61 72 67 65 72 20 74 68 61 6e       larger than
97d0: 20 36 34 4b 42 20 69 73 20 72 65 71 75 69 72 65   64KB is require
97e0: 64 2e 0a 23 0a 23 20 20 20 33 2e 20 55 73 69 6e  d..#.#   3. Usin
97f0: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 2c 20  g connection 1, 
9800: 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20 64  checkpoint the d
9810: 61 74 61 62 61 73 65 2e 20 4d 61 6b 65 20 73 75  atabase. Make su
9820: 72 65 20 61 6c 6c 0a 23 20 20 20 20 20 20 74 68  re all.#      th
9830: 65 20 64 61 74 61 20 69 73 20 70 72 65 73 65 6e  e data is presen
9840: 74 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  t and the databa
9850: 73 65 20 69 73 20 6e 6f 74 20 63 6f 72 72 75 70  se is not corrup
9860: 74 2e 0a 23 0a 23 20 41 74 20 6f 6e 65 20 70 6f  t..#.# At one po
9870: 69 6e 74 2c 20 53 51 4c 69 74 65 20 77 61 73 20  int, SQLite was 
9880: 66 61 69 6c 69 6e 67 20 74 6f 20 67 72 6f 77 20  failing to grow 
9890: 74 68 65 20 6d 61 70 70 69 6e 67 20 6f 66 20 74  the mapping of t
98a0: 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 23 20 66  he wal-index.# f
98b0: 69 6c 65 20 69 6e 20 73 74 65 70 20 33 20 61 6e  ile in step 3 an
98c0: 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  d the checkpoint
98d0: 20 77 61 73 20 63 6f 72 72 75 70 74 69 6e 67 20   was corrupting 
98e0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
98f0: 65 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c  e..#.do_test wal
9900: 2d 32 30 2e 31 20 7b 0a 20 20 63 61 74 63 68 20  -20.1 {.  catch 
9910: 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20 66 69 6c  {db close}.  fil
9920: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
9930: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
9940: 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  wal test.db-jour
9950: 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62  nal.  sqlite3 db
9960: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
9970: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
9980: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
9990: 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  AL;.    CREATE T
99a0: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
99b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
99c0: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
99d0: 28 39 30 30 29 29 3b 0a 20 20 20 20 53 45 4c 45  (900));.    SELE
99e0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
99f0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c 20   t1;.  }.} {wal 
9a00: 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  1}.do_test wal-2
9a10: 30 2e 32 20 7b 0a 20 20 73 65 74 20 3a 3a 62 75  0.2 {.  set ::bu
9a20: 64 64 79 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74  ddy [launch_test
9a30: 66 69 78 74 75 72 65 5d 0a 20 20 74 65 73 74 66  fixture].  testf
9a40: 69 78 74 75 72 65 20 24 3a 3a 62 75 64 64 79 20  ixture $::buddy 
9a50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  {.    sqlite3 db
9a60: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 64 62 20   test.db.    db 
9a70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 20 64 62  transaction { db
9a80: 20 65 76 61 6c 20 7b 0a 20 20 20 20 20 20 50 52   eval {.      PR
9a90: 41 47 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65  AGMA wal_autoche
9aa0: 63 6b 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20  ckpoint = 0;.   
9ab0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9ac0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
9ad0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
9ae0: 3b 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a  ;       /* 2 */.
9af0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9b00: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9b10: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9b20: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 34 20   t1;       /* 4 
9b30: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
9b40: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9b50: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9b60: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9b70: 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   8 */.      INSE
9b80: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
9b90: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
9ba0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
9bb0: 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20   /* 16 */.      
9bc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
9bd0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
9be0: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
9bf0: 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20       /* 32 */.  
9c00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9c10: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9c20: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
9c30: 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a  1;       /* 64 *
9c40: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
9c50: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9c60: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9c70: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9c80: 31 32 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  128 */.      INS
9c90: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9ca0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9cb0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9cc0: 20 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 20 20    /* 256 */.    
9cd0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9ce0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9cf0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9d00: 20 20 20 20 20 20 20 2f 2a 20 35 31 32 20 2a 2f         /* 512 */
9d10: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
9d20: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
9d30: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
9d40: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31  M t1;       /* 1
9d50: 30 32 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  024 */.      INS
9d60: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9d70: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9d80: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9d90: 20 20 2f 2a 20 32 30 34 38 20 2a 2f 0a 20 20 20    /* 2048 */.   
9da0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9db0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
9dc0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
9dd0: 3b 20 20 20 20 20 20 20 2f 2a 20 34 30 39 36 20  ;       /* 4096 
9de0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
9df0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9e00: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9e10: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9e20: 20 38 31 39 32 20 2a 2f 0a 20 20 20 20 20 20 49   8192 */.      I
9e30: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
9e40: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
9e50: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
9e60: 20 20 20 20 2f 2a 20 31 36 33 38 34 20 2a 2f 0a      /* 16384 */.
9e70: 20 20 20 20 7d 20 7d 0a 20 20 7d 0a 7d 20 7b 30      } }.  }.} {0
9e80: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30  }.do_test wal-20
9e90: 2e 33 20 7b 0a 20 20 63 6c 6f 73 65 20 24 3a 3a  .3 {.  close $::
9ea0: 62 75 64 64 79 0a 20 20 65 78 65 63 73 71 6c 20  buddy.  execsql 
9eb0: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
9ec0: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 65 78 65 63  ckpoint }.  exec
9ed0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75  sql { SELECT cou
9ee0: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a  nt(*) FROM t1 }.
9ef0: 7d 20 7b 31 36 33 38 34 7d 0a 64 6f 5f 74 65 73  } {16384}.do_tes
9f00: 74 20 77 61 6c 2d 32 30 2e 34 20 7b 0a 20 20 64  t wal-20.4 {.  d
9f10: 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
9f20: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
9f30: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
9f40: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
9f50: 20 7d 0a 7d 20 7b 31 36 33 38 34 7d 0a 69 6e 74   }.} {16384}.int
9f60: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 77 61 6c  egrity_check wal
9f70: 2d 32 30 2e 35 0a 0a 63 61 74 63 68 20 7b 20 64  -20.5..catch { d
9f80: 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68  b2 close }.catch
9f90: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 0a 64   { db close }..d
9fa0: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 31 20  o_test wal-21.1 
9fb0: 7b 0a 20 20 66 61 75 6c 74 73 69 6d 5f 64 65 6c  {.  faultsim_del
9fc0: 65 74 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ete_and_reopen. 
9fd0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
9fe0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
9ff0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43  ode = WAL;.    C
a000: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
a010: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
a020: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
a030: 31 2c 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52  1, 2);.    INSER
a040: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a050: 28 33 2c 20 34 29 3b 0a 20 20 20 20 49 4e 53 45  (3, 4);.    INSE
a060: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
a070: 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 49 4e 53  S(5, 6);.    INS
a080: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
a090: 45 53 28 37 2c 20 38 29 3b 0a 20 20 20 20 49 4e  ES(7, 8);.    IN
a0a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
a0b0: 55 45 53 28 39 2c 20 31 30 29 3b 0a 20 20 20 20  UES(9, 10);.    
a0c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
a0d0: 41 4c 55 45 53 28 31 31 2c 20 31 32 29 3b 0a 20  ALUES(11, 12);. 
a0e0: 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f 5f 74 65   }.} {wal}.do_te
a0f0: 73 74 20 77 61 6c 2d 32 31 2e 32 20 7b 0a 20 20  st wal-21.2 {.  
a100: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 50  execsql { .    P
a110: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
a120: 20 3d 20 31 30 3b 0a 20 20 20 20 50 52 41 47 4d   = 10;.    PRAGM
a130: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
a140: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
a150: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 3b 0a     SAVEPOINT s;.
a160: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
a170: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
a180: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 2c 20 72  ndomblob(900), r
a190: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
a1a0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 52 4f  ROM t1;.      RO
a1b0: 4c 4c 42 41 43 4b 20 54 4f 20 73 3b 0a 20 20 20  LLBACK TO s;.   
a1c0: 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65   COMMIT;.  }.  e
a1d0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
a1e0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
a1f0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
a200: 20 31 30 20 31 31 20 31 32 7d 0a 64 6f 5f 74 65   10 11 12}.do_te
a210: 73 74 20 77 61 6c 2d 32 31 2e 33 20 7b 0a 20 20  st wal-21.3 {.  
a220: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
a230: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
a240: 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 23 2d 2d 2d 2d   }.} {ok}..#----
a250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a290: 2d 2d 2d 2d 2d 0a 23 20 54 65 73 74 20 72 65 61  -----.# Test rea
a2a0: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
a2b0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69   of databases wi
a2c0: 74 68 20 64 69 66 66 65 72 65 6e 74 20 70 61 67  th different pag
a2d0: 65 2d 73 69 7a 65 73 2e 0a 23 0a 66 6f 72 65 61  e-sizes..#.forea
a2e0: 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31 30 32  ch pgsz {512 102
a2f0: 34 20 32 30 34 38 20 34 30 39 36 20 38 31 39 32  4 2048 4096 8192
a300: 20 31 36 33 38 34 20 33 32 37 36 38 20 36 35 35   16384 32768 655
a310: 33 36 7d 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69  36} {.  do_multi
a320: 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 5b  client_test tn [
a330: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
a340: 20 25 50 47 53 5a 25 20 24 70 67 73 7a 5d 20 7b   %PGSZ% $pgsz] {
a350: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
a360: 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 31  -22.%PGSZ%.$tn.1
a370: 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 0a   {.      sql1 {.
a380: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d          PRAGMA m
a390: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20  ain.page_size = 
a3a0: 25 50 47 53 5a 25 3b 0a 20 20 20 20 20 20 20 20  %PGSZ%;.        
a3b0: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
a3c0: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  um = 0;.        
a3d0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
a3e0: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20  ode = WAL;.     
a3f0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a400: 74 31 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20  t1(x UNIQUE);.  
a410: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
a420: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
a430: 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20  omblob(800);.   
a440: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
a450: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
a460: 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20  mblob(800);.    
a470: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a480: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
a490: 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20 20  blob(800);.     
a4a0: 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a 20   }.    } {wal}. 
a4b0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32     do_test wal-2
a4c0: 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 32 20 7b  2.%PGSZ%.$tn.2 {
a4d0: 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41 20 69   sql2 { PRAGMA i
a4e0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
a4f0: 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64 6f 5f 74   } {ok}.    do_t
a500: 65 73 74 20 77 61 6c 2d 32 32 2e 25 50 47 53 5a  est wal-22.%PGSZ
a510: 25 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20 20  %.$tn.3 {.      
a520: 73 71 6c 31 20 7b 50 52 41 47 4d 41 20 77 61 6c  sql1 {PRAGMA wal
a530: 5f 63 68 65 63 6b 70 6f 69 6e 74 7d 0a 20 20 20  _checkpoint}.   
a540: 20 20 20 65 78 70 72 20 7b 5b 66 69 6c 65 20 73     expr {[file s
a550: 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 25 20 25  ize test.db] % %
a560: 50 47 53 5a 25 7d 0a 20 20 20 20 7d 20 7b 30 7d  PGSZ%}.    } {0}
a570: 0a 20 20 7d 5d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  .  }].}..#------
a580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5c0: 2d 2d 2d 0a 23 20 54 65 73 74 20 74 68 61 74 20  ---.# Test that 
a5d0: 77 68 65 6e 20 31 20 6f 72 20 6d 6f 72 65 20 70  when 1 or more p
a5e0: 61 67 65 73 20 61 72 65 20 72 65 63 6f 76 65 72  ages are recover
a5f0: 65 64 20 66 72 6f 6d 20 61 20 57 41 4c 20 66 69  ed from a WAL fi
a600: 6c 65 2c 20 0a 23 20 73 71 6c 69 74 65 33 5f 6c  le, .# sqlite3_l
a610: 6f 67 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20  og() is invoked 
a620: 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 74  to report this t
a630: 6f 20 74 68 65 20 75 73 65 72 2e 0a 23 0a 73 65  o the user..#.se
a640: 74 20 77 61 6c 66 69 6c 65 20 5b 66 69 6c 65 20  t walfile [file 
a650: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
a660: 20 6a 6f 69 6e 20 5b 70 77 64 5d 20 74 65 73 74   join [pwd] test
a670: 2e 64 62 2d 77 61 6c 5d 5d 0a 63 61 74 63 68 20  .db-wal]].catch 
a680: 7b 64 62 20 63 6c 6f 73 65 7d 0a 66 69 6c 65 20  {db close}.file 
a690: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
a6a0: 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61  st.db.do_test wa
a6b0: 6c 2d 32 33 2e 31 20 7b 0a 20 20 66 61 75 6c 74  l-23.1 {.  fault
a6c0: 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f 72  sim_delete_and_r
a6d0: 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c 20  eopen.  execsql 
a6e0: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
a6f0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
a700: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
a710: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
a720: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
a730: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
a740: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
a750: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
a760: 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73 61 76  }.  faultsim_sav
a770: 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 20 20 73  e_and_close..  s
a780: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
a790: 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c    test_sqlite3_l
a7a0: 6f 67 20 5b 6c 69 73 74 20 6c 61 70 70 65 6e 64  og [list lappend
a7b0: 20 3a 3a 6c 6f 67 5d 0a 20 20 73 65 74 20 3a 3a   ::log].  set ::
a7c0: 6c 6f 67 20 5b 6c 69 73 74 5d 0a 20 20 73 71 6c  log [list].  sql
a7d0: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
a7e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
a7f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  CT * FROM t1 }.}
a800: 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65   {1 2 3 4}.do_te
a810: 73 74 20 77 61 6c 2d 32 33 2e 32 20 7b 20 73 65  st wal-23.2 { se
a820: 74 20 3a 3a 6c 6f 67 20 7d 20 7b 7d 0a 0a 64 6f  t ::log } {}..do
a830: 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e 33 20 7b  _test wal-23.3 {
a840: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 65  .  db close.  se
a850: 74 20 3a 3a 6c 6f 67 20 5b 6c 69 73 74 5d 0a 20  t ::log [list]. 
a860: 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74 6f 72   faultsim_restor
a870: 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20 20 65  e_and_reopen.  e
a880: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
a890: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
a8a0: 20 32 20 33 20 34 7d 0a 73 65 74 20 6e 50 61 67   2 3 4}.set nPag
a8b0: 65 20 5b 65 78 70 72 20 32 2b 24 41 55 54 4f 56  e [expr 2+$AUTOV
a8c0: 41 43 55 55 4d 5d 0a 64 6f 5f 74 65 73 74 20 77  ACUUM].do_test w
a8d0: 61 6c 2d 32 33 2e 34 20 7b 20 0a 20 20 73 65 74  al-23.4 { .  set
a8e0: 20 3a 3a 6c 6f 67 20 0a 7d 20 5b 6c 69 73 74 20   ::log .} [list 
a8f0: 53 51 4c 49 54 45 5f 4f 4b 20 22 52 65 63 6f 76  SQLITE_OK "Recov
a900: 65 72 65 64 20 24 6e 50 61 67 65 20 66 72 61 6d  ered $nPage fram
a910: 65 73 20 66 72 6f 6d 20 57 41 4c 20 66 69 6c 65  es from WAL file
a920: 20 24 77 61 6c 66 69 6c 65 22 5d 0a 0a 0a 69 66   $walfile"]...if
a930: 63 61 70 61 62 6c 65 20 61 75 74 6f 76 61 63 75  capable autovacu
a940: 75 6d 20 7b 0a 20 20 23 20 54 68 69 73 20 62 6c  um {.  # This bl
a950: 6f 63 6b 20 74 65 73 74 73 20 74 68 61 74 20 69  ock tests that i
a960: 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 20  f the size of a 
a970: 64 61 74 61 62 61 73 65 20 69 73 20 72 65 64 75  database is redu
a980: 63 65 64 20 62 79 20 61 20 0a 20 20 23 20 74 72  ced by a .  # tr
a990: 61 6e 73 61 63 74 69 6f 6e 20 28 62 65 63 61 75  ansaction (becau
a9a0: 73 65 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  se of an increme
a9b0: 6e 74 61 6c 20 6f 72 20 61 75 74 6f 2d 76 61 63  ntal or auto-vac
a9c0: 75 75 6d 29 2c 20 74 68 61 74 20 6e 6f 0a 20 20  uum), that no.  
a9d0: 23 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65  # data is writte
a9e0: 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  n to the WAL fil
a9f0: 65 20 66 6f 72 20 74 68 65 20 74 72 75 6e 63 61  e for the trunca
aa00: 74 65 64 20 70 61 67 65 73 20 61 73 20 70 61 72  ted pages as par
aa10: 74 0a 20 20 23 20 6f 66 20 74 68 65 20 63 6f 6d  t.  # of the com
aa20: 6d 69 74 2e 20 65 2e 67 2e 20 69 66 20 61 20 74  mit. e.g. if a t
aa30: 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 64 75 63  ransaction reduc
aa40: 65 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  es the size of a
aa50: 20 64 61 74 61 62 61 73 65 0a 20 20 23 20 74 6f   database.  # to
aa60: 20 4e 20 70 61 67 65 73 2c 20 64 61 74 61 20 66   N pages, data f
aa70: 6f 72 20 70 61 67 65 20 4e 2b 31 20 73 68 6f 75  or page N+1 shou
aa80: 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ld not be writte
aa90: 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66 69 6c  n to the WAL fil
aaa0: 65 20 0a 20 20 23 20 77 68 65 6e 20 63 6f 6d 6d  e .  # when comm
aab0: 69 74 74 69 6e 67 20 74 68 65 20 74 72 61 6e 73  itting the trans
aac0: 61 63 74 69 6f 6e 2e 20 41 74 20 6f 6e 65 20 70  action. At one p
aad0: 6f 69 6e 74 20 73 75 63 68 20 64 61 74 61 20 77  oint such data w
aae0: 61 73 20 62 65 69 6e 67 20 0a 20 20 23 20 77 72  as being .  # wr
aaf0: 69 74 74 65 6e 2e 0a 20 20 23 0a 20 20 63 61 74  itten..  #.  cat
ab00: 63 68 20 7b 64 62 20 63 6c 6f 73 65 7d 0a 20 20  ch {db close}.  
ab10: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
ab20: 2e 64 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62  .db.  sqlite3 db
ab30: 20 74 65 73 74 2e 64 62 0a 20 20 64 6f 5f 65 78   test.db.  do_ex
ab40: 65 63 73 71 6c 5f 74 65 73 74 20 32 34 2e 31 20  ecsql_test 24.1 
ab50: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
ab60: 6f 5f 76 61 63 75 75 6d 20 3d 20 32 3b 0a 20 20  o_vacuum = 2;.  
ab70: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
ab80: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
ab90: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
aba0: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
abb0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
abc0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
abd0: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
abe0: 6f 6d 62 6c 6f 62 28 35 30 30 30 29 29 3b 0a 20  omblob(5000));. 
abf0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
ac00: 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  1 SELECT * FROM 
ac10: 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t1;.    INSERT I
ac20: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20  NTO t1 SELECT * 
ac30: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53  FROM t1;.    INS
ac40: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
ac50: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
ac60: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
ac70: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
ac80: 31 3b 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64  1;.  } {wal}.  d
ac90: 6f 5f 74 65 73 74 20 32 34 2e 32 20 7b 20 0a 20  o_test 24.2 { . 
aca0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
acb0: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
acc0: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
acd0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
ace0: 20 20 20 20 7d 0a 20 20 20 20 64 62 20 63 6c 6f      }.    db clo
acf0: 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  se.    sqlite3 d
ad00: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 66 69  b test.db.    fi
ad10: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
ad20: 62 2d 77 61 6c 0a 20 20 7d 20 30 0a 20 20 64 6f  b-wal.  } 0.  do
ad30: 5f 74 65 73 74 20 32 34 2e 33 20 7b 0a 20 20 20  _test 24.3 {.   
ad40: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
ad50: 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 38 34 20  db.  } [expr 84 
ad60: 2a 20 31 30 32 34 5d 0a 20 20 64 6f 5f 74 65 73  * 1024].  do_tes
ad70: 74 20 32 34 2e 34 20 7b 0a 20 20 20 20 65 78 65  t 24.4 {.    exe
ad80: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 50 52  csql { .      PR
ad90: 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c  AGMA incremental
ada0: 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 50  _vacuum;.      P
adb0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
adc0: 6f 69 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  oint;.    }.    
add0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
ade0: 62 0a 20 20 7d 20 5b 65 78 70 72 20 33 20 2a 20  b.  } [expr 3 * 
adf0: 31 30 32 34 5d 0a 20 20 64 6f 5f 74 65 73 74 20  1024].  do_test 
ae00: 32 34 2e 35 20 7b 0a 20 20 20 20 66 69 6c 65 20  24.5 {.    file 
ae10: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
ae20: 0a 20 20 7d 20 32 31 32 38 0a 7d 0a 0a 64 62 20  .  } 2128.}..db 
ae30: 63 6c 6f 73 65 0a 73 71 6c 69 74 65 33 5f 73 68  close.sqlite3_sh
ae40: 75 74 64 6f 77 6e 0a 74 65 73 74 5f 73 71 6c 69  utdown.test_sqli
ae50: 74 65 33 5f 6c 6f 67 0a 73 71 6c 69 74 65 33 5f  te3_log.sqlite3_
ae60: 69 6e 69 74 69 61 6c 69 7a 65 0a 0a 66 69 6e 69  initialize..fini
ae70: 73 68 5f 74 65 73 74 0a                          sh_test.