/ Hex Artifact Content
Login

Artifact 0a599c3c4812ed92bc7ad9efcc2c4007fe4cc99a:


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 30 20  point } .  } {0 
3d40: 7b 7d 7d 20 20 20 3b 23 20 52 65 61 64 65 72 20  {}}   ;# Reader 
3d50: 6e 6f 20 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b 20  no longer block 
3d60: 63 68 65 63 6b 70 6f 69 6e 74 73 0a 20 20 64 6f  checkpoints.  do
3d70: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3d80: 2e 31 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .13 {.    execsq
3d90: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
3da0: 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32  t1 VALUES(11, 12
3db0: 29 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45  ) }.    sql2 {SE
3dc0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a  LECT * FROM t1}.
3dd0: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
3de0: 20 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20   7 8 9 10}..  # 
3df0: 57 72 69 74 65 72 73 20 64 6f 20 6e 6f 74 20 62  Writers do not b
3e00: 6c 6f 63 6b 20 63 68 65 63 6b 70 6f 69 6e 74 73  lock checkpoints
3e10: 20 61 6e 79 20 6d 6f 72 65 20 65 69 74 68 65 72   any more either
3e20: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
3e30: 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 34 20 7b 0a  wal-10.$tn.14 {.
3e40: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 50      catchsql { P
3e50: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
3e60: 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 30 20 7b  oint } .  } {0 {
3e70: 7d 7d 0a 0a 20 20 23 20 54 68 65 20 66 6f 6c 6c  }}..  # The foll
3e80: 6f 77 69 6e 67 20 73 65 72 69 65 73 20 6f 66 20  owing series of 
3e90: 74 65 73 74 20 63 61 73 65 73 20 75 73 65 64 20  test cases used 
3ea0: 74 6f 20 76 65 72 69 66 79 20 61 6e 6f 74 68 65  to verify anothe
3eb0: 72 20 62 6c 6f 63 6b 69 6e 67 0a 20 20 23 20 63  r blocking.  # c
3ec0: 61 73 65 20 69 6e 20 57 41 4c 20 2d 20 61 20 63  ase in WAL - a c
3ed0: 61 73 65 20 77 68 69 63 68 20 6e 6f 20 6c 6f 6e  ase which no lon
3ee0: 67 65 72 20 62 6c 6f 63 6b 73 2e 0a 20 20 23 0a  ger blocks..  #.
3ef0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3f00: 2e 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20 73 71  .$tn.15 {.    sq
3f10: 6c 32 20 7b 20 43 4f 4d 4d 49 54 3b 20 42 45 47  l2 { COMMIT; BEG
3f20: 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN; SELECT * FRO
3f30: 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 32  M t1; }.  } {1 2
3f40: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
3f50: 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65  0 11 12}.  do_te
3f60: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 36  st wal-10.$tn.16
3f70: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
3f80: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
3f90: 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b  ckpoint } .  } {
3fa0: 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  0 {}}.  do_test 
3fb0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 37 20 7b 0a  wal-10.$tn.17 {.
3fc0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
3fd0: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
3fe0: 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a 20 20  int } .  } {}.  
3ff0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
4000: 74 6e 2e 31 38 20 7b 0a 20 20 20 20 73 71 6c 33  tn.18 {.    sql3
4010: 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54   { BEGIN; SELECT
4020: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d   * FROM t1 }.  }
4030: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
4040: 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 20 20  8 9 10 11 12}.  
4050: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
4060: 74 6e 2e 31 39 20 7b 0a 20 20 20 20 63 61 74 63  tn.19 {.    catc
4070: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
4080: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c  TO t1 VALUES(13,
4090: 20 31 34 29 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d   14) }.  } {0 {}
40a0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
40b0: 31 30 2e 24 74 6e 2e 32 30 20 7b 0a 20 20 20 20  10.$tn.20 {.    
40c0: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
40d0: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d   * FROM t1 }.  }
40e0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
40f0: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
4100: 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  14}.  do_test wa
4110: 6c 2d 31 30 2e 24 74 6e 2e 32 31 20 7b 0a 20 20  l-10.$tn.21 {.  
4120: 20 20 73 71 6c 33 20 43 4f 4d 4d 49 54 0a 20 20    sql3 COMMIT.  
4130: 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20    sql2 COMMIT.  
4140: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  } {}.  do_test w
4150: 61 6c 2d 31 30 2e 24 74 6e 2e 32 32 20 7b 0a 20  al-10.$tn.22 {. 
4160: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
4170: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
4180: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
4190: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
41a0: 31 33 20 31 34 7d 0a 0a 20 20 23 20 41 6e 6f 74  13 14}..  # Anot
41b0: 68 65 72 20 73 65 72 69 65 73 20 6f 66 20 74 65  her series of te
41c0: 73 74 73 20 74 68 61 74 20 75 73 65 64 20 74 6f  sts that used to
41d0: 20 64 65 6d 6f 6e 73 74 72 61 74 65 20 62 6c 6f   demonstrate blo
41e0: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 0a 20  cking behavior. 
41f0: 20 23 20 62 75 74 20 77 68 69 63 68 20 6e 6f 77   # but which now
4200: 20 77 6f 72 6b 2e 0a 20 20 23 0a 20 20 64 6f 5f   work..  #.  do_
4210: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4220: 32 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  23 {.    execsql
4230: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
4240: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b  eckpoint }.  } {
4250: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4260: 31 30 2e 24 74 6e 2e 32 34 20 7b 0a 20 20 20 20  10.$tn.24 {.    
4270: 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53 45  sql2 { BEGIN; SE
4280: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20  LECT * FROM t1; 
4290: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
42a0: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
42b0: 32 20 31 33 20 31 34 7d 0a 20 20 64 6f 5f 74 65  2 13 14}.  do_te
42c0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 35  st wal-10.$tn.25
42d0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
42e0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
42f0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a  kpoint }.  } {}.
4300: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
4310: 2e 24 74 6e 2e 32 36 20 7b 0a 20 20 20 20 63 61  .$tn.26 {.    ca
4320: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
4330: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
4340: 35 2c 20 31 36 29 20 7d 0a 20 20 7d 20 7b 30 20  5, 16) }.  } {0 
4350: 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  {}}.  do_test wa
4360: 6c 2d 31 30 2e 24 74 6e 2e 32 37 20 7b 0a 20 20  l-10.$tn.27 {.  
4370: 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20    sql3 { INSERT 
4380: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
4390: 37 2c 20 31 38 29 20 7d 0a 20 20 7d 20 7b 7d 0a  7, 18) }.  } {}.
43a0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
43b0: 2e 24 74 6e 2e 32 38 20 7b 0a 20 20 20 20 63 6f  .$tn.28 {.    co
43c0: 64 65 33 20 7b 0a 20 20 20 20 20 20 73 65 74 20  de3 {.      set 
43d0: 3a 3a 53 54 4d 54 20 5b 73 71 6c 69 74 65 33 5f  ::STMT [sqlite3_
43e0: 70 72 65 70 61 72 65 20 64 62 33 20 22 53 45 4c  prepare db3 "SEL
43f0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22 20 2d  ECT * FROM t1" -
4400: 31 20 54 41 49 4c 5d 0a 20 20 20 20 20 20 73 71  1 TAIL].      sq
4410: 6c 69 74 65 33 5f 73 74 65 70 20 24 3a 3a 53 54  lite3_step $::ST
4420: 4d 54 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65  MT.    }.    exe
4430: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
4440: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
4450: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
4460: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
4470: 31 35 20 31 36 20 31 37 20 31 38 7d 0a 20 20 64  15 16 17 18}.  d
4480: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
4490: 6e 2e 32 39 20 7b 0a 20 20 20 20 65 78 65 63 73  n.29 {.    execs
44a0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
44b0: 20 74 31 20 56 41 4c 55 45 53 28 31 39 2c 20 32   t1 VALUES(19, 2
44c0: 30 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71  0) }.    catchsq
44d0: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
44e0: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
44f0: 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  {0 {}}.  do_test
4500: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 30 20 7b   wal-10.$tn.30 {
4510: 0a 20 20 20 20 63 6f 64 65 33 20 7b 20 73 71 6c  .    code3 { sql
4520: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a  ite3_finalize $:
4530: 3a 53 54 4d 54 20 7d 0a 20 20 20 20 65 78 65 63  :STMT }.    exec
4540: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
4550: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20  _checkpoint }.  
4560: 7d 20 7b 7d 0a 0a 20 20 23 20 41 74 20 6f 6e 65  } {}..  # At one
4570: 20 70 6f 69 6e 74 2c 20 69 66 20 61 20 72 65 61   point, if a rea
4580: 64 65 72 20 66 61 69 6c 65 64 20 74 6f 20 75 70  der failed to up
4590: 67 72 61 64 65 20 74 6f 20 61 20 77 72 69 74 65  grade to a write
45a0: 72 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 23  r because it.  #
45b0: 20 77 61 73 20 72 65 61 64 69 6e 67 20 61 6e 20   was reading an 
45c0: 6f 6c 64 20 73 6e 61 70 73 68 6f 74 2c 20 74 68  old snapshot, th
45d0: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 77 65  e write-locks we
45e0: 72 65 20 6e 6f 74 20 62 65 69 6e 67 20 72 65 6c  re not being rel
45f0: 65 61 73 65 64 2e 0a 20 20 23 20 54 65 73 74 20  eased..  # Test 
4600: 74 68 61 74 20 74 68 69 73 20 62 75 67 20 68 61  that this bug ha
4610: 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 20 20  s been fixed..  
4620: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
4630: 31 30 2e 24 74 6e 2e 33 31 20 7b 0a 20 20 20 20  10.$tn.31 {.    
4640: 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 20 20  sql2 COMMIT.    
4650: 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20  execsql { BEGIN 
4660: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
4670: 74 31 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20  t1 }.    sql2 { 
4680: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4690: 41 4c 55 45 53 28 32 31 2c 20 32 32 29 20 7d 0a  ALUES(21, 22) }.
46a0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
46b0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
46c0: 4c 55 45 53 28 32 33 2c 20 32 34 29 20 7d 0a 20  LUES(23, 24) }. 
46d0: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
46e0: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
46f0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4700: 2e 33 32 20 7b 0a 20 20 20 20 23 20 54 68 69 73  .32 {.    # This
4710: 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64   statement would
4720: 20 66 61 69 6c 20 77 68 65 6e 20 74 68 65 20 62   fail when the b
4730: 75 67 20 77 61 73 20 70 72 65 73 65 6e 74 2e 0a  ug was present..
4740: 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52      sql2 { INSER
4750: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4760: 28 32 33 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b  (23, 24) }.  } {
4770: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4780: 31 30 2e 24 74 6e 2e 33 33 20 7b 0a 20 20 20 20  10.$tn.33 {.    
4790: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
47a0: 20 2a 20 46 52 4f 4d 20 74 31 20 3b 20 43 4f 4d   * FROM t1 ; COM
47b0: 4d 49 54 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33  MIT }.  } {1 2 3
47c0: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
47d0: 31 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31  11 12 13 14 15 1
47e0: 36 20 31 37 20 31 38 20 31 39 20 32 30 7d 0a 20  6 17 18 19 20}. 
47f0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4800: 24 74 6e 2e 33 34 20 7b 0a 20 20 20 20 65 78 65  $tn.34 {.    exe
4810: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
4820: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
4830: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
4840: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
4850: 31 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32  15 16 17 18 19 2
4860: 30 20 32 31 20 32 32 20 32 33 20 32 34 7d 0a 0a  0 21 22 23 24}..
4870: 20 20 23 20 54 65 73 74 20 74 68 61 74 20 69 66    # Test that if
4880: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20   a checkpointer 
4890: 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 74 68  cannot obtain th
48a0: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
48b0: 2c 20 69 74 0a 20 20 23 20 72 65 6c 65 61 73 65  , it.  # release
48c0: 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 62 65 66 6f  s all locks befo
48d0: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 20 62  re returning a b
48e0: 75 73 79 20 65 72 72 6f 72 2e 0a 20 20 23 0a 20  usy error..  #. 
48f0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4900: 24 74 6e 2e 33 35 20 7b 0a 20 20 20 20 65 78 65  $tn.35 {.    exe
4910: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 44 45  csql { .      DE
4920: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
4930: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
4940: 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
4950: 62 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  b');.      INSER
4960: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4970: 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20  ('c', 'd');.    
4980: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 20 20  }.    sql2 {.   
4990: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
49a0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
49b0: 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61  t1;.    }.  } {a
49c0: 20 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73   b c d}.  do_tes
49d0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36 20  t wal-10.$tn.36 
49e0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
49f0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4a00: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20  kpoint }.  } {0 
4a10: 7b 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  {}}.  do_test wa
4a20: 6c 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a 20 20  l-10.$tn.36 {.  
4a30: 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52 54 20    sql3 { INSERT 
4a40: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
4a50: 65 27 2c 20 27 66 27 29 20 7d 0a 20 20 20 20 73  e', 'f') }.    s
4a60: 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  ql2 { SELECT * F
4a70: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 61 20  ROM t1 }.  } {a 
4a80: 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73 74  b c d}.  do_test
4a90: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 37 20 7b   wal-10.$tn.37 {
4aa0: 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54  .    sql2 COMMIT
4ab0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
4ac0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
4ad0: 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a 0a 20  oint }.  } {}.. 
4ae0: 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73   catch { db clos
4af0: 65 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6f  e }.  catch { co
4b00: 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65 20  de2 { db2 close 
4b10: 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6f  } }.  catch { co
4b20: 64 65 33 20 7b 20 64 62 33 20 63 6c 6f 73 65 20  de3 { db3 close 
4b30: 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c  } }.  catch { cl
4b40: 6f 73 65 20 24 3a 3a 63 6f 64 65 32 5f 63 68 61  ose $::code2_cha
4b50: 6e 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c  n }.  catch { cl
4b60: 6f 73 65 20 24 3a 3a 63 6f 64 65 33 5f 63 68 61  ose $::code3_cha
4b70: 6e 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  n }.}..#--------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bc0: 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f  -.# This block o
4bd0: 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 31 2e  f tests, wal-11.
4be0: 2a 2c 20 74 65 73 74 20 74 68 61 74 20 6e 6f 74  *, test that not
4bf0: 68 69 6e 67 20 67 6f 65 73 20 74 65 72 72 69 62  hing goes terrib
4c00: 6c 79 20 77 72 6f 6e 67 0a 23 20 69 66 20 66 72  ly wrong.# if fr
4c10: 61 6d 65 73 20 6d 75 73 74 20 62 65 20 77 72 69  ames must be wri
4c20: 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20  tten to the log 
4c30: 66 69 6c 65 20 62 65 66 6f 72 65 20 61 20 74 72  file before a tr
4c40: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 23 20 63  ansaction is.# c
4c50: 6f 6d 6d 69 74 74 65 64 20 28 69 6e 20 6f 72 64  ommitted (in ord
4c60: 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65  er to free up me
4c70: 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74 65 73 74  mory)..#.do_test
4c80: 20 77 61 6c 2d 31 31 2e 31 20 7b 0a 20 20 72 65   wal-11.1 {.  re
4c90: 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63 73 71  open_db.  execsq
4ca0: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  l {.    PRAGMA c
4cb0: 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a  ache_size = 10;.
4cc0: 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f      PRAGMA page_
4cd0: 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
4ce0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31   CREATE TABLE t1
4cf0: 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b  (x PRIMARY KEY);
4d00: 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70  .  }.  list [exp
4d10: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
4d20: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70  t.db]/1024] [exp
4d30: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
4d40: 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a  t.db-wal]/1044].
4d50: 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73 74 20  } {1 3}.do_test 
4d60: 77 61 6c 2d 31 31 2e 32 20 7b 0a 20 20 65 78 65  wal-11.2 {.  exe
4d70: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
4d80: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
4d90: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4da0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4db0: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4dc0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4dd0: 5b 6c 69 73 74 20 33 20 5b 6c 6f 67 5f 66 69 6c  [list 3 [log_fil
4de0: 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a  e_size 3 1024]].
4df0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 33  do_test wal-11.3
4e00: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
4e10: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4e20: 4c 55 45 53 28 20 62 6c 6f 62 28 39 30 30 29 20  LUES( blob(900) 
4e30: 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72  ) }.  list [expr
4e40: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
4e50: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65  .db]/1024] [file
4e60: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
4e70: 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 6c 6f  l].} [list 3 [lo
4e80: 67 5f 66 69 6c 65 5f 73 69 7a 65 20 34 20 31 30  g_file_size 4 10
4e90: 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  24]]..do_test wa
4ea0: 6c 2d 31 31 2e 34 20 7b 0a 20 20 65 78 65 63 73  l-11.4 {.  execs
4eb0: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
4ec0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4ed0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
4ee0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
4ef0: 20 20 2d 2d 20 32 0a 20 20 20 20 20 20 49 4e 53    -- 2.      INS
4f00: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4f10: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
4f20: 4d 20 74 31 3b 20 20 20 2d 2d 20 34 0a 20 20 20  M t1;   -- 4.   
4f30: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4f40: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
4f50: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d  0) FROM t1;   --
4f60: 20 38 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20   8.      INSERT 
4f70: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
4f80: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
4f90: 3b 20 20 20 2d 2d 20 31 36 0a 20 20 7d 0a 20 20  ;   -- 16.  }.  
4fa0: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
4fb0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
4fc0: 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  024] [file size 
4fd0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
4fe0: 6c 69 73 74 20 33 20 5b 6c 6f 67 5f 66 69 6c 65  list 3 [log_file
4ff0: 5f 73 69 7a 65 20 33 32 20 31 30 32 34 5d 5d 0a  _size 32 1024]].
5000: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 35  do_test wal-11.5
5010: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
5020: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
5030: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
5040: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
5050: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b  y_check;.  }.} {
5060: 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77  16 ok}.do_test w
5070: 61 6c 2d 31 31 2e 36 20 7b 0a 20 20 65 78 65 63  al-11.6 {.  exec
5080: 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73  sql COMMIT.  lis
5090: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
50a0: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
50b0: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
50c0: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
50d0: 74 20 33 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69  t 3 [log_file_si
50e0: 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f 5f  ze 41 1024]].do_
50f0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 37 20 7b 0a  test wal-11.7 {.
5100: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
5110: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
5120: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52   FROM t1;.    PR
5130: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
5140: 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 36 20  heck;.  }.} {16 
5150: 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ok}.do_test wal-
5160: 31 31 2e 38 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.8 {.  execsql
5170: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
5180: 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73  eckpoint }.  lis
5190: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
51a0: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
51b0: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
51c0: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
51d0: 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73  t 37 [log_file_s
51e0: 69 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a 64 6f  ize 41 1024]].do
51f0: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 39 20 7b  _test wal-11.9 {
5200: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 6c 69  .  db close.  li
5210: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
5220: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
5230: 34 5d 20 5b 6c 6f 67 5f 64 65 6c 65 74 65 64 20  4] [log_deleted 
5240: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b  test.db-wal].} {
5250: 33 37 20 31 7d 0a 73 71 6c 69 74 65 33 5f 77 61  37 1}.sqlite3_wa
5260: 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 64 6f 5f  l db test.db.do_
5270: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 30 20 7b  test wal-11.10 {
5280: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
5290: 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69   PRAGMA cache_si
52a0: 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47  ze = 10;.    BEG
52b0: 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  IN;.      INSERT
52c0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
52d0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
52e0: 31 3b 20 20 20 2d 2d 20 33 32 0a 20 20 20 20 20  1;   -- 32.     
52f0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
5300: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20   FROM t1;.  }.  
5310: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
5320: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
5330: 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20  024] [file size 
5340: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  test.db-wal].} [
5350: 6c 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c  list 37 [log_fil
5360: 65 5f 73 69 7a 65 20 33 37 20 31 30 32 34 5d 5d  e_size 37 1024]]
5370: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
5380: 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  11 {.  execsql {
5390: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
53a0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a  unt(*) FROM t1;.
53b0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20      ROLLBACK;.  
53c0: 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a    SELECT count(*
53d0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d  ) FROM t1;.  }.}
53e0: 20 7b 33 32 20 31 36 7d 0a 64 6f 5f 74 65 73 74   {32 16}.do_test
53f0: 20 77 61 6c 2d 31 31 2e 31 32 20 7b 0a 20 20 6c   wal-11.12 {.  l
5400: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
5410: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
5420: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
5430: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
5440: 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65  ist 37 [log_file
5450: 5f 73 69 7a 65 20 33 37 20 31 30 32 34 5d 5d 0a  _size 37 1024]].
5460: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31  do_test wal-11.1
5470: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  3 {.  execsql {.
5480: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
5490: 74 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28  t1 VALUES( blob(
54a0: 39 30 30 29 20 29 3b 0a 20 20 20 20 53 45 4c 45  900) );.    SELE
54b0: 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
54c0: 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   t1;.    PRAGMA 
54d0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
54e0: 0a 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d 0a 64  .  }.} {17 ok}.d
54f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 34  o_test wal-11.14
5500: 20 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   {.  list [expr 
5510: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5520: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
5530: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
5540: 5d 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 6c 6f  ].} [list 37 [lo
5550: 67 5f 66 69 6c 65 5f 73 69 7a 65 20 33 37 20 31  g_file_size 37 1
5560: 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  024]]...#-------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20  --.# This block 
55c0: 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 32  of tests, wal-12
55d0: 2e 2a 2c 20 74 65 73 74 73 20 74 68 65 20 66 69  .*, tests the fi
55e0: 78 20 66 6f 72 20 61 20 70 72 6f 62 6c 65 6d 20  x for a problem 
55f0: 74 68 61 74 20 0a 23 20 63 6f 75 6c 64 20 6f 63  that .# could oc
5600: 63 75 72 20 69 66 20 61 20 6c 6f 67 20 74 68 61  cur if a log tha
5610: 74 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66  t is a prefix of
5620: 20 61 6e 20 6f 6c 64 65 72 20 6c 6f 67 20 69 73   an older log is
5630: 20 77 72 69 74 74 65 6e 20 0a 23 20 69 6e 74 6f   written .# into
5640: 20 61 20 72 65 75 73 65 64 20 6c 6f 67 20 66 69   a reused log fi
5650: 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64 62 0a  le..#.reopen_db.
5660: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 31  do_test wal-12.1
5670: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5680: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
5690: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
56a0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
56b0: 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45 41 54  x, y);.    CREAT
56c0: 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20 79 29  E TABLE t2(x, y)
56d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
56e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41 27 2c  O t1 VALUES('A',
56f0: 20 31 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20   1);.  }.  list 
5700: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
5710: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
5720: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5730: 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20  db-wal].} [list 
5740: 31 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65  1 [log_file_size
5750: 20 35 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73   5 1024]].do_tes
5760: 74 20 77 61 6c 2d 31 32 2e 32 20 7b 0a 20 20 64  t wal-12.2 {.  d
5770: 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65  b close.  sqlite
5780: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65  3 db test.db.  e
5790: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41  xecsql {.    PRA
57a0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
57b0: 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20 55 50  = normal;.    UP
57c0: 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20  DATE t1 SET y = 
57d0: 30 20 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b  0 WHERE x = 'A';
57e0: 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70  .  }.  list [exp
57f0: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
5800: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70  t.db]/1024] [exp
5810: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
5820: 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a  t.db-wal]/1044].
5830: 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {3 1}.do_test 
5840: 77 61 6c 2d 31 32 2e 33 20 7b 0a 20 20 65 78 65  wal-12.3 {.  exe
5850: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
5860: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 42 27  TO t2 VALUES('B'
5870: 2c 20 31 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65  , 1) }.  list [e
5880: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5890: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65  est.db]/1024] [e
58a0: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
58b0: 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34  est.db-wal]/1044
58c0: 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74 65 73  ].} {3 2}.do_tes
58d0: 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20 20 66  t wal-12.4 {.  f
58e0: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
58f0: 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62  test.db test2.db
5900: 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f  .  file copy -fo
5910: 72 63 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  rce test.db-wal 
5920: 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73  test2.db-wal.  s
5930: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74  qlite3_wal db2 t
5940: 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71  est2.db.  execsq
5950: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
5960: 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b 42 20  M t2 } db2.} {B 
5970: 31 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64 6f 5f  1}.db2 close.do_
5980: 74 65 73 74 20 77 61 6c 2d 31 32 2e 35 20 7b 0a  test wal-12.5 {.
5990: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
59a0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
59b0: 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54  point;.    UPDAT
59c0: 45 20 74 32 20 53 45 54 20 79 20 3d 20 32 20 57  E t2 SET y = 2 W
59d0: 48 45 52 45 20 78 20 3d 20 27 42 27 3b 20 0a 20  HERE x = 'B'; . 
59e0: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
59f0: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50  eckpoint;.    UP
5a00: 44 41 54 45 20 74 31 20 53 45 54 20 79 20 3d 20  DATE t1 SET y = 
5a10: 31 20 57 48 45 52 45 20 78 20 3d 20 27 41 27 3b  1 WHERE x = 'A';
5a20: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
5a30: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20  checkpoint;.    
5a40: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
5a50: 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27 41  = 0 WHERE x = 'A
5a60: 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  ';.    SELECT * 
5a70: 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b  FROM t2;.  }.} {
5a80: 42 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  B 2}.do_test wal
5a90: 2d 31 32 2e 36 20 7b 0a 20 20 66 69 6c 65 20 63  -12.6 {.  file c
5aa0: 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  opy -force test.
5ab0: 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69  db test2.db.  fi
5ac0: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74  le copy -force t
5ad0: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32  est.db-wal test2
5ae0: 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65  .db-wal.  sqlite
5af0: 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 32 2e  3_wal db2 test2.
5b00: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
5b10: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
5b20: 7d 20 64 62 32 0a 7d 20 7b 42 20 32 7d 0a 64 62  } db2.} {B 2}.db
5b30: 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65  2 close.db close
5b40: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54  ------------.# T
5b90: 65 73 74 20 6c 61 72 67 65 20 6c 6f 67 20 73 75  est large log su
5ba0: 6d 6d 61 72 69 65 73 2e 0a 23 0a 23 20 49 6e 20  mmaries..#.# In 
5bb0: 74 68 69 73 20 63 61 73 65 20 22 6c 61 72 67 65  this case "large
5bc0: 22 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e 73 20  " usually means 
5bd0: 61 20 6c 6f 67 20 66 69 6c 65 20 74 68 61 74 20  a log file that 
5be0: 72 65 71 75 69 72 65 73 20 61 20 77 61 6c 2d 69  requires a wal-i
5bf0: 6e 64 65 78 0a 23 20 6d 61 70 70 69 6e 67 20 6c  ndex.# mapping l
5c00: 61 72 67 65 72 20 74 68 61 6e 20 36 34 4b 42 20  arger than 64KB 
5c10: 28 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e 69  (the default ini
5c20: 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 29  tial allocation)
5c30: 2e 20 41 20 36 34 4b 42 20 77 61 6c 2d 69 6e 64  . A 64KB wal-ind
5c40: 65 78 0a 23 20 69 73 20 6c 61 72 67 65 20 65 6e  ex.# is large en
5c50: 6f 75 67 68 20 66 6f 72 20 61 20 6c 6f 67 20 66  ough for a log f
5c60: 69 6c 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ile that contain
5c70: 73 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  s approximately 
5c80: 31 33 31 30 30 20 66 72 61 6d 65 73 2e 0a 23 20  13100 frames..# 
5c90: 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  So the following
5ca0: 20 74 65 73 74 73 20 63 72 65 61 74 65 20 6c 6f   tests create lo
5cb0: 67 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 74  gs containing at
5cc0: 20 6c 65 61 73 74 20 74 68 69 73 20 6d 61 6e 79   least this many
5cd0: 20 66 72 61 6d 65 73 2e 0a 23 0a 23 20 77 61 6c   frames..#.# wal
5ce0: 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20 74 65  -13.1.*: This te
5cf0: 73 74 20 63 61 73 65 20 63 72 65 61 74 65 73 20  st case creates 
5d00: 61 20 76 65 72 79 20 6c 61 72 67 65 20 6c 6f 67  a very large log
5d10: 20 66 69 6c 65 20 77 69 74 68 69 6e 20 74 68 65   file within the
5d20: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 66  .#             f
5d30: 69 6c 65 2d 73 79 73 74 65 6d 20 28 61 72 6f 75  ile-system (arou
5d40: 6e 64 20 32 30 30 4d 42 29 2e 20 54 68 65 20 6c  nd 200MB). The l
5d50: 6f 67 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  og file does not
5d60: 20 63 6f 6e 74 61 69 6e 0a 23 20 20 20 20 20 20   contain.#      
5d70: 20 20 20 20 20 20 20 61 6e 79 20 76 61 6c 69 64         any valid
5d80: 20 66 72 61 6d 65 73 2e 20 54 65 73 74 20 74 68   frames. Test th
5d90: 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
5da0: 66 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c 20 62  file can still b
5db0: 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20  e.#             
5dc0: 6f 70 65 6e 65 64 20 61 6e 64 20 71 75 65 72 69  opened and queri
5dd0: 65 64 2c 20 61 6e 64 20 74 68 61 74 20 74 68 65  ed, and that the
5de0: 20 69 6e 76 61 6c 69 64 20 6c 6f 67 20 66 69 6c   invalid log fil
5df0: 65 20 63 61 75 73 65 73 20 6e 6f 20 0a 23 20 20  e causes no .#  
5e00: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 62 6c             probl
5e10: 65 6d 73 2e 0a 23 0a 23 20 77 61 6c 2d 31 33 2e  ems..#.# wal-13.
5e20: 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74 20 61  2.*: Test that a
5e30: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 63 72 65   process may cre
5e40: 61 74 65 20 61 20 6c 61 72 67 65 20 6c 6f 67 20  ate a large log 
5e50: 66 69 6c 65 20 61 6e 64 20 71 75 65 72 79 0a 23  file and query.#
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
5e70: 20 64 61 74 61 62 61 73 65 20 28 69 6e 63 6c 75   database (inclu
5e80: 64 69 6e 67 20 74 68 65 20 6c 6f 67 20 66 69 6c  ding the log fil
5e90: 65 20 74 68 61 74 20 69 74 20 69 74 73 65 6c 66  e that it itself
5ea0: 20 63 72 65 61 74 65 64 29 2e 0a 23 0a 23 20 77   created)..#.# w
5eb0: 61 6c 2d 31 33 2e 33 2e 2a 3a 20 54 65 73 74 20  al-13.3.*: Test 
5ec0: 74 68 61 74 20 69 66 20 61 20 76 65 72 79 20 6c  that if a very l
5ed0: 61 72 67 65 20 6c 6f 67 20 66 69 6c 65 20 69 73  arge log file is
5ee0: 20 63 72 65 61 74 65 64 2c 20 61 6e 64 20 74 68   created, and th
5ef0: 65 6e 20 61 0a 23 20 20 20 20 20 20 20 20 20 20  en a.#          
5f00: 20 20 20 73 65 63 6f 6e 64 20 63 6f 6e 6e 65 63     second connec
5f10: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 20 6f  tion is opened o
5f20: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
5f30: 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69  ile, it is possi
5f40: 62 6c 65 0a 23 20 20 20 20 20 20 20 20 20 20 20  ble.#           
5f50: 20 20 74 6f 20 71 75 65 72 79 20 74 68 65 20 64    to query the d
5f60: 61 74 61 62 61 73 65 20 28 61 6e 64 20 74 68 65  atabase (and the
5f70: 20 76 65 72 79 20 6c 61 72 67 65 20 6c 6f 67 29   very large log)
5f80: 20 75 73 69 6e 67 20 74 68 65 0a 23 20 20 20 20   using the.#    
5f90: 20 20 20 20 20 20 20 20 20 73 65 63 6f 6e 64 20           second 
5fa0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a 23 20  connection..#.# 
5fb0: 77 61 6c 2d 31 33 2e 34 2e 2a 3a 20 53 61 6d 65  wal-13.4.*: Same
5fc0: 20 74 65 73 74 20 61 73 20 77 61 6c 2d 31 33 2e   test as wal-13.
5fd0: 33 2e 2a 2e 20 45 78 63 65 70 74 20 69 6e 20 74  3.*. Except in t
5fe0: 68 69 73 20 63 61 73 65 20 74 68 65 20 73 65 63  his case the sec
5ff0: 6f 6e 64 0a 23 20 20 20 20 20 20 20 20 20 20 20  ond.#           
6000: 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20    connection is 
6010: 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 78 74  opened by an ext
6020: 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 2e 0a 23  ernal process..#
6030: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e  .do_test wal-13.
6040: 31 2e 31 20 7b 0a 20 20 6c 69 73 74 20 5b 66 69  1.1 {.  list [fi
6050: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
6060: 62 5d 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  b] [file exists 
6070: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b  test.db-wal].} {
6080: 31 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  1 0}.do_test wal
6090: 2d 31 33 2e 31 2e 32 20 7b 0a 20 20 73 65 74 20  -13.1.2 {.  set 
60a0: 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62  fd [open test.db
60b0: 2d 77 61 6c 20 77 5d 0a 20 20 73 65 65 6b 20 24  -wal w].  seek $
60c0: 66 64 20 5b 65 78 70 72 20 32 30 30 2a 31 30 32  fd [expr 200*102
60d0: 34 2a 31 30 32 34 5d 0a 20 20 70 75 74 73 20 24  4*1024].  puts $
60e0: 66 64 20 22 22 0a 20 20 63 6c 6f 73 65 20 24 66  fd "".  close $f
60f0: 64 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  d.  sqlite3 db t
6100: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
6110: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
6120: 20 74 32 20 7d 0a 7d 20 7b 42 20 32 7d 0a 64 6f   t2 }.} {B 2}.do
6130: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e 33  _test wal-13.1.3
6140: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
6150: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
6160: 2e 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a 0a 64  .db-wal.} {0}..d
6170: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 32 2e  o_test wal-13.2.
6180: 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  1 {.  sqlite3 db
6190: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
61a0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e  ql { SELECT coun
61b0: 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d 0a 7d  t(*) FROM t2 }.}
61c0: 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   {1}.do_test wal
61d0: 2d 31 33 2e 32 2e 32 20 7b 0a 20 20 64 62 20 66  -13.2.2 {.  db f
61e0: 75 6e 63 74 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f  unction blob blo
61f0: 62 0a 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30  b.  for {set i 0
6200: 7d 20 7b 24 69 20 3c 20 31 36 7d 20 7b 69 6e 63  } {$i < 16} {inc
6210: 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65 63 73  r i} {.    execs
6220: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
6230: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
6240: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
6250: 46 52 4f 4d 20 74 32 20 7d 0a 20 20 7d 0a 20 20  FROM t2 }.  }.  
6260: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
6270: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
6280: 32 20 7d 0a 7d 20 5b 65 78 70 72 20 69 6e 74 28  2 }.} [expr int(
6290: 70 6f 77 28 32 2c 20 31 36 29 29 5d 0a 64 6f 5f  pow(2, 16))].do_
62a0: 74 65 73 74 20 77 61 6c 2d 31 33 2e 32 2e 33 20  test wal-13.2.3 
62b0: 7b 0a 20 20 65 78 70 72 20 5b 66 69 6c 65 20 73  {.  expr [file s
62c0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
62d0: 20 3e 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a   > [log_file_siz
62e0: 65 20 33 33 30 30 30 20 31 30 32 34 5d 0a 7d 20  e 33000 1024].} 
62f0: 31 0a 0a 66 6f 72 65 61 63 68 20 63 6f 64 65 20  1..foreach code 
6300: 5b 6c 69 73 74 20 7b 0a 20 20 73 65 74 20 74 6e  [list {.  set tn
6310: 20 33 0a 20 20 70 72 6f 63 20 62 75 64 64 79 20   3.  proc buddy 
6320: 7b 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c 20  {tcl} { uplevel 
6330: 23 30 20 24 74 63 6c 20 7d 0a 7d 20 7b 0a 20 20  #0 $tcl }.} {.  
6340: 73 65 74 20 74 6e 20 34 0a 20 20 73 65 74 20 3a  set tn 4.  set :
6350: 3a 62 75 64 64 79 20 5b 6c 61 75 6e 63 68 5f 74  :buddy [launch_t
6360: 65 73 74 66 69 78 74 75 72 65 5d 0a 20 20 70 72  estfixture].  pr
6370: 6f 63 20 62 75 64 64 79 20 7b 74 63 6c 7d 20 7b  oc buddy {tcl} {
6380: 20 74 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a   testfixture $::
6390: 62 75 64 64 79 20 24 74 63 6c 20 7d 0a 7d 5d 20  buddy $tcl }.}] 
63a0: 7b 0a 0a 20 20 65 76 61 6c 20 24 63 6f 64 65 0a  {..  eval $code.
63b0: 20 20 72 65 6f 70 65 6e 5f 64 62 0a 0a 20 20 64    reopen_db..  d
63c0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74  o_test wal-13.$t
63d0: 6e 2e 30 20 7b 0a 20 20 20 20 62 75 64 64 79 20  n.0 {.    buddy 
63e0: 7b 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65  { sqlite3 db2 te
63f0: 73 74 2e 64 62 20 7d 0a 20 20 20 20 65 78 65 63  st.db }.    exec
6400: 73 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47  sql {.      PRAG
6410: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
6420: 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45  = WAL;.      CRE
6430: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b  ATE TABLE t1(x);
6440: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
6450: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
6460: 64 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20  domblob(800);.  
6470: 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20    }.    execsql 
6480: 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  { SELECT count(*
6490: 29 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  ) FROM t1 }.  } 
64a0: 7b 31 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20  {1}..  for {set 
64b0: 69 69 20 31 7d 20 7b 24 69 69 3c 31 36 7d 20 7b  ii 1} {$ii<16} {
64c0: 69 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 64  incr ii} {.    d
64d0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74  o_test wal-13.$t
64e0: 6e 2e 24 69 69 2e 61 20 7b 0a 20 20 20 20 20 20  n.$ii.a {.      
64f0: 62 75 64 64 79 20 7b 20 64 62 32 20 65 76 61 6c  buddy { db2 eval
6500: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
6510: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
6520: 6c 6f 62 28 38 30 30 29 20 46 52 4f 4d 20 74 31  lob(800) FROM t1
6530: 20 7d 20 7d 0a 20 20 20 20 20 20 62 75 64 64 79   } }.      buddy
6540: 20 7b 20 64 62 32 20 65 76 61 6c 20 7b 20 53 45   { db2 eval { SE
6550: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
6560: 4f 4d 20 74 31 20 7d 20 7d 0a 20 20 20 20 7d 20  OM t1 } }.    } 
6570: 5b 65 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a  [expr (1<<$ii)].
6580: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
6590: 31 33 2e 24 74 6e 2e 24 69 69 2e 62 20 7b 0a 20  13.$tn.$ii.b {. 
65a0: 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 53       db eval { S
65b0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
65c0: 52 4f 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b  ROM t1 }.    } [
65d0: 65 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20  expr (1<<$ii)]. 
65e0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31     do_test wal-1
65f0: 33 2e 24 74 6e 2e 24 69 69 2e 63 20 7b 0a 20 20  3.$tn.$ii.c {.  
6600: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45      db eval { SE
6610: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
6620: 4f 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65  OM t1 }.    } [e
6630: 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20  xpr (1<<$ii)].  
6640: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33    do_test wal-13
6650: 2e 24 74 6e 2e 24 69 69 2e 64 20 7b 0a 20 20 20  .$tn.$ii.d {.   
6660: 20 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41     db eval { PRA
6670: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
6680: 65 63 6b 20 7d 0a 20 20 20 20 7d 20 7b 6f 6b 7d  eck }.    } {ok}
6690: 0a 20 20 7d 0a 0a 20 20 63 61 74 63 68 20 7b 20  .  }..  catch { 
66a0: 64 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 63 61  db2 close }.  ca
66b0: 74 63 68 20 7b 20 63 6c 6f 73 65 20 24 3a 3a 62  tch { close $::b
66c0: 75 64 64 79 20 7d 0a 20 20 64 62 20 63 6c 6f 73  uddy }.  db clos
66d0: 65 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.}..#----------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
66f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6720: 23 20 43 68 65 63 6b 20 61 20 66 75 6e 20 63 6f  # Check a fun co
6730: 72 72 75 70 74 69 6f 6e 20 63 61 73 65 20 68 61  rruption case ha
6740: 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 23 0a  s been fixed..#.
6750: 23 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 77 61  # The problem wa
6760: 73 20 74 68 61 74 20 61 66 74 65 72 20 70 65 72  s that after per
6770: 66 6f 72 6d 69 6e 67 20 61 20 63 68 65 63 6b 70  forming a checkp
6780: 6f 69 6e 74 20 75 73 69 6e 67 20 61 20 63 6f 6e  oint using a con
6790: 6e 65 63 74 69 6f 6e 0a 23 20 74 68 61 74 20 68  nection.# that h
67a0: 61 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74  ad an out-of-dat
67b0: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2c 20 74  e pager-cache, t
67c0: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
67d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 0a   connection was.
67e0: 23 20 75 73 65 64 20 69 74 20 64 69 64 20 6e 6f  # used it did no
67f0: 74 20 72 65 61 6c 69 7a 65 20 74 68 65 20 63 61  t realize the ca
6800: 63 68 65 20 77 61 73 20 6f 75 74 2d 6f 66 2d 64  che was out-of-d
6810: 61 74 65 20 61 6e 64 20 70 72 6f 63 65 65 64 65  ate and proceede
6820: 64 20 74 6f 0a 23 20 6f 70 65 72 61 74 65 20 77  d to.# operate w
6830: 69 74 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74  ith an inconsist
6840: 65 6e 74 20 63 61 63 68 65 2e 20 4c 65 61 64 69  ent cache. Leadi
6850: 6e 67 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ng to corruption
6860: 2e 0a 23 0a 63 61 74 63 68 20 7b 20 64 62 20 63  ..#.catch { db c
6870: 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64  lose }.catch { d
6880: 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68  b2 close }.catch
6890: 20 7b 20 64 62 33 20 63 6c 6f 73 65 20 7d 0a 66   { db3 close }.f
68a0: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
68b0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
68c0: 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20 64 62  b-wal.sqlite3 db
68d0: 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33   test.db.sqlite3
68e0: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 64 6f 5f   db2 test.db.do_
68f0: 74 65 73 74 20 77 61 6c 2d 31 34 20 7b 0a 20 20  test wal-14 {.  
6900: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
6910: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
6920: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45  e = WAL;.    CRE
6930: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 50  ATE TABLE t1(a P
6940: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a  RIMARY KEY, b);.
6950: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6960: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
6970: 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d  blob(10), random
6980: 62 6c 6f 62 28 31 30 30 29 29 3b 0a 20 20 20 20  blob(100));.    
6990: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
69a0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
69b0: 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  (10), randomblob
69c0: 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (100) FROM t1;. 
69d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
69e0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
69f0: 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62  lob(10), randomb
6a00: 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31  lob(100) FROM t1
6a10: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
6a20: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
6a30: 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64  omblob(10), rand
6a40: 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d  omblob(100) FROM
6a50: 20 74 31 3b 0a 20 20 7d 0a 0a 20 20 64 62 32 20   t1;.  }..  db2 
6a60: 65 76 61 6c 20 7b 20 0a 20 20 20 20 49 4e 53 45  eval { .    INSE
6a70: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
6a80: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29  T randomblob(10)
6a90: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
6aa0: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
6ab0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
6ac0: 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e  domblob(10), ran
6ad0: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20  domblob(100);.  
6ae0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6af0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6b00: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
6b10: 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53  ob(100);.    INS
6b20: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
6b30: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  CT randomblob(10
6b40: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
6b50: 30 29 3b 0a 20 20 7d 0a 0a 20 20 23 20 41 66 74  0);.  }..  # Aft
6b60: 65 72 20 65 78 65 63 75 74 69 6e 67 20 74 68 65  er executing the
6b70: 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65   "PRAGMA wal_che
6b80: 63 6b 70 6f 69 6e 74 22 2c 20 63 6f 6e 6e 65 63  ckpoint", connec
6b90: 74 69 6f 6e 20 5b 64 62 5d 20 77 61 73 20 62 65  tion [db] was be
6ba0: 69 6e 67 0a 20 20 23 20 6c 65 66 74 20 77 69 74  ing.  # left wit
6bb0: 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  h an inconsisten
6bc0: 74 20 63 61 63 68 65 2e 20 52 75 6e 6e 69 6e 67  t cache. Running
6bd0: 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45   the CREATE INDE
6be0: 58 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 23 20  X statement.  # 
6bf0: 69 6e 20 74 68 69 73 20 73 74 61 74 65 20 6c 65  in this state le
6c00: 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
6c10: 72 72 75 70 74 69 6f 6e 2e 0a 20 20 63 61 74 63  rruption..  catc
6c20: 68 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41 47  hsql { .    PRAG
6c30: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
6c40: 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49 4e  t;.    CREATE IN
6c50: 44 45 58 20 69 31 20 6f 6e 20 74 31 28 62 29 3b  DEX i1 on t1(b);
6c60: 0a 20 20 7d 0a 20 20 20 0a 20 20 64 62 32 20 65  .  }.   .  db2 e
6c70: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74  val { PRAGMA int
6c80: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a 7d  egrity_check }.}
6c90: 20 7b 6f 6b 7d 0a 0a 63 61 74 63 68 20 7b 20 64   {ok}..catch { d
6ca0: 62 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20  b close }.catch 
6cb0: 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 0a 23  { db2 close }..#
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20  ---------.# The 
6d10: 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
6d20: 6f 66 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31  of tests - wal-1
6d30: 35 2e 2a 20 2d 20 66 6f 63 75 73 20 6f 6e 20 74  5.* - focus on t
6d40: 65 73 74 69 6e 67 20 74 68 65 20 0a 23 20 69 6d  esting the .# im
6d50: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
6d60: 74 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  the sqlite3_wal_
6d70: 63 68 65 63 6b 70 6f 69 6e 74 28 29 20 69 6e 74  checkpoint() int
6d80: 65 72 66 61 63 65 2e 0a 23 0a 66 69 6c 65 20 64  erface..#.file d
6d90: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
6da0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
6db0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
6dc0: 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  .db.do_test wal-
6dd0: 31 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  15.1 {.  execsql
6de0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75   {.    PRAGMA au
6df0: 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20  to_vacuum = 0;. 
6e00: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
6e10: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
6e20: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
6e30: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 7d 0a 20  ode = WAL;.  }. 
6e40: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
6e50: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
6e60: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
6e70: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
6e80: 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a  1, 2);.  }.} {}.
6e90: 0a 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20  .# Test that an 
6ea0: 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
6eb0: 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  d if the databas
6ec0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72 65  e name is not re
6ed0: 63 6f 67 6e 69 7a 65 64 0a 23 0a 64 6f 5f 74 65  cognized.#.do_te
6ee0: 73 74 20 77 61 6c 2d 31 35 2e 32 2e 31 20 7b 0a  st wal-15.2.1 {.
6ef0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
6f00: 65 63 6b 70 6f 69 6e 74 20 64 62 20 61 75 78 0a  eckpoint db aux.
6f10: 7d 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d  } {SQLITE_ERROR}
6f20: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
6f30: 32 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  2.2 {.  sqlite3_
6f40: 65 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51  errcode db.} {SQ
6f50: 4c 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74  LITE_ERROR}.do_t
6f60: 65 73 74 20 77 61 6c 2d 31 35 2e 32 2e 33 20 7b  est wal-15.2.3 {
6f70: 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  .  sqlite3_errms
6f80: 67 20 64 62 0a 7d 20 7b 75 6e 6b 6e 6f 77 6e 20  g db.} {unknown 
6f90: 64 61 74 61 62 61 73 65 3a 20 61 75 78 7d 0a 0a  database: aux}..
6fa0: 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 65  # Test that an e
6fb0: 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
6fc0: 20 69 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   if an attempt i
6fd0: 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70  s made to checkp
6fe0: 6f 69 6e 74 0a 23 20 69 66 20 61 20 74 72 61 6e  oint.# if a tran
6ff0: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  saction is open 
7000: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
7010: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .#.do_test wal-1
7020: 35 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71  5.3.1 {.  execsq
7030: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
7040: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7050: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
7060: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 77 61    }.  sqlite3_wa
7070: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
7080: 6d 61 69 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c  main.} {SQLITE_L
7090: 4f 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20 77  OCKED}.do_test w
70a0: 61 6c 2d 31 35 2e 33 2e 32 20 7b 0a 20 20 73 71  al-15.3.2 {.  sq
70b0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62  lite3_errcode db
70c0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  .} {SQLITE_LOCKE
70d0: 44 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  D}.do_test wal-1
70e0: 35 2e 33 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65  5.3.3 {.  sqlite
70f0: 33 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 64  3_errmsg db.} {d
7100: 61 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73  atabase table is
7110: 20 6c 6f 63 6b 65 64 7d 0a 0a 23 20 45 61 72 6c   locked}..# Earl
7120: 69 65 72 20 76 65 72 73 69 6f 6e 73 20 72 65 74  ier versions ret
7130: 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69  urned an error i
7140: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
7150: 65 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 0a  e db cannot be .
7160: 23 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 62  # checkpointed b
7170: 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 73 20  ecause of locks 
7180: 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
7190: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 68 65 63  connection. Chec
71a0: 6b 20 74 68 61 74 0a 23 20 74 68 69 73 20 69 73  k that.# this is
71b0: 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 68 65 20 63   no longer the c
71c0: 61 73 65 2e 0a 23 0a 73 71 6c 69 74 65 33 20 64  ase..#.sqlite3 d
71d0: 62 32 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65  b2 test.db.do_te
71e0: 73 74 20 77 61 6c 2d 31 35 2e 34 2e 31 20 7b 0a  st wal-15.4.1 {.
71f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
7200: 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43  BEGIN;.    SELEC
7210: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
7220: 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f   db2.} {1 2}.do_
7230: 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 32 20  test wal-15.4.2 
7240: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f  {.  execsql { CO
7250: 4d 4d 49 54 20 7d 0a 20 20 73 71 6c 69 74 65 33  MMIT }.  sqlite3
7260: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
7270: 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d  db.} {SQLITE_OK}
7280: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e  .do_test wal-15.
7290: 34 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  4.3 {.  sqlite3_
72a0: 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 6e 6f 74  errmsg db.} {not
72b0: 20 61 6e 20 65 72 72 6f 72 7d 0a 0a 23 20 41 66   an error}..# Af
72c0: 74 65 72 20 5b 64 62 32 5d 20 64 72 6f 70 73 20  ter [db2] drops 
72d0: 69 74 73 20 6c 6f 63 6b 2c 20 5b 64 62 5d 20 6d  its lock, [db] m
72e0: 61 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 74 68  ay checkpoint th
72f0: 65 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  e db..#.do_test 
7300: 77 61 6c 2d 31 35 2e 34 2e 34 20 7b 0a 20 20 65  wal-15.4.4 {.  e
7310: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  xecsql { COMMIT 
7320: 7d 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f  } db2.  sqlite3_
7330: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
7340: 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  b.} {SQLITE_OK}.
7350: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34  do_test wal-15.4
7360: 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .5 {.  sqlite3_e
7370: 72 72 6d 73 67 20 64 62 0a 7d 20 7b 6e 6f 74 20  rrmsg db.} {not 
7380: 61 6e 20 65 72 72 6f 72 7d 0a 64 6f 5f 74 65 73  an error}.do_tes
7390: 74 20 77 61 6c 2d 31 35 2e 34 2e 36 20 7b 0a 20  t wal-15.4.6 {. 
73a0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
73b0: 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34 2a  db.} [expr 1024*
73c0: 32 5d 0a 0a 63 61 74 63 68 20 7b 20 64 62 32 20  2]..catch { db2 
73d0: 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20  close }.catch { 
73e0: 64 62 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d 2d 2d  db close }..#---
73f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7430: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c  ------.# The fol
7440: 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20  lowing block of 
7450: 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 36 2e 2a  tests - wal-16.*
7460: 20 2d 20 74 65 73 74 20 74 68 61 74 20 69 66 20   - test that if 
7470: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f  a NULL pointer o
7480: 72 0a 23 20 61 6e 20 65 6d 70 74 79 20 73 74 72  r.# an empty str
7490: 69 6e 67 20 69 73 20 70 61 73 73 65 64 20 61 73  ing is passed as
74a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
74b0: 6d 65 6e 74 20 6f 66 20 74 68 65 20 77 61 6c 5f  ment of the wal_
74c0: 63 68 65 63 6b 70 6f 69 6e 74 28 29 0a 23 20 41  checkpoint().# A
74d0: 50 49 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69  PI, an attempt i
74e0: 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70  s made to checkp
74f0: 6f 69 6e 74 20 61 6c 6c 20 61 74 74 61 63 68 65  oint all attache
7500: 64 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66  d databases..#.f
7510: 6f 72 65 61 63 68 20 7b 74 6e 20 63 6b 70 74 5f  oreach {tn ckpt_
7520: 63 6d 64 20 63 6b 70 74 5f 72 65 73 20 63 6b 70  cmd ckpt_res ckp
7530: 74 5f 6d 61 69 6e 20 63 6b 70 74 5f 61 75 78 7d  t_main ckpt_aux}
7540: 20 7b 0a 20 20 31 20 7b 73 71 6c 69 74 65 33 5f   {.  1 {sqlite3_
7550: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
7560: 62 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b}              
7570: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20  SQLITE_OK     1 
7580: 31 0a 20 20 32 20 7b 73 71 6c 69 74 65 33 5f 77  1.  2 {sqlite3_w
7590: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
75a0: 20 22 22 7d 20 20 20 20 20 20 20 20 20 20 20 53   ""}           S
75b0: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20 31  QLITE_OK     1 1
75c0: 0a 20 20 33 20 7b 64 62 20 65 76 61 6c 20 22 50  .  3 {db eval "P
75d0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
75e0: 6f 69 6e 74 22 7d 20 20 20 20 20 20 20 20 7b 7d  oint"}        {}
75f0: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 31 0a              1 1.
7600: 0a 20 20 34 20 7b 73 71 6c 69 74 65 33 5f 77 61  .  4 {sqlite3_wa
7610: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
7620: 6d 61 69 6e 7d 20 20 20 20 20 20 20 20 20 53 51  main}         SQ
7630: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20 30 0a  LITE_OK     1 0.
7640: 20 20 35 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c    5 {sqlite3_wal
7650: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 61  _checkpoint db a
7660: 75 78 7d 20 20 20 20 20 20 20 20 20 20 53 51 4c  ux}          SQL
7670: 49 54 45 5f 4f 4b 20 20 20 20 20 30 20 31 0a 20  ITE_OK     0 1. 
7680: 20 36 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f   6 {sqlite3_wal_
7690: 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 74 65  checkpoint db te
76a0: 6d 70 7d 20 20 20 20 20 20 20 20 20 53 51 4c 49  mp}         SQLI
76b0: 54 45 5f 4f 4b 20 20 20 20 20 30 20 30 0a 20 20  TE_OK     0 0.  
76c0: 37 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47  7 {db eval "PRAG
76d0: 4d 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65 63  MA main.wal_chec
76e0: 6b 70 6f 69 6e 74 22 7d 20 20 20 7b 7d 20 20 20  kpoint"}   {}   
76f0: 20 20 20 20 20 20 20 20 20 31 20 30 0a 20 20 38           1 0.  8
7700: 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d   {db eval "PRAGM
7710: 41 20 61 75 78 2e 77 61 6c 5f 63 68 65 63 6b 70  A aux.wal_checkp
7720: 6f 69 6e 74 22 7d 20 20 20 20 7b 7d 20 20 20 20  oint"}    {}    
7730: 20 20 20 20 20 20 20 20 30 20 31 0a 20 20 39 20          0 1.  9 
7740: 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41  {db eval "PRAGMA
7750: 20 74 65 6d 70 2e 77 61 6c 5f 63 68 65 63 6b 70   temp.wal_checkp
7760: 6f 69 6e 74 22 7d 20 20 20 7b 7d 20 20 20 20 20  oint"}   {}     
7770: 20 20 20 20 20 20 20 30 20 30 0a 7d 20 7b 0a 20         0 0.} {. 
7780: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e   do_test wal-16.
7790: 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 69 6c 65  $tn.1 {.    file
77a0: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74   delete -force t
77b0: 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62  est2.db test2.db
77c0: 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 6a 6f  -wal test2.db-jo
77d0: 75 72 6e 61 6c 0a 20 20 20 20 66 69 6c 65 20 64  urnal.    file d
77e0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
77f0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
7800: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
7810: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64 62  ..    sqlite3 db
7820: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65   test.db.    exe
7830: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41 54 54  csql {.      ATT
7840: 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20 41  ACH 'test2.db' A
7850: 53 20 61 75 78 3b 0a 20 20 20 20 20 20 50 52 41  S aux;.      PRA
7860: 47 4d 41 20 6d 61 69 6e 2e 61 75 74 6f 5f 76 61  GMA main.auto_va
7870: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cuum = 0;.      
7880: 50 52 41 47 4d 41 20 61 75 78 2e 61 75 74 6f 5f  PRAGMA aux.auto_
7890: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
78a0: 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f    PRAGMA main.jo
78b0: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
78c0: 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 61  ;.      PRAGMA a
78d0: 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  ux.journal_mode 
78e0: 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50 52 41  = WAL;.      PRA
78f0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
7900: 3d 20 4e 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a  = NORMAL;.    }.
7910: 20 20 7d 20 7b 77 61 6c 20 77 61 6c 7d 0a 0a 20    } {wal wal}.. 
7920: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e   do_test wal-16.
7930: 24 74 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63  $tn.2 {.    exec
7940: 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52 45 41  sql {.      CREA
7950: 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 74 31  TE TABLE main.t1
7960: 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20 4b  (a, b, PRIMARY K
7970: 45 59 28 61 2c 20 62 29 29 3b 0a 20 20 20 20 20  EY(a, b));.     
7980: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 75   CREATE TABLE au
7990: 78 2e 74 32 28 61 2c 20 62 2c 20 50 52 49 4d 41  x.t2(a, b, PRIMA
79a0: 52 59 20 4b 45 59 28 61 2c 20 62 29 29 3b 0a 0a  RY KEY(a, b));..
79b0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
79c0: 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20 72  O t2 VALUES(1, r
79d0: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 29 29  andomblob(1000))
79e0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
79f0: 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 32 2c  NTO t2 VALUES(2,
7a00: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30   randomblob(1000
7a10: 29 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  ));.      INSERT
7a20: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
7a30: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d  * FROM t2;.    }
7a40: 0a 20 20 0a 20 20 20 20 6c 69 73 74 20 5b 66 69  .  .    list [fi
7a50: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
7a60: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
7a70: 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69  .db-wal].  } [li
7a80: 73 74 20 5b 65 78 70 72 20 31 2a 31 30 32 34 5d  st [expr 1*1024]
7a90: 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20   [log_file_size 
7aa0: 31 30 20 31 30 32 34 5d 5d 0a 20 20 64 6f 5f 74  10 1024]].  do_t
7ab0: 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 33  est wal-16.$tn.3
7ac0: 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c   {.    list [fil
7ad0: 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64 62 5d  e size test2.db]
7ae0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
7af0: 32 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c  2.db-wal].  } [l
7b00: 69 73 74 20 5b 65 78 70 72 20 31 2a 31 30 32 34  ist [expr 1*1024
7b10: 5d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65  ] [log_file_size
7b20: 20 31 36 20 31 30 32 34 5d 5d 0a 20 20 0a 20 20   16 1024]].  .  
7b30: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24  do_test wal-16.$
7b40: 74 6e 2e 34 20 5b 6c 69 73 74 20 65 76 61 6c 20  tn.4 [list eval 
7b50: 24 63 6b 70 74 5f 63 6d 64 5d 20 24 63 6b 70 74  $ckpt_cmd] $ckpt
7b60: 5f 72 65 73 0a 20 20 0a 20 20 64 6f 5f 74 65 73  _res.  .  do_tes
7b70: 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 35 20 7b  t wal-16.$tn.5 {
7b80: 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  .    list [file 
7b90: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66  size test.db] [f
7ba0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
7bb0: 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20  -wal].  } [list 
7bc0: 5b 65 78 70 72 20 28 24 63 6b 70 74 5f 6d 61 69  [expr ($ckpt_mai
7bd0: 6e 20 3f 20 37 20 3a 20 31 29 2a 31 30 32 34 5d  n ? 7 : 1)*1024]
7be0: 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20   [log_file_size 
7bf0: 31 30 20 31 30 32 34 5d 5d 0a 0a 20 20 64 6f 5f  10 1024]]..  do_
7c00: 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e  test wal-16.$tn.
7c10: 36 20 7b 0a 20 20 20 20 6c 69 73 74 20 5b 66 69  6 {.    list [fi
7c20: 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64 62  le size test2.db
7c30: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
7c40: 74 32 2e 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b  t2.db-wal].  } [
7c50: 6c 69 73 74 20 5b 65 78 70 72 20 28 24 63 6b 70  list [expr ($ckp
7c60: 74 5f 61 75 78 20 3f 20 37 20 3a 20 31 29 2a 31  t_aux ? 7 : 1)*1
7c70: 30 32 34 5d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73  024] [log_file_s
7c80: 69 7a 65 20 31 36 20 31 30 32 34 5d 5d 0a 0a 20  ize 16 1024]].. 
7c90: 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73   catch { db clos
7ca0: 65 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d  e }.}..#--------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cf0: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
7d00: 67 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 37  g tests - wal-17
7d10: 2e 2a 20 2d 20 61 74 74 65 6d 70 74 20 74 6f 20  .* - attempt to 
7d20: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
7d30: 63 6f 72 72 65 63 74 0a 23 20 6e 75 6d 62 65 72  correct.# number
7d40: 20 6f 66 20 22 70 61 64 64 69 6e 67 22 20 66 72   of "padding" fr
7d50: 61 6d 65 73 20 61 72 65 20 61 70 70 65 6e 64 65  ames are appende
7d60: 64 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c  d to the log fil
7d70: 65 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  e when a transac
7d80: 74 69 6f 6e 0a 23 20 69 73 20 63 6f 6d 6d 69 74  tion.# is commit
7d90: 74 65 64 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f  ted in synchrono
7da0: 75 73 3d 46 55 4c 4c 20 6d 6f 64 65 2e 0a 23 20  us=FULL mode..# 
7db0: 0a 23 20 44 6f 20 74 68 69 73 20 62 79 20 63 72  .# Do this by cr
7dc0: 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
7dd0: 65 20 74 68 61 74 20 75 73 65 73 20 35 31 32 20  e that uses 512 
7de0: 62 79 74 65 20 70 61 67 65 73 2e 20 54 68 65 6e  byte pages. Then
7df0: 20 77 72 69 74 69 6e 67 0a 23 20 61 20 74 72 61   writing.# a tra
7e00: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 6d 6f  nsaction that mo
7e10: 64 69 66 69 65 73 20 31 37 31 20 70 61 67 65 73  difies 171 pages
7e20: 2e 20 49 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  . In synchronous
7e30: 3d 4e 4f 52 4d 41 4c 20 6d 6f 64 65 2c 20 74 68  =NORMAL mode, th
7e40: 69 73 0a 23 20 70 72 6f 64 75 63 65 73 20 61 20  is.# produces a 
7e50: 6c 6f 67 20 66 69 6c 65 20 6f 66 3a 0a 23 0a 23  log file of:.#.#
7e60: 20 20 20 32 34 20 2b 20 28 32 34 2b 35 31 32 29     24 + (24+512)
7e70: 2a 31 37 31 20 3d 20 39 30 33 31 32 20 62 79 74  *171 = 90312 byt
7e80: 65 73 2e 0a 23 0a 23 20 53 6c 69 67 68 74 6c 79  es..#.# Slightly
7e90: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 31 31 2a   larger than 11*
7ea0: 38 31 39 32 20 3d 20 39 30 31 31 32 20 62 79 74  8192 = 90112 byt
7eb0: 65 73 2e 0a 23 0a 23 20 52 75 6e 20 74 68 65 20  es..#.# Run the 
7ec0: 74 65 73 74 20 75 73 69 6e 67 20 76 61 72 69 6f  test using vario
7ed0: 75 73 20 64 69 66 66 65 72 65 6e 74 20 73 65 63  us different sec
7ee0: 74 6f 72 2d 73 69 7a 65 73 2e 20 49 6e 20 65 61  tor-sizes. In ea
7ef0: 63 68 20 63 61 73 65 2c 20 74 68 65 0a 23 20 57  ch case, the.# W
7f00: 41 4c 20 63 6f 64 65 20 73 68 6f 75 6c 64 20 77  AL code should w
7f10: 72 69 74 65 20 74 68 65 20 39 30 33 30 30 20 62  rite the 90300 b
7f20: 79 74 65 73 20 6f 66 20 6c 6f 67 20 66 69 6c 65  ytes of log file
7f30: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
7f40: 0a 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  .# transaction, 
7f50: 74 68 65 6e 20 61 70 70 65 6e 64 20 61 73 20 6d  then append as m
7f60: 61 79 20 66 72 61 6d 65 73 20 61 73 20 61 72 65  ay frames as are
7f70: 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 74   required to ext
7f80: 65 6e 64 20 74 68 65 0a 23 20 6c 6f 67 20 66 69  end the.# log fi
7f90: 6c 65 20 73 6f 20 74 68 61 74 20 6e 6f 20 70 61  le so that no pa
7fa0: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  rt of the next t
7fb0: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
7fc0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  be written into.
7fd0: 23 20 61 20 64 69 73 6b 2d 73 65 63 74 6f 72 20  # a disk-sector 
7fe0: 75 73 65 64 20 62 79 20 74 72 61 6e 73 61 63 74  used by transact
7ff0: 69 6f 6e 20 6a 75 73 74 20 63 6f 6d 6d 69 74 74  ion just committ
8000: 65 64 2e 0a 23 0a 73 65 74 20 6f 6c 64 5f 70 65  ed..#.set old_pe
8010: 6e 64 69 6e 67 5f 62 79 74 65 20 5b 73 71 6c 69  nding_byte [sqli
8020: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
8030: 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 30 78  _pending_byte 0x
8040: 31 30 30 30 30 30 30 30 5d 0a 63 61 74 63 68 20  10000000].catch 
8050: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72  { db close }.for
8060: 65 61 63 68 20 7b 74 6e 20 73 65 63 74 6f 72 73  each {tn sectors
8070: 69 7a 65 20 6c 6f 67 73 69 7a 65 7d 20 7b 0a 20  ize logsize} {. 
8080: 20 31 20 20 20 31 32 38 20 20 39 32 32 31 36 0a   1   128  92216.
8090: 20 20 32 20 20 20 32 35 36 20 20 39 32 32 31 36    2   256  92216
80a0: 0a 20 20 33 20 20 20 35 31 32 20 20 39 32 32 31  .  3   512  9221
80b0: 36 20 0a 20 20 34 20 20 31 30 32 34 20 20 39 32  6 .  4  1024  92
80c0: 32 31 36 0a 20 20 35 20 20 32 30 34 38 20 20 39  216.  5  2048  9
80d0: 32 32 31 36 0a 20 20 36 20 20 34 30 39 36 20 20  2216.  6  4096  
80e0: 39 34 33 36 30 0a 20 20 37 20 20 38 31 39 32 20  94360.  7  8192 
80f0: 20 39 38 36 34 38 0a 7d 20 7b 0a 20 20 66 69 6c   98648.} {.  fil
8100: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
8110: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
8120: 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  wal test.db-jour
8130: 6e 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 73 69  nal.  sqlite3_si
8140: 6d 75 6c 61 74 65 5f 64 65 76 69 63 65 20 2d 73  mulate_device -s
8150: 65 63 74 6f 72 73 69 7a 65 20 24 73 65 63 74 6f  ectorsize $secto
8160: 72 73 69 7a 65 0a 20 20 73 71 6c 69 74 65 33 20  rsize.  sqlite3 
8170: 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20  db test.db -vfs 
8180: 64 65 76 73 79 6d 0a 0a 20 20 64 6f 5f 74 65 73  devsym..  do_tes
8190: 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 31 20 7b  t wal-17.$tn.1 {
81a0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  .    execsql {. 
81b0: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f       PRAGMA auto
81c0: 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20  _vacuum = 0;.   
81d0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
81e0: 69 7a 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 20  ize = 512;.     
81f0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
8200: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
8210: 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f    PRAGMA synchro
8220: 6e 6f 75 73 20 3d 20 46 55 4c 4c 3b 0a 20 20 20  nous = FULL;.   
8230: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
8240: 0a 20 20 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  .      BEGIN;.  
8250: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
8260: 20 74 28 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20   t(x);.    }.   
8270: 20 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b   for {set i 0} {
8280: 24 69 3c 31 36 36 7d 20 7b 69 6e 63 72 20 69 7d  $i<166} {incr i}
8290: 20 7b 0a 20 20 20 20 20 20 65 78 65 63 73 71 6c   {.      execsql
82a0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
82b0: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
82c0: 6f 62 28 34 30 30 29 29 20 7d 0a 20 20 20 20 7d  ob(400)) }.    }
82d0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 43 4f 4d  .    execsql COM
82e0: 4d 49 54 0a 0a 20 20 20 20 66 69 6c 65 20 73 69  MIT..    file si
82f0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  ze test.db-wal. 
8300: 20 7d 20 24 6c 6f 67 73 69 7a 65 0a 0a 20 20 64   } $logsize..  d
8310: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 37 2e 24 74  o_test wal-17.$t
8320: 6e 2e 32 20 7b 0a 20 20 20 20 66 69 6c 65 20 73  n.2 {.    file s
8330: 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20 7d 20  ize test.db.  } 
8340: 35 31 32 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77  512..  do_test w
8350: 61 6c 2d 31 37 2e 24 74 6e 2e 33 20 7b 0a 20 20  al-17.$tn.3 {.  
8360: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 66    db close.    f
8370: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
8380: 0a 20 20 7d 20 5b 65 78 70 72 20 35 31 32 2a 31  .  } [expr 512*1
8390: 37 31 5d 0a 7d 0a 73 71 6c 69 74 65 33 5f 74 65  71].}.sqlite3_te
83a0: 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69  st_control_pendi
83b0: 6e 67 5f 62 79 74 65 20 24 6f 6c 64 5f 70 65 6e  ng_byte $old_pen
83c0: 64 69 6e 67 5f 62 79 74 65 0a 0a 23 2d 2d 2d 2d  ding_byte..#----
83d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8410: 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 74 65 73  -----.# This tes
8420: 74 20 2d 20 77 61 6c 2d 31 38 2e 2a 20 2d 20 76  t - wal-18.* - v
8430: 65 72 69 66 69 65 73 20 61 20 63 6f 75 70 6c 65  erifies a couple
8440: 20 6f 66 20 73 70 65 63 69 66 69 63 20 63 6f 6e   of specific con
8450: 64 69 74 69 6f 6e 73 20 74 68 61 74 0a 23 20 6d  ditions that.# m
8460: 61 79 20 62 65 20 65 6e 63 6f 75 6e 74 65 72 65  ay be encountere
8470: 64 20 77 68 69 6c 65 20 72 65 63 6f 76 65 72 69  d while recoveri
8480: 6e 67 20 61 20 6c 6f 67 20 66 69 6c 65 20 61 72  ng a log file ar
8490: 65 20 68 61 6e 64 6c 65 64 20 63 6f 72 72 65 63  e handled correc
84a0: 74 6c 79 3a 0a 23 0a 23 20 20 20 77 61 6c 2d 31  tly:.#.#   wal-1
84b0: 38 2e 31 2e 2a 20 57 68 65 6e 20 74 68 65 20 66  8.1.* When the f
84c0: 69 72 73 74 20 33 32 2d 62 69 74 73 20 6f 66 20  irst 32-bits of 
84d0: 61 20 66 72 61 6d 65 20 63 68 65 63 6b 73 75 6d  a frame checksum
84e0: 20 69 73 20 63 6f 72 72 65 63 74 20 62 75 74 20   is correct but 
84f0: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .#              
8500: 74 68 65 20 73 65 63 6f 6e 64 20 33 32 2d 62 69  the second 32-bi
8510: 74 73 20 61 72 65 20 66 61 6c 73 65 2c 20 61 6e  ts are false, an
8520: 64 0a 23 0a 23 20 20 20 77 61 6c 2d 31 38 2e 32  d.#.#   wal-18.2
8530: 2e 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65  .* When the page
8540: 2d 73 69 7a 65 20 66 69 65 6c 64 20 74 68 61 74  -size field that
8550: 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73   occurs at the s
8560: 74 61 72 74 20 6f 66 20 61 20 6c 6f 67 0a 23 20  tart of a log.# 
8570: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
8580: 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20  e is a power of 
8590: 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 31  2 greater than 1
85a0: 36 33 38 34 20 6f 72 20 73 6d 61 6c 6c 65 72 20  6384 or smaller 
85b0: 74 68 61 6e 20 35 31 32 2e 0a 23 0a 66 69 6c 65  than 512..#.file
85c0: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74   delete -force t
85d0: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
85e0: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
85f0: 61 6c 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  al.do_test wal-1
8600: 38 2e 30 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  8.0 {.  sqlite3 
8610: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
8620: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
8630: 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30  A page_size = 10
8640: 32 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  24;.    PRAGMA a
8650: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
8660: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
8670: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
8680: 20 20 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72     PRAGMA synchr
8690: 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 0a 0a 20 20  onous = OFF;..  
86a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
86b0: 31 28 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61  1(a, b, UNIQUE(a
86c0: 2c 20 62 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  , b));.    INSER
86d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
86e0: 28 30 2c 20 30 29 3b 0a 20 20 20 20 50 52 41 47  (0, 0);.    PRAG
86f0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
8700: 74 3b 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49  t;..    INSERT I
8710: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
8720: 20 32 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d   2);          --
8730: 20 66 72 61 6d 65 73 20 31 20 61 6e 64 20 32 0a   frames 1 and 2.
8740: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
8750: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
8760: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 66 72 61            -- fra
8770: 6d 65 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20  mes 3 and 4.    
8780: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
8790: 41 4c 55 45 53 28 35 2c 20 36 29 3b 20 20 20 20  ALUES(5, 6);    
87a0: 20 20 20 20 20 20 2d 2d 20 66 72 61 6d 65 73 20        -- frames 
87b0: 35 20 61 6e 64 20 36 0a 20 20 7d 0a 0a 20 20 66  5 and 6.  }..  f
87c0: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
87d0: 74 65 73 74 2e 64 62 20 74 65 73 74 58 2e 64 62  test.db testX.db
87e0: 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f  .  file copy -fo
87f0: 72 63 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  rce test.db-wal 
8800: 74 65 73 74 58 2e 64 62 2d 77 61 6c 0a 20 20 64  testX.db-wal.  d
8810: 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73 74 20 5b  b close.  list [
8820: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 58 2e  file size testX.
8830: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
8840: 65 73 74 58 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  estX.db-wal].} [
8850: 6c 69 73 74 20 5b 65 78 70 72 20 33 2a 31 30 32  list [expr 3*102
8860: 34 5d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a  4] [log_file_siz
8870: 65 20 36 20 31 30 32 34 5d 5d 0a 0a 75 6e 73 65  e 6 1024]]..unse
8880: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6e 46  t -nocomplain nF
8890: 72 61 6d 65 20 72 65 73 75 6c 74 0a 66 6f 72 65  rame result.fore
88a0: 61 63 68 20 7b 6e 46 72 61 6d 65 20 72 65 73 75  ach {nFrame resu
88b0: 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 30  lt} {.         0
88c0: 20 20 20 20 20 20 7b 30 20 30 7d 0a 20 20 20 20        {0 0}.    
88d0: 20 20 20 20 20 31 20 20 20 20 20 20 7b 30 20 30       1      {0 0
88e0: 7d 0a 20 20 20 20 20 20 20 20 20 32 20 20 20 20  }.         2    
88f0: 20 20 7b 30 20 30 20 31 20 32 7d 0a 20 20 20 20    {0 0 1 2}.    
8900: 20 20 20 20 20 33 20 20 20 20 20 20 7b 30 20 30       3      {0 0
8910: 20 31 20 32 7d 0a 20 20 20 20 20 20 20 20 20 34   1 2}.         4
8920: 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 20 33        {0 0 1 2 3
8930: 20 34 7d 0a 20 20 20 20 20 20 20 20 20 35 20 20   4}.         5  
8940: 20 20 20 20 7b 30 20 30 20 31 20 32 20 33 20 34      {0 0 1 2 3 4
8950: 7d 0a 20 20 20 20 20 20 20 20 20 36 20 20 20 20  }.         6    
8960: 20 20 7b 30 20 30 20 31 20 32 20 33 20 34 20 35    {0 0 1 2 3 4 5
8970: 20 36 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   6}.} {.  do_tes
8980: 74 20 77 61 6c 2d 31 38 2e 31 2e 24 6e 46 72 61  t wal-18.1.$nFra
8990: 6d 65 20 7b 0a 20 20 20 20 66 69 6c 65 20 63 6f  me {.    file co
89a0: 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74 58 2e  py -force testX.
89b0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 66  db test.db.    f
89c0: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
89d0: 74 65 73 74 58 2e 64 62 2d 77 61 6c 20 74 65 73  testX.db-wal tes
89e0: 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 20 20 68 65  t.db-wal..    he
89f0: 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74 2e 64  xio_write test.d
8a00: 62 2d 77 61 6c 20 5b 65 78 70 72 20 32 34 20 2b  b-wal [expr 24 +
8a10: 20 24 6e 46 72 61 6d 65 2a 28 32 34 2b 31 30 32   $nFrame*(24+102
8a20: 34 29 20 2b 20 32 30 5d 20 30 30 30 30 30 30 30  4) + 20] 0000000
8a30: 30 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  0..    sqlite3 d
8a40: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
8a50: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 53  ecsql { .      S
8a60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
8a70: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 69 6e  .      PRAGMA in
8a80: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 20 0a  tegrity_check; .
8a90: 20 20 20 20 7d 0a 20 20 7d 20 5b 63 6f 6e 63 61      }.  } [conca
8aa0: 74 20 24 72 65 73 75 6c 74 20 6f 6b 5d 0a 20 20  t $result ok].  
8ab0: 64 62 20 63 6c 6f 73 65 0a 7d 20 0a 0a 70 72 6f  db close.} ..pro
8ac0: 63 20 72 61 6e 64 6f 6d 62 6c 6f 62 20 7b 70 67  c randomblob {pg
8ad0: 73 7a 7d 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  sz} {.  sqlite3 
8ae0: 72 62 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20  rbdb :memory:.  
8af0: 73 65 74 20 62 6c 6f 62 20 5b 72 62 64 62 20 6f  set blob [rbdb o
8b00: 6e 65 20 7b 53 45 4c 45 43 54 20 72 61 6e 64 6f  ne {SELECT rando
8b10: 6d 62 6c 6f 62 28 24 70 67 73 7a 29 7d 5d 0a 20  mblob($pgsz)}]. 
8b20: 20 72 62 64 62 20 63 6c 6f 73 65 0a 20 20 73 65   rbdb close.  se
8b30: 74 20 62 6c 6f 62 0a 7d 0a 0a 70 72 6f 63 20 6c  t blob.}..proc l
8b40: 6f 67 63 6b 73 75 6d 20 7b 63 6b 76 31 20 63 6b  ogcksum {ckv1 ck
8b50: 76 32 20 62 6c 6f 62 7d 20 7b 0a 20 20 75 70 76  v2 blob} {.  upv
8b60: 61 72 20 24 63 6b 76 31 20 63 31 0a 20 20 75 70  ar $ckv1 c1.  up
8b70: 76 61 72 20 24 63 6b 76 32 20 63 32 0a 0a 20 20  var $ckv2 c2..  
8b80: 73 65 74 20 73 63 61 6e 70 61 74 74 65 72 6e 20  set scanpattern 
8b90: 49 2a 0a 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f  I*.  if {$::tcl_
8ba0: 70 6c 61 74 66 6f 72 6d 28 62 79 74 65 4f 72 64  platform(byteOrd
8bb0: 65 72 29 20 65 71 20 22 6c 69 74 74 6c 65 45 6e  er) eq "littleEn
8bc0: 64 69 61 6e 22 7d 20 7b 0a 20 20 20 20 73 65 74  dian"} {.    set
8bd0: 20 73 63 61 6e 70 61 74 74 65 72 6e 20 69 2a 0a   scanpattern i*.
8be0: 20 20 7d 0a 0a 20 20 62 69 6e 61 72 79 20 73 63    }..  binary sc
8bf0: 61 6e 20 24 62 6c 6f 62 20 24 73 63 61 6e 70 61  an $blob $scanpa
8c00: 74 74 65 72 6e 20 76 61 6c 75 65 73 0a 20 20 66  ttern values.  f
8c10: 6f 72 65 61 63 68 20 7b 76 31 20 76 32 7d 20 24  oreach {v1 v2} $
8c20: 76 61 6c 75 65 73 20 7b 0a 20 20 20 20 73 65 74  values {.    set
8c30: 20 63 31 20 5b 65 78 70 72 20 7b 28 24 63 31 20   c1 [expr {($c1 
8c40: 2b 20 24 76 31 20 2b 20 24 63 32 29 26 30 78 46  + $v1 + $c2)&0xF
8c50: 46 46 46 46 46 46 46 7d 5d 0a 20 20 20 20 73 65  FFFFFFF}].    se
8c60: 74 20 63 32 20 5b 65 78 70 72 20 7b 28 24 63 32  t c2 [expr {($c2
8c70: 20 2b 20 24 76 32 20 2b 20 24 63 31 29 26 30 78   + $v2 + $c1)&0x
8c80: 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 7d 0a 7d  FFFFFFFF}].  }.}
8c90: 0a 0a 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72  ..file copy -for
8ca0: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 58  ce test.db testX
8cb0: 2e 64 62 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20  .db.foreach {tn 
8cc0: 70 67 73 7a 20 77 6f 72 6b 73 7d 20 7b 20 0a 20  pgsz works} { . 
8cd0: 20 31 20 20 20 20 31 32 38 20 20 20 20 30 0a 20   1    128    0. 
8ce0: 20 32 20 20 20 20 32 35 36 20 20 20 20 30 0a 20   2    256    0. 
8cf0: 20 33 20 20 20 20 35 31 32 20 20 20 20 31 0a 20   3    512    1. 
8d00: 20 34 20 20 20 31 30 32 34 20 20 20 20 31 0a 20   4   1024    1. 
8d10: 20 35 20 20 20 32 30 34 38 20 20 20 20 31 0a 20   5   2048    1. 
8d20: 20 36 20 20 20 34 30 39 36 20 20 20 20 31 0a 20   6   4096    1. 
8d30: 20 37 20 20 20 38 31 39 32 20 20 20 20 31 0a 20   7   8192    1. 
8d40: 20 38 20 20 31 36 33 38 34 20 20 20 20 31 0a 20   8  16384    1. 
8d50: 20 39 20 20 33 32 37 36 38 20 20 20 20 31 0a 20   9  32768    1. 
8d60: 31 30 20 20 36 35 35 33 36 20 20 20 20 30 0a 20  10  65536    0. 
8d70: 31 31 20 20 20 31 30 31 36 20 20 20 20 30 0a 7d  11   1016    0.}
8d80: 20 7b 0a 0a 20 20 69 66 20 7b 24 3a 3a 53 51 4c   {..  if {$::SQL
8d90: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
8da0: 45 20 3c 20 24 70 67 73 7a 7d 20 7b 0a 20 20 20  E < $pgsz} {.   
8db0: 20 73 65 74 20 77 6f 72 6b 73 20 30 0a 20 20 7d   set works 0.  }
8dc0: 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 70 67 20  ..  for {set pg 
8dd0: 31 7d 20 7b 24 70 67 20 3c 3d 20 33 7d 20 7b 69  1} {$pg <= 3} {i
8de0: 6e 63 72 20 70 67 7d 20 7b 0a 20 20 20 20 66 69  ncr pg} {.    fi
8df0: 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74  le copy -force t
8e00: 65 73 74 58 2e 64 62 20 74 65 73 74 2e 64 62 0a  estX.db test.db.
8e10: 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20      file delete 
8e20: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77  -force test.db-w
8e30: 61 6c 0a 20 20 0a 20 20 20 20 23 20 43 68 65 63  al.  .    # Chec
8e40: 6b 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  k that the datab
8e50: 61 73 65 20 6e 6f 77 20 65 78 69 73 74 73 20 61  ase now exists a
8e60: 6e 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74  nd consists of t
8e70: 68 72 65 65 20 70 61 67 65 73 2e 20 41 6e 64 0a  hree pages. And.
8e80: 20 20 20 20 23 20 74 68 61 74 20 74 68 65 72 65      # that there
8e90: 20 69 73 20 6e 6f 20 61 73 73 6f 63 69 61 74 65   is no associate
8ea0: 64 20 77 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  d wal file..    
8eb0: 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61  #.    do_test wa
8ec0: 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 31  l-18.2.$tn.$pg.1
8ed0: 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20 74   { file exists t
8ee0: 65 73 74 2e 64 62 2d 77 61 6c 20 7d 20 30 0a 20  est.db-wal } 0. 
8ef0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31     do_test wal-1
8f00: 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 32 20 7b 20  8.2.$tn.$pg.2 { 
8f10: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
8f20: 2e 64 62 20 7d 20 31 0a 20 20 20 20 64 6f 5f 74  .db } 1.    do_t
8f30: 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e  est wal-18.2.$tn
8f40: 2e 24 70 67 2e 33 20 7b 20 66 69 6c 65 20 73 69  .$pg.3 { file si
8f50: 7a 65 20 74 65 73 74 2e 64 62 20 7d 20 5b 65 78  ze test.db } [ex
8f60: 70 72 20 31 30 32 34 2a 33 5d 0a 20 20 0a 20 20  pr 1024*3].  .  
8f70: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38    do_test wal-18
8f80: 2e 32 2e 24 74 6e 2e 24 70 67 2e 34 20 7b 0a 0a  .2.$tn.$pg.4 {..
8f90: 20 20 20 20 20 20 23 20 43 72 65 61 74 65 20 61        # Create a
8fa0: 20 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63   wal file that c
8fb0: 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
8fc0: 20 66 72 61 6d 65 20 28 64 61 74 61 62 61 73 65   frame (database
8fd0: 20 70 61 67 65 0a 20 20 20 20 20 20 23 20 6e 75   page.      # nu
8fe0: 6d 62 65 72 20 24 70 67 29 20 77 69 74 68 20 74  mber $pg) with t
8ff0: 68 65 20 63 6f 6d 6d 69 74 20 66 6c 61 67 20 73  he commit flag s
9000: 65 74 2e 20 54 68 65 20 66 72 61 6d 65 20 63 68  et. The frame ch
9010: 65 63 6b 73 75 6d 20 69 73 0a 20 20 20 20 20 20  ecksum is.      
9020: 23 20 63 6f 72 72 65 63 74 2c 20 62 75 74 20 74  # correct, but t
9030: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
9040: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
9050: 20 61 72 65 20 63 6f 72 72 75 70 74 2e 0a 20 20   are corrupt..  
9060: 20 20 20 20 23 0a 20 20 20 20 20 20 23 20 54 68      #.      # Th
9070: 65 20 70 61 67 65 2d 73 69 7a 65 20 69 6e 20 74  e page-size in t
9080: 68 65 20 6c 6f 67 20 66 69 6c 65 20 68 65 61 64  he log file head
9090: 65 72 20 69 73 20 73 65 74 20 74 6f 20 24 70 67  er is set to $pg
90a0: 73 7a 2e 20 49 66 20 74 68 65 0a 20 20 20 20 20  sz. If the.     
90b0: 20 23 20 57 41 4c 20 63 6f 64 65 20 63 6f 6e 73   # WAL code cons
90c0: 69 64 65 72 73 20 24 70 67 73 7a 20 74 6f 20 62  iders $pgsz to b
90d0: 65 20 61 20 76 61 6c 69 64 20 53 51 4c 69 74 65  e a valid SQLite
90e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
90f0: 61 67 65 2d 73 69 7a 65 2c 0a 20 20 20 20 20 20  age-size,.      
9100: 23 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  # the database w
9110: 69 6c 6c 20 62 65 20 63 6f 72 72 75 70 74 20 28  ill be corrupt (
9120: 62 65 63 61 75 73 65 20 74 68 65 20 67 61 72 62  because the garb
9130: 61 67 65 20 66 72 61 6d 65 20 63 6f 6e 74 65 6e  age frame conten
9140: 74 73 0a 20 20 20 20 20 20 23 20 77 69 6c 6c 20  ts.      # will 
9150: 62 65 20 74 72 65 61 74 65 64 20 61 73 20 76 61  be treated as va
9160: 6c 69 64 20 63 6f 6e 74 65 6e 74 29 2e 20 49 66  lid content). If
9170: 20 24 70 67 73 7a 20 69 73 20 69 6e 76 61 6c 69   $pgsz is invali
9180: 64 20 28 74 6f 6f 20 73 6d 61 6c 6c 0a 20 20 20  d (too small.   
9190: 20 20 20 23 20 6f 72 20 74 6f 6f 20 6c 61 72 67     # or too larg
91a0: 65 29 2c 20 74 68 65 20 64 62 20 77 69 6c 6c 20  e), the db will 
91b0: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 20 61  not be corrupt a
91c0: 73 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77  s the log file w
91d0: 69 6c 6c 0a 20 20 20 20 20 20 23 20 62 65 20 69  ill.      # be i
91e0: 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 23 0a  gnored..      #.
91f0: 20 20 20 20 20 20 73 65 74 20 77 61 6c 68 64 72        set walhdr
9200: 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20   [binary format 
9210: 49 49 49 49 49 49 20 39 33 31 30 37 31 36 31 38  IIIIII 931071618
9220: 20 33 30 30 37 30 30 30 20 24 70 67 73 7a 20 31   3007000 $pgsz 1
9230: 32 33 34 20 32 32 20 32 33 5d 0a 20 20 20 20 20  234 22 23].     
9240: 20 73 65 74 20 66 72 61 6d 65 62 6f 64 79 20 5b   set framebody [
9250: 72 61 6e 64 6f 6d 62 6c 6f 62 20 24 70 67 73 7a  randomblob $pgsz
9260: 5d 0a 20 20 20 20 20 20 73 65 74 20 66 72 61 6d  ].      set fram
9270: 65 68 64 72 20 20 5b 62 69 6e 61 72 79 20 66 6f  ehdr  [binary fo
9280: 72 6d 61 74 20 49 49 49 49 20 24 70 67 20 35 20  rmat IIII $pg 5 
9290: 32 32 20 32 33 5d 0a 20 20 20 20 20 20 73 65 74  22 23].      set
92a0: 20 63 31 20 30 0a 20 20 20 20 20 20 73 65 74 20   c1 0.      set 
92b0: 63 32 20 30 0a 20 20 20 20 20 20 6c 6f 67 63 6b  c2 0.      logck
92c0: 73 75 6d 20 63 31 20 63 32 20 24 77 61 6c 68 64  sum c1 c2 $walhd
92d0: 72 0a 20 20 20 20 20 20 6c 6f 67 63 6b 73 75 6d  r.      logcksum
92e0: 20 63 31 20 63 32 20 5b 73 74 72 69 6e 67 20 72   c1 c2 [string r
92f0: 61 6e 67 65 20 24 66 72 61 6d 65 68 64 72 20 30  ange $framehdr 0
9300: 20 37 5d 0a 20 20 20 20 20 20 6c 6f 67 63 6b 73   7].      logcks
9310: 75 6d 20 63 31 20 63 32 20 24 66 72 61 6d 65 62  um c1 c2 $frameb
9320: 6f 64 79 0a 20 20 20 20 20 20 73 65 74 20 66 72  ody.      set fr
9330: 61 6d 65 68 64 72 20 5b 62 69 6e 61 72 79 20 66  amehdr [binary f
9340: 6f 72 6d 61 74 20 49 49 49 49 49 49 20 24 70 67  ormat IIIIII $pg
9350: 20 35 20 32 32 20 32 33 20 24 63 31 20 24 63 32   5 22 23 $c1 $c2
9360: 5d 0a 0a 20 20 20 20 20 20 73 65 74 20 66 64 20  ]..      set fd 
9370: 5b 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 77 61  [open test.db-wa
9380: 6c 20 77 5d 0a 20 20 20 20 20 20 66 63 6f 6e 66  l w].      fconf
9390: 69 67 75 72 65 20 24 66 64 20 2d 65 6e 63 6f 64  igure $fd -encod
93a0: 69 6e 67 20 62 69 6e 61 72 79 20 2d 74 72 61 6e  ing binary -tran
93b0: 73 6c 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20  slation binary. 
93c0: 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77       puts -nonew
93d0: 6c 69 6e 65 20 24 66 64 20 24 77 61 6c 68 64 72  line $fd $walhdr
93e0: 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e  .      puts -non
93f0: 65 77 6c 69 6e 65 20 24 66 64 20 24 66 72 61 6d  ewline $fd $fram
9400: 65 68 64 72 0a 20 20 20 20 20 20 70 75 74 73 20  ehdr.      puts 
9410: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24  -nonewline $fd $
9420: 66 72 61 6d 65 62 6f 64 79 0a 20 20 20 20 20 20  framebody.      
9430: 63 6c 6f 73 65 20 24 66 64 0a 20 20 0a 20 20 20  close $fd.  .   
9440: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
9450: 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20 7d 20 5b  t.db-wal.    } [
9460: 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20  log_file_size 1 
9470: 24 70 67 73 7a 5d 0a 20 20 0a 20 20 20 20 64 6f  $pgsz].  .    do
9480: 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24  _test wal-18.2.$
9490: 74 6e 2e 24 70 67 2e 35 20 7b 0a 20 20 20 20 20  tn.$pg.5 {.     
94a0: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
94b0: 2e 64 62 0a 20 20 20 20 20 20 73 65 74 20 72 63  .db.      set rc
94c0: 20 5b 63 61 74 63 68 20 7b 20 64 62 20 6f 6e 65   [catch { db one
94d0: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   {PRAGMA integri
94e0: 74 79 5f 63 68 65 63 6b 7d 20 7d 20 6d 73 67 5d  ty_check} } msg]
94f0: 0a 20 20 20 20 20 20 65 78 70 72 20 7b 20 24 72  .      expr { $r
9500: 63 21 3d 30 20 7c 7c 20 24 6d 73 67 21 3d 22 6f  c!=0 || $msg!="o
9510: 6b 22 20 7d 0a 20 20 20 20 7d 20 24 77 6f 72 6b  k" }.    } $work
9520: 73 0a 20 20 0a 20 20 20 20 64 62 20 63 6c 6f 73  s.  .    db clos
9530: 65 0a 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  e.  }.}..#------
9540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9580: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
9590: 69 6e 67 20 74 65 73 74 20 2d 20 77 61 6c 2d 31  ing test - wal-1
95a0: 39 2e 2a 20 2d 20 66 69 78 65 73 20 61 20 62 75  9.* - fixes a bu
95b0: 67 20 74 68 61 74 20 77 61 73 20 70 72 65 73 65  g that was prese
95c0: 6e 74 20 64 75 72 69 6e 67 0a 23 20 64 65 76 65  nt during.# deve
95d0: 6c 6f 70 6d 65 6e 74 2e 0a 23 0a 23 20 57 68 65  lopment..#.# Whe
95e0: 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  n a database con
95f0: 6e 65 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d  nection in WAL m
9600: 6f 64 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 69  ode is closed, i
9610: 74 20 61 74 74 65 6d 70 74 73 20 61 6e 0a 23 20  t attempts an.# 
9620: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
9630: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
9640: 69 6c 65 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b  ile. If the lock
9650: 20 69 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68   is obtained, th
9660: 65 0a 23 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6b  e.# connection k
9670: 6e 6f 77 73 20 74 68 61 74 20 69 74 20 69 73 20  nows that it is 
9680: 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
9690: 69 6f 6e 20 74 6f 20 64 69 73 63 6f 6e 6e 65 63  ion to disconnec
96a0: 74 20 66 72 6f 6d 0a 23 20 74 68 65 20 64 61 74  t from.# the dat
96b0: 61 62 61 73 65 2c 20 73 6f 20 69 74 20 72 75 6e  abase, so it run
96c0: 73 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  s a checkpoint o
96d0: 70 65 72 61 74 69 6f 6e 2e 20 54 68 65 20 62 75  peration. The bu
96e0: 67 20 77 61 73 20 74 68 61 74 0a 23 20 74 68 65  g was that.# the
96f0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
9700: 6e 6f 74 20 75 70 64 61 74 69 6e 67 20 69 74 73  not updating its
9710: 20 70 72 69 76 61 74 65 20 63 6f 70 79 20 6f 66   private copy of
9720: 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 0a   the wal-index .
9730: 23 20 68 65 61 64 65 72 20 62 65 66 6f 72 65 20  # header before 
9740: 64 6f 69 6e 67 20 73 6f 2c 20 6d 65 61 6e 69 6e  doing so, meanin
9750: 67 20 74 68 61 74 20 69 74 20 63 6f 75 6c 64 20  g that it could 
9760: 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 20 6f 6c  checkpoint an ol
9770: 64 0a 23 20 73 6e 61 70 73 68 6f 74 2e 0a 23 0a  d.# snapshot..#.
9780: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e 31  do_test wal-19.1
9790: 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65   {.  file delete
97a0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
97b0: 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74  test.db-wal test
97c0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 73 71  .db-journal.  sq
97d0: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
97e0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
97f0: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
9800: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f   {.    PRAGMA jo
9810: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
9820: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
9830: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
9840: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9850: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
9860: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9870: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
9880: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53   }.  execsql { S
9890: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
98a0: 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34  } db2.} {1 2 3 4
98b0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 39  }.do_test wal-19
98c0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
98d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
98e0: 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29   t1 VALUES(5, 6)
98f0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
9900: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t1;.  }.} {1
9910: 20 32 20 33 20 34 20 35 20 36 7d 0a 64 6f 5f 74   2 3 4 5 6}.do_t
9920: 65 73 74 20 77 61 6c 2d 31 39 2e 33 20 7b 0a 20  est wal-19.3 {. 
9930: 20 64 62 20 63 6c 6f 73 65 0a 20 20 64 62 32 20   db close.  db2 
9940: 63 6c 6f 73 65 0a 20 20 66 69 6c 65 20 65 78 69  close.  file exi
9950: 73 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  sts test.db-wal.
9960: 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61  } {0}.do_test wa
9970: 6c 2d 31 39 2e 34 20 7b 0a 20 20 23 20 57 68 65  l-19.4 {.  # Whe
9980: 6e 20 74 68 65 20 62 75 67 20 77 61 73 20 70 72  n the bug was pr
9990: 65 73 65 6e 74 2c 20 74 68 65 20 66 6f 6c 6c 6f  esent, the follo
99a0: 77 69 6e 67 20 77 61 73 20 72 65 74 75 72 6e 69  wing was returni
99b0: 6e 67 20 7b 31 20 32 20 33 20 34 7d 20 6f 6e 6c  ng {1 2 3 4} onl
99c0: 79 2c 0a 20 20 23 20 61 73 20 5b 64 62 32 5d 20  y,.  # as [db2] 
99d0: 68 61 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64 61  had an out-of-da
99e0: 74 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 77  te copy of the w
99f0: 61 6c 2d 69 6e 64 65 78 20 68 65 61 64 65 72 20  al-index header 
9a00: 77 68 65 6e 20 69 74 20 77 61 73 0a 20 20 23 20  when it was.  # 
9a10: 63 6c 6f 73 65 64 2e 0a 20 20 23 0a 20 20 73 71  closed..  #.  sq
9a20: 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62  lite3 db test.db
9a30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
9a40: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
9a50: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
9a60: 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .#--------------
9a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68  -----------.# Th
9ab0: 69 73 20 74 65 73 74 20 2d 20 77 61 6c 2d 32 30  is test - wal-20
9ac0: 2e 2a 20 2d 20 75 73 65 73 20 74 77 6f 20 63 6f  .* - uses two co
9ad0: 6e 6e 65 63 74 69 6f 6e 73 2e 20 4f 6e 65 20 69  nnections. One i
9ae0: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 61  n this process a
9af0: 6e 64 0a 23 20 74 68 65 20 6f 74 68 65 72 20 69  nd.# the other i
9b00: 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  n an external pr
9b10: 6f 63 65 73 73 2e 20 54 68 65 20 70 72 6f 63 65  ocess. The proce
9b20: 64 75 72 65 20 69 73 3a 0a 23 0a 23 20 20 20 31  dure is:.#.#   1
9b30: 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69  . Using connecti
9b40: 6f 6e 20 31 2c 20 63 72 65 61 74 65 20 74 68 65  on 1, create the
9b50: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
9b60: 2e 0a 23 0a 23 20 20 20 32 2e 20 55 73 69 6e 67  ..#.#   2. Using
9b70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 32 20 28 69   connection 2 (i
9b80: 6e 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 70 72  n an external pr
9b90: 6f 63 65 73 73 29 2c 20 61 64 64 20 73 6f 20 6d  ocess), add so m
9ba0: 75 63 68 0a 23 20 20 20 20 20 20 64 61 74 61 20  uch.#      data 
9bb0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
9bc0: 77 69 74 68 6f 75 74 20 63 68 65 63 6b 70 6f 69  without checkpoi
9bd0: 6e 74 69 6e 67 20 74 68 61 74 20 61 20 77 61 6c  nting that a wal
9be0: 2d 69 6e 64 65 78 20 0a 23 20 20 20 20 20 20 6c  -index .#      l
9bf0: 61 72 67 65 72 20 74 68 61 6e 20 36 34 4b 42 20  arger than 64KB 
9c00: 69 73 20 72 65 71 75 69 72 65 64 2e 0a 23 0a 23  is required..#.#
9c10: 20 20 20 33 2e 20 55 73 69 6e 67 20 63 6f 6e 6e     3. Using conn
9c20: 65 63 74 69 6f 6e 20 31 2c 20 63 68 65 63 6b 70  ection 1, checkp
9c30: 6f 69 6e 74 20 74 68 65 20 64 61 74 61 62 61 73  oint the databas
9c40: 65 2e 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  e. Make sure all
9c50: 0a 23 20 20 20 20 20 20 74 68 65 20 64 61 74 61  .#      the data
9c60: 20 69 73 20 70 72 65 73 65 6e 74 20 61 6e 64 20   is present and 
9c70: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
9c80: 6e 6f 74 20 63 6f 72 72 75 70 74 2e 0a 23 0a 23  not corrupt..#.#
9c90: 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74 2c 20 53   At one point, S
9ca0: 51 4c 69 74 65 20 77 61 73 20 66 61 69 6c 69 6e  QLite was failin
9cb0: 67 20 74 6f 20 67 72 6f 77 20 74 68 65 20 6d 61  g to grow the ma
9cc0: 70 70 69 6e 67 20 6f 66 20 74 68 65 20 77 61 6c  pping of the wal
9cd0: 2d 69 6e 64 65 78 0a 23 20 66 69 6c 65 20 69 6e  -index.# file in
9ce0: 20 73 74 65 70 20 33 20 61 6e 64 20 74 68 65 20   step 3 and the 
9cf0: 63 68 65 63 6b 70 6f 69 6e 74 20 77 61 73 20 63  checkpoint was c
9d00: 6f 72 72 75 70 74 69 6e 67 20 74 68 65 20 64 61  orrupting the da
9d10: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 23 0a 64  tabase file..#.d
9d20: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30 2e 31 20  o_test wal-20.1 
9d30: 7b 0a 20 20 63 61 74 63 68 20 7b 64 62 20 63 6c  {.  catch {db cl
9d40: 6f 73 65 7d 0a 20 20 66 69 6c 65 20 64 65 6c 65  ose}.  file dele
9d50: 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64  te -force test.d
9d60: 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  b test.db-wal te
9d70: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  st.db-journal.  
9d80: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
9d90: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
9da0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
9db0: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
9dc0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9dd0: 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1(x);.    INSERT
9de0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
9df0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 29  randomblob(900))
9e00: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75  ;.    SELECT cou
9e10: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
9e20: 20 7d 0a 7d 20 7b 77 61 6c 20 31 7d 0a 64 6f 5f   }.} {wal 1}.do_
9e30: 74 65 73 74 20 77 61 6c 2d 32 30 2e 32 20 7b 0a  test wal-20.2 {.
9e40: 20 20 73 65 74 20 3a 3a 62 75 64 64 79 20 5b 6c    set ::buddy [l
9e50: 61 75 6e 63 68 5f 74 65 73 74 66 69 78 74 75 72  aunch_testfixtur
9e60: 65 5d 0a 20 20 74 65 73 74 66 69 78 74 75 72 65  e].  testfixture
9e70: 20 24 3a 3a 62 75 64 64 79 20 7b 0a 20 20 20 20   $::buddy {.    
9e80: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
9e90: 64 62 0a 20 20 20 20 64 62 20 74 72 61 6e 73 61  db.    db transa
9ea0: 63 74 69 6f 6e 20 7b 20 64 62 20 65 76 61 6c 20  ction { db eval 
9eb0: 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 77  {.      PRAGMA w
9ec0: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
9ed0: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 49 4e 53  t = 0;.      INS
9ee0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9ef0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9f00: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9f10: 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 20 20 20    /* 2 */.      
9f20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
9f30: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
9f40: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
9f50: 20 20 20 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 20       /* 4 */.   
9f60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9f70: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
9f80: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
9f90: 3b 20 20 20 20 20 20 20 2f 2a 20 38 20 2a 2f 0a  ;       /* 8 */.
9fa0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9fb0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9fc0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
9fd0: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 36   t1;       /* 16
9fe0: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
9ff0: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
a000: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
a010: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
a020: 2a 20 33 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e  * 32 */.      IN
a030: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
a040: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
a050: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
a060: 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20 20 20     /* 64 */.    
a070: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a080: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
a090: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
a0a0: 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f         /* 128 */
a0b0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a0c0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
a0d0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
a0e0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 32  M t1;       /* 2
a0f0: 35 36 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45  56 */.      INSE
a100: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
a110: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
a120: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
a130: 20 2f 2a 20 35 31 32 20 2a 2f 0a 20 20 20 20 20   /* 512 */.     
a140: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
a150: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
a160: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
a170: 20 20 20 20 20 20 2f 2a 20 31 30 32 34 20 2a 2f        /* 1024 */
a180: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
a190: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
a1a0: 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  domblob(900) FRO
a1b0: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 32  M t1;       /* 2
a1c0: 30 34 38 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53  048 */.      INS
a1d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
a1e0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
a1f0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
a200: 20 20 2f 2a 20 34 30 39 36 20 2a 2f 0a 20 20 20    /* 4096 */.   
a210: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a220: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
a230: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
a240: 3b 20 20 20 20 20 20 20 2f 2a 20 38 31 39 32 20  ;       /* 8192 
a250: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
a260: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
a270: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
a280: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
a290: 20 31 36 33 38 34 20 2a 2f 0a 20 20 20 20 7d 20   16384 */.    } 
a2a0: 7d 0a 20 20 7d 0a 7d 20 7b 30 7d 0a 64 6f 5f 74  }.  }.} {0}.do_t
a2b0: 65 73 74 20 77 61 6c 2d 32 30 2e 33 20 7b 0a 20  est wal-20.3 {. 
a2c0: 20 63 6c 6f 73 65 20 24 3a 3a 62 75 64 64 79 0a   close $::buddy.
a2d0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
a2e0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
a2f0: 70 6f 69 6e 74 3b 0a 20 20 20 20 53 45 4c 45 43  point;.    SELEC
a300: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
a310: 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 36 33 38 34  t1;.  }.} {16384
a320: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 30  }.do_test wal-20
a330: 2e 34 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .4 {.  db close.
a340: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
a350: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
a360: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
a370: 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 36   FROM t1 }.} {16
a380: 33 38 34 7d 0a 69 6e 74 65 67 72 69 74 79 5f 63  384}.integrity_c
a390: 68 65 63 6b 20 77 61 6c 2d 32 30 2e 35 0a 0a 63  heck wal-20.5..c
a3a0: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
a3b0: 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c   }.catch { db cl
a3c0: 6f 73 65 20 7d 0a 66 69 6c 65 20 64 65 6c 65 74  ose }.file delet
a3d0: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
a3e0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
a3f0: 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 0a 64 6f  t.db-journal..do
a400: 5f 74 65 73 74 20 77 61 6c 2d 32 31 2e 31 20 7b  _test wal-21.1 {
a410: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65  .  sqlite3 db te
a420: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
a430: 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  { .    PRAGMA jo
a440: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
a450: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
a460: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
a470: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
a480: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
a490: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
a4a0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
a4b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
a4c0: 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b 0a  1 VALUES(5, 6);.
a4d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
a4e0: 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29 3b  t1 VALUES(7, 8);
a4f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
a500: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30   t1 VALUES(9, 10
a510: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a520: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c  TO t1 VALUES(11,
a530: 20 31 32 29 3b 0a 20 20 7d 0a 7d 20 7b 77 61 6c   12);.  }.} {wal
a540: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 31  }.do_test wal-21
a550: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
a560: 20 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61 63   .    PRAGMA cac
a570: 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20  he_size = 10;.  
a580: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
a590: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47  ckpoint;.    BEG
a5a0: 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f  IN;.      SAVEPO
a5b0: 49 4e 54 20 73 3b 0a 20 20 20 20 20 20 20 20 49  INT s;.        I
a5c0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
a5d0: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
a5e0: 39 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  900), randomblob
a5f0: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20  (900) FROM t1;. 
a600: 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f       ROLLBACK TO
a610: 20 73 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a   s;.    COMMIT;.
a620: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
a630: 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  M t1;.  }.} {1 2
a640: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
a650: 30 20 31 31 20 31 32 7d 0a 64 6f 5f 74 65 73 74  0 11 12}.do_test
a660: 20 77 61 6c 2d 32 31 2e 33 20 7b 0a 20 20 65 78   wal-21.3 {.  ex
a670: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
a680: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
a690: 0a 7d 20 7b 6f 6b 7d 0a 0a 66 69 6e 69 73 68 5f  .} {ok}..finish_
a6a0: 74 65 73 74 0a                                   test.