/ Hex Artifact Content
Login

Artifact 90afd254ece957a716751b1c35fac02d6353c2a7:


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 0a 69 66 63 61 70 61  mmon.tcl..ifcapa
0270: 62 6c 65 20 21 77 61 6c 20 7b 66 69 6e 69 73 68  ble !wal {finish
0280: 5f 74 65 73 74 20 3b 20 72 65 74 75 72 6e 20 7d  _test ; return }
0290: 0a 0a 70 72 6f 63 20 72 65 6f 70 65 6e 5f 64 62  ..proc reopen_db
02a0: 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 20   {} {.  catch { 
02b0: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 69 6c  db close }.  fil
02c0: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
02d0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
02e0: 77 61 6c 20 74 65 73 74 2e 64 62 2d 77 61 6c 2d  wal test.db-wal-
02f0: 73 75 6d 6d 61 72 79 0a 20 20 73 71 6c 69 74 65  summary.  sqlite
0300: 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62  3_wal db test.db
0310: 0a 7d 0a 0a 73 65 74 20 3a 3a 62 6c 6f 62 63 6e  .}..set ::blobcn
0320: 74 20 30 0a 70 72 6f 63 20 62 6c 6f 62 20 7b 6e  t 0.proc blob {n
0330: 42 79 74 65 7d 20 7b 0a 20 20 69 6e 63 72 20 3a  Byte} {.  incr :
0340: 3a 62 6c 6f 62 63 6e 74 0a 20 20 72 65 74 75 72  :blobcnt.  retur
0350: 6e 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  n [string range 
0360: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 22  [string repeat "
0370: 24 7b 3a 3a 62 6c 6f 62 63 6e 74 7d 78 22 20 24  ${::blobcnt}x" $
0380: 6e 42 79 74 65 5d 20 31 20 24 6e 42 79 74 65 5d  nByte] 1 $nByte]
0390: 0a 7d 0a 0a 70 72 6f 63 20 73 71 6c 69 74 65 33  .}..proc sqlite3
03a0: 5f 77 61 6c 20 7b 61 72 67 73 7d 20 7b 0a 20 20  _wal {args} {.  
03b0: 65 76 61 6c 20 73 71 6c 69 74 65 33 20 24 61 72  eval sqlite3 $ar
03c0: 67 73 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72  gs.  [lindex $ar
03d0: 67 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41  gs 0] eval { PRA
03e0: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
03f0: 3d 20 30 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20  = 0 }.  [lindex 
0400: 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b 20  $args 0] eval { 
0410: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
0420: 20 3d 20 31 30 32 34 20 7d 0a 20 20 5b 6c 69 6e   = 1024 }.  [lin
0430: 64 65 78 20 24 61 72 67 73 20 30 5d 20 65 76 61  dex $args 0] eva
0440: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
0450: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a  al_mode = wal }.
0460: 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20    [lindex $args 
0470: 30 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41  0] eval { PRAGMA
0480: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e   synchronous = n
0490: 6f 72 6d 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65  ormal }.  [linde
04a0: 78 20 24 61 72 67 73 20 30 5d 20 66 75 6e 63 74  x $args 0] funct
04b0: 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a  ion blob blob.}.
04c0: 0a 70 72 6f 63 20 6c 6f 67 5f 66 69 6c 65 5f 73  .proc log_file_s
04d0: 69 7a 65 20 7b 6e 46 72 61 6d 65 20 70 67 73 7a  ize {nFrame pgsz
04e0: 7d 20 7b 0a 20 20 65 78 70 72 20 7b 32 34 20 2b  } {.  expr {24 +
04f0: 20 28 24 70 67 73 7a 2b 32 34 29 2a 24 6e 46 72   ($pgsz+24)*$nFr
0500: 61 6d 65 7d 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67  ame}.}..proc log
0510: 5f 64 65 6c 65 74 65 64 20 7b 6c 6f 67 66 69 6c  _deleted {logfil
0520: 65 7d 20 7b 0a 20 20 72 65 74 75 72 6e 20 5b 65  e} {.  return [e
0530: 78 70 72 20 5b 66 69 6c 65 20 65 78 69 73 74 73  xpr [file exists
0540: 20 24 6c 6f 67 66 69 6c 65 5d 3d 3d 30 5d 0a 7d   $logfile]==0].}
0550: 0a 0a 23 0a 23 20 54 68 65 73 65 20 61 72 65 20  ..#.# These are 
0560: 27 77 61 72 6d 2d 62 6f 64 79 27 20 74 65 73 74  'warm-body' test
0570: 73 20 75 73 65 64 20 77 68 69 6c 65 20 64 65 76  s used while dev
0580: 65 6c 6f 70 69 6e 67 20 74 68 65 20 57 41 4c 20  eloping the WAL 
0590: 63 6f 64 65 2e 20 54 68 65 79 0a 23 20 73 65 72  code. They.# ser
05a0: 76 65 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74  ve to prove that
05b0: 20 61 20 66 65 77 20 72 65 61 6c 6c 79 20 73 69   a few really si
05c0: 6d 70 6c 65 20 63 61 73 65 73 20 77 6f 72 6b 3a  mple cases work:
05d0: 0a 23 0a 23 20 77 61 6c 2d 31 2e 2a 3a 20 52 65  .#.# wal-1.*: Re
05e0: 61 64 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ad and write the
05f0: 20 64 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c   database..# wal
0600: 2d 32 2e 2a 3a 20 54 65 73 74 20 4d 56 43 43 20  -2.*: Test MVCC 
0610: 77 69 74 68 20 6f 6e 65 20 72 65 61 64 65 72 2c  with one reader,
0620: 20 6f 6e 65 20 77 72 69 74 65 72 2e 0a 23 20 77   one writer..# w
0630: 61 6c 2d 33 2e 2a 3a 20 54 65 73 74 20 74 72 61  al-3.*: Test tra
0640: 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63  nsaction rollbac
0650: 6b 2e 0a 23 20 77 61 6c 2d 34 2e 2a 3a 20 54 65  k..# wal-4.*: Te
0660: 73 74 20 73 61 76 65 70 6f 69 6e 74 2f 73 74 61  st savepoint/sta
0670: 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e  tement rollback.
0680: 0a 23 20 77 61 6c 2d 35 2e 2a 3a 20 54 65 73 74  .# wal-5.*: Test
0690: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
06a0: 73 65 2e 0a 23 20 77 61 6c 2d 36 2e 2a 3a 20 54  se..# wal-6.*: T
06b0: 65 73 74 20 63 72 65 61 74 69 6e 67 20 64 61 74  est creating dat
06c0: 61 62 61 73 65 73 20 77 69 74 68 20 64 69 66 66  abases with diff
06d0: 65 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 73  erent page sizes
06e0: 2e 0a 23 0a 23 0a 0a 64 6f 5f 74 65 73 74 20 77  ..#.#..do_test w
06f0: 61 6c 2d 30 2e 31 20 7b 0a 20 20 65 78 65 63 73  al-0.1 {.  execs
0700: 71 6c 20 7b 20 50 52 41 47 4d 41 20 61 75 74 6f  ql { PRAGMA auto
0710: 5f 76 61 63 75 75 6d 20 3d 20 30 20 7d 0a 20 20  _vacuum = 0 }.  
0720: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
0730: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e   synchronous = n
0740: 6f 72 6d 61 6c 20 7d 0a 20 20 65 78 65 63 73 71  ormal }.  execsq
0750: 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e  l { PRAGMA journ
0760: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a  al_mode = wal }.
0770: 7d 20 7b 77 61 6c 7d 0a 64 6f 5f 74 65 73 74 20  } {wal}.do_test 
0780: 77 61 6c 2d 30 2e 32 20 7b 0a 20 20 66 69 6c 65  wal-0.2 {.  file
0790: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
07a0: 7b 31 30 32 34 7d 0a 0a 64 6f 5f 74 65 73 74 20  {1024}..do_test 
07b0: 77 61 6c 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63  wal-1.0 {.  exec
07c0: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
07d0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
07e0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20  LE t1(a, b); .  
07f0: 7d 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65  }.  list [file e
0800: 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f  xists test.db-jo
0810: 75 72 6e 61 6c 5d 20 5c 0a 20 20 20 20 20 20 20  urnal] \.       
0820: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
0830: 74 2e 64 62 2d 77 61 6c 5d 20 20 20 20 20 5c 0a  t.db-wal]     \.
0840: 20 20 20 20 20 20 20 5b 66 69 6c 65 20 73 69 7a         [file siz
0850: 65 20 74 65 73 74 2e 64 62 5d 0a 7d 20 7b 30 20  e test.db].} {0 
0860: 31 20 31 30 32 34 7d 0a 64 6f 5f 74 65 73 74 20  1 1024}.do_test 
0870: 77 61 6c 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63  wal-1.1 {.  exec
0880: 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73  sql COMMIT.  lis
0890: 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  t [file exists t
08a0: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
08b0: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
08c0: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 30 20 31  t.db-wal].} {0 1
08d0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e  }.do_test wal-1.
08e0: 32 20 7b 0a 20 20 23 20 54 68 65 72 65 20 61 72  2 {.  # There ar
08f0: 65 20 6e 6f 77 20 74 77 6f 20 70 61 67 65 73 20  e now two pages 
0900: 69 6e 20 74 68 65 20 6c 6f 67 2e 0a 20 20 66 69  in the log..  fi
0910: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
0920: 77 61 6c 0a 7d 20 5b 6c 6f 67 5f 66 69 6c 65 5f  wal.} [log_file_
0930: 73 69 7a 65 20 32 20 31 30 32 34 5d 0a 0a 64 6f  size 2 1024]..do
0940: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 33 20 7b 0a  _test wal-1.3 {.
0950: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0960: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
0970: 5f 6d 61 73 74 65 72 20 7d 0a 7d 20 7b 74 61 62  _master }.} {tab
0980: 6c 65 20 74 31 20 74 31 20 32 20 7b 43 52 45 41  le t1 t1 2 {CREA
0990: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
09a0: 29 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  )}}..do_test wal
09b0: 2d 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.4 {.  execsql
09c0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
09d0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d  1 VALUES(1, 2) }
09e0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
09f0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a00: 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 65 78 65  ES(3, 4) }.  exe
0a10: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0a20: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
0a30: 36 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  6) }.  execsql {
0a40: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0a50: 56 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 0a 20  VALUES(7, 8) }. 
0a60: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0a70: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0a80: 28 39 2c 20 31 30 29 20 7d 0a 7d 20 7b 7d 0a 0a  (9, 10) }.} {}..
0a90: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 35 20  do_test wal-1.5 
0aa0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0ab0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0ac0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
0ad0: 37 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65  7 8 9 10}..do_te
0ae0: 73 74 20 77 61 6c 2d 32 2e 31 20 7b 0a 20 20 73  st wal-2.1 {.  s
0af0: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 2e  qlite3_wal db2 .
0b00: 2f 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73  /test.db.  execs
0b10: 71 6c 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45  ql { BEGIN; SELE
0b20: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
0b30: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
0b40: 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f  6 7 8 9 10}..do_
0b50: 74 65 73 74 20 77 61 6c 2d 32 2e 32 20 7b 0a 20  test wal-2.2 {. 
0b60: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0b70: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0b80: 28 31 31 2c 20 31 32 29 20 7d 0a 20 20 65 78 65  (11, 12) }.  exe
0b90: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0ba0: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
0bb0: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0bc0: 30 20 31 31 20 31 32 7d 0a 0a 64 6f 5f 74 65 73  0 11 12}..do_tes
0bd0: 74 20 77 61 6c 2d 32 2e 33 20 7b 0a 20 20 65 78  t wal-2.3 {.  ex
0be0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
0bf0: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d   FROM t1 } db2.}
0c00: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
0c10: 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74  8 9 10}..do_test
0c20: 20 77 61 6c 2d 32 2e 34 20 7b 0a 20 20 65 78 65   wal-2.4 {.  exe
0c30: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0c40: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c  TO t1 VALUES(13,
0c50: 20 31 34 29 20 7d 0a 20 20 65 78 65 63 73 71 6c   14) }.  execsql
0c60: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0c70: 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34   t1 }.} {1 2 3 4
0c80: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
0c90: 20 31 32 20 31 33 20 31 34 7d 0a 0a 64 6f 5f 74   12 13 14}..do_t
0ca0: 65 73 74 20 77 61 6c 2d 32 2e 35 20 7b 0a 20 20  est wal-2.5 {.  
0cb0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
0cc0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32   * FROM t1 } db2
0cd0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
0ce0: 37 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65  7 8 9 10}..do_te
0cf0: 73 74 20 77 61 6c 2d 32 2e 36 20 7b 0a 20 20 65  st wal-2.6 {.  e
0d00: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 3b  xecsql { COMMIT;
0d10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0d20: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33  1 } db2.} {1 2 3
0d30: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
0d40: 31 31 20 31 32 20 31 33 20 31 34 7d 0a 0a 64 6f  11 12 13 14}..do
0d50: 5f 74 65 73 74 20 77 61 6c 2d 33 2e 31 20 7b 0a  _test wal-3.1 {.
0d60: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
0d70: 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  N; DELETE FROM t
0d80: 31 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 }.  execsql { 
0d90: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0da0: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
0db0: 77 61 6c 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63  wal-3.2 {.  exec
0dc0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0dd0: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b  ROM t1 } db2.} {
0de0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
0df0: 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34  9 10 11 12 13 14
0e00: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33 2e  }.do_test wal-3.
0e10: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
0e20: 52 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20 65 78 65  ROLLBACK }.  exe
0e30: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0e40: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
0e50: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0e60: 30 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a 64  0 11 12 13 14}.d
0e70: 62 32 20 63 6c 6f 73 65 0a 0a 23 2d 2d 2d 2d 2d  b2 close..#-----
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
0ed0: 77 69 6e 67 20 74 65 73 74 73 2c 20 77 61 6c 2d  wing tests, wal-
0ee0: 34 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 73  4.*, test that s
0ef0: 61 76 65 70 6f 69 6e 74 73 20 77 6f 72 6b 20 77  avepoints work w
0f00: 69 74 68 20 57 41 4c 20 0a 23 20 64 61 74 61 62  ith WAL .# datab
0f10: 61 73 65 73 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ases..#.do_test 
0f20: 77 61 6c 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63  wal-4.1 {.  exec
0f30: 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54 45  sql {.    DELETE
0f40: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45   FROM t1;.    BE
0f50: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
0f60: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0f70: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20  ('a', 'b');.    
0f80: 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a    SAVEPOINT sp;.
0f90: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
0fa0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 63  NTO t1 VALUES('c
0fb0: 27 2c 20 27 64 27 29 3b 0a 20 20 20 20 20 20 20  ', 'd');.       
0fc0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0fd0: 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 20 63 20  1;.  }.} {a b c 
0fe0: 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  d}.do_test wal-4
0ff0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
1000: 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20  .      ROLLBACK 
1010: 54 4f 20 73 70 3b 0a 20 20 20 20 20 20 53 45 4c  TO sp;.      SEL
1020: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
1030: 20 7d 0a 7d 20 7b 61 20 62 7d 0a 64 6f 5f 74 65   }.} {a b}.do_te
1040: 73 74 20 77 61 6c 2d 34 2e 33 20 7b 0a 20 20 65  st wal-4.3 {.  e
1050: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  xecsql {.    COM
1060: 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  MIT;.    SELECT 
1070: 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  * FROM t1;.  }.}
1080: 20 7b 61 20 62 7d 0a 0a 64 6f 5f 74 65 73 74 20   {a b}..do_test 
1090: 77 61 6c 2d 34 2e 34 2e 31 20 7b 0a 20 20 64 62  wal-4.4.1 {.  db
10a0: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
10b0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64 62   db test.db.  db
10c0: 20 66 75 6e 63 20 62 6c 6f 62 20 62 6c 6f 62 0a   func blob blob.
10d0: 20 20 6c 69 73 74 20 5b 65 78 65 63 73 71 6c 20    list [execsql 
10e0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
10f0: 74 31 20 7d 5d 20 5b 66 69 6c 65 20 73 69 7a 65  t1 }] [file size
1100: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
1110: 7b 7b 61 20 62 7d 20 30 7d 0a 64 6f 5f 74 65 73  {{a b} 0}.do_tes
1120: 74 20 77 61 6c 2d 34 2e 34 2e 32 20 7b 0a 20 20  t wal-4.4.2 {.  
1130: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
1140: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
1150: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
1160: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1170: 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t2(a, b);.    IN
1180: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
1190: 55 45 53 28 62 6c 6f 62 28 34 30 30 29 2c 20 62  UES(blob(400), b
11a0: 6c 6f 62 28 34 30 30 29 29 3b 0a 20 20 20 20 53  lob(400));.    S
11b0: 41 56 45 50 4f 49 4e 54 20 74 72 3b 0a 20 20 20  AVEPOINT tr;.   
11c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
11d0: 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  2 SELECT blob(40
11e0: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
11f0: 4f 4d 20 74 32 3b 20 2f 2a 20 20 32 20 2a 2f 0a  OM t2; /*  2 */.
1200: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1210: 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t2 SELECT blob
1220: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1230: 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 34 20   FROM t2; /*  4 
1240: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
1250: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
1260: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
1270: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
1280: 20 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   8 */.      INSE
1290: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
12a0: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
12b0: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
12c0: 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49  /* 16 */.      I
12d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
12e0: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
12f0: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1300: 32 3b 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20  2; /* 32 */.    
1310: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1320: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1330: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1340: 4d 20 74 31 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20  M t1; /*  2 */. 
1350: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1360: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
1370: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
1380: 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 34 20 2a  FROM t1; /*  4 *
1390: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
13a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
13b0: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
13c0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20  0) FROM t1; /*  
13d0: 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  8 */.      INSER
13e0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
13f0: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1400: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1410: 2a 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e  * 16 */.      IN
1420: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1430: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1440: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
1450: 3b 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20  ; /* 32 */.     
1460: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1470: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
1480: 7b 33 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  {32}.do_test wal
1490: 2d 34 2e 34 2e 33 20 7b 0a 20 20 65 78 65 63 73  -4.4.3 {.  execs
14a0: 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ql { ROLLBACK TO
14b0: 20 74 72 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65   tr }.} {}.do_te
14c0: 73 74 20 77 61 6c 2d 34 2e 34 2e 34 20 7b 0a 20  st wal-4.4.4 {. 
14d0: 20 73 65 74 20 6c 6f 67 73 69 7a 65 20 5b 66 69   set logsize [fi
14e0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
14f0: 77 61 6c 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b  wal].  execsql {
1500: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1510: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 78 27  TO t1 VALUES('x'
1520: 2c 20 27 79 27 29 3b 0a 20 20 20 20 52 45 4c 45  , 'y');.    RELE
1530: 41 53 45 20 74 72 3b 0a 20 20 7d 0a 20 20 65 78  ASE tr;.  }.  ex
1540: 70 72 20 7b 20 24 6c 6f 67 73 69 7a 65 20 3d 3d  pr { $logsize ==
1550: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
1560: 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d 20 7b 31 7d  .db-wal] }.} {1}
1570: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34  .do_test wal-4.4
1580: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
1590: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
15a0: 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 31 7d   FROM t2 }.} {1}
15b0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34  .do_test wal-4.4
15c0: 2e 36 20 7b 0a 20 20 66 69 6c 65 20 63 6f 70 79  .6 {.  file copy
15d0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
15e0: 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65 20  test2.db.  file 
15f0: 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74  copy -force test
1600: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
1610: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64  -wal.  sqlite3 d
1620: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78  b2 test2.db.  ex
1630: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
1640: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
1650: 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ; SELECT count(*
1660: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
1670: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
1680: 77 61 6c 2d 34 2e 34 2e 37 20 7b 0a 20 20 65 78  wal-4.4.7 {.  ex
1690: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
16a0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
16b0: 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20   db2.} {ok}.db2 
16c0: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
16d0: 61 6c 2d 34 2e 35 2e 31 20 7b 0a 20 20 72 65 6f  al-4.5.1 {.  reo
16e0: 70 65 6e 5f 64 62 0a 20 20 64 62 20 66 75 6e 63  pen_db.  db func
16f0: 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 65 78 65   blob blob.  exe
1700: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
1710: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
1720: 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45   WAL;.    CREATE
1730: 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b   TABLE t1(a, b);
1740: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1750: 20 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20   t1 VALUES('a', 
1760: 27 62 27 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  'b');.  }.  sqli
1770: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
1780: 20 64 62 20 66 75 6e 63 20 62 6c 6f 62 20 62 6c   db func blob bl
1790: 6f 62 0a 20 20 6c 69 73 74 20 5b 65 78 65 63 73  ob.  list [execs
17a0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
17b0: 4f 4d 20 74 31 20 7d 5d 20 5b 66 69 6c 65 20 73  OM t1 }] [file s
17c0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
17d0: 0a 7d 20 7b 7b 61 20 62 7d 20 30 7d 0a 64 6f 5f  .} {{a b} 0}.do_
17e0: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 32 20 7b  test wal-4.5.2 {
17f0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41  .  execsql { PRA
1800: 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d  GMA cache_size =
1810: 20 31 30 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   10 }.  execsql 
1820: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  {.    CREATE TAB
1830: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
1840: 20 42 45 47 49 4e 3b 0a 20 20 20 20 49 4e 53 45   BEGIN;.    INSE
1850: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1860: 53 28 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  S(blob(400), blo
1870: 62 28 34 30 30 29 29 3b 0a 20 20 20 20 53 41 56  b(400));.    SAV
1880: 45 50 4f 49 4e 54 20 74 72 3b 0a 20 20 20 20 20  EPOINT tr;.     
1890: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
18a0: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
18b0: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
18c0: 20 74 32 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20 20   t2; /*  2 */.  
18d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
18e0: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
18f0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1900: 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 34 20 2a 2f  ROM t2; /*  4 */
1910: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1920: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
1930: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1940: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 38  ) FROM t2; /*  8
1950: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
1960: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
1970: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
1980: 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a  400) FROM t2; /*
1990: 20 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53   16 */.      INS
19a0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
19b0: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
19c0: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b  ob(400) FROM t2;
19d0: 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20   /* 32 */.      
19e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
19f0: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1a00: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1a10: 74 31 3b 20 2f 2a 20 20 32 20 2a 2f 0a 20 20 20  t1; /*  2 */.   
1a20: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1a30: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  1 SELECT blob(40
1a40: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1a50: 4f 4d 20 74 31 3b 20 2f 2a 20 20 34 20 2a 2f 0a  OM t1; /*  4 */.
1a60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1a70: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
1a80: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
1a90: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 38 20   FROM t1; /*  8 
1aa0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
1ab0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
1ac0: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
1ad0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20  00) FROM t1; /* 
1ae0: 31 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  16 */.      INSE
1af0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1b00: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1b10: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(400) FROM t1; 
1b20: 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 53  /* 32 */.      S
1b30: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1b40: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 33  ROM t2;.  }.} {3
1b50: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  2}.do_test wal-4
1b60: 2e 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.3 {.  execsql
1b70: 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 74   { ROLLBACK TO t
1b80: 72 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74  r }.} {}.do_test
1b90: 20 77 61 6c 2d 34 2e 35 2e 34 20 7b 0a 20 20 73   wal-4.5.4 {.  s
1ba0: 65 74 20 6c 6f 67 73 69 7a 65 20 5b 66 69 6c 65  et logsize [file
1bb0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
1bc0: 6c 5d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  l].  execsql {. 
1bd0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1be0: 20 74 31 20 56 41 4c 55 45 53 28 27 78 27 2c 20   t1 VALUES('x', 
1bf0: 27 79 27 29 3b 0a 20 20 20 20 52 45 4c 45 41 53  'y');.    RELEAS
1c00: 45 20 74 72 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  E tr;.    COMMIT
1c10: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 20 24  ;.  }.  expr { $
1c20: 6c 6f 67 73 69 7a 65 20 3d 3d 20 5b 66 69 6c 65  logsize == [file
1c30: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
1c40: 6c 5d 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65  l] }.} {1}.do_te
1c50: 73 74 20 77 61 6c 2d 34 2e 35 2e 35 20 7b 0a 20  st wal-4.5.5 {. 
1c60: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1c70: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1c80: 74 32 20 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e  t2 ; SELECT coun
1c90: 74 28 2a 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d  t(*) FROM t1 }.}
1ca0: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77   {1 2}.do_test w
1cb0: 61 6c 2d 34 2e 35 2e 36 20 7b 0a 20 20 66 69 6c  al-4.5.6 {.  fil
1cc0: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65  e copy -force te
1cd0: 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20  st.db test2.db. 
1ce0: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
1cf0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  e test.db-wal te
1d00: 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c  st2.db-wal.  sql
1d10: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
1d20: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
1d30: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1d40: 4f 4d 20 74 32 20 3b 20 53 45 4c 45 43 54 20 63  OM t2 ; SELECT c
1d50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
1d60: 7d 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f  } db2.} {1 2}.do
1d70: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 37 20  _test wal-4.5.7 
1d80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
1d90: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
1da0: 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
1db0: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f  }.db2 close..do_
1dc0: 74 65 73 74 20 77 61 6c 2d 34 2e 36 2e 31 20 7b  test wal-4.6.1 {
1dd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1de0: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 32 3b   DELETE FROM t2;
1df0: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
1e00: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20  checkpoint;.    
1e10: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
1e20: 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55  ERT INTO t2 VALU
1e30: 45 53 28 27 77 27 2c 20 27 78 27 29 3b 0a 20 20  ES('w', 'x');.  
1e40: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 61      SAVEPOINT sa
1e50: 76 65 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45  ve;.        INSE
1e60: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
1e70: 53 28 27 79 27 2c 20 27 7a 27 29 3b 0a 20 20 20  S('y', 'z');.   
1e80: 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73     ROLLBACK TO s
1e90: 61 76 65 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ave;.    COMMIT;
1ea0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1eb0: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 77 20  OM t2;.  }.} {w 
1ec0: 78 7d 0a 0a 0a 72 65 6f 70 65 6e 5f 64 62 0a 64  x}...reopen_db.d
1ed0: 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 31 20 7b  o_test wal-5.1 {
1ee0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1ef0: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
1f00: 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20  LE t2(a, b);.   
1f10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
1f20: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
1f30: 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77  }.} {}.do_test w
1f40: 61 6c 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73  al-5.2 {.  execs
1f50: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
1f60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1f70: 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34  O t2 VALUES(3, 4
1f80: 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20  );.      SELECT 
1f90: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
1fa0: 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65   {1 2 3 4}.do_te
1fb0: 73 74 20 77 61 6c 2d 35 2e 33 20 7b 0a 20 20 65  st wal-5.3 {.  e
1fc0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c  xecsql {.    ROL
1fd0: 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43  LBACK;.    SELEC
1fe0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d  T * FROM t2;.  }
1ff0: 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {1 2}.do_test
2000: 20 77 61 6c 2d 35 2e 34 20 7b 0a 20 20 65 78 65   wal-5.4 {.  exe
2010: 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54  csql {.    CREAT
2020: 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 33 28  E TEMP TABLE t3(
2030: 78 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42  x UNIQUE);.    B
2040: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
2050: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
2060: 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 49  S(3, 4);.      I
2070: 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41  NSERT INTO t3 VA
2080: 4c 55 45 53 28 27 61 62 63 27 29 3b 0a 20 20 7d  LUES('abc');.  }
2090: 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e  .  catchsql { IN
20a0: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
20b0: 55 45 53 28 27 61 62 63 27 29 20 7d 0a 7d 20 7b  UES('abc') }.} {
20c0: 31 20 7b 63 6f 6c 75 6d 6e 20 78 20 69 73 20 6e  1 {column x is n
20d0: 6f 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74  ot unique}}.do_t
20e0: 65 73 74 20 77 61 6c 2d 35 2e 35 20 7b 0a 20 20  est wal-5.5 {.  
20f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f  execsql {.    CO
2100: 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54  MMIT;.    SELECT
2110: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
2120: 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 62 20 63  } {1 2 3 4}.db c
2130: 6c 6f 73 65 0a 0a 66 6f 72 65 61 63 68 20 73 65  lose..foreach se
2140: 63 74 6f 72 20 7b 35 31 32 20 34 30 39 36 7d 20  ctor {512 4096} 
2150: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 69 6d 75  {.  sqlite3_simu
2160: 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 73 65 63  late_device -sec
2170: 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 0a  torsize $sector.
2180: 20 20 66 6f 72 65 61 63 68 20 70 67 73 7a 20 7b    foreach pgsz {
2190: 35 31 32 20 31 30 32 34 20 32 30 34 38 20 34 30  512 1024 2048 40
21a0: 39 36 7d 20 7b 0a 20 20 20 20 66 69 6c 65 20 64  96} {.    file d
21b0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
21c0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
21d0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
21e0: 2d 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a  -6.$sector.$pgsz
21f0: 2e 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  .1 {.      sqlit
2200: 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76  e3 db test.db -v
2210: 66 73 20 64 65 76 73 79 6d 0a 20 20 20 20 20 20  fs devsym.      
2220: 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20  execsql ".      
2230: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
2240: 7a 65 20 3d 20 24 70 67 73 7a 3b 0a 20 20 20 20  ze = $pgsz;.    
2250: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
2260: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
2270: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
2280: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
2290: 20 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65       ".      exe
22a0: 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 43  csql ".        C
22b0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
22c0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e  , b);.        IN
22d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
22e0: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20  UES(1, 2);.     
22f0: 20 22 0a 20 20 20 20 20 20 64 62 20 63 6c 6f 73   ".      db clos
2300: 65 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a  e.      file siz
2310: 65 20 74 65 73 74 2e 64 62 0a 20 20 20 20 7d 20  e test.db.    } 
2320: 5b 65 78 70 72 20 24 70 67 73 7a 2a 32 5d 0a 20  [expr $pgsz*2]. 
2330: 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61   .    do_test wa
2340: 6c 2d 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73  l-6.$sector.$pgs
2350: 7a 2e 32 20 7b 0a 20 20 20 20 20 20 6c 6f 67 5f  z.2 {.      log_
2360: 64 65 6c 65 74 65 64 20 74 65 73 74 2e 64 62 2d  deleted test.db-
2370: 77 61 6c 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20  wal.    } {1}.  
2380: 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  }.}..do_test wal
2390: 2d 37 2e 31 20 7b 0a 20 20 66 69 6c 65 20 64 65  -7.1 {.  file de
23a0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
23b0: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  .db test.db-wal.
23c0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62    sqlite3_wal db
23d0: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
23e0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
23f0: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
2400: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
2410: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
2420: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2430: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
2440: 7d 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73  }.  list [file s
2450: 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69  ize test.db] [fi
2460: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
2470: 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31 30 32  wal].} [list 102
2480: 34 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65  4 [log_file_size
2490: 20 33 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73   3 1024]].do_tes
24a0: 74 20 77 61 6c 2d 37 2e 32 20 7b 0a 20 20 65 78  t wal-7.2 {.  ex
24b0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
24c0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
24d0: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a    list [file siz
24e0: 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65  e test.db] [file
24f0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
2500: 6c 5d 0a 7d 20 5b 6c 69 73 74 20 32 30 34 38 20  l].} [list 2048 
2510: 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 33  [log_file_size 3
2520: 20 31 30 32 34 5d 5d 0a 0a 23 20 45 78 65 63 75   1024]]..# Execu
2530: 74 65 20 73 6f 6d 65 20 74 72 61 6e 73 61 63 74  te some transact
2540: 69 6f 6e 73 20 69 6e 20 61 75 74 6f 2d 76 61 63  ions in auto-vac
2550: 75 75 6d 20 6d 6f 64 65 20 74 6f 20 74 65 73 74  uum mode to test
2560: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23   database file.#
2570: 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 23 0a 64   truncation..#.d
2580: 6f 5f 74 65 73 74 20 77 61 6c 2d 38 2e 31 20 7b  o_test wal-8.1 {
2590: 0a 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 63  .  reopen_db.  c
25a0: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
25b0: 7d 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20  }.  file delete 
25c0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74  -force test.db t
25d0: 65 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 73 71  est.db-wal..  sq
25e0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
25f0: 0a 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 62  .  db function b
2600: 6c 6f 62 20 62 6c 6f 62 0a 20 20 65 78 65 63 73  lob blob.  execs
2610: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
2620: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b  auto_vacuum = 1;
2630: 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72  .    PRAGMA jour
2640: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a  nal_mode = wal;.
2650: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
2660: 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 7d 20 7b 77  vacuum;.  }.} {w
2670: 61 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61  al 1}.do_test wa
2680: 6c 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  l-8.2 {.  execsq
2690: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
26a0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
26b0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
26c0: 45 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53  E t1(x);.    INS
26d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
26e0: 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  ES(blob(900));. 
26f0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2700: 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30  1 VALUES(blob(90
2710: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
2720: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
2730: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
2740: 3b 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f  ;       /*  4 */
2750: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2760: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2770: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2780: 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20      /*  8 */.   
2790: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
27a0: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
27b0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
27c0: 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53  /* 16 */.    INS
27d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
27e0: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
27f0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33  M t1;       /* 3
2800: 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  2 */.    INSERT 
2810: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
2820: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
2830: 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f  ;       /* 64 */
2840: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
2850: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a  checkpoint;.  }.
2860: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
2870: 2e 64 62 0a 7d 20 5b 65 78 70 72 20 36 38 2a 31  .db.} [expr 68*1
2880: 30 32 34 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  024].do_test wal
2890: 2d 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.3 {.  execsql
28a0: 20 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46   { .    DELETE F
28b0: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77  ROM t1 WHERE row
28c0: 69 64 3c 35 34 3b 0a 20 20 20 20 50 52 41 47 4d  id<54;.    PRAGM
28d0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
28e0: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  ;.  }.  file siz
28f0: 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70  e test.db.} [exp
2900: 72 20 31 34 2a 31 30 32 34 5d 0a 0a 23 20 52 75  r 14*1024]..# Ru
2910: 6e 20 73 6f 6d 65 20 22 77 61 72 6d 2d 62 6f 64  n some "warm-bod
2920: 79 22 20 74 65 73 74 73 20 74 6f 20 65 6e 73 75  y" tests to ensu
2930: 72 65 20 74 68 61 74 20 6c 6f 67 2d 73 75 6d 6d  re that log-summ
2940: 61 72 79 20 66 69 6c 65 73 20 77 69 74 68 20 6d  ary files with m
2950: 6f 72 65 0a 23 20 74 68 61 6e 20 32 35 36 20 65  ore.# than 256 e
2960: 6e 74 72 69 65 73 20 28 6c 6f 67 20 73 75 6d 6d  ntries (log summ
2970: 61 72 69 65 73 20 74 68 61 74 20 63 6f 6e 74 61  aries that conta
2980: 69 6e 20 69 6e 64 65 78 20 62 6c 6f 63 6b 73 29  in index blocks)
2990: 20 77 6f 72 6b 20 4f 6b 2e 0a 23 0a 64 6f 5f 74   work Ok..#.do_t
29a0: 65 73 74 20 77 61 6c 2d 39 2e 31 20 7b 0a 20 20  est wal-9.1 {.  
29b0: 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63  reopen_db.  exec
29c0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
29d0: 20 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d   TABLE t1(x PRIM
29e0: 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e  ARY KEY);.    IN
29f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2a00: 55 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a  UES(blob(900));.
2a10: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2a20: 74 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39  t1 VALUES(blob(9
2a30: 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  00));.    INSERT
2a40: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2a50: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2a60: 31 3b 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a  1;       /*  4 *
2a70: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
2a80: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2a90: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2aa0: 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20       /*  8 */.  
2ab0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2ac0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2ad0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2ae0: 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e   /* 16 */.    IN
2af0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
2b00: 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52  ECT blob(900) FR
2b10: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
2b20: 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54  32 */.    INSERT
2b30: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
2b40: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
2b50: 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a  1;       /* 64 *
2b60: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
2b70: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
2b80: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
2b90: 20 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20       /* 128 */. 
2ba0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
2bb0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
2bc0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
2bd0: 20 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 7d 0a    /* 256 */.  }.
2be0: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
2bf0: 2e 64 62 0a 7d 20 31 30 32 34 0a 64 6f 5f 74 65  .db.} 1024.do_te
2c00: 73 74 20 77 61 6c 2d 39 2e 32 20 7b 0a 20 20 73  st wal-9.2 {.  s
2c10: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74  qlite3_wal db2 t
2c20: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
2c30: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   {PRAGMA integri
2c40: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d  ty_check } db2.}
2c50: 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77   {ok}..do_test w
2c60: 61 6c 2d 39 2e 33 20 7b 0a 20 20 66 69 6c 65 20  al-9.3 {.  file 
2c70: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65  delete -force te
2c80: 73 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d  st2.db test2.db-
2c90: 77 61 6c 0a 20 20 66 69 6c 65 20 63 6f 70 79 20  wal.  file copy 
2ca0: 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62  test.db test2.db
2cb0: 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 74 65 73  .  file copy tes
2cc0: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64  t.db-wal test2.d
2cd0: 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f  b-wal.  sqlite3_
2ce0: 77 61 6c 20 64 62 33 20 74 65 73 74 32 2e 64 62  wal db3 test2.db
2cf0: 20 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41   .  execsql {PRA
2d00: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
2d10: 65 63 6b 20 7d 20 64 62 33 0a 7d 20 7b 6f 6b 7d  eck } db3.} {ok}
2d20: 0a 64 62 33 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74  .db3 close..do_t
2d30: 65 73 74 20 77 61 6c 2d 39 2e 34 20 7b 0a 20 20  est wal-9.4 {.  
2d40: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
2d50: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
2d60: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20  }.  db2 close.  
2d70: 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20  sqlite3_wal db2 
2d80: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
2d90: 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72  l {PRAGMA integr
2da0: 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a  ity_check } db2.
2db0: 7d 20 7b 6f 6b 7d 0a 0a 66 6f 72 65 61 63 68 20  } {ok}..foreach 
2dc0: 68 61 6e 64 6c 65 20 7b 64 62 20 64 62 32 20 64  handle {db db2 d
2dd0: 62 33 7d 20 7b 20 63 61 74 63 68 20 7b 20 24 68  b3} { catch { $h
2de0: 61 6e 64 6c 65 20 63 6c 6f 73 65 20 7d 20 7d 0a  andle close } }.
2df0: 75 6e 73 65 74 20 68 61 6e 64 6c 65 0a 0a 23 2d  unset handle..#-
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
2e50: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
2e60: 66 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 30  f tests - wal-10
2e70: 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 74  .* - test that t
2e80: 68 65 20 57 41 4c 20 6c 6f 63 6b 69 6e 67 20 0a  he WAL locking .
2e90: 23 20 73 63 68 65 6d 65 20 77 6f 72 6b 73 20 69  # scheme works i
2ea0: 6e 20 73 69 6d 70 6c 65 20 63 61 73 65 73 2e 20  n simple cases. 
2eb0: 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65  This block of te
2ec0: 73 74 73 20 69 73 20 72 75 6e 20 74 77 69 63 65  sts is run twice
2ed0: 2e 20 4f 6e 63 65 0a 23 20 75 73 69 6e 67 20 6d  . Once.# using m
2ee0: 75 6c 74 69 70 6c 65 20 63 6f 6e 6e 65 63 74 69  ultiple connecti
2ef0: 6f 6e 73 20 69 6e 20 74 68 65 20 61 64 64 72 65  ons in the addre
2f00: 73 73 20 73 70 61 63 65 20 6f 66 20 74 68 65 20  ss space of the 
2f10: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2c  current process,
2f20: 0a 23 20 61 6e 64 20 6f 6e 63 65 20 77 69 74 68  .# and once with
2f30: 20 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   all connections
2f40: 20 65 78 63 65 70 74 20 6f 6e 65 20 72 75 6e 6e   except one runn
2f50: 69 6e 67 20 69 6e 20 65 78 74 65 72 6e 61 6c 20  ing in external 
2f60: 70 72 6f 63 65 73 73 65 73 2e 0a 23 0a 66 6f 72  processes..#.for
2f70: 65 61 63 68 20 63 6f 64 65 20 5b 6c 69 73 74 20  each code [list 
2f80: 7b 0a 20 20 73 65 74 20 3a 3a 63 6f 64 65 32 5f  {.  set ::code2_
2f90: 63 68 61 6e 20 5b 6c 61 75 6e 63 68 5f 74 65 73  chan [launch_tes
2fa0: 74 66 69 78 74 75 72 65 5d 0a 20 20 73 65 74 20  tfixture].  set 
2fb0: 3a 3a 63 6f 64 65 33 5f 63 68 61 6e 20 5b 6c 61  ::code3_chan [la
2fc0: 75 6e 63 68 5f 74 65 73 74 66 69 78 74 75 72 65  unch_testfixture
2fd0: 5d 0a 20 20 70 72 6f 63 20 63 6f 64 65 32 20 7b  ].  proc code2 {
2fe0: 74 63 6c 7d 20 7b 20 74 65 73 74 66 69 78 74 75  tcl} { testfixtu
2ff0: 72 65 20 24 3a 3a 63 6f 64 65 32 5f 63 68 61 6e  re $::code2_chan
3000: 20 24 74 63 6c 20 7d 0a 20 20 70 72 6f 63 20 63   $tcl }.  proc c
3010: 6f 64 65 33 20 7b 74 63 6c 7d 20 7b 20 74 65 73  ode3 {tcl} { tes
3020: 74 66 69 78 74 75 72 65 20 24 3a 3a 63 6f 64 65  tfixture $::code
3030: 33 5f 63 68 61 6e 20 24 74 63 6c 20 7d 0a 20 20  3_chan $tcl }.  
3040: 73 65 74 20 74 6e 20 31 0a 7d 20 7b 0a 20 20 70  set tn 1.} {.  p
3050: 72 6f 63 20 63 6f 64 65 32 20 7b 74 63 6c 7d 20  roc code2 {tcl} 
3060: 7b 20 75 70 6c 65 76 65 6c 20 23 30 20 24 74 63  { uplevel #0 $tc
3070: 6c 20 7d 0a 20 20 70 72 6f 63 20 63 6f 64 65 33  l }.  proc code3
3080: 20 7b 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c   {tcl} { uplevel
3090: 20 23 30 20 24 74 63 6c 20 7d 0a 20 20 73 65 74   #0 $tcl }.  set
30a0: 20 74 6e 20 32 0a 7d 5d 20 7b 0a 0a 20 20 65 76   tn 2.}] {..  ev
30b0: 61 6c 20 24 63 6f 64 65 0a 20 20 72 65 6f 70 65  al $code.  reope
30c0: 6e 5f 64 62 0a 0a 20 20 23 20 4f 70 65 6e 20 63  n_db..  # Open c
30d0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32 5d  onnections [db2]
30e0: 20 61 6e 64 20 5b 64 62 33 5d 2e 20 44 65 70 65   and [db3]. Depe
30f0: 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69  nding on which i
3100: 74 65 72 61 74 69 6f 6e 20 74 68 69 73 0a 20 20  teration this.  
3110: 23 20 69 73 2c 20 74 68 65 20 63 6f 6e 6e 65 63  # is, the connec
3120: 74 69 6f 6e 73 20 6d 61 79 20 62 65 20 63 72 65  tions may be cre
3130: 61 74 65 64 20 69 6e 20 74 68 69 73 20 69 6e 74  ated in this int
3140: 65 72 70 72 65 74 65 72 2c 20 6f 72 20 69 6e 20  erpreter, or in 
3150: 0a 20 20 23 20 69 6e 74 65 72 70 72 65 74 65 72  .  # interpreter
3160: 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6f 74 68  s running in oth
3170: 65 72 20 4f 53 20 70 72 6f 63 65 73 73 65 73 2e  er OS processes.
3180: 20 41 73 20 73 75 63 68 2c 20 74 68 65 20 5b 64   As such, the [d
3190: 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 0a 20 20  b2] and [db3].  
31a0: 23 20 63 6f 6d 6d 61 6e 64 73 20 73 68 6f 75 6c  # commands shoul
31b0: 64 20 6f 6e 6c 79 20 62 65 20 61 63 63 65 73 73  d only be access
31c0: 65 64 20 77 69 74 68 69 6e 20 5b 63 6f 64 65 32  ed within [code2
31d0: 5d 20 61 6e 64 20 5b 63 6f 64 65 33 5d 20 62 6c  ] and [code3] bl
31e0: 6f 63 6b 73 2c 0a 20 20 23 20 72 65 73 70 65 63  ocks,.  # respec
31f0: 74 69 76 65 6c 79 2e 0a 20 20 23 0a 20 20 63 6f  tively..  #.  co
3200: 64 65 32 20 7b 20 73 71 6c 69 74 65 33 20 64 62  de2 { sqlite3 db
3210: 32 20 74 65 73 74 2e 64 62 20 3b 20 64 62 32 20  2 test.db ; db2 
3220: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
3230: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
3240: 20 7d 20 7d 0a 20 20 63 6f 64 65 33 20 7b 20 73   } }.  code3 { s
3250: 71 6c 69 74 65 33 20 64 62 33 20 74 65 73 74 2e  qlite3 db3 test.
3260: 64 62 20 3b 20 64 62 33 20 65 76 61 6c 20 7b 20  db ; db3 eval { 
3270: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
3280: 6f 64 65 20 3d 20 57 41 4c 20 7d 20 7d 0a 0a 20  ode = WAL } }.. 
3290: 20 23 20 53 68 6f 72 74 68 61 6e 64 20 63 6f 6d   # Shorthand com
32a0: 6d 61 6e 64 73 2e 20 45 78 65 63 75 74 65 20 53  mands. Execute S
32b0: 51 4c 20 75 73 69 6e 67 20 64 61 74 61 62 61 73  QL using databas
32c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62  e connection [db
32d0: 32 5d 20 6f 72 20 0a 20 20 23 20 5b 64 62 33 5d  2] or .  # [db3]
32e0: 2e 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73  . Return the res
32f0: 75 6c 74 73 2e 0a 20 20 23 0a 20 20 70 72 6f 63  ults..  #.  proc
3300: 20 73 71 6c 32 20 7b 73 71 6c 7d 20 7b 20 63 6f   sql2 {sql} { co
3310: 64 65 32 20 5b 6c 69 73 74 20 64 62 32 20 65 76  de2 [list db2 ev
3320: 61 6c 20 24 73 71 6c 5d 20 7d 0a 20 20 70 72 6f  al $sql] }.  pro
3330: 63 20 73 71 6c 33 20 7b 73 71 6c 7d 20 7b 20 63  c sql3 {sql} { c
3340: 6f 64 65 33 20 5b 6c 69 73 74 20 64 62 33 20 65  ode3 [list db3 e
3350: 76 61 6c 20 24 73 71 6c 5d 20 7d 0a 0a 20 20 23  val $sql] }..  #
3360: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3370: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
3380: 61 6e 64 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  and contents..  
3390: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
33a0: 31 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65  10.$tn.1 {.    e
33b0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43  xecsql {.      C
33c0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
33d0: 2c 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  , b);.      INSE
33e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
33f0: 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 53  S(1, 2);.      S
3400: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
3410: 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d  .    }.  } {1 2}
3420: 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61  ..  # Open a tra
3430: 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 77 72 69  nsaction and wri
3440: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
3450: 73 65 20 75 73 69 6e 67 20 5b 64 62 5d 2e 20 43  se using [db]. C
3460: 68 65 63 6b 20 74 68 61 74 20 5b 64 62 32 5d 0a  heck that [db2].
3470: 20 20 23 20 69 73 20 73 74 69 6c 6c 20 61 62 6c    # is still abl
3480: 65 20 74 6f 20 72 65 61 64 20 74 68 65 20 73 6e  e to read the sn
3490: 61 70 73 68 6f 74 20 62 65 66 6f 72 65 20 74 68  apshot before th
34a0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
34b0: 73 20 6f 70 65 6e 65 64 2e 0a 20 20 23 0a 20 20  s opened..  #.  
34c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
34d0: 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.2 {.    execs
34e0: 71 6c 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45  ql { BEGIN; INSE
34f0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
3500: 53 28 33 2c 20 34 29 3b 20 7d 0a 20 20 20 20 73  S(3, 4); }.    s
3510: 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  ql2 {SELECT * FR
3520: 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 7d  OM t1}.  } {1 2}
3530: 0a 0a 20 20 23 20 48 61 76 65 20 5b 64 62 5d 20  ..  # Have [db] 
3540: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
3550: 61 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68  action. Check th
3560: 61 74 20 5b 64 62 32 5d 20 69 73 20 6e 6f 77 20  at [db2] is now 
3570: 73 65 65 69 6e 67 20 74 68 65 20 0a 20 20 23 20  seeing the .  # 
3580: 6e 65 77 2c 20 75 70 64 61 74 65 64 20 73 6e 61  new, updated sna
3590: 70 73 68 6f 74 2e 0a 20 20 23 0a 20 20 64 6f 5f  pshot..  #.  do_
35a0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
35b0: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
35c0: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73  { COMMIT }.    s
35d0: 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  ql2 {SELECT * FR
35e0: 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20  OM t1}.  } {1 2 
35f0: 33 20 34 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  3 4}..  # Have [
3600: 64 62 32 5d 20 6f 70 65 6e 20 61 20 72 65 61 64  db2] open a read
3610: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
3620: 65 6e 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  en write to the 
3630: 64 62 20 76 69 61 20 5b 64 62 5d 2e 20 43 68 65  db via [db]. Che
3640: 63 6b 0a 20 20 23 20 74 68 61 74 20 5b 64 62 32  ck.  # that [db2
3650: 5d 20 69 73 20 73 74 69 6c 6c 20 73 65 65 69 6e  ] is still seein
3660: 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  g the original s
3670: 6e 61 70 73 68 6f 74 2e 20 54 68 65 6e 20 72 65  napshot. Then re
3680: 61 64 20 77 69 74 68 20 5b 64 62 33 5d 2e 0a 20  ad with [db3].. 
3690: 20 23 20 5b 64 62 33 5d 20 73 68 6f 75 6c 64 20   # [db3] should 
36a0: 73 65 65 20 74 68 65 20 6e 65 77 6c 79 20 63 6f  see the newly co
36b0: 6d 6d 69 74 74 65 64 20 64 61 74 61 2e 0a 20 20  mmitted data..  
36c0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
36d0: 31 30 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73  10.$tn.4 {.    s
36e0: 71 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53 45  ql2 { BEGIN ; SE
36f0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
3700: 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20 20    } {1 2 3 4}.  
3710: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3720: 74 6e 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73  tn.5 {.    execs
3730: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
3740: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
3750: 3b 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45  ; }.    sql2 {SE
3760: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
3770: 20 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20 20    } {1 2 3 4}.  
3780: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3790: 74 6e 2e 36 20 7b 0a 20 20 20 20 73 71 6c 33 20  tn.6 {.    sql3 
37a0: 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  {SELECT * FROM t
37b0: 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20  1}.  } {1 2 3 4 
37c0: 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  5 6}.  do_test w
37d0: 61 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20 20  al-10.$tn.7 {.  
37e0: 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20    sql2 COMMIT.  
37f0: 7d 20 7b 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b  } {}..  # Have [
3800: 64 62 32 5d 20 6f 70 65 6e 20 61 20 77 72 69 74  db2] open a writ
3810: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
3820: 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77  hen attempt to w
3830: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 20 20 23  rite to the .  #
3840: 20 64 61 74 61 62 61 73 65 20 76 69 61 20 5b 64   database via [d
3850: 62 5d 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20  b]. This should 
3860: 66 61 69 6c 20 28 77 72 69 74 65 72 20 6c 6f 63  fail (writer loc
3870: 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
3880: 69 6e 65 64 29 2e 0a 20 20 23 0a 20 20 23 20 54  ined)..  #.  # T
3890: 68 65 6e 20 6f 70 65 6e 20 61 20 72 65 61 64 2d  hen open a read-
38a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68  transaction with
38b0: 20 5b 64 62 5d 2e 20 43 6f 6d 6d 69 74 20 74 68   [db]. Commit th
38c0: 65 20 5b 64 62 32 5d 20 74 72 61 6e 73 61 63 74  e [db2] transact
38d0: 69 6f 6e 0a 20 20 23 20 74 6f 20 64 69 73 6b 2e  ion.  # to disk.
38e0: 20 56 65 72 69 66 79 20 74 68 61 74 20 5b 64 62   Verify that [db
38f0: 5d 20 73 74 69 6c 6c 20 63 61 6e 6e 6f 74 20 77  ] still cannot w
3900: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
3910: 62 61 73 65 20 28 62 65 63 61 75 73 65 0a 20 20  base (because.  
3920: 23 20 69 74 20 69 73 20 72 65 61 64 69 6e 67 20  # it is reading 
3930: 61 6e 20 6f 6c 64 20 73 6e 61 70 73 68 6f 74 29  an old snapshot)
3940: 2e 0a 20 20 23 0a 20 20 23 20 43 6c 6f 73 65 20  ..  #.  # Close 
3950: 74 68 65 20 63 75 72 72 65 6e 74 20 5b 64 62 5d  the current [db]
3960: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 70   transaction. Op
3970: 65 6e 20 61 20 6e 65 77 20 6f 6e 65 2e 20 5b 64  en a new one. [d
3980: 62 5d 20 63 61 6e 20 6e 6f 77 20 77 72 69 74 65  b] can now write
3990: 0a 20 20 23 20 74 6f 20 74 68 65 20 64 61 74 61  .  # to the data
39a0: 62 61 73 65 20 28 61 73 20 69 74 20 69 73 20 6e  base (as it is n
39b0: 6f 74 20 6c 6f 63 6b 65 64 20 61 6e 64 20 5b 64  ot locked and [d
39c0: 62 5d 20 69 73 20 72 65 61 64 69 6e 67 20 74 68  b] is reading th
39d0: 65 20 6c 61 74 65 73 74 0a 20 20 23 20 73 6e 61  e latest.  # sna
39e0: 70 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20 64 6f  pshot)..  #.  do
39f0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3a00: 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  .7 {.    sql2 { 
3a10: 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e  BEGIN; INSERT IN
3a20: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20  TO t1 VALUES(7, 
3a30: 38 29 20 3b 20 7d 0a 20 20 20 20 63 61 74 63 68  8) ; }.    catch
3a40: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
3a50: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
3a60: 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74  0) }.  } {1 {dat
3a70: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
3a80: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
3a90: 31 30 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 65  10.$tn.8 {.    e
3aa0: 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20 3b  xecsql { BEGIN ;
3ab0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3ac0: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
3ad0: 20 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20   5 6}.  do_test 
3ae0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 39 20 7b 0a 20  wal-10.$tn.9 {. 
3af0: 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20     sql2 COMMIT. 
3b00: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e     catchsql { IN
3b10: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3b20: 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20 7d  UES(9, 10) }.  }
3b30: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
3b40: 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74   locked}}.  do_t
3b50: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3b60: 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  0 {.    execsql 
3b70: 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 65  { COMMIT }.    e
3b80: 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20 7d  xecsql { BEGIN }
3b90: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
3ba0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3bb0: 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20  LUES(9, 10) }.  
3bc0: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
3bd0: 49 54 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c  IT }.    execsql
3be0: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
3bf0: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
3c00: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d   4 5 6 7 8 9 10}
3c10: 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20 72 65 61  ..  # Open a rea
3c20: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  d transaction wi
3c30: 74 68 20 5b 64 62 32 5d 2e 20 43 68 65 63 6b 20  th [db2]. Check 
3c40: 74 68 61 74 20 74 68 69 73 20 70 72 65 76 65 6e  that this preven
3c50: 74 73 20 5b 64 62 5d 20 66 72 6f 6d 0a 20 20 23  ts [db] from.  #
3c60: 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74   checkpointing t
3c70: 68 65 20 64 61 74 61 62 61 73 65 2e 20 42 75 74  he database. But
3c80: 20 6e 6f 74 20 66 72 6f 6d 20 77 72 69 74 69 6e   not from writin
3c90: 67 20 74 6f 20 69 74 2e 0a 20 20 23 0a 20 20 64  g to it..  #.  d
3ca0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3cb0: 6e 2e 31 31 20 7b 0a 20 20 20 20 73 71 6c 32 20  n.11 {.    sql2 
3cc0: 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20  { BEGIN; SELECT 
3cd0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
3ce0: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
3cf0: 20 39 20 31 30 7d 0a 20 20 64 6f 5f 74 65 73 74   9 10}.  do_test
3d00: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 32 20 7b   wal-10.$tn.12 {
3d10: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
3d20: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
3d30: 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 31 20  point } .  } {1 
3d40: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
3d50: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
3d60: 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 33 20 7b 0a  wal-10.$tn.13 {.
3d70: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e      execsql { IN
3d80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3d90: 55 45 53 28 31 31 2c 20 31 32 29 20 7d 0a 20 20  UES(11, 12) }.  
3da0: 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a    sql2 {SELECT *
3db0: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
3dc0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
3dd0: 20 31 30 7d 0a 0a 20 20 23 20 43 6f 6e 6e 65 63   10}..  # Connec
3de0: 74 69 6f 6e 20 5b 64 62 32 5d 20 69 73 20 68 6f  tion [db2] is ho
3df0: 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 6e 20  lding a lock on 
3e00: 61 20 73 6e 61 70 73 68 6f 74 2c 20 70 72 65 76  a snapshot, prev
3e10: 65 6e 74 69 6e 67 20 5b 64 62 5d 20 66 72 6f 6d  enting [db] from
3e20: 0a 20 20 23 20 63 68 65 63 6b 70 6f 69 6e 74 69  .  # checkpointi
3e30: 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
3e40: 20 41 64 64 20 61 20 62 75 73 79 2d 68 61 6e 64   Add a busy-hand
3e50: 6c 65 72 20 74 6f 20 5b 64 62 5d 2e 20 49 66 20  ler to [db]. If 
3e60: 5b 64 62 32 5d 20 63 6f 6d 70 6c 65 74 65 73 0a  [db2] completes.
3e70: 20 20 23 20 69 74 73 20 74 72 61 6e 73 61 63 74    # its transact
3e80: 69 6f 6e 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  ion from within 
3e90: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
3ea0: 2c 20 5b 64 62 5d 20 69 73 20 61 62 6c 65 20 74  , [db] is able t
3eb0: 6f 20 63 6f 6d 70 6c 65 74 65 0a 20 20 23 20 74  o complete.  # t
3ec0: 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70  he checkpoint op
3ed0: 65 72 61 74 69 6f 6e 2e 0a 20 20 23 0a 20 20 70  eration..  #.  p
3ee0: 72 6f 63 20 62 75 73 79 68 61 6e 64 6c 65 72 20  roc busyhandler 
3ef0: 78 20 7b 0a 20 20 20 20 69 66 20 7b 24 78 3d 3d  x {.    if {$x==
3f00: 34 7d 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54  4} { sql2 COMMIT
3f10: 20 7d 0a 20 20 20 20 69 66 20 7b 24 78 3c 35 7d   }.    if {$x<5}
3f20: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20   { return 0 }.  
3f30: 20 20 72 65 74 75 72 6e 20 31 0a 20 20 7d 0a 20    return 1.  }. 
3f40: 20 64 62 20 62 75 73 79 20 62 75 73 79 68 61 6e   db busy busyhan
3f50: 64 6c 65 72 0a 20 20 64 6f 5f 74 65 73 74 20 77  dler.  do_test w
3f60: 61 6c 2d 31 30 2e 24 74 6e 2e 31 34 20 7b 0a 20  al-10.$tn.14 {. 
3f70: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41     execsql { PRA
3f80: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
3f90: 6e 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a 0a 20 20  nt } .  } {}..  
3fa0: 23 20 53 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  # Similar to the
3fb0: 20 74 65 73 74 20 61 62 6f 76 65 2e 20 45 78 63   test above. Exc
3fc0: 65 70 74 20 74 68 69 73 20 74 69 6d 65 2c 20 61  ept this time, a
3fd0: 20 6e 65 77 20 72 65 61 64 20 74 72 61 6e 73 61   new read transa
3fe0: 63 74 69 6f 6e 20 69 73 0a 20 20 23 20 73 74 61  ction is.  # sta
3ff0: 72 74 65 64 20 28 64 62 33 29 20 77 68 69 6c 65  rted (db3) while
4000: 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74 65   the checkpointe
4010: 72 20 69 73 20 77 61 69 74 69 6e 67 20 66 6f 72  r is waiting for
4020: 20 61 6e 20 6f 6c 64 20 6f 6e 65 20 28 64 62 32   an old one (db2
4030: 29 20 74 6f 20 0a 20 20 23 20 66 69 6e 69 73 68  ) to .  # finish
4040: 2e 20 54 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  . The checkpoint
4050: 65 72 20 63 61 6e 20 66 69 6e 69 73 68 2c 20 62  er can finish, b
4060: 75 74 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e  ut any subsequen
4070: 74 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  t write operatio
4080: 6e 73 20 0a 20 20 23 20 6d 75 73 74 20 77 61 69  ns .  # must wai
4090: 74 20 75 6e 74 69 6c 20 61 66 74 65 72 20 64 62  t until after db
40a0: 33 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68 65  3 has closed the
40b0: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
40c0: 6e 2c 20 61 73 20 64 62 33 20 69 73 20 61 0a 20  n, as db3 is a. 
40d0: 20 23 20 22 72 65 67 69 6f 6e 20 44 22 20 77 72   # "region D" wr
40e0: 69 74 65 72 2e 0a 20 20 23 0a 20 20 64 62 20 62  iter..  #.  db b
40f0: 75 73 79 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74  usy {}.  do_test
4100: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 35 20 7b   wal-10.$tn.15 {
4110: 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49  .    sql2 { BEGI
4120: 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  N; SELECT * FROM
4130: 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 32 20   t1; }.  } {1 2 
4140: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
4150: 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73   11 12}.  do_tes
4160: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 36 20  t wal-10.$tn.16 
4170: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
4180: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4190: 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 31  kpoint } .  } {1
41a0: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
41b0: 63 6b 65 64 7d 7d 0a 20 20 70 72 6f 63 20 62 75  cked}}.  proc bu
41c0: 73 79 68 61 6e 64 6c 65 72 20 78 20 7b 0a 20 20  syhandler x {.  
41d0: 20 20 69 66 20 7b 24 78 3d 3d 33 7d 20 7b 20 73    if {$x==3} { s
41e0: 71 6c 33 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c  ql3 { BEGIN; SEL
41f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20  ECT * FROM t1 } 
4200: 7d 0a 20 20 20 20 69 66 20 7b 24 78 3d 3d 34 7d  }.    if {$x==4}
4210: 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d   { sql2 COMMIT }
4220: 0a 20 20 20 20 69 66 20 7b 24 78 3c 35 7d 20 20  .    if {$x<5}  
4230: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20  { return 0 }.   
4240: 20 72 65 74 75 72 6e 20 31 0a 20 20 7d 0a 20 20   return 1.  }.  
4250: 64 62 20 62 75 73 79 20 62 75 73 79 68 61 6e 64  db busy busyhand
4260: 6c 65 72 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  ler.  do_test wa
4270: 6c 2d 31 30 2e 24 74 6e 2e 31 37 20 7b 0a 20 20  l-10.$tn.17 {.  
4280: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
4290: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
42a0: 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  t } .  } {}.  do
42b0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
42c0: 2e 31 38 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b  .18 {.    sql3 {
42d0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
42e0: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
42f0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
4300: 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   12}.  do_test w
4310: 61 6c 2d 31 30 2e 24 74 6e 2e 31 39 20 7b 0a 20  al-10.$tn.19 {. 
4320: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e     catchsql { IN
4330: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4340: 55 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20  UES(13, 14) }.  
4350: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
4360: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f  s locked}}.  do_
4370: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4380: 32 30 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  20 {.    execsql
4390: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
43a0: 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33   t1 }.  } {1 2 3
43b0: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
43c0: 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73 74  11 12}.  do_test
43d0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 31 20 7b   wal-10.$tn.21 {
43e0: 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d 4d 49 54  .    sql3 COMMIT
43f0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
4400: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 32 20  t wal-10.$tn.22 
4410: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
4420: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4430: 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d 0a  ALUES(13, 14) }.
4440: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
4450: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
4460: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
4470: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
4480: 20 31 33 20 31 34 7d 0a 0a 20 20 23 20 53 65 74   13 14}..  # Set
4490: 20 5b 64 62 33 5d 20 75 70 20 61 73 20 61 20 22   [db3] up as a "
44a0: 72 65 67 69 6f 6e 20 44 22 20 72 65 61 64 65 72  region D" reader
44b0: 20 61 67 61 69 6e 2e 20 54 68 65 6e 20 75 70 67   again. Then upg
44c0: 72 61 64 65 20 69 74 20 74 6f 20 61 20 77 72 69  rade it to a wri
44d0: 74 65 72 0a 20 20 23 20 61 6e 64 20 62 61 63 6b  ter.  # and back
44e0: 20 64 6f 77 6e 20 74 6f 20 61 20 72 65 61 64 65   down to a reade
44f0: 72 2e 20 54 68 65 6e 2c 20 63 68 65 63 6b 20 74  r. Then, check t
4500: 68 61 74 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  hat a checkpoint
4510: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
4520: 0a 20 20 23 20 28 61 73 20 5b 64 62 33 5d 20 73  .  # (as [db3] s
4530: 74 69 6c 6c 20 68 61 73 20 61 20 73 6e 61 70 73  till has a snaps
4540: 68 6f 74 20 6c 6f 63 6b 65 64 29 2e 0a 20 20 23  hot locked)..  #
4550: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
4560: 30 2e 24 74 6e 2e 32 33 20 7b 0a 20 20 20 20 65  0.$tn.23 {.    e
4570: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
4580: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
4590: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
45a0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 34 20  t wal-10.$tn.24 
45b0: 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47  {.    sql2 { BEG
45c0: 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN; SELECT * FRO
45d0: 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 32  M t1; }.  } {1 2
45e0: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
45f0: 30 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a 20  0 11 12 13 14}. 
4600: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4610: 24 74 6e 2e 32 35 20 7b 0a 20 20 20 20 65 78 65  $tn.25 {.    exe
4620: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
4630: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
4640: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
4650: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36 20 7b 0a  wal-10.$tn.26 {.
4660: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
4670: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4680: 4c 55 45 53 28 31 35 2c 20 31 36 29 20 7d 0a 20  LUES(15, 16) }. 
4690: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
46a0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
46b0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
46c0: 2e 32 37 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b  .27 {.    sql3 {
46d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
46e0: 56 41 4c 55 45 53 28 31 35 2c 20 31 36 29 20 7d  VALUES(15, 16) }
46f0: 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  .  } {}.  do_tes
4700: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 38 20  t wal-10.$tn.28 
4710: 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b 0a 20 20  {.    code3 {.  
4720: 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b      set ::STMT [
4730: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20  sqlite3_prepare 
4740: 64 62 33 20 22 53 45 4c 45 43 54 20 2a 20 46 52  db3 "SELECT * FR
4750: 4f 4d 20 74 31 22 20 2d 31 20 54 41 49 4c 5d 0a  OM t1" -1 TAIL].
4760: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
4770: 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20 20 20 7d  ep $::STMT.    }
4780: 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d 4d 49 54  .    sql3 COMMIT
4790: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53  .    execsql { S
47a0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
47b0: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
47c0: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
47d0: 32 20 31 33 20 31 34 20 31 35 20 31 36 7d 0a 20  2 13 14 15 16}. 
47e0: 20 64 62 20 62 75 73 79 20 7b 7d 0a 20 20 64 6f   db busy {}.  do
47f0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4800: 2e 32 39 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .29 {.    execsq
4810: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
4820: 74 31 20 56 41 4c 55 45 53 28 31 37 2c 20 31 38  t1 VALUES(17, 18
4830: 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ) }.    catchsql
4840: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
4850: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b  eckpoint }.  } {
4860: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
4870: 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
4880: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 30 20  t wal-10.$tn.30 
4890: 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b 20 73 71  {.    code3 { sq
48a0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24  lite3_finalize $
48b0: 3a 3a 53 54 4d 54 20 7d 0a 20 20 20 20 65 78 65  ::STMT }.    exe
48c0: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
48d0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
48e0: 20 7d 20 7b 7d 0a 0a 20 20 23 20 41 74 20 6f 6e   } {}..  # At on
48f0: 65 20 70 6f 69 6e 74 2c 20 69 66 20 61 20 72 65  e point, if a re
4900: 61 64 65 72 20 66 61 69 6c 65 64 20 74 6f 20 75  ader failed to u
4910: 70 67 72 61 64 65 20 74 6f 20 61 20 77 72 69 74  pgrade to a writ
4920: 65 72 20 62 65 63 61 75 73 65 20 69 74 0a 20 20  er because it.  
4930: 23 20 77 61 73 20 72 65 61 64 69 6e 67 20 61 6e  # was reading an
4940: 20 6f 6c 64 20 73 6e 61 70 73 68 6f 74 2c 20 74   old snapshot, t
4950: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 77  he write-locks w
4960: 65 72 65 20 6e 6f 74 20 62 65 69 6e 67 20 72 65  ere not being re
4970: 6c 65 61 73 65 64 2e 0a 20 20 23 20 54 65 73 74  leased..  # Test
4980: 20 74 68 61 74 20 74 68 69 73 20 62 75 67 20 68   that this bug h
4990: 61 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 20  as been fixed.. 
49a0: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
49b0: 2d 31 30 2e 24 74 6e 2e 33 31 20 7b 0a 20 20 20  -10.$tn.31 {.   
49c0: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
49d0: 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   ; SELECT * FROM
49e0: 20 74 31 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b   t1 }.    sql2 {
49f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4a00: 56 41 4c 55 45 53 28 31 39 2c 20 32 30 29 20 7d  VALUES(19, 20) }
4a10: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
4a20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4a30: 41 4c 55 45 53 28 32 31 2c 20 32 32 29 20 7d 0a  ALUES(21, 22) }.
4a40: 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
4a50: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
4a60: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
4a70: 6e 2e 33 32 20 7b 0a 20 20 20 20 23 20 54 68 69  n.32 {.    # Thi
4a80: 73 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c  s statement woul
4a90: 64 20 66 61 69 6c 20 77 68 65 6e 20 74 68 65 20  d fail when the 
4aa0: 62 75 67 20 77 61 73 20 70 72 65 73 65 6e 74 2e  bug was present.
4ab0: 0a 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45  .    sql2 { INSE
4ac0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4ad0: 53 28 32 31 2c 20 32 32 29 20 7d 0a 20 20 7d 20  S(21, 22) }.  } 
4ae0: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  {}.  do_test wal
4af0: 2d 31 30 2e 24 74 6e 2e 33 33 20 7b 0a 20 20 20  -10.$tn.33 {.   
4b00: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
4b10: 54 20 2a 20 46 52 4f 4d 20 74 31 20 3b 20 43 4f  T * FROM t1 ; CO
4b20: 4d 4d 49 54 20 7d 0a 20 20 7d 20 7b 31 20 32 20  MMIT }.  } {1 2 
4b30: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
4b40: 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35 20   11 12 13 14 15 
4b50: 31 36 20 31 37 20 31 38 7d 0a 20 20 64 6f 5f 74  16 17 18}.  do_t
4b60: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33  est wal-10.$tn.3
4b70: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
4b80: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
4b90: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  t1 }.  } {1 2 3 
4ba0: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
4bb0: 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36  1 12 13 14 15 16
4bc0: 20 31 37 20 31 38 20 31 39 20 32 30 20 32 31 20   17 18 19 20 21 
4bd0: 32 32 7d 0a 0a 20 20 23 20 54 65 73 74 20 74 68  22}..  # Test th
4be0: 61 74 20 69 66 20 61 20 63 68 65 63 6b 70 6f 69  at if a checkpoi
4bf0: 6e 74 65 72 20 63 61 6e 6e 6f 74 20 6f 62 74 61  nter cannot obta
4c00: 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20  in the required 
4c10: 6c 6f 63 6b 73 2c 20 69 74 0a 20 20 23 20 72 65  locks, it.  # re
4c20: 6c 65 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73  leases all locks
4c30: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
4c40: 67 20 61 20 62 75 73 79 20 65 72 72 6f 72 2e 0a  g a busy error..
4c50: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
4c60: 6c 2d 31 30 2e 24 74 6e 2e 33 35 20 7b 0a 20 20  l-10.$tn.35 {.  
4c70: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
4c80: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74     DELETE FROM t
4c90: 31 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  1;.      INSERT 
4ca0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4cb0: 61 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20  a', 'b');.      
4cc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4cd0: 41 4c 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b  ALUES('c', 'd');
4ce0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 32 20  .    }.    sql2 
4cf0: 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20  {.      BEGIN;. 
4d00: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
4d10: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20  FROM t1;.    }. 
4d20: 20 7d 20 7b 61 20 62 20 63 20 64 7d 0a 20 20 70   } {a b c d}.  p
4d30: 72 6f 63 20 62 75 73 79 68 61 6e 64 6c 65 72 20  roc busyhandler 
4d40: 78 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20  x { return 1 }. 
4d50: 20 64 62 20 62 75 73 79 20 62 75 73 79 68 61 6e   db busy busyhan
4d60: 64 6c 65 72 0a 20 20 64 6f 5f 74 65 73 74 20 77  dler.  do_test w
4d70: 61 6c 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20  al-10.$tn.36 {. 
4d80: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52     catchsql { PR
4d90: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
4da0: 69 6e 74 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61  int }.  } {1 {da
4db0: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
4dc0: 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  }}.  do_test wal
4dd0: 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20 20  -10.$tn.36 {.   
4de0: 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20 49   sql3 { INSERT I
4df0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 65  NTO t1 VALUES('e
4e00: 27 2c 20 27 66 27 29 20 7d 0a 20 20 20 20 73 71  ', 'f') }.    sq
4e10: 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  l2 { SELECT * FR
4e20: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 61 20 62  OM t1 }.  } {a b
4e30: 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73 74 20   c d}.  do_test 
4e40: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 37 20 7b 0a  wal-10.$tn.37 {.
4e50: 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a      sql2 COMMIT.
4e60: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
4e70: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
4e80: 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20  int }.  } {}..  
4e90: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
4ea0: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6f 64   }.  catch { cod
4eb0: 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d  e2 { db2 close }
4ec0: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6f 64   }.  catch { cod
4ed0: 65 33 20 7b 20 64 62 33 20 63 6c 6f 73 65 20 7d  e3 { db3 close }
4ee0: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c 6f   }.  catch { clo
4ef0: 73 65 20 24 3a 3a 63 6f 64 65 32 5f 63 68 61 6e  se $::code2_chan
4f00: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c 6f   }.  catch { clo
4f10: 73 65 20 24 3a 3a 63 6f 64 65 33 5f 63 68 61 6e  se $::code3_chan
4f20: 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   }.}..#---------
4f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4f70: 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .# This block of
4f80: 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 31 2e 2a   tests, wal-11.*
4f90: 2c 20 74 65 73 74 20 74 68 61 74 20 6e 6f 74 68  , test that noth
4fa0: 69 6e 67 20 67 6f 65 73 20 74 65 72 72 69 62 6c  ing goes terribl
4fb0: 79 20 77 72 6f 6e 67 0a 23 20 69 66 20 66 72 61  y wrong.# if fra
4fc0: 6d 65 73 20 6d 75 73 74 20 62 65 20 77 72 69 74  mes must be writ
4fd0: 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ten to the log f
4fe0: 69 6c 65 20 62 65 66 6f 72 65 20 61 20 74 72 61  ile before a tra
4ff0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 23 20 63 6f  nsaction is.# co
5000: 6d 6d 69 74 74 65 64 20 28 69 6e 20 6f 72 64 65  mmitted (in orde
5010: 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
5020: 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ory)..#.do_test 
5030: 77 61 6c 2d 31 31 2e 31 20 7b 0a 20 20 72 65 6f  wal-11.1 {.  reo
5040: 70 65 6e 5f 64 62 0a 20 20 65 78 65 63 73 71 6c  pen_db.  execsql
5050: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
5060: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
5070: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
5080: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
5090: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
50a0: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
50b0: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72    }.  list [expr
50c0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
50d0: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72  .db]/1024] [expr
50e0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
50f0: 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d  .db-wal]/1044].}
5100: 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20 77   {1 3}.do_test w
5110: 61 6c 2d 31 31 2e 32 20 7b 0a 20 20 65 78 65 63  al-11.2 {.  exec
5120: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
5130: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20  _checkpoint }.  
5140: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
5150: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
5160: 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  024] [file size 
5170: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
5180: 6c 69 73 74 20 33 20 5b 6c 6f 67 5f 66 69 6c 65  list 3 [log_file
5190: 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a 64  _size 3 1024]].d
51a0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 33 20  o_test wal-11.3 
51b0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
51c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
51d0: 55 45 53 28 20 62 6c 6f 62 28 39 30 30 29 20 29  UES( blob(900) )
51e0: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
51f0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5200: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
5210: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
5220: 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 6c 6f 67  ].} [list 3 [log
5230: 5f 66 69 6c 65 5f 73 69 7a 65 20 34 20 31 30 32  _file_size 4 102
5240: 34 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  4]]..do_test wal
5250: 2d 31 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71  -11.4 {.  execsq
5260: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
5270: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
5280: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
5290: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
52a0: 20 2d 2d 20 32 0a 20 20 20 20 20 20 49 4e 53 45   -- 2.      INSE
52b0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
52c0: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
52d0: 20 74 31 3b 20 20 20 2d 2d 20 34 0a 20 20 20 20   t1;   -- 4.    
52e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
52f0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
5300: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20  ) FROM t1;   -- 
5310: 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  8.      INSERT I
5320: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
5330: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
5340: 20 20 20 2d 2d 20 31 36 0a 20 20 7d 0a 20 20 6c     -- 16.  }.  l
5350: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
5360: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
5370: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
5380: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
5390: 69 73 74 20 33 20 5b 6c 6f 67 5f 66 69 6c 65 5f  ist 3 [log_file_
53a0: 73 69 7a 65 20 33 32 20 31 30 32 34 5d 5d 0a 64  size 32 1024]].d
53b0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 35 20  o_test wal-11.5 
53c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
53d0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
53e0: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
53f0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
5400: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31  _check;.  }.} {1
5410: 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  6 ok}.do_test wa
5420: 6c 2d 31 31 2e 36 20 7b 0a 20 20 65 78 65 63 73  l-11.6 {.  execs
5430: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73 74  ql COMMIT.  list
5440: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
5450: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
5460: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5470: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
5480: 20 33 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a   3 [log_file_siz
5490: 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f 74  e 41 1024]].do_t
54a0: 65 73 74 20 77 61 6c 2d 31 31 2e 37 20 7b 0a 20  est wal-11.7 {. 
54b0: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
54c0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
54d0: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41  FROM t1;.    PRA
54e0: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
54f0: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 36 20 6f  eck;.  }.} {16 o
5500: 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  k}.do_test wal-1
5510: 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.8 {.  execsql 
5520: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
5530: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74  ckpoint }.  list
5540: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
5550: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
5560: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5570: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
5580: 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69   37 [log_file_si
5590: 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f  ze 41 1024]].do_
55a0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 39 20 7b 0a  test wal-11.9 {.
55b0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73    db close.  lis
55c0: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
55d0: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
55e0: 5d 20 5b 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74  ] [log_deleted t
55f0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 33  est.db-wal].} {3
5600: 37 20 31 7d 0a 73 71 6c 69 74 65 33 5f 77 61 6c  7 1}.sqlite3_wal
5610: 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74   db test.db.do_t
5620: 65 73 74 20 77 61 6c 2d 31 31 2e 31 30 20 7b 0a  est wal-11.10 {.
5630: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
5640: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
5650: 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49  e = 10;.    BEGI
5660: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
5670: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
5680: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
5690: 3b 20 20 20 2d 2d 20 33 32 0a 20 20 20 20 20 20  ;   -- 32.      
56a0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
56b0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 6c  FROM t1;.  }.  l
56c0: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
56d0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
56e0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
56f0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
5700: 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65  ist 37 [log_file
5710: 5f 73 69 7a 65 20 33 37 20 31 30 32 34 5d 5d 0a  _size 37 1024]].
5720: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31  do_test wal-11.1
5730: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
5740: 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75        SELECT cou
5750: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
5760: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
5770: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
5780: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20   FROM t1;.  }.} 
5790: 7b 33 32 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20  {32 16}.do_test 
57a0: 77 61 6c 2d 31 31 2e 31 32 20 7b 0a 20 20 6c 69  wal-11.12 {.  li
57b0: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
57c0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
57d0: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
57e0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
57f0: 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65 5f  st 37 [log_file_
5800: 73 69 7a 65 20 33 37 20 31 30 32 34 5d 5d 0a 64  size 37 1024]].d
5810: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 33  o_test wal-11.13
5820: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5830: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5840: 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39  1 VALUES( blob(9
5850: 30 30 29 20 29 3b 0a 20 20 20 20 53 45 4c 45 43  00) );.    SELEC
5860: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
5870: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
5880: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
5890: 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d 0a 64 6f    }.} {17 ok}.do
58a0: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 34 20  _test wal-11.14 
58b0: 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  {.  list [expr [
58c0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
58d0: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
58e0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
58f0: 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 6c 6f 67  .} [list 37 [log
5900: 5f 66 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30  _file_size 37 10
5910: 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  24]]...#--------
5920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  -.# This block o
5970: 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 32 2e  f tests, wal-12.
5980: 2a 2c 20 74 65 73 74 73 20 74 68 65 20 66 69 78  *, tests the fix
5990: 20 66 6f 72 20 61 20 70 72 6f 62 6c 65 6d 20 74   for a problem t
59a0: 68 61 74 20 0a 23 20 63 6f 75 6c 64 20 6f 63 63  hat .# could occ
59b0: 75 72 20 69 66 20 61 20 6c 6f 67 20 74 68 61 74  ur if a log that
59c0: 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20   is a prefix of 
59d0: 61 6e 20 6f 6c 64 65 72 20 6c 6f 67 20 69 73 20  an older log is 
59e0: 77 72 69 74 74 65 6e 20 0a 23 20 69 6e 74 6f 20  written .# into 
59f0: 61 20 72 65 75 73 65 64 20 6c 6f 67 20 66 69 6c  a reused log fil
5a00: 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64 62 0a 64  e..#.reopen_db.d
5a10: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 31 20  o_test wal-12.1 
5a20: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5a30: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
5a40: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43  ze = 1024;.    C
5a50: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78  REATE TABLE t1(x
5a60: 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54 45  , y);.    CREATE
5a70: 20 54 41 42 4c 45 20 74 32 28 78 2c 20 79 29 3b   TABLE t2(x, y);
5a80: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
5a90: 20 74 31 20 56 41 4c 55 45 53 28 27 41 27 2c 20   t1 VALUES('A', 
5aa0: 31 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  1);.  }.  list [
5ab0: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
5ac0: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
5ad0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
5ae0: 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31  b-wal].} [list 1
5af0: 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20   [log_file_size 
5b00: 35 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74  5 1024]].do_test
5b10: 20 77 61 6c 2d 31 32 2e 32 20 7b 0a 20 20 64 62   wal-12.2 {.  db
5b20: 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33   close.  sqlite3
5b30: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78   db test.db.  ex
5b40: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
5b50: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
5b60: 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 55 50 44   normal;.    UPD
5b70: 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 30  ATE t1 SET y = 0
5b80: 20 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b 0a   WHERE x = 'A';.
5b90: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72    }.  list [expr
5ba0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5bb0: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72  .db]/1024] [expr
5bc0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
5bd0: 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d  .db-wal]/1044].}
5be0: 20 7b 33 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77   {3 1}.do_test w
5bf0: 61 6c 2d 31 32 2e 33 20 7b 0a 20 20 65 78 65 63  al-12.3 {.  exec
5c00: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
5c10: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 42 27 2c  O t2 VALUES('B',
5c20: 20 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78   1) }.  list [ex
5c30: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
5c40: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78  st.db]/1024] [ex
5c50: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
5c60: 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d  st.db-wal]/1044]
5c70: 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74 65 73 74  .} {3 2}.do_test
5c80: 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20 20 66 69   wal-12.4 {.  fi
5c90: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74  le copy -force t
5ca0: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
5cb0: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
5cc0: 63 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  ce test.db-wal t
5cd0: 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71  est2.db-wal.  sq
5ce0: 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65  lite3_wal db2 te
5cf0: 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  st2.db.  execsql
5d00: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
5d10: 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 42 20 31   t2 } db2.} {B 1
5d20: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f 74  }.db2 close.do_t
5d30: 65 73 74 20 77 61 6c 2d 31 32 2e 35 20 7b 0a 20  est wal-12.5 {. 
5d40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
5d50: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
5d60: 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54 45  oint;.    UPDATE
5d70: 20 74 32 20 53 45 54 20 79 20 3d 20 32 20 57 48   t2 SET y = 2 WH
5d80: 45 52 45 20 78 20 3d 20 27 42 27 3b 20 0a 20 20  ERE x = 'B'; .  
5d90: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
5da0: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44  ckpoint;.    UPD
5db0: 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20 31  ATE t1 SET y = 1
5dc0: 20 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b 0a   WHERE x = 'A';.
5dd0: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
5de0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55  heckpoint;.    U
5df0: 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d  PDATE t1 SET y =
5e00: 20 30 20 57 48 45 52 45 20 78 20 3d 20 27 41 27   0 WHERE x = 'A'
5e10: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
5e20: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 42  ROM t2;.  }.} {B
5e30: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   2}.do_test wal-
5e40: 31 32 2e 36 20 7b 0a 20 20 66 69 6c 65 20 63 6f  12.6 {.  file co
5e50: 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  py -force test.d
5e60: 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c  b test2.db.  fil
5e70: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65  e copy -force te
5e80: 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e  st.db-wal test2.
5e90: 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33  db-wal.  sqlite3
5ea0: 5f 77 61 6c 20 64 62 32 20 74 65 73 74 32 2e 64  _wal db2 test2.d
5eb0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
5ec0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d  LECT * FROM t2 }
5ed0: 20 64 62 32 0a 7d 20 7b 42 20 32 7d 0a 64 62 32   db2.} {B 2}.db2
5ee0: 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65 0a   close.db close.
5ef0: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
5f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 65  -----------.# Te
5f40: 73 74 20 6c 61 72 67 65 20 6c 6f 67 20 73 75 6d  st large log sum
5f50: 6d 61 72 69 65 73 2e 0a 23 0a 23 20 49 6e 20 74  maries..#.# In t
5f60: 68 69 73 20 63 61 73 65 20 22 6c 61 72 67 65 22  his case "large"
5f70: 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20 61   usually means a
5f80: 20 6c 6f 67 20 66 69 6c 65 20 74 68 61 74 20 72   log file that r
5f90: 65 71 75 69 72 65 73 20 61 20 77 61 6c 2d 69 6e  equires a wal-in
5fa0: 64 65 78 0a 23 20 6d 61 70 70 69 6e 67 20 6c 61  dex.# mapping la
5fb0: 72 67 65 72 20 74 68 61 6e 20 36 34 4b 42 20 28  rger than 64KB (
5fc0: 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e 69 74  the default init
5fd0: 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 29 2e  ial allocation).
5fe0: 20 41 20 36 34 4b 42 20 77 61 6c 2d 69 6e 64 65   A 64KB wal-inde
5ff0: 78 0a 23 20 69 73 20 6c 61 72 67 65 20 65 6e 6f  x.# is large eno
6000: 75 67 68 20 66 6f 72 20 61 20 6c 6f 67 20 66 69  ugh for a log fi
6010: 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  le that contains
6020: 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31   approximately 1
6030: 33 31 30 30 20 66 72 61 6d 65 73 2e 0a 23 20 53  3100 frames..# S
6040: 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
6050: 74 65 73 74 73 20 63 72 65 61 74 65 20 6c 6f 67  tests create log
6060: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 74 20  s containing at 
6070: 6c 65 61 73 74 20 74 68 69 73 20 6d 61 6e 79 20  least this many 
6080: 66 72 61 6d 65 73 2e 0a 23 0a 23 20 77 61 6c 2d  frames..#.# wal-
6090: 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65 73  13.1.*: This tes
60a0: 74 20 63 61 73 65 20 63 72 65 61 74 65 73 20 61  t case creates a
60b0: 20 76 65 72 79 20 6c 61 72 67 65 20 6c 6f 67 20   very large log 
60c0: 66 69 6c 65 20 77 69 74 68 69 6e 20 74 68 65 0a  file within the.
60d0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69  #             fi
60e0: 6c 65 2d 73 79 73 74 65 6d 20 28 61 72 6f 75 6e  le-system (aroun
60f0: 64 20 32 30 30 4d 42 29 2e 20 54 68 65 20 6c 6f  d 200MB). The lo
6100: 67 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  g file does not 
6110: 63 6f 6e 74 61 69 6e 0a 23 20 20 20 20 20 20 20  contain.#       
6120: 20 20 20 20 20 20 61 6e 79 20 76 61 6c 69 64 20        any valid 
6130: 66 72 61 6d 65 73 2e 20 54 65 73 74 20 74 68 61  frames. Test tha
6140: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
6150: 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  ile can still be
6160: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  .#             o
6170: 70 65 6e 65 64 20 61 6e 64 20 71 75 65 72 69 65  pened and querie
6180: 64 2c 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  d, and that the 
6190: 69 6e 76 61 6c 69 64 20 6c 6f 67 20 66 69 6c 65  invalid log file
61a0: 20 63 61 75 73 65 73 20 6e 6f 20 0a 23 20 20 20   causes no .#   
61b0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 62 6c 65            proble
61c0: 6d 73 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e 32  ms..#.# wal-13.2
61d0: 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61 20  .*: Test that a 
61e0: 70 72 6f 63 65 73 73 20 6d 61 79 20 63 72 65 61  process may crea
61f0: 74 65 20 61 20 6c 61 72 67 65 20 6c 6f 67 20 66  te a large log f
6200: 69 6c 65 20 61 6e 64 20 71 75 65 72 79 0a 23 20  ile and query.# 
6210: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
6220: 64 61 74 61 62 61 73 65 20 28 69 6e 63 6c 75 64  database (includ
6230: 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c 65  ing the log file
6240: 20 74 68 61 74 20 69 74 20 69 74 73 65 6c 66 20   that it itself 
6250: 63 72 65 61 74 65 64 29 2e 0a 23 0a 23 20 77 61  created)..#.# wa
6260: 6c 2d 31 33 2e 33 2e 2a 3a 20 54 65 73 74 20 74  l-13.3.*: Test t
6270: 68 61 74 20 69 66 20 61 20 76 65 72 79 20 6c 61  hat if a very la
6280: 72 67 65 20 6c 6f 67 20 66 69 6c 65 20 69 73 20  rge log file is 
6290: 63 72 65 61 74 65 64 2c 20 61 6e 64 20 74 68 65  created, and the
62a0: 6e 20 61 0a 23 20 20 20 20 20 20 20 20 20 20 20  n a.#           
62b0: 20 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63 74    second connect
62c0: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ion is opened on
62d0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
62e0: 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  le, it is possib
62f0: 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  le.#            
6300: 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 64 61   to query the da
6310: 74 61 62 61 73 65 20 28 61 6e 64 20 74 68 65 20  tabase (and the 
6320: 76 65 72 79 20 6c 61 72 67 65 20 6c 6f 67 29 20  very large log) 
6330: 75 73 69 6e 67 20 74 68 65 0a 23 20 20 20 20 20  using the.#     
6340: 20 20 20 20 20 20 20 20 73 65 63 6f 6e 64 20 63          second c
6350: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 23 20 77  onnection..#.# w
6360: 61 6c 2d 31 33 2e 34 2e 2a 3a 20 53 61 6d 65 20  al-13.4.*: Same 
6370: 74 65 73 74 20 61 73 20 77 61 6c 2d 31 33 2e 33  test as wal-13.3
6380: 2e 2a 2e 20 45 78 63 65 70 74 20 69 6e 20 74 68  .*. Except in th
6390: 69 73 20 63 61 73 65 20 74 68 65 20 73 65 63 6f  is case the seco
63a0: 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  nd.#            
63b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f   connection is o
63c0: 70 65 6e 65 64 20 62 79 20 61 6e 20 65 78 74 65  pened by an exte
63d0: 72 6e 61 6c 20 70 72 6f 63 65 73 73 2e 0a 23 0a  rnal process..#.
63e0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 31  do_test wal-13.1
63f0: 2e 31 20 7b 0a 20 20 6c 69 73 74 20 5b 66 69 6c  .1 {.  list [fil
6400: 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62  e exists test.db
6410: 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  ] [file exists t
6420: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 31  est.db-wal].} {1
6430: 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   0}.do_test wal-
6440: 31 33 2e 31 2e 32 20 7b 0a 20 20 73 65 74 20 66  13.1.2 {.  set f
6450: 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d  d [open test.db-
6460: 77 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24 66  wal w].  seek $f
6470: 64 20 5b 65 78 70 72 20 32 30 30 2a 31 30 32 34  d [expr 200*1024
6480: 2a 31 30 32 34 5d 0a 20 20 70 75 74 73 20 24 66  *1024].  puts $f
6490: 64 20 22 22 0a 20 20 63 6c 6f 73 65 20 24 66 64  d "".  close $fd
64a0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
64b0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
64c0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
64d0: 74 32 20 7d 0a 7d 20 7b 42 20 32 7d 0a 64 6f 5f  t2 }.} {B 2}.do_
64e0: 74 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e 33 20  test wal-13.1.3 
64f0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 66  {.  db close.  f
6500: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
6510: 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a 0a 64 6f  db-wal.} {0}..do
6520: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 32 2e 31  _test wal-13.2.1
6530: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
6540: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
6550: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
6560: 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20  (*) FROM t2 }.} 
6570: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  {1}.do_test wal-
6580: 31 33 2e 32 2e 32 20 7b 0a 20 20 64 62 20 66 75  13.2.2 {.  db fu
6590: 6e 63 74 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f 62  nction blob blob
65a0: 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d  .  for {set i 0}
65b0: 20 7b 24 69 20 3c 20 31 36 7d 20 7b 69 6e 63 72   {$i < 16} {incr
65c0: 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73 71   i} {.    execsq
65d0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
65e0: 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t2 SELECT blob(4
65f0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
6600: 52 4f 4d 20 74 32 20 7d 0a 20 20 7d 0a 20 20 65  ROM t2 }.  }.  e
6610: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
6620: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32  count(*) FROM t2
6630: 20 7d 0a 7d 20 5b 65 78 70 72 20 69 6e 74 28 70   }.} [expr int(p
6640: 6f 77 28 32 2c 20 31 36 29 29 5d 0a 64 6f 5f 74  ow(2, 16))].do_t
6650: 65 73 74 20 77 61 6c 2d 31 33 2e 32 2e 33 20 7b  est wal-13.2.3 {
6660: 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73 69  .  expr [file si
6670: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ze test.db-wal] 
6680: 3e 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65  > [log_file_size
6690: 20 33 33 30 30 30 20 31 30 32 34 5d 0a 7d 20 31   33000 1024].} 1
66a0: 0a 0a 66 6f 72 65 61 63 68 20 63 6f 64 65 20 5b  ..foreach code [
66b0: 6c 69 73 74 20 7b 0a 20 20 73 65 74 20 74 6e 20  list {.  set tn 
66c0: 33 0a 20 20 70 72 6f 63 20 62 75 64 64 79 20 7b  3.  proc buddy {
66d0: 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c 20 23  tcl} { uplevel #
66e0: 30 20 24 74 63 6c 20 7d 0a 7d 20 7b 0a 20 20 73  0 $tcl }.} {.  s
66f0: 65 74 20 74 6e 20 34 0a 20 20 73 65 74 20 3a 3a  et tn 4.  set ::
6700: 62 75 64 64 79 20 5b 6c 61 75 6e 63 68 5f 74 65  buddy [launch_te
6710: 73 74 66 69 78 74 75 72 65 5d 0a 20 20 70 72 6f  stfixture].  pro
6720: 63 20 62 75 64 64 79 20 7b 74 63 6c 7d 20 7b 20  c buddy {tcl} { 
6730: 74 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a 62  testfixture $::b
6740: 75 64 64 79 20 24 74 63 6c 20 7d 0a 7d 5d 20 7b  uddy $tcl }.}] {
6750: 0a 0a 20 20 65 76 61 6c 20 24 63 6f 64 65 0a 20  ..  eval $code. 
6760: 20 72 65 6f 70 65 6e 5f 64 62 0a 0a 20 20 64 6f   reopen_db..  do
6770: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e  _test wal-13.$tn
6780: 2e 30 20 7b 0a 20 20 20 20 62 75 64 64 79 20 7b  .0 {.    buddy {
6790: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
67a0: 74 2e 64 62 20 7d 0a 20 20 20 20 65 78 65 63 73  t.db }.    execs
67b0: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
67c0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
67d0: 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41   WAL;.      CREA
67e0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
67f0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
6800: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
6810: 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20  omblob(800);.   
6820: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
6830: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
6840: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
6850: 31 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  1}..  for {set i
6860: 69 20 31 7d 20 7b 24 69 69 3c 31 36 7d 20 7b 69  i 1} {$ii<16} {i
6870: 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 64 6f  ncr ii} {.    do
6880: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e  _test wal-13.$tn
6890: 2e 24 69 69 2e 61 20 7b 0a 20 20 20 20 20 20 62  .$ii.a {.      b
68a0: 75 64 64 79 20 7b 20 64 62 32 20 65 76 61 6c 20  uddy { db2 eval 
68b0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
68c0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
68d0: 6f 62 28 38 30 30 29 20 46 52 4f 4d 20 74 31 20  ob(800) FROM t1 
68e0: 7d 20 7d 0a 20 20 20 20 20 20 62 75 64 64 79 20  } }.      buddy 
68f0: 7b 20 64 62 32 20 65 76 61 6c 20 7b 20 53 45 4c  { db2 eval { SEL
6900: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
6910: 4d 20 74 31 20 7d 20 7d 0a 20 20 20 20 7d 20 5b  M t1 } }.    } [
6920: 65 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20  expr (1<<$ii)]. 
6930: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31     do_test wal-1
6940: 33 2e 24 74 6e 2e 24 69 69 2e 62 20 7b 0a 20 20  3.$tn.$ii.b {.  
6950: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45      db eval { SE
6960: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
6970: 4f 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65  OM t1 }.    } [e
6980: 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20  xpr (1<<$ii)].  
6990: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33    do_test wal-13
69a0: 2e 24 74 6e 2e 24 69 69 2e 63 20 7b 0a 20 20 20  .$tn.$ii.c {.   
69b0: 20 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c     db eval { SEL
69c0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
69d0: 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78  M t1 }.    } [ex
69e0: 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20  pr (1<<$ii)].   
69f0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e   do_test wal-13.
6a00: 24 74 6e 2e 24 69 69 2e 64 20 7b 0a 20 20 20 20  $tn.$ii.d {.    
6a10: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
6a20: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
6a30: 63 6b 20 7d 0a 20 20 20 20 7d 20 7b 6f 6b 7d 0a  ck }.    } {ok}.
6a40: 20 20 7d 0a 0a 20 20 63 61 74 63 68 20 7b 20 64    }..  catch { d
6a50: 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 63 61 74  b2 close }.  cat
6a60: 63 68 20 7b 20 63 6c 6f 73 65 20 24 3a 3a 62 75  ch { close $::bu
6a70: 64 64 79 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ddy }.  db close
6a80: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
6ad0: 20 43 68 65 63 6b 20 61 20 66 75 6e 20 63 6f 72   Check a fun cor
6ae0: 72 75 70 74 69 6f 6e 20 63 61 73 65 20 68 61 73  ruption case has
6af0: 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 23 0a 23   been fixed..#.#
6b00: 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 77 61 73   The problem was
6b10: 20 74 68 61 74 20 61 66 74 65 72 20 70 65 72 66   that after perf
6b20: 6f 72 6d 69 6e 67 20 61 20 63 68 65 63 6b 70 6f  orming a checkpo
6b30: 69 6e 74 20 75 73 69 6e 67 20 61 20 63 6f 6e 6e  int using a conn
6b40: 65 63 74 69 6f 6e 0a 23 20 74 68 61 74 20 68 61  ection.# that ha
6b50: 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74 65  d an out-of-date
6b60: 20 70 61 67 65 72 2d 63 61 63 68 65 2c 20 74 68   pager-cache, th
6b70: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
6b80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 0a 23  connection was.#
6b90: 20 75 73 65 64 20 69 74 20 64 69 64 20 6e 6f 74   used it did not
6ba0: 20 72 65 61 6c 69 7a 65 20 74 68 65 20 63 61 63   realize the cac
6bb0: 68 65 20 77 61 73 20 6f 75 74 2d 6f 66 2d 64 61  he was out-of-da
6bc0: 74 65 20 61 6e 64 20 70 72 6f 63 65 65 64 65 64  te and proceeded
6bd0: 20 74 6f 0a 23 20 6f 70 65 72 61 74 65 20 77 69   to.# operate wi
6be0: 74 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  th an inconsiste
6bf0: 6e 74 20 63 61 63 68 65 2e 20 4c 65 61 64 69 6e  nt cache. Leadin
6c00: 67 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 2e  g to corruption.
6c10: 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c  .#.catch { db cl
6c20: 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62  ose }.catch { db
6c30: 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20  2 close }.catch 
6c40: 7b 20 64 62 33 20 63 6c 6f 73 65 20 7d 0a 66 69  { db3 close }.fi
6c50: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
6c60: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
6c70: 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20 64 62 20  -wal.sqlite3 db 
6c80: 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33 20  test.db.sqlite3 
6c90: 64 62 32 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74  db2 test.db.do_t
6ca0: 65 73 74 20 77 61 6c 2d 31 34 20 7b 0a 20 20 65  est wal-14 {.  e
6cb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
6cc0: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
6cd0: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45 41   = WAL;.    CREA
6ce0: 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50 52  TE TABLE t1(a PR
6cf0: 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 20  IMARY KEY, b);. 
6d00: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6d10: 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62  1 VALUES(randomb
6d20: 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62  lob(10), randomb
6d30: 6c 6f 62 28 31 30 30 29 29 3b 0a 20 20 20 20 49  lob(100));.    I
6d40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
6d50: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
6d60: 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  10), randomblob(
6d70: 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  100) FROM t1;.  
6d80: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6d90: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6da0: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
6db0: 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(100) FROM t1;
6dc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
6dd0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
6de0: 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f  mblob(10), rando
6df0: 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20  mblob(100) FROM 
6e00: 74 31 3b 0a 20 20 7d 0a 0a 20 20 64 62 32 20 65  t1;.  }..  db2 e
6e10: 76 61 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45 52  val { .    INSER
6e20: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
6e30: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c   randomblob(10),
6e40: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
6e50: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6e60: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
6e70: 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64  omblob(10), rand
6e80: 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20 20  omblob(100);.   
6e90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6ea0: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
6eb0: 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  b(10), randomblo
6ec0: 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53 45  b(100);.    INSE
6ed0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
6ee0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29  T randomblob(10)
6ef0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
6f00: 29 3b 0a 20 20 7d 0a 0a 20 20 23 20 41 66 74 65  );.  }..  # Afte
6f10: 72 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 20  r executing the 
6f20: 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63  "PRAGMA wal_chec
6f30: 6b 70 6f 69 6e 74 22 2c 20 63 6f 6e 6e 65 63 74  kpoint", connect
6f40: 69 6f 6e 20 5b 64 62 5d 20 77 61 73 20 62 65 69  ion [db] was bei
6f50: 6e 67 0a 20 20 23 20 6c 65 66 74 20 77 69 74 68  ng.  # left with
6f60: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
6f70: 20 63 61 63 68 65 2e 20 52 75 6e 6e 69 6e 67 20   cache. Running 
6f80: 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
6f90: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 23 20 69   statement.  # i
6fa0: 6e 20 74 68 69 73 20 73 74 61 74 65 20 6c 65 64  n this state led
6fb0: 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
6fc0: 72 75 70 74 69 6f 6e 2e 0a 20 20 63 61 74 63 68  ruption..  catch
6fd0: 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47 4d  sql { .    PRAGM
6fe0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
6ff0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e 44  ;.    CREATE IND
7000: 45 58 20 69 31 20 6f 6e 20 74 31 28 62 29 3b 0a  EX i1 on t1(b);.
7010: 20 20 7d 0a 20 20 20 0a 20 20 64 62 32 20 65 76    }.   .  db2 ev
7020: 61 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65  al { PRAGMA inte
7030: 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 7d 20  grity_check }.} 
7040: 7b 6f 6b 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62  {ok}..catch { db
7050: 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b   close }.catch {
7060: 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d   db2 close }..#-
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
70c0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
70d0: 66 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 35  f tests - wal-15
70e0: 2e 2a 20 2d 20 66 6f 63 75 73 20 6f 6e 20 74 65  .* - focus on te
70f0: 73 74 69 6e 67 20 74 68 65 20 0a 23 20 69 6d 70  sting the .# imp
7100: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
7110: 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  he sqlite3_wal_c
7120: 68 65 63 6b 70 6f 69 6e 74 28 29 20 69 6e 74 65  heckpoint() inte
7130: 72 66 61 63 65 2e 0a 23 0a 66 69 6c 65 20 64 65  rface..#.file de
7140: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
7150: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  .db test.db-wal.
7160: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
7170: 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  db.do_test wal-1
7180: 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
7190: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
71a0: 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20  o_vacuum = 0;.  
71b0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
71c0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
71d0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
71e0: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 7d 0a 20 20  de = WAL;.  }.  
71f0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
7200: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
7210: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
7220: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
7230: 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  , 2);.  }.} {}..
7240: 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 65  # Test that an e
7250: 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
7260: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
7270: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72 65 63   name is not rec
7280: 6f 67 6e 69 7a 65 64 0a 23 0a 64 6f 5f 74 65 73  ognized.#.do_tes
7290: 74 20 77 61 6c 2d 31 35 2e 32 2e 31 20 7b 0a 20  t wal-15.2.1 {. 
72a0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
72b0: 63 6b 70 6f 69 6e 74 20 64 62 20 61 75 78 0a 7d  ckpoint db aux.}
72c0: 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a   {SQLITE_ERROR}.
72d0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 32  do_test wal-15.2
72e0: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .2 {.  sqlite3_e
72f0: 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c  rrcode db.} {SQL
7300: 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65  ITE_ERROR}.do_te
7310: 73 74 20 77 61 6c 2d 31 35 2e 32 2e 33 20 7b 0a  st wal-15.2.3 {.
7320: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
7330: 20 64 62 0a 7d 20 7b 75 6e 6b 6e 6f 77 6e 20 64   db.} {unknown d
7340: 61 74 61 62 61 73 65 3a 20 61 75 78 7d 0a 0a 23  atabase: aux}..#
7350: 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 65 72   Test that an er
7360: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
7370: 69 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  if an attempt is
7380: 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
7390: 69 6e 74 0a 23 20 69 66 20 61 20 74 72 61 6e 73  int.# if a trans
73a0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
73b0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
73c0: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  #.do_test wal-15
73d0: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
73e0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
73f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7400: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
7410: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c   }.  sqlite3_wal
7420: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 6d  _checkpoint db m
7430: 61 69 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f  ain.} {SQLITE_LO
7440: 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20 77 61  CKED}.do_test wa
7450: 6c 2d 31 35 2e 33 2e 32 20 7b 0a 20 20 73 71 6c  l-15.3.2 {.  sql
7460: 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62 0a  ite3_errcode db.
7470: 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  } {SQLITE_LOCKED
7480: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
7490: 2e 33 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  .3.3 {.  sqlite3
74a0: 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 64 61  _errmsg db.} {da
74b0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
74c0: 6c 6f 63 6b 65 64 7d 0a 0a 23 20 41 6c 73 6f 20  locked}..# Also 
74d0: 74 65 73 74 20 74 68 61 74 20 61 6e 20 65 72 72  test that an err
74e0: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
74f0: 66 20 74 68 65 20 64 62 20 63 61 6e 6e 6f 74 20  f the db cannot 
7500: 62 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 0a  be checkpointed.
7510: 23 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  # because of loc
7520: 6b 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ks held by anoth
7530: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23  er connection..#
7540: 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73  .sqlite3 db2 tes
7550: 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c  t.db.do_test wal
7560: 2d 31 35 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63  -15.4.1 {.  exec
7570: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
7580: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
7590: 4f 4d 20 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d  OM t1;.  } db2.}
75a0: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77   {1 2}.do_test w
75b0: 61 6c 2d 31 35 2e 34 2e 32 20 7b 0a 20 20 65 78  al-15.4.2 {.  ex
75c0: 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d  ecsql { COMMIT }
75d0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  .  sqlite3_wal_c
75e0: 68 65 63 6b 70 6f 69 6e 74 20 64 62 0a 7d 20 7b  heckpoint db.} {
75f0: 53 51 4c 49 54 45 5f 42 55 53 59 7d 0a 64 6f 5f  SQLITE_BUSY}.do_
7600: 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 33 20  test wal-15.4.3 
7610: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  {.  sqlite3_errm
7620: 73 67 20 64 62 0a 7d 20 7b 64 61 74 61 62 61 73  sg db.} {databas
7630: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 0a 0a 23 20  e is locked}..# 
7640: 41 66 74 65 72 20 5b 64 62 32 5d 20 64 72 6f 70  After [db2] drop
7650: 73 20 69 74 73 20 6c 6f 63 6b 2c 20 5b 64 62 5d  s its lock, [db]
7660: 20 6d 61 79 20 63 68 65 63 6b 70 6f 69 6e 74 20   may checkpoint 
7670: 74 68 65 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73  the db..#.do_tes
7680: 74 20 77 61 6c 2d 31 35 2e 34 2e 34 20 7b 0a 20  t wal-15.4.4 {. 
7690: 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49   execsql { COMMI
76a0: 54 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74 65  T } db2.  sqlite
76b0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
76c0: 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   db.} {SQLITE_OK
76d0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
76e0: 2e 34 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33  .4.5 {.  sqlite3
76f0: 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 6e 6f  _errmsg db.} {no
7700: 74 20 61 6e 20 65 72 72 6f 72 7d 0a 64 6f 5f 74  t an error}.do_t
7710: 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 36 20 7b  est wal-15.4.6 {
7720: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
7730: 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32  t.db.} [expr 102
7740: 34 2a 32 5d 0a 0a 63 61 74 63 68 20 7b 20 64 62  4*2]..catch { db
7750: 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20  2 close }.catch 
7760: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d  { db close }..#-
7770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
77b0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
77c0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
77d0: 66 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 36  f tests - wal-16
77e0: 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 69  .* - test that i
77f0: 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
7800: 20 6f 72 0a 23 20 61 6e 20 65 6d 70 74 79 20 73   or.# an empty s
7810: 74 72 69 6e 67 20 69 73 20 70 61 73 73 65 64 20  tring is passed 
7820: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
7830: 67 75 6d 65 6e 74 20 6f 66 20 74 68 65 20 77 61  gument of the wa
7840: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 29 0a 23  l_checkpoint().#
7850: 20 41 50 49 2c 20 61 6e 20 61 74 74 65 6d 70 74   API, an attempt
7860: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63   is made to chec
7870: 6b 70 6f 69 6e 74 20 61 6c 6c 20 61 74 74 61 63  kpoint all attac
7880: 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a 23  hed databases..#
7890: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 6b 70  .foreach {tn ckp
78a0: 74 5f 63 6d 64 20 63 6b 70 74 5f 72 65 73 20 63  t_cmd ckpt_res c
78b0: 6b 70 74 5f 6d 61 69 6e 20 63 6b 70 74 5f 61 75  kpt_main ckpt_au
78c0: 78 7d 20 7b 0a 20 20 31 20 7b 73 71 6c 69 74 65  x} {.  1 {sqlite
78d0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
78e0: 20 64 62 7d 20 20 20 20 20 20 20 20 20 20 20 20   db}            
78f0: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
7900: 31 20 31 0a 20 20 32 20 7b 73 71 6c 69 74 65 33  1 1.  2 {sqlite3
7910: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
7920: 64 62 20 22 22 7d 20 20 20 20 20 20 20 20 20 20  db ""}          
7930: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31   SQLITE_OK     1
7940: 20 31 0a 20 20 33 20 7b 64 62 20 65 76 61 6c 20   1.  3 {db eval 
7950: 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63  "PRAGMA wal_chec
7960: 6b 70 6f 69 6e 74 22 7d 20 20 20 20 20 20 20 20  kpoint"}        
7970: 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20 31 20  {}            1 
7980: 31 0a 0a 20 20 34 20 7b 73 71 6c 69 74 65 33 5f  1..  4 {sqlite3_
7990: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
79a0: 62 20 6d 61 69 6e 7d 20 20 20 20 20 20 20 20 20  b main}         
79b0: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20  SQLITE_OK     1 
79c0: 30 0a 20 20 35 20 7b 73 71 6c 69 74 65 33 5f 77  0.  5 {sqlite3_w
79d0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
79e0: 20 61 75 78 7d 20 20 20 20 20 20 20 20 20 20 53   aux}          S
79f0: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 30 20 31  QLITE_OK     0 1
7a00: 0a 20 20 36 20 7b 73 71 6c 69 74 65 33 5f 77 61  .  6 {sqlite3_wa
7a10: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
7a20: 74 65 6d 70 7d 20 20 20 20 20 20 20 20 20 53 51  temp}         SQ
7a30: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 30 20 30 0a  LITE_OK     0 0.
7a40: 20 20 37 20 7b 64 62 20 65 76 61 6c 20 22 50 52    7 {db eval "PR
7a50: 41 47 4d 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68  AGMA main.wal_ch
7a60: 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 7b 7d 20  eckpoint"}   {} 
7a70: 20 20 20 20 20 20 20 20 20 20 20 31 20 30 0a 20             1 0. 
7a80: 20 38 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41   8 {db eval "PRA
7a90: 47 4d 41 20 61 75 78 2e 77 61 6c 5f 63 68 65 63  GMA aux.wal_chec
7aa0: 6b 70 6f 69 6e 74 22 7d 20 20 20 20 7b 7d 20 20  kpoint"}    {}  
7ab0: 20 20 20 20 20 20 20 20 20 20 30 20 31 0a 20 20            0 1.  
7ac0: 39 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47  9 {db eval "PRAG
7ad0: 4d 41 20 74 65 6d 70 2e 77 61 6c 5f 63 68 65 63  MA temp.wal_chec
7ae0: 6b 70 6f 69 6e 74 22 7d 20 20 20 7b 7d 20 20 20  kpoint"}   {}   
7af0: 20 20 20 20 20 20 20 20 20 30 20 30 0a 7d 20 7b           0 0.} {
7b00: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
7b10: 36 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 69  6.$tn.1 {.    fi
7b20: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
7b30: 20 74 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e   test2.db test2.
7b40: 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d  db-wal test2.db-
7b50: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 66 69 6c 65  journal.    file
7b60: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74   delete -force t
7b70: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
7b80: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
7b90: 61 6c 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 20  al..    sqlite3 
7ba0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
7bb0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41  xecsql {.      A
7bc0: 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27  TTACH 'test2.db'
7bd0: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20 50   AS aux;.      P
7be0: 52 41 47 4d 41 20 6d 61 69 6e 2e 61 75 74 6f 5f  RAGMA main.auto_
7bf0: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
7c00: 20 20 50 52 41 47 4d 41 20 61 75 78 2e 61 75 74    PRAGMA aux.aut
7c10: 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20  o_vacuum = 0;.  
7c20: 20 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e      PRAGMA main.
7c30: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
7c40: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
7c50: 20 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64   aux.journal_mod
7c60: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50  e = WAL;.      P
7c70: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7c80: 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20  s = NORMAL;.    
7c90: 7d 0a 20 20 7d 20 7b 77 61 6c 20 77 61 6c 7d 0a  }.  } {wal wal}.
7ca0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
7cb0: 36 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78  6.$tn.2 {.    ex
7cc0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
7cd0: 45 41 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e  EATE TABLE main.
7ce0: 74 31 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59  t1(a, b, PRIMARY
7cf0: 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20   KEY(a, b));.   
7d00: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
7d10: 61 75 78 2e 74 32 28 61 2c 20 62 2c 20 50 52 49  aux.t2(a, b, PRI
7d20: 4d 41 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b  MARY KEY(a, b));
7d30: 0a 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ..      INSERT I
7d40: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c  NTO t2 VALUES(1,
7d50: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
7d60: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
7d70: 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28   INTO t2 VALUES(
7d80: 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  2, randomblob(10
7d90: 30 30 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  00));.      INSE
7da0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
7db0: 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20  T * FROM t2;.   
7dc0: 20 7d 0a 20 20 0a 20 20 20 20 6c 69 73 74 20 5b   }.  .    list [
7dd0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
7de0: 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  b] [file size te
7df0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b  st.db-wal].  } [
7e00: 6c 69 73 74 20 5b 65 78 70 72 20 31 2a 31 30 32  list [expr 1*102
7e10: 34 5d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a  4] [log_file_siz
7e20: 65 20 31 30 20 31 30 32 34 5d 5d 0a 20 20 64 6f  e 10 1024]].  do
7e30: 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e  _test wal-16.$tn
7e40: 2e 33 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66  .3 {.    list [f
7e50: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64  ile size test2.d
7e60: 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  b] [file size te
7e70: 73 74 32 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20  st2.db-wal].  } 
7e80: 5b 6c 69 73 74 20 5b 65 78 70 72 20 31 2a 31 30  [list [expr 1*10
7e90: 32 34 5d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69  24] [log_file_si
7ea0: 7a 65 20 31 36 20 31 30 32 34 5d 5d 0a 20 20 0a  ze 16 1024]].  .
7eb0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36    do_test wal-16
7ec0: 2e 24 74 6e 2e 34 20 5b 6c 69 73 74 20 65 76 61  .$tn.4 [list eva
7ed0: 6c 20 24 63 6b 70 74 5f 63 6d 64 5d 20 24 63 6b  l $ckpt_cmd] $ck
7ee0: 70 74 5f 72 65 73 0a 20 20 0a 20 20 64 6f 5f 74  pt_res.  .  do_t
7ef0: 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 35  est wal-16.$tn.5
7f00: 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c   {.    list [fil
7f10: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20  e size test.db] 
7f20: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
7f30: 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73  db-wal].  } [lis
7f40: 74 20 5b 65 78 70 72 20 28 24 63 6b 70 74 5f 6d  t [expr ($ckpt_m
7f50: 61 69 6e 20 3f 20 37 20 3a 20 31 29 2a 31 30 32  ain ? 7 : 1)*102
7f60: 34 5d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a  4] [log_file_siz
7f70: 65 20 31 30 20 31 30 32 34 5d 5d 0a 0a 20 20 64  e 10 1024]]..  d
7f80: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74  o_test wal-16.$t
7f90: 6e 2e 36 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b  n.6 {.    list [
7fa0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e  file size test2.
7fb0: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
7fc0: 65 73 74 32 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d  est2.db-wal].  }
7fd0: 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 28 24 63   [list [expr ($c
7fe0: 6b 70 74 5f 61 75 78 20 3f 20 37 20 3a 20 31 29  kpt_aux ? 7 : 1)
7ff0: 2a 31 30 32 34 5d 20 5b 6c 6f 67 5f 66 69 6c 65  *1024] [log_file
8000: 5f 73 69 7a 65 20 31 36 20 31 30 32 34 5d 5d 0a  _size 16 1024]].
8010: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c  .  catch { db cl
8020: 6f 73 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  ose }.}..#------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8070: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
8080: 69 6e 67 20 74 65 73 74 73 20 2d 20 77 61 6c 2d  ing tests - wal-
8090: 31 37 2e 2a 20 2d 20 61 74 74 65 6d 70 74 20 74  17.* - attempt t
80a0: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  o verify that th
80b0: 65 20 63 6f 72 72 65 63 74 0a 23 20 6e 75 6d 62  e correct.# numb
80c0: 65 72 20 6f 66 20 22 70 61 64 64 69 6e 67 22 20  er of "padding" 
80d0: 66 72 61 6d 65 73 20 61 72 65 20 61 70 70 65 6e  frames are appen
80e0: 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ded to the log f
80f0: 69 6c 65 20 77 68 65 6e 20 61 20 74 72 61 6e 73  ile when a trans
8100: 61 63 74 69 6f 6e 0a 23 20 69 73 20 63 6f 6d 6d  action.# is comm
8110: 69 74 74 65 64 20 69 6e 20 73 79 6e 63 68 72 6f  itted in synchro
8120: 6e 6f 75 73 3d 46 55 4c 4c 20 6d 6f 64 65 2e 0a  nous=FULL mode..
8130: 23 20 0a 23 20 44 6f 20 74 68 69 73 20 62 79 20  # .# Do this by 
8140: 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62  creating a datab
8150: 61 73 65 20 74 68 61 74 20 75 73 65 73 20 35 31  ase that uses 51
8160: 32 20 62 79 74 65 20 70 61 67 65 73 2e 20 54 68  2 byte pages. Th
8170: 65 6e 20 77 72 69 74 69 6e 67 0a 23 20 61 20 74  en writing.# a t
8180: 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
8190: 6d 6f 64 69 66 69 65 73 20 31 37 31 20 70 61 67  modifies 171 pag
81a0: 65 73 2e 20 49 6e 20 73 79 6e 63 68 72 6f 6e 6f  es. In synchrono
81b0: 75 73 3d 4e 4f 52 4d 41 4c 20 6d 6f 64 65 2c 20  us=NORMAL mode, 
81c0: 74 68 69 73 0a 23 20 70 72 6f 64 75 63 65 73 20  this.# produces 
81d0: 61 20 6c 6f 67 20 66 69 6c 65 20 6f 66 3a 0a 23  a log file of:.#
81e0: 0a 23 20 20 20 32 34 20 2b 20 28 32 34 2b 35 31  .#   24 + (24+51
81f0: 32 29 2a 31 37 31 20 3d 20 39 30 33 31 32 20 62  2)*171 = 90312 b
8200: 79 74 65 73 2e 0a 23 0a 23 20 53 6c 69 67 68 74  ytes..#.# Slight
8210: 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31  ly larger than 1
8220: 31 2a 38 31 39 32 20 3d 20 39 30 31 31 32 20 62  1*8192 = 90112 b
8230: 79 74 65 73 2e 0a 23 0a 23 20 52 75 6e 20 74 68  ytes..#.# Run th
8240: 65 20 74 65 73 74 20 75 73 69 6e 67 20 76 61 72  e test using var
8250: 69 6f 75 73 20 64 69 66 66 65 72 65 6e 74 20 73  ious different s
8260: 65 63 74 6f 72 2d 73 69 7a 65 73 2e 20 49 6e 20  ector-sizes. In 
8270: 65 61 63 68 20 63 61 73 65 2c 20 74 68 65 0a 23  each case, the.#
8280: 20 57 41 4c 20 63 6f 64 65 20 73 68 6f 75 6c 64   WAL code should
8290: 20 77 72 69 74 65 20 74 68 65 20 39 30 33 30 30   write the 90300
82a0: 20 62 79 74 65 73 20 6f 66 20 6c 6f 67 20 66 69   bytes of log fi
82b0: 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
82c0: 65 20 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e  e .# transaction
82d0: 2c 20 74 68 65 6e 20 61 70 70 65 6e 64 20 61 73  , then append as
82e0: 20 6d 61 79 20 66 72 61 6d 65 73 20 61 73 20 61   may frames as a
82f0: 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 65  re required to e
8300: 78 74 65 6e 64 20 74 68 65 0a 23 20 6c 6f 67 20  xtend the.# log 
8310: 66 69 6c 65 20 73 6f 20 74 68 61 74 20 6e 6f 20  file so that no 
8320: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  part of the next
8330: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
8340: 6c 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  l be written int
8350: 6f 0a 23 20 61 20 64 69 73 6b 2d 73 65 63 74 6f  o.# a disk-secto
8360: 72 20 75 73 65 64 20 62 79 20 74 72 61 6e 73 61  r used by transa
8370: 63 74 69 6f 6e 20 6a 75 73 74 20 63 6f 6d 6d 69  ction just commi
8380: 74 74 65 64 2e 0a 23 0a 73 65 74 20 6f 6c 64 5f  tted..#.set old_
8390: 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 5b 73 71  pending_byte [sq
83a0: 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
83b0: 6f 6c 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20  ol_pending_byte 
83c0: 30 78 31 30 30 30 30 30 30 30 5d 0a 63 61 74 63  0x10000000].catc
83d0: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66  h { db close }.f
83e0: 6f 72 65 61 63 68 20 7b 74 6e 20 73 65 63 74 6f  oreach {tn secto
83f0: 72 73 69 7a 65 20 6c 6f 67 73 69 7a 65 7d 20 7b  rsize logsize} {
8400: 0a 20 20 31 20 20 20 31 32 38 20 20 39 32 32 31  .  1   128  9221
8410: 36 0a 20 20 32 20 20 20 32 35 36 20 20 39 32 32  6.  2   256  922
8420: 31 36 0a 20 20 33 20 20 20 35 31 32 20 20 39 32  16.  3   512  92
8430: 32 31 36 20 0a 20 20 34 20 20 31 30 32 34 20 20  216 .  4  1024  
8440: 39 32 32 31 36 0a 20 20 35 20 20 32 30 34 38 20  92216.  5  2048 
8450: 20 39 32 32 31 36 0a 20 20 36 20 20 34 30 39 36   92216.  6  4096
8460: 20 20 39 34 33 36 30 0a 20 20 37 20 20 38 31 39    94360.  7  819
8470: 32 20 20 39 38 36 34 38 0a 7d 20 7b 0a 20 20 66  2  98648.} {.  f
8480: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
8490: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
84a0: 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f  b-wal test.db-jo
84b0: 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f  urnal.  sqlite3_
84c0: 73 69 6d 75 6c 61 74 65 5f 64 65 76 69 63 65 20  simulate_device 
84d0: 2d 73 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63  -sectorsize $sec
84e0: 74 6f 72 73 69 7a 65 0a 20 20 73 71 6c 69 74 65  torsize.  sqlite
84f0: 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66  3 db test.db -vf
8500: 73 20 64 65 76 73 79 6d 0a 0a 20 20 64 6f 5f 74  s devsym..  do_t
8510: 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 31  est wal-17.$tn.1
8520: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
8530: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75  .      PRAGMA au
8540: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20  to_vacuum = 0;. 
8550: 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65       PRAGMA page
8560: 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20  _size = 512;.   
8570: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
8580: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
8590: 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68      PRAGMA synch
85a0: 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 0a 20  ronous = FULL;. 
85b0: 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c     }.    execsql
85c0: 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a   {.      BEGIN;.
85d0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
85e0: 4c 45 20 74 28 78 29 3b 0a 20 20 20 20 7d 0a 20  LE t(x);.    }. 
85f0: 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d     for {set i 0}
8600: 20 7b 24 69 3c 31 36 36 7d 20 7b 69 6e 63 72 20   {$i<166} {incr 
8610: 69 7d 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73  i} {.      execs
8620: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
8630: 20 74 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d   t VALUES(random
8640: 62 6c 6f 62 28 34 30 30 29 29 20 7d 0a 20 20 20  blob(400)) }.   
8650: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 43   }.    execsql C
8660: 4f 4d 4d 49 54 0a 0a 20 20 20 20 66 69 6c 65 20  OMMIT..    file 
8670: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
8680: 0a 20 20 7d 20 24 6c 6f 67 73 69 7a 65 0a 0a 20  .  } $logsize.. 
8690: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 37 2e   do_test wal-17.
86a0: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65  $tn.2 {.    file
86b0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
86c0: 7d 20 35 31 32 0a 0a 20 20 64 6f 5f 74 65 73 74  } 512..  do_test
86d0: 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 33 20 7b 0a   wal-17.$tn.3 {.
86e0: 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20      db close.   
86f0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
8700: 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 35 31 32  db.  } [expr 512
8710: 2a 31 37 31 5d 0a 7d 0a 73 71 6c 69 74 65 33 5f  *171].}.sqlite3_
8720: 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e  test_control_pen
8730: 64 69 6e 67 5f 62 79 74 65 20 24 6f 6c 64 5f 70  ding_byte $old_p
8740: 65 6e 64 69 6e 67 5f 62 79 74 65 0a 0a 23 2d 2d  ending_byte..#--
8750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8790: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 74  -------.# This t
87a0: 65 73 74 20 2d 20 77 61 6c 2d 31 38 2e 2a 20 2d  est - wal-18.* -
87b0: 20 76 65 72 69 66 69 65 73 20 61 20 63 6f 75 70   verifies a coup
87c0: 6c 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 63  le of specific c
87d0: 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 0a 23  onditions that.#
87e0: 20 6d 61 79 20 62 65 20 65 6e 63 6f 75 6e 74 65   may be encounte
87f0: 72 65 64 20 77 68 69 6c 65 20 72 65 63 6f 76 65  red while recove
8800: 72 69 6e 67 20 61 20 6c 6f 67 20 66 69 6c 65 20  ring a log file 
8810: 61 72 65 20 68 61 6e 64 6c 65 64 20 63 6f 72 72  are handled corr
8820: 65 63 74 6c 79 3a 0a 23 0a 23 20 20 20 77 61 6c  ectly:.#.#   wal
8830: 2d 31 38 2e 31 2e 2a 20 57 68 65 6e 20 74 68 65  -18.1.* When the
8840: 20 66 69 72 73 74 20 33 32 2d 62 69 74 73 20 6f   first 32-bits o
8850: 66 20 61 20 66 72 61 6d 65 20 63 68 65 63 6b 73  f a frame checks
8860: 75 6d 20 69 73 20 63 6f 72 72 65 63 74 20 62 75  um is correct bu
8870: 74 20 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  t .#            
8880: 20 20 74 68 65 20 73 65 63 6f 6e 64 20 33 32 2d    the second 32-
8890: 62 69 74 73 20 61 72 65 20 66 61 6c 73 65 2c 20  bits are false, 
88a0: 61 6e 64 0a 23 0a 23 20 20 20 77 61 6c 2d 31 38  and.#.#   wal-18
88b0: 2e 32 2e 2a 20 57 68 65 6e 20 74 68 65 20 70 61  .2.* When the pa
88c0: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 74 68  ge-size field th
88d0: 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
88e0: 20 73 74 61 72 74 20 6f 66 20 61 20 6c 6f 67 0a   start of a log.
88f0: 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  #              f
8900: 69 6c 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f  ile is a power o
8910: 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
8920: 20 31 36 33 38 34 20 6f 72 20 73 6d 61 6c 6c 65   16384 or smalle
8930: 72 20 74 68 61 6e 20 35 31 32 2e 0a 23 0a 66 69  r than 512..#.fi
8940: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
8950: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
8960: 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75  -wal test.db-jou
8970: 72 6e 61 6c 0a 64 6f 5f 74 65 73 74 20 77 61 6c  rnal.do_test wal
8980: 2d 31 38 2e 30 20 7b 0a 20 20 73 71 6c 69 74 65  -18.0 {.  sqlite
8990: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
89a0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
89b0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
89c0: 31 30 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41  1024;.    PRAGMA
89d0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30   auto_vacuum = 0
89e0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
89f0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
8a00: 0a 20 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63  .    PRAGMA sync
8a10: 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 0a  hronous = OFF;..
8a20: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8a30: 20 74 31 28 61 2c 20 62 2c 20 55 4e 49 51 55 45   t1(a, b, UNIQUE
8a40: 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 49 4e 53  (a, b));.    INS
8a50: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
8a60: 45 53 28 30 2c 20 30 29 3b 0a 20 20 20 20 50 52  ES(0, 0);.    PR
8a70: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
8a80: 69 6e 74 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54  int;..    INSERT
8a90: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
8aa0: 31 2c 20 32 29 3b 20 20 20 20 20 20 20 20 20 20  1, 2);          
8ab0: 2d 2d 20 66 72 61 6d 65 73 20 31 20 61 6e 64 20  -- frames 1 and 
8ac0: 32 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  2.    INSERT INT
8ad0: 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34  O t1 VALUES(3, 4
8ae0: 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20 66  );          -- f
8af0: 72 61 6d 65 73 20 33 20 61 6e 64 20 34 0a 20 20  rames 3 and 4.  
8b00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
8b10: 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 20 20   VALUES(5, 6);  
8b20: 20 20 20 20 20 20 20 20 2d 2d 20 66 72 61 6d 65          -- frame
8b30: 73 20 35 20 61 6e 64 20 36 0a 20 20 7d 0a 0a 20  s 5 and 6.  }.. 
8b40: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
8b50: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 58 2e  e test.db testX.
8b60: 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d  db.  file copy -
8b70: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77 61  force test.db-wa
8b80: 6c 20 74 65 73 74 58 2e 64 62 2d 77 61 6c 0a 20  l testX.db-wal. 
8b90: 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73 74   db close.  list
8ba0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
8bb0: 58 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65  X.db] [file size
8bc0: 20 74 65 73 74 58 2e 64 62 2d 77 61 6c 5d 0a 7d   testX.db-wal].}
8bd0: 20 5b 6c 69 73 74 20 5b 65 78 70 72 20 33 2a 31   [list [expr 3*1
8be0: 30 32 34 5d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73  024] [log_file_s
8bf0: 69 7a 65 20 36 20 31 30 32 34 5d 5d 0a 0a 75 6e  ize 6 1024]]..un
8c00: 73 65 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20  set -nocomplain 
8c10: 6e 46 72 61 6d 65 20 72 65 73 75 6c 74 0a 66 6f  nFrame result.fo
8c20: 72 65 61 63 68 20 7b 6e 46 72 61 6d 65 20 72 65  reach {nFrame re
8c30: 73 75 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20  sult} {.        
8c40: 20 30 20 20 20 20 20 20 7b 30 20 30 7d 0a 20 20   0      {0 0}.  
8c50: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 7b 30         1      {0
8c60: 20 30 7d 0a 20 20 20 20 20 20 20 20 20 32 20 20   0}.         2  
8c70: 20 20 20 20 7b 30 20 30 20 31 20 32 7d 0a 20 20      {0 0 1 2}.  
8c80: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 7b 30         3      {0
8c90: 20 30 20 31 20 32 7d 0a 20 20 20 20 20 20 20 20   0 1 2}.        
8ca0: 20 34 20 20 20 20 20 20 7b 30 20 30 20 31 20 32   4      {0 0 1 2
8cb0: 20 33 20 34 7d 0a 20 20 20 20 20 20 20 20 20 35   3 4}.         5
8cc0: 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 20 33        {0 0 1 2 3
8cd0: 20 34 7d 0a 20 20 20 20 20 20 20 20 20 36 20 20   4}.         6  
8ce0: 20 20 20 20 7b 30 20 30 20 31 20 32 20 33 20 34      {0 0 1 2 3 4
8cf0: 20 35 20 36 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74   5 6}.} {.  do_t
8d00: 65 73 74 20 77 61 6c 2d 31 38 2e 31 2e 24 6e 46  est wal-18.1.$nF
8d10: 72 61 6d 65 20 7b 0a 20 20 20 20 66 69 6c 65 20  rame {.    file 
8d20: 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74  copy -force test
8d30: 58 2e 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  X.db test.db.   
8d40: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
8d50: 65 20 74 65 73 74 58 2e 64 62 2d 77 61 6c 20 74  e testX.db-wal t
8d60: 65 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 20 20  est.db-wal..    
8d70: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
8d80: 2e 64 62 2d 77 61 6c 20 5b 65 78 70 72 20 32 34  .db-wal [expr 24
8d90: 20 2b 20 24 6e 46 72 61 6d 65 2a 28 32 34 2b 31   + $nFrame*(24+1
8da0: 30 32 34 29 20 2b 20 32 30 5d 20 30 30 30 30 30  024) + 20] 00000
8db0: 30 30 30 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  000..    sqlite3
8dc0: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20   db test.db.    
8dd0: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
8de0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
8df0: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
8e00: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
8e10: 20 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 63 6f 6e   .    }.  } [con
8e20: 63 61 74 20 24 72 65 73 75 6c 74 20 6f 6b 5d 0a  cat $result ok].
8e30: 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 0a 0a 70    db close.} ..p
8e40: 72 6f 63 20 72 61 6e 64 6f 6d 62 6c 6f 62 20 7b  roc randomblob {
8e50: 70 67 73 7a 7d 20 7b 0a 20 20 73 71 6c 69 74 65  pgsz} {.  sqlite
8e60: 33 20 72 62 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  3 rbdb :memory:.
8e70: 20 20 73 65 74 20 62 6c 6f 62 20 5b 72 62 64 62    set blob [rbdb
8e80: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 72 61 6e   one {SELECT ran
8e90: 64 6f 6d 62 6c 6f 62 28 24 70 67 73 7a 29 7d 5d  domblob($pgsz)}]
8ea0: 0a 20 20 72 62 64 62 20 63 6c 6f 73 65 0a 20 20  .  rbdb close.  
8eb0: 73 65 74 20 62 6c 6f 62 0a 7d 0a 0a 70 72 6f 63  set blob.}..proc
8ec0: 20 6c 6f 67 63 6b 73 75 6d 20 7b 63 6b 76 31 20   logcksum {ckv1 
8ed0: 63 6b 76 32 20 62 6c 6f 62 7d 20 7b 0a 20 20 75  ckv2 blob} {.  u
8ee0: 70 76 61 72 20 24 63 6b 76 31 20 63 31 0a 20 20  pvar $ckv1 c1.  
8ef0: 75 70 76 61 72 20 24 63 6b 76 32 20 63 32 0a 0a  upvar $ckv2 c2..
8f00: 0a 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 24  .  binary scan $
8f10: 62 6c 6f 62 20 49 2a 20 76 61 6c 75 65 73 0a 20  blob I* values. 
8f20: 20 66 6f 72 65 61 63 68 20 7b 76 31 20 76 32 7d   foreach {v1 v2}
8f30: 20 24 76 61 6c 75 65 73 20 7b 0a 20 20 20 20 73   $values {.    s
8f40: 65 74 20 63 31 20 5b 65 78 70 72 20 7b 28 24 63  et c1 [expr {($c
8f50: 31 20 2b 20 24 76 31 20 2b 20 24 63 32 29 26 30  1 + $v1 + $c2)&0
8f60: 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 20 20  xFFFFFFFF}].    
8f70: 73 65 74 20 63 32 20 5b 65 78 70 72 20 7b 28 24  set c2 [expr {($
8f80: 63 32 20 2b 20 24 76 32 20 2b 20 24 63 31 29 26  c2 + $v2 + $c1)&
8f90: 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 7d  0xFFFFFFFF}].  }
8fa0: 0a 7d 0a 0a 66 69 6c 65 20 63 6f 70 79 20 2d 66  .}..file copy -f
8fb0: 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73  orce test.db tes
8fc0: 74 58 2e 64 62 0a 66 6f 72 65 61 63 68 20 7b 74  tX.db.foreach {t
8fd0: 6e 20 70 67 73 7a 20 77 6f 72 6b 73 7d 20 7b 20  n pgsz works} { 
8fe0: 0a 20 20 31 20 20 20 20 31 32 38 20 20 20 20 30  .  1    128    0
8ff0: 0a 20 20 32 20 20 20 20 32 35 36 20 20 20 20 30  .  2    256    0
9000: 0a 20 20 33 20 20 20 20 35 31 32 20 20 20 20 31  .  3    512    1
9010: 0a 20 20 34 20 20 20 31 30 32 34 20 20 20 20 31  .  4   1024    1
9020: 0a 20 20 35 20 20 20 32 30 34 38 20 20 20 20 31  .  5   2048    1
9030: 0a 20 20 36 20 20 20 34 30 39 36 20 20 20 20 31  .  6   4096    1
9040: 0a 20 20 37 20 20 20 38 31 39 32 20 20 20 20 31  .  7   8192    1
9050: 0a 20 20 38 20 20 31 36 33 38 34 20 20 20 20 31  .  8  16384    1
9060: 0a 20 20 39 20 20 33 32 37 36 38 20 20 20 20 31  .  9  32768    1
9070: 0a 20 31 30 20 20 36 35 35 33 36 20 20 20 20 30  . 10  65536    0
9080: 0a 20 31 31 20 20 20 31 30 31 36 20 20 20 20 30  . 11   1016    0
9090: 0a 7d 20 7b 0a 0a 20 20 69 66 20 7b 24 3a 3a 53  .} {..  if {$::S
90a0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
90b0: 49 5a 45 20 3c 20 24 70 67 73 7a 7d 20 7b 0a 20  IZE < $pgsz} {. 
90c0: 20 20 20 73 65 74 20 77 6f 72 6b 73 20 30 0a 20     set works 0. 
90d0: 20 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 70   }..  for {set p
90e0: 67 20 31 7d 20 7b 24 70 67 20 3c 3d 20 33 7d 20  g 1} {$pg <= 3} 
90f0: 7b 69 6e 63 72 20 70 67 7d 20 7b 0a 20 20 20 20  {incr pg} {.    
9100: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
9110: 20 74 65 73 74 58 2e 64 62 20 74 65 73 74 2e 64   testX.db test.d
9120: 62 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74  b.    file delet
9130: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
9140: 2d 77 61 6c 0a 20 20 0a 20 20 20 20 23 20 43 68  -wal.  .    # Ch
9150: 65 63 6b 20 74 68 61 74 20 74 68 65 20 64 61 74  eck that the dat
9160: 61 62 61 73 65 20 6e 6f 77 20 65 78 69 73 74 73  abase now exists
9170: 20 61 6e 64 20 63 6f 6e 73 69 73 74 73 20 6f 66   and consists of
9180: 20 74 68 72 65 65 20 70 61 67 65 73 2e 20 41 6e   three pages. An
9190: 64 0a 20 20 20 20 23 20 74 68 61 74 20 74 68 65  d.    # that the
91a0: 72 65 20 69 73 20 6e 6f 20 61 73 73 6f 63 69 61  re is no associa
91b0: 74 65 64 20 77 61 6c 20 66 69 6c 65 2e 0a 20 20  ted wal file..  
91c0: 20 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20    #.    do_test 
91d0: 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67  wal-18.2.$tn.$pg
91e0: 2e 31 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73  .1 { file exists
91f0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 7d 20 30   test.db-wal } 0
9200: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
9210: 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 32 20  -18.2.$tn.$pg.2 
9220: 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65  { file exists te
9230: 73 74 2e 64 62 20 7d 20 31 0a 20 20 20 20 64 6f  st.db } 1.    do
9240: 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24  _test wal-18.2.$
9250: 74 6e 2e 24 70 67 2e 33 20 7b 20 66 69 6c 65 20  tn.$pg.3 { file 
9260: 73 69 7a 65 20 74 65 73 74 2e 64 62 20 7d 20 5b  size test.db } [
9270: 65 78 70 72 20 31 30 32 34 2a 33 5d 0a 20 20 0a  expr 1024*3].  .
9280: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
9290: 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 34 20 7b  18.2.$tn.$pg.4 {
92a0: 0a 0a 20 20 20 20 20 20 23 20 43 72 65 61 74 65  ..      # Create
92b0: 20 61 20 77 61 6c 20 66 69 6c 65 20 74 68 61 74   a wal file that
92c0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67   contains a sing
92d0: 6c 65 20 66 72 61 6d 65 20 28 64 61 74 61 62 61  le frame (databa
92e0: 73 65 20 70 61 67 65 0a 20 20 20 20 20 20 23 20  se page.      # 
92f0: 6e 75 6d 62 65 72 20 24 70 67 29 20 77 69 74 68  number $pg) with
9300: 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 6c 61 67   the commit flag
9310: 20 73 65 74 2e 20 54 68 65 20 66 72 61 6d 65 20   set. The frame 
9320: 63 68 65 63 6b 73 75 6d 20 69 73 0a 20 20 20 20  checksum is.    
9330: 20 20 23 20 63 6f 72 72 65 63 74 2c 20 62 75 74    # correct, but
9340: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
9350: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
9360: 67 65 20 61 72 65 20 63 6f 72 72 75 70 74 2e 0a  ge are corrupt..
9370: 20 20 20 20 20 20 23 0a 20 20 20 20 20 20 23 20        #.      # 
9380: 54 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 6e  The page-size in
9390: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 68 65   the log file he
93a0: 61 64 65 72 20 69 73 20 73 65 74 20 74 6f 20 24  ader is set to $
93b0: 70 67 73 7a 2e 20 49 66 20 74 68 65 0a 20 20 20  pgsz. If the.   
93c0: 20 20 20 23 20 57 41 4c 20 63 6f 64 65 20 63 6f     # WAL code co
93d0: 6e 73 69 64 65 72 73 20 24 70 67 73 7a 20 74 6f  nsiders $pgsz to
93e0: 20 62 65 20 61 20 76 61 6c 69 64 20 53 51 4c 69   be a valid SQLi
93f0: 74 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  te database file
9400: 20 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 20 20   page-size,.    
9410: 20 20 23 20 74 68 65 20 64 61 74 61 62 61 73 65    # the database
9420: 20 77 69 6c 6c 20 62 65 20 63 6f 72 72 75 70 74   will be corrupt
9430: 20 28 62 65 63 61 75 73 65 20 74 68 65 20 67 61   (because the ga
9440: 72 62 61 67 65 20 66 72 61 6d 65 20 63 6f 6e 74  rbage frame cont
9450: 65 6e 74 73 0a 20 20 20 20 20 20 23 20 77 69 6c  ents.      # wil
9460: 6c 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20  l be treated as 
9470: 76 61 6c 69 64 20 63 6f 6e 74 65 6e 74 29 2e 20  valid content). 
9480: 49 66 20 24 70 67 73 7a 20 69 73 20 69 6e 76 61  If $pgsz is inva
9490: 6c 69 64 20 28 74 6f 6f 20 73 6d 61 6c 6c 0a 20  lid (too small. 
94a0: 20 20 20 20 20 23 20 6f 72 20 74 6f 6f 20 6c 61       # or too la
94b0: 72 67 65 29 2c 20 74 68 65 20 64 62 20 77 69 6c  rge), the db wil
94c0: 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74  l not be corrupt
94d0: 20 61 73 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   as the log file
94e0: 20 77 69 6c 6c 0a 20 20 20 20 20 20 23 20 62 65   will.      # be
94f0: 20 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20   ignored..      
9500: 23 0a 20 20 20 20 20 20 73 65 74 20 77 61 6c 68  #.      set walh
9510: 64 72 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61  dr [binary forma
9520: 74 20 49 49 49 49 49 49 20 39 33 31 30 37 31 36  t IIIIII 9310716
9530: 31 38 20 33 30 30 37 30 30 30 20 24 70 67 73 7a  18 3007000 $pgsz
9540: 20 31 32 33 34 20 32 32 20 32 33 5d 0a 20 20 20   1234 22 23].   
9550: 20 20 20 73 65 74 20 66 72 61 6d 65 62 6f 64 79     set framebody
9560: 20 5b 72 61 6e 64 6f 6d 62 6c 6f 62 20 24 70 67   [randomblob $pg
9570: 73 7a 5d 0a 20 20 20 20 20 20 73 65 74 20 66 72  sz].      set fr
9580: 61 6d 65 68 64 72 20 20 5b 62 69 6e 61 72 79 20  amehdr  [binary 
9590: 66 6f 72 6d 61 74 20 49 49 49 49 20 24 70 67 20  format IIII $pg 
95a0: 35 20 32 32 20 32 33 5d 0a 20 20 20 20 20 20 73  5 22 23].      s
95b0: 65 74 20 63 31 20 30 0a 20 20 20 20 20 20 73 65  et c1 0.      se
95c0: 74 20 63 32 20 30 0a 20 20 20 20 20 20 6c 6f 67  t c2 0.      log
95d0: 63 6b 73 75 6d 20 63 31 20 63 32 20 24 66 72 61  cksum c1 c2 $fra
95e0: 6d 65 68 64 72 0a 20 20 20 20 20 20 6c 6f 67 63  mehdr.      logc
95f0: 6b 73 75 6d 20 63 31 20 63 32 20 24 66 72 61 6d  ksum c1 c2 $fram
9600: 65 62 6f 64 79 0a 20 20 20 20 20 20 73 65 74 20  ebody.      set 
9610: 66 72 61 6d 65 68 64 72 20 5b 62 69 6e 61 72 79  framehdr [binary
9620: 20 66 6f 72 6d 61 74 20 49 49 49 49 49 49 20 24   format IIIIII $
9630: 70 67 20 35 20 32 32 20 32 33 20 24 63 31 20 24  pg 5 22 23 $c1 $
9640: 63 32 5d 0a 20 20 20 20 20 20 73 65 74 20 66 64  c2].      set fd
9650: 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 77   [open test.db-w
9660: 61 6c 20 77 5d 0a 20 20 20 20 20 20 66 63 6f 6e  al w].      fcon
9670: 66 69 67 75 72 65 20 24 66 64 20 2d 65 6e 63 6f  figure $fd -enco
9680: 64 69 6e 67 20 62 69 6e 61 72 79 20 2d 74 72 61  ding binary -tra
9690: 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a  nslation binary.
96a0: 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65        puts -none
96b0: 77 6c 69 6e 65 20 24 66 64 20 24 77 61 6c 68 64  wline $fd $walhd
96c0: 72 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f  r.      puts -no
96d0: 6e 65 77 6c 69 6e 65 20 24 66 64 20 24 66 72 61  newline $fd $fra
96e0: 6d 65 68 64 72 0a 20 20 20 20 20 20 70 75 74 73  mehdr.      puts
96f0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20   -nonewline $fd 
9700: 24 66 72 61 6d 65 62 6f 64 79 0a 20 20 20 20 20  $framebody.     
9710: 20 63 6c 6f 73 65 20 24 66 64 0a 20 20 0a 20 20   close $fd.  .  
9720: 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65      file size te
9730: 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20 7d 20  st.db-wal.    } 
9740: 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 31  [log_file_size 1
9750: 20 24 70 67 73 7a 5d 0a 20 20 0a 20 20 20 20 64   $pgsz].  .    d
9760: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e  o_test wal-18.2.
9770: 24 74 6e 2e 24 70 67 2e 35 20 7b 0a 20 20 20 20  $tn.$pg.5 {.    
9780: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
9790: 74 2e 64 62 0a 20 20 20 20 20 20 73 65 74 20 72  t.db.      set r
97a0: 63 20 5b 63 61 74 63 68 20 7b 20 64 62 20 6f 6e  c [catch { db on
97b0: 65 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72  e {PRAGMA integr
97c0: 69 74 79 5f 63 68 65 63 6b 7d 20 7d 20 6d 73 67  ity_check} } msg
97d0: 5d 0a 20 20 20 20 20 20 65 78 70 72 20 7b 20 24  ].      expr { $
97e0: 72 63 21 3d 30 20 7c 7c 20 24 6d 73 67 21 3d 22  rc!=0 || $msg!="
97f0: 6f 6b 22 20 7d 0a 20 20 20 20 7d 20 24 77 6f 72  ok" }.    } $wor
9800: 6b 73 0a 20 20 0a 20 20 20 20 64 62 20 63 6c 6f  ks.  .    db clo
9810: 73 65 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d  se.  }.}..#-----
9820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9860: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
9870: 77 69 6e 67 20 74 65 73 74 20 2d 20 77 61 6c 2d  wing test - wal-
9880: 31 39 2e 2a 20 2d 20 66 69 78 65 73 20 61 20 62  19.* - fixes a b
9890: 75 67 20 74 68 61 74 20 77 61 73 20 70 72 65 73  ug that was pres
98a0: 65 6e 74 20 64 75 72 69 6e 67 0a 23 20 64 65 76  ent during.# dev
98b0: 65 6c 6f 70 6d 65 6e 74 2e 0a 23 0a 23 20 57 68  elopment..#.# Wh
98c0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  en a database co
98d0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20  nnection in WAL 
98e0: 6d 6f 64 65 20 69 73 20 63 6c 6f 73 65 64 2c 20  mode is closed, 
98f0: 69 74 20 61 74 74 65 6d 70 74 73 20 61 6e 0a 23  it attempts an.#
9900: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
9910: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
9920: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 6c 6f 63  file. If the loc
9930: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 2c 20 74  k is obtained, t
9940: 68 65 0a 23 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  he.# connection 
9950: 6b 6e 6f 77 73 20 74 68 61 74 20 69 74 20 69 73  knows that it is
9960: 20 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63   the last connec
9970: 74 69 6f 6e 20 74 6f 20 64 69 73 63 6f 6e 6e 65  tion to disconne
9980: 63 74 20 66 72 6f 6d 0a 23 20 74 68 65 20 64 61  ct from.# the da
9990: 74 61 62 61 73 65 2c 20 73 6f 20 69 74 20 72 75  tabase, so it ru
99a0: 6e 73 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  ns a checkpoint 
99b0: 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 62  operation. The b
99c0: 75 67 20 77 61 73 20 74 68 61 74 0a 23 20 74 68  ug was that.# th
99d0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
99e0: 20 6e 6f 74 20 75 70 64 61 74 69 6e 67 20 69 74   not updating it
99f0: 73 20 70 72 69 76 61 74 65 20 63 6f 70 79 20 6f  s private copy o
9a00: 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
9a10: 0a 23 20 68 65 61 64 65 72 20 62 65 66 6f 72 65  .# header before
9a20: 20 64 6f 69 6e 67 20 73 6f 2c 20 6d 65 61 6e 69   doing so, meani
9a30: 6e 67 20 74 68 61 74 20 69 74 20 63 6f 75 6c 64  ng that it could
9a40: 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 20 6f   checkpoint an o
9a50: 6c 64 0a 23 20 73 6e 61 70 73 68 6f 74 2e 0a 23  ld.# snapshot..#
9a60: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e  .do_test wal-19.
9a70: 31 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  1 {.  file delet
9a80: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
9a90: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
9aa0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73  t.db-journal.  s
9ab0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
9ac0: 62 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20  b.  sqlite3 db2 
9ad0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
9ae0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a  l {.    PRAGMA j
9af0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
9b00: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
9b10: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
9b20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9b30: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
9b40: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9b50: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
9b60: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
9b70: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
9b80: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
9b90: 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  4}.do_test wal-1
9ba0: 39 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  9.2 {.  execsql 
9bb0: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
9bc0: 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36  O t1 VALUES(5, 6
9bd0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  );.    SELECT * 
9be0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
9bf0: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f  1 2 3 4 5 6}.do_
9c00: 74 65 73 74 20 77 61 6c 2d 31 39 2e 33 20 7b 0a  test wal-19.3 {.
9c10: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32    db close.  db2
9c20: 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78   close.  file ex
9c30: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c  ists test.db-wal
9c40: 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {0}.do_test w
9c50: 61 6c 2d 31 39 2e 34 20 7b 0a 20 20 23 20 57 68  al-19.4 {.  # Wh
9c60: 65 6e 20 74 68 65 20 62 75 67 20 77 61 73 20 70  en the bug was p
9c70: 72 65 73 65 6e 74 2c 20 74 68 65 20 66 6f 6c 6c  resent, the foll
9c80: 6f 77 69 6e 67 20 77 61 73 20 72 65 74 75 72 6e  owing was return
9c90: 69 6e 67 20 7b 31 20 32 20 33 20 34 7d 20 6f 6e  ing {1 2 3 4} on
9ca0: 6c 79 2c 0a 20 20 23 20 61 73 20 5b 64 62 32 5d  ly,.  # as [db2]
9cb0: 20 68 61 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64   had an out-of-d
9cc0: 61 74 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ate copy of the 
9cd0: 77 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72  wal-index header
9ce0: 20 77 68 65 6e 20 69 74 20 77 61 73 0a 20 20 23   when it was.  #
9cf0: 20 63 6c 6f 73 65 64 2e 0a 20 20 23 0a 20 20 73   closed..  #.  s
9d00: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
9d10: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
9d20: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
9d30: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d  .} {1 2 3 4 5 6}
9d40: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
9d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
9d90: 68 69 73 20 74 65 73 74 20 2d 20 77 61 6c 2d 32  his test - wal-2
9da0: 30 2e 2a 20 2d 20 75 73 65 73 20 74 77 6f 20 63  0.* - uses two c
9db0: 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 4f 6e 65 20  onnections. One 
9dc0: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
9dd0: 61 6e 64 0a 23 20 74 68 65 20 6f 74 68 65 72 20  and.# the other 
9de0: 69 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70  in an external p
9df0: 72 6f 63 65 73 73 2e 20 54 68 65 20 70 72 6f 63  rocess. The proc
9e00: 65 64 75 72 65 20 69 73 3a 0a 23 0a 23 20 20 20  edure is:.#.#   
9e10: 31 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74  1. Using connect
9e20: 69 6f 6e 20 31 2c 20 63 72 65 61 74 65 20 74 68  ion 1, create th
9e30: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
9e40: 61 2e 0a 23 0a 23 20 20 20 32 2e 20 55 73 69 6e  a..#.#   2. Usin
9e50: 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 28  g connection 2 (
9e60: 69 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70  in an external p
9e70: 72 6f 63 65 73 73 29 2c 20 61 64 64 20 73 6f 20  rocess), add so 
9e80: 6d 75 63 68 0a 23 20 20 20 20 20 20 64 61 74 61  much.#      data
9e90: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
9ea0: 20 77 69 74 68 6f 75 74 20 63 68 65 63 6b 70 6f   without checkpo
9eb0: 69 6e 74 69 6e 67 20 74 68 61 74 20 61 20 77 61  inting that a wa
9ec0: 6c 2d 69 6e 64 65 78 20 0a 23 20 20 20 20 20 20  l-index .#      
9ed0: 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34 4b 42  larger than 64KB
9ee0: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 23 0a   is required..#.
9ef0: 23 20 20 20 33 2e 20 55 73 69 6e 67 20 63 6f 6e  #   3. Using con
9f00: 6e 65 63 74 69 6f 6e 20 31 2c 20 63 68 65 63 6b  nection 1, check
9f10: 70 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61  point the databa
9f20: 73 65 2e 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  se. Make sure al
9f30: 6c 0a 23 20 20 20 20 20 20 74 68 65 20 64 61 74  l.#      the dat
9f40: 61 20 69 73 20 70 72 65 73 65 6e 74 20 61 6e 64  a is present and
9f50: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
9f60: 20 6e 6f 74 20 63 6f 72 72 75 70 74 2e 0a 23 0a   not corrupt..#.
9f70: 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20  # At one point, 
9f80: 53 51 4c 69 74 65 20 77 61 73 20 66 61 69 6c 69  SQLite was faili
9f90: 6e 67 20 74 6f 20 67 72 6f 77 20 74 68 65 20 6d  ng to grow the m
9fa0: 61 70 70 69 6e 67 20 6f 66 20 74 68 65 20 77 61  apping of the wa
9fb0: 6c 2d 69 6e 64 65 78 0a 23 20 66 69 6c 65 20 69  l-index.# file i
9fc0: 6e 20 73 74 65 70 20 33 20 61 6e 64 20 74 68 65  n step 3 and the
9fd0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 77 61 73 20   checkpoint was 
9fe0: 63 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64  corrupting the d
9ff0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a  atabase file..#.
a000: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 31  do_test wal-20.1
a010: 20 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63   {.  catch {db c
a020: 6c 6f 73 65 7d 0a 20 20 66 69 6c 65 20 64 65 6c  lose}.  file del
a030: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
a040: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74  db test.db-wal t
a050: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  est.db-journal. 
a060: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
a070: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  .db.  execsql {.
a080: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
a090: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
a0a0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
a0b0: 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52  t1(x);.    INSER
a0c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
a0d0: 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29  (randomblob(900)
a0e0: 29 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f  );.    SELECT co
a0f0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
a100: 20 20 7d 0a 7d 20 7b 77 61 6c 20 31 7d 0a 64 6f    }.} {wal 1}.do
a110: 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 32 20 7b  _test wal-20.2 {
a120: 0a 20 20 73 65 74 20 3a 3a 62 75 64 64 79 20 5b  .  set ::buddy [
a130: 6c 61 75 6e 63 68 5f 74 65 73 74 66 69 78 74 75  launch_testfixtu
a140: 72 65 5d 0a 20 20 74 65 73 74 66 69 78 74 75 72  re].  testfixtur
a150: 65 20 24 3a 3a 62 75 64 64 79 20 7b 0a 20 20 20  e $::buddy {.   
a160: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
a170: 2e 64 62 0a 20 20 20 20 64 62 20 74 72 61 6e 73  .db.    db trans
a180: 61 63 74 69 6f 6e 20 7b 20 64 62 20 65 76 61 6c  action { db eval
a190: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
a1a0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
a1b0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 49 4e  nt = 0;.      IN
a1c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
a1d0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
a1e0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
a1f0: 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20     /* 2 */.     
a200: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
a210: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
a220: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
a230: 20 20 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20        /* 4 */.  
a240: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a250: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
a260: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
a270: 31 3b 20 20 20 20 20 20 20 2f 2a 20 38 20 2a 2f  1;       /* 8 */
a280: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a290: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
a2a0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
a2b0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31  M t1;       /* 1
a2c0: 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  6 */.      INSER
a2d0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
a2e0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
a2f0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
a300: 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 49  /* 32 */.      I
a310: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
a320: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
a330: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
a340: 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20 20      /* 64 */.   
a350: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a360: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
a370: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
a380: 3b 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20 2a  ;       /* 128 *
a390: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
a3a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
a3b0: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
a3c0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
a3d0: 32 35 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  256 */.      INS
a3e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
a3f0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
a400: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
a410: 20 20 2f 2a 20 35 31 32 20 2a 2f 0a 20 20 20 20    /* 512 */.    
a420: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a430: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
a440: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
a450: 20 20 20 20 20 20 20 2f 2a 20 31 30 32 34 20 2a         /* 1024 *
a460: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
a470: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
a480: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
a490: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
a4a0: 32 30 34 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e  2048 */.      IN
a4b0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
a4c0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
a4d0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
a4e0: 20 20 20 2f 2a 20 34 30 39 36 20 2a 2f 0a 20 20     /* 4096 */.  
a4f0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a500: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
a510: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
a520: 31 3b 20 20 20 20 20 20 20 2f 2a 20 38 31 39 32  1;       /* 8192
a530: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
a540: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a550: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
a560: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
a570: 2a 20 31 36 33 38 34 20 2a 2f 0a 20 20 20 20 7d  * 16384 */.    }
a580: 20 7d 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f   }.  }.} {0}.do_
a590: 74 65 73 74 20 77 61 6c 2d 32 30 2e 33 20 7b 0a  test wal-20.3 {.
a5a0: 20 20 63 6c 6f 73 65 20 24 3a 3a 62 75 64 64 79    close $::buddy
a5b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
a5c0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
a5d0: 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 53 45 4c 45  kpoint;.    SELE
a5e0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
a5f0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 36 33 38   t1;.  }.} {1638
a600: 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  4}.do_test wal-2
a610: 30 2e 34 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  0.4 {.  db close
a620: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
a630: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
a640: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
a650: 29 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  ) FROM t1 }.} {1
a660: 36 33 38 34 7d 0a 69 6e 74 65 67 72 69 74 79 5f  6384}.integrity_
a670: 63 68 65 63 6b 20 77 61 6c 2d 32 30 2e 35 0a 0a  check wal-20.5..
a680: 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73  catch { db2 clos
a690: 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 20 63  e }.catch { db c
a6a0: 6c 6f 73 65 20 7d 0a 0a 66 69 6e 69 73 68 5f 74  lose }..finish_t
a6b0: 65 73 74 0a                                      est.