/ Hex Artifact Content
Login

Artifact 2b3626a6c839ef281e2a51f6223578e5fa7616c2:


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 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
03f0: 31 30 32 34 20 7d 0a 20 20 5b 6c 69 6e 64 65 78  1024 }.  [lindex
0400: 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b   $args 0] eval {
0410: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
0420: 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20 5b  mode = wal }.  [
0430: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20  lindex $args 0] 
0440: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 73 79  eval { PRAGMA sy
0450: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d  nchronous = norm
0460: 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24  al }.  [lindex $
0470: 61 72 67 73 20 30 5d 20 66 75 6e 63 74 69 6f 6e  args 0] function
0480: 20 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a 0a 70 72   blob blob.}..pr
0490: 6f 63 20 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65  oc log_file_size
04a0: 20 7b 6e 46 72 61 6d 65 20 70 67 73 7a 7d 20 7b   {nFrame pgsz} {
04b0: 0a 20 20 65 78 70 72 20 7b 31 32 20 2b 20 28 24  .  expr {12 + ($
04c0: 70 67 73 7a 2b 31 36 29 2a 24 6e 46 72 61 6d 65  pgsz+16)*$nFrame
04d0: 7d 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67 5f 64 65  }.}..proc log_de
04e0: 6c 65 74 65 64 20 7b 6c 6f 67 66 69 6c 65 7d 20  leted {logfile} 
04f0: 7b 0a 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72  {.  return [expr
0500: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 6c   [file exists $l
0510: 6f 67 66 69 6c 65 5d 3d 3d 30 5d 0a 7d 0a 0a 23  ogfile]==0].}..#
0520: 0a 23 20 54 68 65 73 65 20 61 72 65 20 27 77 61  .# These are 'wa
0530: 72 6d 2d 62 6f 64 79 27 20 74 65 73 74 73 20 75  rm-body' tests u
0540: 73 65 64 20 77 68 69 6c 65 20 64 65 76 65 6c 6f  sed while develo
0550: 70 69 6e 67 20 74 68 65 20 57 41 4c 20 63 6f 64  ping the WAL cod
0560: 65 2e 20 54 68 65 79 0a 23 20 73 65 72 76 65 20  e. They.# serve 
0570: 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 61 20  to prove that a 
0580: 66 65 77 20 72 65 61 6c 6c 79 20 73 69 6d 70 6c  few really simpl
0590: 65 20 63 61 73 65 73 20 77 6f 72 6b 3a 0a 23 0a  e cases work:.#.
05a0: 23 20 77 61 6c 2d 31 2e 2a 3a 20 52 65 61 64 20  # wal-1.*: Read 
05b0: 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 64 61  and write the da
05c0: 74 61 62 61 73 65 2e 0a 23 20 77 61 6c 2d 32 2e  tabase..# wal-2.
05d0: 2a 3a 20 54 65 73 74 20 4d 56 43 43 20 77 69 74  *: Test MVCC wit
05e0: 68 20 6f 6e 65 20 72 65 61 64 65 72 2c 20 6f 6e  h one reader, on
05f0: 65 20 77 72 69 74 65 72 2e 0a 23 20 77 61 6c 2d  e writer..# wal-
0600: 33 2e 2a 3a 20 54 65 73 74 20 74 72 61 6e 73 61  3.*: Test transa
0610: 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ction rollback..
0620: 23 20 77 61 6c 2d 34 2e 2a 3a 20 54 65 73 74 20  # wal-4.*: Test 
0630: 73 61 76 65 70 6f 69 6e 74 2f 73 74 61 74 65 6d  savepoint/statem
0640: 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20  ent rollback..# 
0650: 77 61 6c 2d 35 2e 2a 3a 20 54 65 73 74 20 74 68  wal-5.*: Test th
0660: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
0670: 0a 23 20 77 61 6c 2d 36 2e 2a 3a 20 54 65 73 74  .# wal-6.*: Test
0680: 20 63 72 65 61 74 69 6e 67 20 64 61 74 61 62 61   creating databa
0690: 73 65 73 20 77 69 74 68 20 64 69 66 66 65 72 65  ses with differe
06a0: 6e 74 20 70 61 67 65 20 73 69 7a 65 73 2e 0a 23  nt page sizes..#
06b0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e  ..do_test wal-0.
06c0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
06d0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
06e0: 75 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a 20 20  us = normal }.  
06f0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
0700: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
0710: 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f  wal }.} {wal}.do
0720: 5f 74 65 73 74 20 77 61 6c 2d 30 2e 32 20 7b 0a  _test wal-0.2 {.
0730: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
0740: 2e 64 62 0a 7d 20 7b 31 30 32 34 7d 0a 0a 64 6f  .db.} {1024}..do
0750: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 30 20 7b 0a  _test wal-1.0 {.
0760: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
0770: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
0780: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0790: 29 3b 20 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  ); .  }.  list [
07a0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
07b0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5c 0a 20  .db-journal] \. 
07c0: 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78 69 73        [file exis
07d0: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ts test.db-wal] 
07e0: 20 20 20 20 5c 0a 20 20 20 20 20 20 20 5b 66 69      \.       [fi
07f0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
0800: 0a 7d 20 7b 30 20 31 20 31 30 32 34 7d 0a 64 6f  .} {0 1 1024}.do
0810: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 31 20 7b 0a  _test wal-1.1 {.
0820: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
0830: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78  .  list [file ex
0840: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
0850: 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73  rnal] [file exis
0860: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ts test.db-wal].
0870: 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {0 1}.do_test 
0880: 77 61 6c 2d 31 2e 32 20 7b 0a 20 20 23 20 54 68  wal-1.2 {.  # Th
0890: 65 72 65 20 61 72 65 20 6e 6f 77 20 74 77 6f 20  ere are now two 
08a0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  pages in the log
08b0: 2e 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  ..  file size te
08c0: 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 5b 6c 6f 67  st.db-wal.} [log
08d0: 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30 32  _file_size 2 102
08e0: 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]..do_test wal-
08f0: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
0900: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0910: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a  sqlite_master }.
0920: 7d 20 7b 74 61 62 6c 65 20 74 31 20 74 31 20 32  } {table t1 t1 2
0930: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
0940: 31 28 61 2c 20 62 29 7d 7d 0a 0a 64 6f 5f 74 65  1(a, b)}}..do_te
0950: 73 74 20 77 61 6c 2d 31 2e 34 20 7b 0a 20 20 65  st wal-1.4 {.  e
0960: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
0970: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0980: 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c  , 2) }.  execsql
0990: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
09a0: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d  1 VALUES(3, 4) }
09b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
09c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
09d0: 45 53 28 35 2c 20 36 29 20 7d 0a 20 20 65 78 65  ES(5, 6) }.  exe
09e0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
09f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20  TO t1 VALUES(7, 
0a00: 38 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  8) }.  execsql {
0a10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0a20: 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a  VALUES(9, 10) }.
0a30: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  } {}..do_test wa
0a40: 6c 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  l-1.5 {.  execsq
0a50: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0a60: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
0a70: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0a80: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 31  .do_test wal-2.1
0a90: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c   {.  sqlite3_wal
0aa0: 20 64 62 32 20 2e 2f 74 65 73 74 2e 64 62 0a 20   db2 ./test.db. 
0ab0: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
0ac0: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
0ad0: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20  t1 } db2.} {1 2 
0ae0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0af0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0b00: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0b10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0b20: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d  VALUES(11, 12) }
0b30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0b40: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0b50: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0b60: 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 0a   8 9 10 11 12}..
0b70: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 33 20  do_test wal-2.3 
0b80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0b90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0ba0: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20   db2.} {1 2 3 4 
0bb0: 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 64  5 6 7 8 9 10}..d
0bc0: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 34 20 7b  o_test wal-2.4 {
0bd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0be0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0bf0: 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20 65  ES(13, 14) }.  e
0c00: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0c10: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
0c20: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0c30: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d   10 11 12 13 14}
0c40: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0c50: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
0c60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0c70: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
0c80: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0c90: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 36  .do_test wal-2.6
0ca0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
0cb0: 4f 4d 4d 49 54 3b 20 53 45 4c 45 43 54 20 2a 20  OMMIT; SELECT * 
0cc0: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
0cd0: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0ce0: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
0cf0: 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4}..do_test wal-
0d00: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
0d10: 7b 20 42 45 47 49 4e 3b 20 44 45 4c 45 54 45 20  { BEGIN; DELETE 
0d20: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65 63  FROM t1 }.  exec
0d30: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0d40: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a 64 6f  ROM t1 }.} {}.do
0d50: 5f 74 65 73 74 20 77 61 6c 2d 33 2e 32 20 7b 0a  _test wal-3.2 {.
0d60: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0d70: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
0d80: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
0d90: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
0da0: 20 31 33 20 31 34 7d 0a 64 6f 5f 74 65 73 74 20   13 14}.do_test 
0db0: 77 61 6c 2d 33 2e 33 20 7b 0a 20 20 65 78 65 63  wal-3.3 {.  exec
0dc0: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
0dd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0de0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0df0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0e00: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
0e10: 20 31 34 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a   14}.db2 close..
0e20: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
0e70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
0e80: 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74 65 73 74 20  , wal-4.*, test 
0e90: 74 68 61 74 20 73 61 76 65 70 6f 69 6e 74 73 20  that savepoints 
0ea0: 77 6f 72 6b 20 77 69 74 68 20 57 41 4c 20 0a 23  work with WAL .#
0eb0: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 64 6f   databases..#.do
0ec0: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 31 20 7b 0a  _test wal-4.1 {.
0ed0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0ee0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
0ef0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0f00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0f10: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
0f20: 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
0f30: 54 20 73 70 3b 0a 20 20 20 20 20 20 20 20 49 4e  T sp;.        IN
0f40: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0f50: 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20  UES('c', 'd');. 
0f60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
0f70: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
0f80: 61 20 62 20 63 20 64 7d 0a 64 6f 5f 74 65 73 74  a b c d}.do_test
0f90: 20 77 61 6c 2d 34 2e 32 20 7b 0a 20 20 65 78 65   wal-4.2 {.  exe
0fa0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 52 4f 4c  csql {.      ROL
0fb0: 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
0fc0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0fd0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d   t1;.  }.} {a b}
0fe0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 33  .do_test wal-4.3
0ff0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1000: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53     COMMIT;.    S
1010: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
1020: 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a 0a 64 6f  .  }.} {a b}..do
1030: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 31 20  _test wal-4.4.1 
1040: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
1050: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1060: 62 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62  b.  db func blob
1070: 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20 5b 65 78   blob.  list [ex
1080: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
1090: 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b 66 69 6c   FROM t1 }] [fil
10a0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
10b0: 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20 30 7d 0a  al].} {{a b} 0}.
10c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
10d0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
10e0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
10f0: 65 20 3d 20 31 30 20 7d 0a 20 20 65 78 65 63 73  e = 10 }.  execs
1100: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1110: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
1120: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1130: 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34  t2 VALUES(blob(4
1140: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b  00), blob(400));
1150: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74  .    SAVEPOINT t
1160: 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  r;.      INSERT 
1170: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
1180: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
1190: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
11a0: 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   2 */.      INSE
11b0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
11c0: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
11d0: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
11e0: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
11f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1200: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1210: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1220: 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20  2; /*  8 */.    
1230: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1240: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1250: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1260: 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20  M t2; /* 16 */. 
1270: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1280: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
1290: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
12a0: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a  FROM t2; /* 32 *
12b0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
12c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
12d0: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
12e0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20  0) FROM t1; /*  
12f0: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
1300: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1310: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1320: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1330: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
1340: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1350: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1360: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
1370: 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20  ; /*  8 */.     
1380: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1390: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
13a0: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
13b0: 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20   t1; /* 16 */.  
13c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13d0: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
13e0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
13f0: 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f  ROM t1; /* 32 */
1400: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
1410: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a  unt(*) FROM t2;.
1420: 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65    }.} {32}.do_te
1430: 73 74 20 77 61 6c 2d 34 2e 34 2e 33 20 7b 0a 20  st wal-4.4.3 {. 
1440: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
1450: 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d  ACK TO tr }.} {}
1460: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34  .do_test wal-4.4
1470: 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69  .4 {.  set logsi
1480: 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  ze [file size te
1490: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65  st.db-wal].  exe
14a0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
14b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
14c0: 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20  ES('x', 'y');.  
14d0: 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20    RELEASE tr;.  
14e0: 7d 0a 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73  }.  expr { $logs
14f0: 69 7a 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a  ize == [file siz
1500: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d  e test.db-wal] }
1510: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
1520: 61 6c 2d 34 2e 34 2e 35 20 7b 0a 20 20 65 78 65  al-4.4.5 {.  exe
1530: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
1540: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d  unt(*) FROM t2 }
1550: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
1560: 61 6c 2d 34 2e 34 2e 36 20 7b 0a 20 20 66 69 6c  al-4.4.6 {.  fil
1570: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65  e copy -force te
1580: 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20  st.db test2.db. 
1590: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
15a0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  e test.db-wal te
15b0: 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c  st2.db-wal.  sql
15c0: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
15d0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
15e0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
15f0: 4f 4d 20 74 32 20 3b 20 53 45 4c 45 43 54 20 63  OM t2 ; SELECT c
1600: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
1610: 7d 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f  } db2.} {1 2}.do
1620: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 37 20  _test wal-4.4.7 
1630: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
1640: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
1650: 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
1660: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f  }.db2 close..do_
1670: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 31 20 7b  test wal-4.5.1 {
1680: 0a 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 64  .  reopen_db.  d
1690: 62 20 66 75 6e 63 20 62 6c 6f 62 20 62 6c 6f 62  b func blob blob
16a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
16b0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
16c0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
16d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
16e0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
16f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1700: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a  ('a', 'b');.  }.
1710: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
1720: 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63 20 62  t.db.  db func b
1730: 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20  lob blob.  list 
1740: 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43  [execsql { SELEC
1750: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b  T * FROM t1 }] [
1760: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
1770: 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20  b-wal].} {{a b} 
1780: 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  0}.do_test wal-4
1790: 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.2 {.  execsql
17a0: 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f   { PRAGMA cache_
17b0: 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 65 78  size = 10 }.  ex
17c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
17d0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
17e0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
17f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1800: 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34 30 30   VALUES(blob(400
1810: 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b 0a 20  ), blob(400));. 
1820: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 72 3b     SAVEPOINT tr;
1830: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1840: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
1850: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1860: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 32  ) FROM t2; /*  2
1870: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
1880: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
1890: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
18a0: 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a  400) FROM t2; /*
18b0: 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    4 */.      INS
18c0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
18d0: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
18e0: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b  ob(400) FROM t2;
18f0: 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20 20   /*  8 */.      
1900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
1910: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1920: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1930: 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20  t2; /* 16 */.   
1940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1950: 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  2 SELECT blob(40
1960: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1970: 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a 2f 0a  OM t2; /* 32 */.
1980: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1990: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
19a0: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
19b0: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 32 20   FROM t1; /*  2 
19c0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
19d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
19e0: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
19f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20  00) FROM t1; /* 
1a00: 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   4 */.      INSE
1a10: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1a20: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1a30: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(400) FROM t1; 
1a40: 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 49  /*  8 */.      I
1a50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1a60: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1a70: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1a80: 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20  1; /* 16 */.    
1a90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1aa0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1ab0: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1ac0: 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f 0a 20  M t1; /* 32 */. 
1ad0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
1ae0: 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20  t(*) FROM t2;.  
1af0: 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65 73 74  }.} {32}.do_test
1b00: 20 77 61 6c 2d 34 2e 35 2e 33 20 7b 0a 20 20 65   wal-4.5.3 {.  e
1b10: 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43  xecsql { ROLLBAC
1b20: 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d 0a 64  K TO tr }.} {}.d
1b30: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 34  o_test wal-4.5.4
1b40: 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69 7a 65   {.  set logsize
1b50: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
1b60: 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65 63 73  .db-wal].  execs
1b70: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
1b80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1b90: 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20 20 20  ('x', 'y');.    
1ba0: 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20 20 20  RELEASE tr;.    
1bb0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78  COMMIT;.  }.  ex
1bc0: 70 72 20 7b 20 24 6c 6f 67 73 69 7a 65 20 3d 3d  pr { $logsize ==
1bd0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
1be0: 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d 20 7b 31 7d  .db-wal] }.} {1}
1bf0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
1c00: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
1c10: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1c20: 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c 45 43   FROM t2 ; SELEC
1c30: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1c40: 74 31 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f  t1 }.} {1 2}.do_
1c50: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 36 20 7b  test wal-4.5.6 {
1c60: 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f  .  file copy -fo
1c70: 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  rce test.db test
1c80: 32 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79  2.db.  file copy
1c90: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d   -force test.db-
1ca0: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
1cb0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
1cc0: 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71  est2.db.  execsq
1cd0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
1ce0: 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45  (*) FROM t2 ; SE
1cf0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1d00: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t1 } db2.} {1
1d10: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   2}.do_test wal-
1d20: 34 2e 35 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  4.5.7 {.  execsq
1d30: 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  l { PRAGMA integ
1d40: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32  rity_check } db2
1d50: 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73  .} {ok}.db2 clos
1d60: 65 0a 0a 0a 72 65 6f 70 65 6e 5f 64 62 0a 64 6f  e...reopen_db.do
1d70: 5f 74 65 73 74 20 77 61 6c 2d 35 2e 31 20 7b 0a  _test wal-5.1 {.
1d80: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1d90: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
1da0: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
1db0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1dc0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
1dd0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  .} {}.do_test wa
1de0: 6c 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  l-5.2 {.  execsq
1df0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
1e00: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1e10: 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t2 VALUES(3, 4)
1e20: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
1e30: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
1e40: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73  {1 2 3 4}.do_tes
1e50: 74 20 77 61 6c 2d 35 2e 33 20 7b 0a 20 20 65 78  t wal-5.3 {.  ex
1e60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c  ecsql {.    ROLL
1e70: 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54  BACK;.    SELECT
1e80: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
1e90: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
1ea0: 77 61 6c 2d 35 2e 34 20 7b 0a 20 20 65 78 65 63  wal-5.4 {.  exec
1eb0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1ec0: 20 54 45 4d 50 20 54 41 42 4c 45 20 74 33 28 78   TEMP TABLE t3(x
1ed0: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42 45   UNIQUE);.    BE
1ee0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
1ef0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1f00: 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 49 4e  (3, 4);.      IN
1f10: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
1f20: 55 45 53 28 27 61 62 63 27 29 3b 0a 20 20 7d 0a  UES('abc');.  }.
1f30: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
1f40: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
1f50: 45 53 28 27 61 62 63 27 29 20 7d 0a 7d 20 7b 31  ES('abc') }.} {1
1f60: 20 7b 63 6f 6c 75 6d 6e 20 78 20 69 73 20 6e 6f   {column x is no
1f70: 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74 65  t unique}}.do_te
1f80: 73 74 20 77 61 6c 2d 35 2e 35 20 7b 0a 20 20 65  st wal-5.5 {.  e
1f90: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  xecsql {.    COM
1fa0: 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  MIT;.    SELECT 
1fb0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
1fc0: 20 7b 31 20 32 20 33 20 34 7d 0a 64 62 20 63 6c   {1 2 3 4}.db cl
1fd0: 6f 73 65 0a 0a 66 6f 72 65 61 63 68 20 73 65 63  ose..foreach sec
1fe0: 74 6f 72 20 7b 35 31 32 20 34 30 39 36 7d 20 7b  tor {512 4096} {
1ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c  .  sqlite3_simul
2000: 61 74 65 5f 64 65 76 69 63 65 20 2d 73 65 63 74  ate_device -sect
2010: 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 0a 20  orsize $sector. 
2020: 20 66 6f 72 65 61 63 68 20 70 67 73 7a 20 7b 35   foreach pgsz {5
2030: 31 32 20 31 30 32 34 20 32 30 34 38 20 34 30 39  12 1024 2048 409
2040: 36 7d 20 7b 0a 20 20 20 20 66 69 6c 65 20 64 65  6} {.    file de
2050: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
2060: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  .db test.db-wal.
2070: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
2080: 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e  6.$sector.$pgsz.
2090: 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1 {.      sqlite
20a0: 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66  3 db test.db -vf
20b0: 73 20 64 65 76 73 79 6d 0a 20 20 20 20 20 20 65  s devsym.      e
20c0: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20  xecsql ".       
20d0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
20e0: 65 20 3d 20 24 70 67 73 7a 3b 0a 20 20 20 20 20  e = $pgsz;.     
20f0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
2100: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
2110: 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65 63      ".      exec
2120: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 43 52  sql ".        CR
2130: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2140: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   b);.        INS
2150: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2160: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  ES(1, 2);.      
2170: 22 0a 20 20 20 20 20 20 64 62 20 63 6c 6f 73 65  ".      db close
2180: 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65  .      file size
2190: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 7d 20 5b   test.db.    } [
21a0: 65 78 70 72 20 24 70 67 73 7a 2a 32 5d 0a 20 20  expr $pgsz*2].  
21b0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
21c0: 2d 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a  -6.$sector.$pgsz
21d0: 2e 32 20 7b 0a 20 20 20 20 20 20 6c 6f 67 5f 64  .2 {.      log_d
21e0: 65 6c 65 74 65 64 20 74 65 73 74 2e 64 62 2d 77  eleted test.db-w
21f0: 61 6c 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d  al.    } {1}.  }
2200: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  .}..do_test wal-
2210: 37 2e 31 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c  7.1 {.  file del
2220: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
2230: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  db test.db-wal. 
2240: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20   sqlite3_wal db 
2250: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
2260: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
2270: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
2280: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2290: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
22a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
22b0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
22c0: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69  .  list [file si
22d0: 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c  ze test.db] [fil
22e0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
22f0: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31 30 32 34  al].} [list 1024
2300: 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20   [log_file_size 
2310: 33 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74  3 1024]].do_test
2320: 20 77 61 6c 2d 37 2e 32 20 7b 0a 20 20 65 78 65   wal-7.2 {.  exe
2330: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
2340: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
2350: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
2360: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20   test.db] [file 
2370: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
2380: 5d 0a 7d 20 5b 6c 69 73 74 20 32 30 34 38 20 5b  ].} [list 2048 [
2390: 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20  log_file_size 3 
23a0: 31 30 32 34 5d 5d 0a 0a 23 20 45 78 65 63 75 74  1024]]..# Execut
23b0: 65 20 73 6f 6d 65 20 74 72 61 6e 73 61 63 74 69  e some transacti
23c0: 6f 6e 73 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ons in auto-vacu
23d0: 75 6d 20 6d 6f 64 65 20 74 6f 20 74 65 73 74 20  um mode to test 
23e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
23f0: 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 23 0a 64 6f  truncation..#.do
2400: 5f 74 65 73 74 20 77 61 6c 2d 38 2e 31 20 7b 0a  _test wal-8.1 {.
2410: 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 63 61    reopen_db.  ca
2420: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
2430: 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  .  file delete -
2440: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
2450: 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 73 71 6c  st.db-wal..  sql
2460: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
2470: 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 62 6c    db function bl
2480: 6f 62 20 62 6c 6f 62 0a 20 20 65 78 65 63 73 71  ob blob.  execsq
2490: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  l {.    PRAGMA a
24a0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a  uto_vacuum = 1;.
24b0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
24c0: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
24d0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
24e0: 61 63 75 75 6d 3b 0a 20 20 7d 0a 7d 20 7b 77 61  acuum;.  }.} {wa
24f0: 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  l 1}.do_test wal
2500: 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.2 {.  execsql
2510: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
2520: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
2530: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2540: 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t1(x);.    INSE
2550: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2560: 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20  S(blob(900));.  
2570: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2580: 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30 30   VALUES(blob(900
2590: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
25a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
25b0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
25c0: 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a         /*  4 */.
25d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
25e0: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
25f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
2600: 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20     /*  8 */.    
2610: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2620: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
2630: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
2640: 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45  * 16 */.    INSE
2650: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2660: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
2670: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32   t1;       /* 32
2680: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
2690: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
26a0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
26b0: 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a         /* 64 */.
26c0: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
26d0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20  heckpoint;.  }. 
26e0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
26f0: 64 62 0a 7d 20 5b 65 78 70 72 20 36 38 2a 31 30  db.} [expr 68*10
2700: 32 34 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  24].do_test wal-
2710: 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.3 {.  execsql 
2720: 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  { .    DELETE FR
2730: 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69  OM t1 WHERE rowi
2740: 64 3c 35 34 3b 0a 20 20 20 20 50 52 41 47 4d 41  d<54;.    PRAGMA
2750: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
2760: 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65  .  }.  file size
2770: 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72   test.db.} [expr
2780: 20 31 34 2a 31 30 32 34 5d 0a 0a 23 20 52 75 6e   14*1024]..# Run
2790: 20 73 6f 6d 65 20 22 77 61 72 6d 2d 62 6f 64 79   some "warm-body
27a0: 22 20 74 65 73 74 73 20 74 6f 20 65 6e 73 75 72  " tests to ensur
27b0: 65 20 74 68 61 74 20 6c 6f 67 2d 73 75 6d 6d 61  e that log-summa
27c0: 72 79 20 66 69 6c 65 73 20 77 69 74 68 20 6d 6f  ry files with mo
27d0: 72 65 0a 23 20 74 68 61 6e 20 32 35 36 20 65 6e  re.# than 256 en
27e0: 74 72 69 65 73 20 28 6c 6f 67 20 73 75 6d 6d 61  tries (log summa
27f0: 72 69 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ries that contai
2800: 6e 20 69 6e 64 65 78 20 62 6c 6f 63 6b 73 29 20  n index blocks) 
2810: 77 6f 72 6b 20 4f 6b 2e 0a 23 0a 64 6f 5f 74 65  work Ok..#.do_te
2820: 73 74 20 77 61 6c 2d 39 2e 31 20 7b 0a 20 20 72  st wal-9.1 {.  r
2830: 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63 73  eopen_db.  execs
2840: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2850: 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41  TABLE t1(x PRIMA
2860: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53  RY KEY);.    INS
2870: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2880: 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  ES(blob(900));. 
2890: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
28a0: 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30  1 VALUES(blob(90
28b0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
28c0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
28d0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
28e0: 3b 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f  ;       /*  4 */
28f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2900: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2910: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2920: 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20      /*  8 */.   
2930: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2940: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2950: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
2960: 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53  /* 16 */.    INS
2970: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2980: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
2990: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33  M t1;       /* 3
29a0: 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  2 */.    INSERT 
29b0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
29c0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
29d0: 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f  ;       /* 64 */
29e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
29f0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2a00: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2a10: 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20      /* 128 */.  
2a20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2a30: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2a40: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2a50: 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 7d 0a 20   /* 256 */.  }. 
2a60: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
2a70: 64 62 0a 7d 20 31 30 32 34 0a 64 6f 5f 74 65 73  db.} 1024.do_tes
2a80: 74 20 77 61 6c 2d 39 2e 32 20 7b 0a 20 20 73 71  t wal-9.2 {.  sq
2a90: 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65  lite3_wal db2 te
2aa0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
2ab0: 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  {PRAGMA integrit
2ac0: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20  y_check } db2.} 
2ad0: 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  {ok}..do_test wa
2ae0: 6c 2d 39 2e 33 20 7b 0a 20 20 66 69 6c 65 20 64  l-9.3 {.  file d
2af0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
2b00: 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 77  t2.db test2.db-w
2b10: 61 6c 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 74  al.  file copy t
2b20: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
2b30: 20 20 66 69 6c 65 20 63 6f 70 79 20 74 65 73 74    file copy test
2b40: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
2b50: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77  -wal.  sqlite3_w
2b60: 61 6c 20 64 62 33 20 74 65 73 74 32 2e 64 62 20  al db3 test2.db 
2b70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
2b80: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2b90: 63 6b 20 7d 20 64 62 33 0a 7d 20 7b 6f 6b 7d 0a  ck } db3.} {ok}.
2ba0: 64 62 33 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  db3 close..do_te
2bb0: 73 74 20 77 61 6c 2d 39 2e 34 20 7b 0a 20 20 65  st wal-9.4 {.  e
2bc0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
2bd0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
2be0: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 73  .  db2 close.  s
2bf0: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74  qlite3_wal db2 t
2c00: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
2c10: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   {PRAGMA integri
2c20: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d  ty_check } db2.}
2c30: 20 7b 6f 6b 7d 0a 0a 66 6f 72 65 61 63 68 20 68   {ok}..foreach h
2c40: 61 6e 64 6c 65 20 7b 64 62 20 64 62 32 20 64 62  andle {db db2 db
2c50: 33 7d 20 7b 20 63 61 74 63 68 20 7b 20 24 68 61  3} { catch { $ha
2c60: 6e 64 6c 65 20 63 6c 6f 73 65 20 7d 20 7d 0a 75  ndle close } }.u
2c70: 6e 73 65 74 20 68 61 6e 64 6c 65 0a 0a 23 2d 2d  nset handle..#--
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
2cd0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
2ce0: 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 30 2e   tests - wal-10.
2cf0: 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 74 68  * - test that th
2d00: 65 20 57 41 4c 20 6c 6f 63 6b 69 6e 67 20 0a 23  e WAL locking .#
2d10: 20 73 63 68 65 6d 65 20 77 6f 72 6b 73 20 69 6e   scheme works in
2d20: 20 73 69 6d 70 6c 65 20 63 61 73 65 73 2e 20 54   simple cases. T
2d30: 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  his block of tes
2d40: 74 73 20 69 73 20 72 75 6e 20 74 77 69 63 65 2e  ts is run twice.
2d50: 20 4f 6e 63 65 0a 23 20 75 73 69 6e 67 20 6d 75   Once.# using mu
2d60: 6c 74 69 70 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  ltiple connectio
2d70: 6e 73 20 69 6e 20 74 68 65 20 61 64 64 72 65 73  ns in the addres
2d80: 73 20 73 70 61 63 65 20 6f 66 20 74 68 65 20 63  s space of the c
2d90: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2c 0a  urrent process,.
2da0: 23 20 61 6e 64 20 6f 6e 63 65 20 77 69 74 68 20  # and once with 
2db0: 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  all connections 
2dc0: 65 78 63 65 70 74 20 6f 6e 65 20 72 75 6e 6e 69  except one runni
2dd0: 6e 67 20 69 6e 20 65 78 74 65 72 6e 61 6c 20 70  ng in external p
2de0: 72 6f 63 65 73 73 65 73 2e 0a 23 0a 66 6f 72 65  rocesses..#.fore
2df0: 61 63 68 20 63 6f 64 65 20 5b 6c 69 73 74 20 7b  ach code [list {
2e00: 0a 20 20 73 65 74 20 3a 3a 63 6f 64 65 32 5f 63  .  set ::code2_c
2e10: 68 61 6e 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74  han [launch_test
2e20: 66 69 78 74 75 72 65 5d 0a 20 20 73 65 74 20 3a  fixture].  set :
2e30: 3a 63 6f 64 65 33 5f 63 68 61 6e 20 5b 6c 61 75  :code3_chan [lau
2e40: 6e 63 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d  nch_testfixture]
2e50: 0a 20 20 70 72 6f 63 20 63 6f 64 65 32 20 7b 74  .  proc code2 {t
2e60: 63 6c 7d 20 7b 20 74 65 73 74 66 69 78 74 75 72  cl} { testfixtur
2e70: 65 20 24 3a 3a 63 6f 64 65 32 5f 63 68 61 6e 20  e $::code2_chan 
2e80: 24 74 63 6c 20 7d 0a 20 20 70 72 6f 63 20 63 6f  $tcl }.  proc co
2e90: 64 65 33 20 7b 74 63 6c 7d 20 7b 20 74 65 73 74  de3 {tcl} { test
2ea0: 66 69 78 74 75 72 65 20 24 3a 3a 63 6f 64 65 33  fixture $::code3
2eb0: 5f 63 68 61 6e 20 24 74 63 6c 20 7d 0a 20 20 73  _chan $tcl }.  s
2ec0: 65 74 20 74 6e 20 31 0a 7d 20 7b 0a 20 20 70 72  et tn 1.} {.  pr
2ed0: 6f 63 20 63 6f 64 65 32 20 7b 74 63 6c 7d 20 7b  oc code2 {tcl} {
2ee0: 20 75 70 6c 65 76 65 6c 20 23 30 20 24 74 63 6c   uplevel #0 $tcl
2ef0: 20 7d 0a 20 20 70 72 6f 63 20 63 6f 64 65 33 20   }.  proc code3 
2f00: 7b 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c 20  {tcl} { uplevel 
2f10: 23 30 20 24 74 63 6c 20 7d 0a 20 20 73 65 74 20  #0 $tcl }.  set 
2f20: 74 6e 20 32 0a 7d 5d 20 7b 0a 0a 20 20 65 76 61  tn 2.}] {..  eva
2f30: 6c 20 24 63 6f 64 65 0a 20 20 72 65 6f 70 65 6e  l $code.  reopen
2f40: 5f 64 62 0a 0a 20 20 23 20 4f 70 65 6e 20 63 6f  _db..  # Open co
2f50: 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32 5d 20  nnections [db2] 
2f60: 61 6e 64 20 5b 64 62 33 5d 2e 20 44 65 70 65 6e  and [db3]. Depen
2f70: 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 74  ding on which it
2f80: 65 72 61 74 69 6f 6e 20 74 68 69 73 0a 20 20 23  eration this.  #
2f90: 20 69 73 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74   is, the connect
2fa0: 69 6f 6e 73 20 6d 61 79 20 62 65 20 63 72 65 61  ions may be crea
2fb0: 74 65 64 20 69 6e 20 74 68 69 73 20 69 6e 74 65  ted in this inte
2fc0: 72 70 72 65 74 65 72 2c 20 6f 72 20 69 6e 20 0a  rpreter, or in .
2fd0: 20 20 23 20 69 6e 74 65 72 70 72 65 74 65 72 73    # interpreters
2fe0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6f 74 68 65   running in othe
2ff0: 72 20 4f 53 20 70 72 6f 63 65 73 73 65 73 2e 20  r OS processes. 
3000: 41 73 20 73 75 63 68 2c 20 74 68 65 20 5b 64 62  As such, the [db
3010: 32 5d 20 61 6e 64 20 5b 64 62 33 5d 0a 20 20 23  2] and [db3].  #
3020: 20 63 6f 6d 6d 61 6e 64 73 20 73 68 6f 75 6c 64   commands should
3030: 20 6f 6e 6c 79 20 62 65 20 61 63 63 65 73 73 65   only be accesse
3040: 64 20 77 69 74 68 69 6e 20 5b 63 6f 64 65 32 5d  d within [code2]
3050: 20 61 6e 64 20 5b 63 6f 64 65 33 5d 20 62 6c 6f   and [code3] blo
3060: 63 6b 73 2c 0a 20 20 23 20 72 65 73 70 65 63 74  cks,.  # respect
3070: 69 76 65 6c 79 2e 0a 20 20 23 0a 20 20 63 6f 64  ively..  #.  cod
3080: 65 32 20 7b 20 73 71 6c 69 74 65 33 20 64 62 32  e2 { sqlite3 db2
3090: 20 74 65 73 74 2e 64 62 20 3b 20 64 62 32 20 65   test.db ; db2 e
30a0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  val { PRAGMA jou
30b0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20  rnal_mode = WAL 
30c0: 7d 20 7d 0a 20 20 63 6f 64 65 33 20 7b 20 73 71  } }.  code3 { sq
30d0: 6c 69 74 65 33 20 64 62 33 20 74 65 73 74 2e 64  lite3 db3 test.d
30e0: 62 20 3b 20 64 62 33 20 65 76 61 6c 20 7b 20 50  b ; db3 eval { P
30f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
3100: 64 65 20 3d 20 57 41 4c 20 7d 20 7d 0a 0a 20 20  de = WAL } }..  
3110: 23 20 53 68 6f 72 74 68 61 6e 64 20 63 6f 6d 6d  # Shorthand comm
3120: 61 6e 64 73 2e 20 45 78 65 63 75 74 65 20 53 51  ands. Execute SQ
3130: 4c 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  L using database
3140: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 32   connection [db2
3150: 5d 20 6f 72 20 0a 20 20 23 20 5b 64 62 33 5d 2e  ] or .  # [db3].
3160: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
3170: 6c 74 73 2e 0a 20 20 23 0a 20 20 70 72 6f 63 20  lts..  #.  proc 
3180: 73 71 6c 32 20 7b 73 71 6c 7d 20 7b 20 63 6f 64  sql2 {sql} { cod
3190: 65 32 20 5b 6c 69 73 74 20 64 62 32 20 65 76 61  e2 [list db2 eva
31a0: 6c 20 24 73 71 6c 5d 20 7d 0a 20 20 70 72 6f 63  l $sql] }.  proc
31b0: 20 73 71 6c 33 20 7b 73 71 6c 7d 20 7b 20 63 6f   sql3 {sql} { co
31c0: 64 65 33 20 5b 6c 69 73 74 20 64 62 33 20 65 76  de3 [list db3 ev
31d0: 61 6c 20 24 73 71 6c 5d 20 7d 0a 0a 20 20 23 20  al $sql] }..  # 
31e0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 64  Initialize the d
31f0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 61  atabase schema a
3200: 6e 64 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 23  nd contents..  #
3210: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3220: 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  0.$tn.1 {.    ex
3230: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
3240: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
3250: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
3260: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3270: 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 53 45  (1, 2);.      SE
3280: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3290: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a      }.  } {1 2}.
32a0: 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e  .  # Open a tran
32b0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 77 72 69 74  saction and writ
32c0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
32d0: 65 20 75 73 69 6e 67 20 5b 64 62 5d 2e 20 43 68  e using [db]. Ch
32e0: 65 63 6b 20 74 68 61 74 20 5b 64 62 32 5d 0a 20  eck that [db2]. 
32f0: 20 23 20 69 73 20 73 74 69 6c 6c 20 61 62 6c 65   # is still able
3300: 20 74 6f 20 72 65 61 64 20 74 68 65 20 73 6e 61   to read the sna
3310: 70 73 68 6f 74 20 62 65 66 6f 72 65 20 74 68 65  pshot before the
3320: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
3330: 20 6f 70 65 6e 65 64 2e 0a 20 20 23 0a 20 20 64   opened..  #.  d
3340: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3350: 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.2 {.    execsq
3360: 6c 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52  l { BEGIN; INSER
3370: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3380: 28 33 2c 20 34 29 3b 20 7d 0a 20 20 20 20 73 71  (3, 4); }.    sq
3390: 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  l2 {SELECT * FRO
33a0: 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a  M t1}.  } {1 2}.
33b0: 0a 20 20 23 20 48 61 76 65 20 5b 64 62 5d 20 63  .  # Have [db] c
33c0: 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
33d0: 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61  ction. Check tha
33e0: 74 20 5b 64 62 32 5d 20 69 73 20 6e 6f 77 20 73  t [db2] is now s
33f0: 65 65 69 6e 67 20 74 68 65 20 0a 20 20 23 20 6e  eeing the .  # n
3400: 65 77 2c 20 75 70 64 61 74 65 64 20 73 6e 61 70  ew, updated snap
3410: 73 68 6f 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  shot..  #.  do_t
3420: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33  est wal-10.$tn.3
3430: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3440: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73 71   COMMIT }.    sq
3450: 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  l2 {SELECT * FRO
3460: 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33  M t1}.  } {1 2 3
3470: 20 34 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64   4}..  # Have [d
3480: 62 32 5d 20 6f 70 65 6e 20 61 20 72 65 61 64 20  b2] open a read 
3490: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
34a0: 6e 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  n write to the d
34b0: 62 20 76 69 61 20 5b 64 62 5d 2e 20 43 68 65 63  b via [db]. Chec
34c0: 6b 0a 20 20 23 20 74 68 61 74 20 5b 64 62 32 5d  k.  # that [db2]
34d0: 20 69 73 20 73 74 69 6c 6c 20 73 65 65 69 6e 67   is still seeing
34e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 6e   the original sn
34f0: 61 70 73 68 6f 74 2e 20 54 68 65 6e 20 72 65 61  apshot. Then rea
3500: 64 20 77 69 74 68 20 5b 64 62 33 5d 2e 0a 20 20  d with [db3]..  
3510: 23 20 5b 64 62 33 5d 20 73 68 6f 75 6c 64 20 73  # [db3] should s
3520: 65 65 20 74 68 65 20 6e 65 77 6c 79 20 63 6f 6d  ee the newly com
3530: 6d 69 74 74 65 64 20 64 61 74 61 2e 0a 20 20 23  mitted data..  #
3540: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3550: 30 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71  0.$tn.4 {.    sq
3560: 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c  l2 { BEGIN ; SEL
3570: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
3580: 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64   } {1 2 3 4}.  d
3590: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
35a0: 6e 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.5 {.    execsq
35b0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
35c0: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
35d0: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c   }.    sql2 {SEL
35e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
35f0: 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64   } {1 2 3 4}.  d
3600: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3610: 6e 2e 36 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b  n.6 {.    sql3 {
3620: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3630: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
3640: 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61   6}.  do_test wa
3650: 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20 20 20  l-10.$tn.7 {.   
3660: 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 7d   sql2 COMMIT.  }
3670: 20 7b 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64   {}..  # Have [d
3680: 62 32 5d 20 6f 70 65 6e 20 61 20 77 72 69 74 65  b2] open a write
3690: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
36a0: 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  en attempt to wr
36b0: 69 74 65 20 74 6f 20 74 68 65 20 0a 20 20 23 20  ite to the .  # 
36c0: 64 61 74 61 62 61 73 65 20 76 69 61 20 5b 64 62  database via [db
36d0: 5d 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66  ]. This should f
36e0: 61 69 6c 20 28 77 72 69 74 65 72 20 6c 6f 63 6b  ail (writer lock
36f0: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
3700: 6e 65 64 29 2e 0a 20 20 23 0a 20 20 23 20 54 68  ned)..  #.  # Th
3710: 65 6e 20 6f 70 65 6e 20 61 20 72 65 61 64 2d 74  en open a read-t
3720: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 20  ransaction with 
3730: 5b 64 62 5d 2e 20 43 6f 6d 6d 69 74 20 74 68 65  [db]. Commit the
3740: 20 5b 64 62 32 5d 20 74 72 61 6e 73 61 63 74 69   [db2] transacti
3750: 6f 6e 0a 20 20 23 20 74 6f 20 64 69 73 6b 2e 20  on.  # to disk. 
3760: 56 65 72 69 66 79 20 74 68 61 74 20 5b 64 62 5d  Verify that [db]
3770: 20 73 74 69 6c 6c 20 63 61 6e 6e 6f 74 20 77 72   still cannot wr
3780: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
3790: 61 73 65 20 28 62 65 63 61 75 73 65 0a 20 20 23  ase (because.  #
37a0: 20 69 74 20 69 73 20 72 65 61 64 69 6e 67 20 61   it is reading a
37b0: 6e 20 6f 6c 64 20 73 6e 61 70 73 68 6f 74 29 2e  n old snapshot).
37c0: 0a 20 20 23 0a 20 20 23 20 43 6c 6f 73 65 20 74  .  #.  # Close t
37d0: 68 65 20 63 75 72 72 65 6e 74 20 5b 64 62 5d 20  he current [db] 
37e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 70 65  transaction. Ope
37f0: 6e 20 61 20 6e 65 77 20 6f 6e 65 2e 20 5b 64 62  n a new one. [db
3800: 5d 20 63 61 6e 20 6e 6f 77 20 77 72 69 74 65 0a  ] can now write.
3810: 20 20 23 20 74 6f 20 74 68 65 20 64 61 74 61 62    # to the datab
3820: 61 73 65 20 28 61 73 20 69 74 20 69 73 20 6e 6f  ase (as it is no
3830: 74 20 6c 6f 63 6b 65 64 20 61 6e 64 20 5b 64 62  t locked and [db
3840: 5d 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  ] is reading the
3850: 20 6c 61 74 65 73 74 0a 20 20 23 20 73 6e 61 70   latest.  # snap
3860: 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f  shot)..  #.  do_
3870: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3880: 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  7 {.    sql2 { B
3890: 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
38a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38  O t1 VALUES(7, 8
38b0: 29 20 3b 20 7d 0a 20 20 20 20 63 61 74 63 68 73  ) ; }.    catchs
38c0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
38d0: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30   t1 VALUES(9, 10
38e0: 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  ) }.  } {1 {data
38f0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
3900: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3910: 30 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 65 78  0.$tn.8 {.    ex
3920: 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20 3b 20  ecsql { BEGIN ; 
3930: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3940: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3950: 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  5 6}.  do_test w
3960: 61 6c 2d 31 30 2e 24 74 6e 2e 39 20 7b 0a 20 20  al-10.$tn.9 {.  
3970: 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20    sql2 COMMIT.  
3980: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
3990: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
39a0: 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20 7d 20  ES(9, 10) }.  } 
39b0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
39c0: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
39d0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 30  st wal-10.$tn.10
39e0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
39f0: 20 43 4f 4d 4d 49 54 3b 20 42 45 47 49 4e 3b 20   COMMIT; BEGIN; 
3a00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3a10: 41 4c 55 45 53 28 39 2c 20 31 30 29 3b 20 43 4f  ALUES(9, 10); CO
3a20: 4d 4d 49 54 3b 20 7d 0a 20 20 20 20 65 78 65 63  MMIT; }.    exec
3a30: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
3a40: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3a50: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
3a60: 31 30 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20  10}..  # Open a 
3a70: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
3a80: 20 77 69 74 68 20 5b 64 62 32 5d 2e 20 43 68 65   with [db2]. Che
3a90: 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65  ck that this pre
3aa0: 76 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d 0a  vents [db] from.
3ab0: 20 20 23 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e    # checkpointin
3ac0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  g the database. 
3ad0: 42 75 74 20 6e 6f 74 20 66 72 6f 6d 20 77 72 69  But not from wri
3ae0: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 20 20 23 0a  ting to it..  #.
3af0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3b00: 2e 24 74 6e 2e 31 31 20 7b 0a 20 20 20 20 73 71  .$tn.11 {.    sq
3b10: 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45  l2 { BEGIN; SELE
3b20: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
3b30: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
3b40: 37 20 38 20 39 20 31 30 7d 0a 20 20 64 6f 5f 74  7 8 9 10}.  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: 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  2 {.    catchsql
3b70: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
3b80: 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20  eckpoint } .  } 
3b90: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
3ba0: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
3bb0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 33  st wal-10.$tn.13
3bc0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3bd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3be0: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d  VALUES(11, 12) }
3bf0: 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43  .    sql2 {SELEC
3c00: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d  T * FROM t1}.  }
3c10: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3c20: 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 43 6f 6e  8 9 10}..  # Con
3c30: 6e 65 63 74 69 6f 6e 20 5b 64 62 32 5d 20 69 73  nection [db2] is
3c40: 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 20   holding a lock 
3c50: 6f 6e 20 61 20 73 6e 61 70 73 68 6f 74 2c 20 70  on a snapshot, p
3c60: 72 65 76 65 6e 74 69 6e 67 20 5b 64 62 5d 20 66  reventing [db] f
3c70: 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b 70 6f 69  rom.  # checkpoi
3c80: 6e 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  nting the databa
3c90: 73 65 2e 20 41 64 64 20 61 20 62 75 73 79 2d 68  se. Add a busy-h
3ca0: 61 6e 64 6c 65 72 20 74 6f 20 5b 64 62 5d 2e 20  andler to [db]. 
3cb0: 49 66 20 5b 64 62 32 5d 20 63 6f 6d 70 6c 65 74  If [db2] complet
3cc0: 65 73 0a 20 20 23 20 69 74 73 20 74 72 61 6e 73  es.  # its trans
3cd0: 61 63 74 69 6f 6e 20 66 72 6f 6d 20 77 69 74 68  action from with
3ce0: 69 6e 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  in the busy-hand
3cf0: 6c 65 72 2c 20 5b 64 62 5d 20 69 73 20 61 62 6c  ler, [db] is abl
3d00: 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 0a 20 20  e to complete.  
3d10: 23 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  # the checkpoint
3d20: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 23 0a   operation..  #.
3d30: 20 20 70 72 6f 63 20 62 75 73 79 68 61 6e 64 6c    proc busyhandl
3d40: 65 72 20 78 20 7b 0a 20 20 20 20 69 66 20 7b 24  er x {.    if {$
3d50: 78 3d 3d 34 7d 20 7b 20 73 71 6c 32 20 43 4f 4d  x==4} { sql2 COM
3d60: 4d 49 54 20 7d 0a 20 20 20 20 69 66 20 7b 24 78  MIT }.    if {$x
3d70: 3c 35 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d  <5} { return 0 }
3d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 0a 20 20  .    return 1.  
3d90: 7d 0a 20 20 64 62 20 62 75 73 79 20 62 75 73 79  }.  db busy busy
3da0: 68 61 6e 64 6c 65 72 0a 20 20 64 6f 5f 74 65 73  handler.  do_tes
3db0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 34 20  t wal-10.$tn.14 
3dc0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
3dd0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
3de0: 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a  point } .  } {}.
3df0: 0a 20 20 23 20 53 69 6d 69 6c 61 72 20 74 6f 20  .  # Similar to 
3e00: 74 68 65 20 74 65 73 74 20 61 62 6f 76 65 2e 20  the test above. 
3e10: 45 78 63 65 70 74 20 74 68 69 73 20 74 69 6d 65  Except this time
3e20: 2c 20 61 20 6e 65 77 20 72 65 61 64 20 74 72 61  , a new read tra
3e30: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 23 20  nsaction is.  # 
3e40: 73 74 61 72 74 65 64 20 28 64 62 33 29 20 77 68  started (db3) wh
3e50: 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
3e60: 6e 74 65 72 20 69 73 20 77 61 69 74 69 6e 67 20  nter is waiting 
3e70: 66 6f 72 20 61 6e 20 6f 6c 64 20 6f 6e 65 20 28  for an old one (
3e80: 64 62 32 29 20 74 6f 20 0a 20 20 23 20 66 69 6e  db2) to .  # fin
3e90: 69 73 68 2e 20 54 68 65 20 63 68 65 63 6b 70 6f  ish. The checkpo
3ea0: 69 6e 74 65 72 20 63 61 6e 20 66 69 6e 69 73 68  inter can finish
3eb0: 2c 20 62 75 74 20 61 6e 79 20 73 75 62 73 65 71  , but any subseq
3ec0: 75 65 6e 74 20 77 72 69 74 65 20 6f 70 65 72 61  uent write opera
3ed0: 74 69 6f 6e 73 20 0a 20 20 23 20 6d 75 73 74 20  tions .  # must 
3ee0: 77 61 69 74 20 75 6e 74 69 6c 20 61 66 74 65 72  wait until after
3ef0: 20 64 62 33 20 68 61 73 20 63 6c 6f 73 65 64 20   db3 has closed 
3f00: 74 68 65 20 72 65 61 64 20 74 72 61 6e 73 61 63  the read transac
3f10: 74 69 6f 6e 2c 20 61 73 20 64 62 33 20 69 73 20  tion, as db3 is 
3f20: 61 0a 20 20 23 20 22 72 65 67 69 6f 6e 20 44 22  a.  # "region D"
3f30: 20 77 72 69 74 65 72 2e 0a 20 20 23 0a 20 20 64   writer..  #.  d
3f40: 62 20 62 75 73 79 20 7b 7d 0a 20 20 64 6f 5f 74  b busy {}.  do_t
3f50: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3f60: 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  5 {.    sql2 { B
3f70: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
3f80: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31  ROM t1; }.  } {1
3f90: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
3fa0: 20 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f   10 11 12}.  do_
3fb0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3fc0: 31 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  16 {.    catchsq
3fd0: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
3fe0: 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d  heckpoint } .  }
3ff0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
4000: 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 70 72 6f 63   locked}}.  proc
4010: 20 62 75 73 79 68 61 6e 64 6c 65 72 20 78 20 7b   busyhandler x {
4020: 0a 20 20 20 20 69 66 20 7b 24 78 3d 3d 33 7d 20  .    if {$x==3} 
4030: 7b 20 73 71 6c 33 20 7b 20 42 45 47 49 4e 3b 20  { sql3 { BEGIN; 
4040: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4050: 20 7d 20 7d 0a 20 20 20 20 69 66 20 7b 24 78 3d   } }.    if {$x=
4060: 3d 34 7d 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49  =4} { sql2 COMMI
4070: 54 20 7d 0a 20 20 20 20 69 66 20 7b 24 78 3c 35  T }.    if {$x<5
4080: 7d 20 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  }  { return 0 }.
4090: 20 20 20 20 72 65 74 75 72 6e 20 31 0a 20 20 7d      return 1.  }
40a0: 0a 20 20 64 62 20 62 75 73 79 20 62 75 73 79 68  .  db busy busyh
40b0: 61 6e 64 6c 65 72 0a 20 20 64 6f 5f 74 65 73 74  andler.  do_test
40c0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 37 20 7b   wal-10.$tn.17 {
40d0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
40e0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
40f0: 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a 20  oint } .  } {}. 
4100: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4110: 24 74 6e 2e 31 38 20 7b 0a 20 20 20 20 73 71 6c  $tn.18 {.    sql
4120: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
4130: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20  M t1 }.  } {1 2 
4140: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
4150: 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73   11 12}.  do_tes
4160: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 39 20  t wal-10.$tn.19 
4170: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
4180: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4190: 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d  VALUES(13, 14) }
41a0: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
41b0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
41c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
41d0: 74 6e 2e 32 30 20 7b 0a 20 20 20 20 65 78 65 63  tn.20 {.    exec
41e0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
41f0: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
4200: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
4210: 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74  10 11 12}.  do_t
4220: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
4230: 31 20 7b 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d  1 {.    sql3 COM
4240: 4d 49 54 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  MIT.  } {}.  do_
4250: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4260: 32 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  22 {.    execsql
4270: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4280: 31 20 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29  1 VALUES(13, 14)
4290: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
42a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
42b0: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
42c0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
42d0: 20 31 32 20 31 33 20 31 34 7d 0a 0a 20 20 23 20   12 13 14}..  # 
42e0: 53 65 74 20 5b 64 62 33 5d 20 75 70 20 61 73 20  Set [db3] up as 
42f0: 61 20 22 72 65 67 69 6f 6e 20 44 22 20 72 65 61  a "region D" rea
4300: 64 65 72 20 61 67 61 69 6e 2e 20 54 68 65 6e 20  der again. Then 
4310: 75 70 67 72 61 64 65 20 69 74 20 74 6f 20 61 20  upgrade it to a 
4320: 77 72 69 74 65 72 0a 20 20 23 20 61 6e 64 20 62  writer.  # and b
4330: 61 63 6b 20 64 6f 77 6e 20 74 6f 20 61 20 72 65  ack down to a re
4340: 61 64 65 72 2e 20 54 68 65 6e 2c 20 63 68 65 63  ader. Then, chec
4350: 6b 20 74 68 61 74 20 61 20 63 68 65 63 6b 70 6f  k that a checkpo
4360: 69 6e 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  int is not possi
4370: 62 6c 65 0a 20 20 23 20 28 61 73 20 5b 64 62 33  ble.  # (as [db3
4380: 5d 20 73 74 69 6c 6c 20 68 61 73 20 61 20 73 6e  ] still has a sn
4390: 61 70 73 68 6f 74 20 6c 6f 63 6b 65 64 29 2e 0a  apshot locked)..
43a0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
43b0: 6c 2d 31 30 2e 24 74 6e 2e 32 33 20 7b 0a 20 20  l-10.$tn.23 {.  
43c0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
43d0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
43e0: 74 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  t }.  } {}.  do_
43f0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4400: 32 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  24 {.    sql2 { 
4410: 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20  BEGIN; SELECT * 
4420: 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b  FROM t1; }.  } {
4430: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
4440: 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34  9 10 11 12 13 14
4450: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4460: 31 30 2e 24 74 6e 2e 32 35 20 7b 0a 20 20 20 20  10.$tn.25 {.    
4470: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4480: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4490: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
44a0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36  st wal-10.$tn.26
44b0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
44c0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
44d0: 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36 29 20   VALUES(15, 16) 
44e0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
44f0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
4500: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4510: 24 74 6e 2e 32 37 20 7b 0a 20 20 20 20 73 71 6c  $tn.27 {.    sql
4520: 33 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  3 { INSERT INTO 
4530: 74 31 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36  t1 VALUES(15, 16
4540: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ) }.  } {}.  do_
4550: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4560: 32 38 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b  28 {.    code3 {
4570: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 53 54 4d  .      set ::STM
4580: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
4590: 72 65 20 64 62 33 20 22 53 45 4c 45 43 54 20 2a  re db3 "SELECT *
45a0: 20 46 52 4f 4d 20 74 31 22 20 2d 31 20 54 41 49   FROM t1" -1 TAI
45b0: 4c 5d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  L].      sqlite3
45c0: 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20  _step $::STMT.  
45d0: 20 20 7d 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d    }.    sql3 COM
45e0: 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71 6c 20  MIT.    execsql 
45f0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
4600: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  t1 }.  } {1 2 3 
4610: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
4620: 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36  1 12 13 14 15 16
4630: 7d 0a 20 20 64 62 20 62 75 73 79 20 7b 7d 0a 20  }.  db busy {}. 
4640: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4650: 24 74 6e 2e 32 39 20 7b 0a 20 20 20 20 65 78 65  $tn.29 {.    exe
4660: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
4670: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 37 2c  TO t1 VALUES(17,
4680: 20 31 38 29 20 7d 0a 20 20 20 20 63 61 74 63 68   18) }.    catch
4690: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
46a0: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20  _checkpoint }.  
46b0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
46c0: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f  s locked}}.  do_
46d0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
46e0: 33 30 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b  30 {.    code3 {
46f0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
4700: 65 20 24 3a 3a 53 54 4d 54 20 7d 0a 20 20 20 20  e $::STMT }.    
4710: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4720: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4730: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 41 74  }.  } {}..  # At
4740: 20 6f 6e 65 20 70 6f 69 6e 74 2c 20 69 66 20 61   one point, if a
4750: 20 72 65 61 64 65 72 20 66 61 69 6c 65 64 20 74   reader failed t
4760: 6f 20 75 70 67 72 61 64 65 20 74 6f 20 61 20 77  o upgrade to a w
4770: 72 69 74 65 72 20 62 65 63 61 75 73 65 20 69 74  riter because it
4780: 0a 20 20 23 20 77 61 73 20 72 65 61 64 69 6e 67  .  # was reading
4790: 20 61 6e 20 6f 6c 64 20 73 6e 61 70 73 68 6f 74   an old snapshot
47a0: 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  , the write-lock
47b0: 73 20 77 65 72 65 20 6e 6f 74 20 62 65 69 6e 67  s were not being
47c0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 23 20 54   released..  # T
47d0: 65 73 74 20 74 68 61 74 20 74 68 69 73 20 62 75  est that this bu
47e0: 67 20 68 61 73 20 62 65 65 6e 20 66 69 78 65 64  g has been fixed
47f0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
4800: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 31 20 7b 0a  wal-10.$tn.31 {.
4810: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45      execsql { BE
4820: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  GIN ; SELECT * F
4830: 52 4f 4d 20 74 31 20 7d 0a 20 20 20 20 73 71 6c  ROM t1 }.    sql
4840: 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  2 { INSERT INTO 
4850: 74 31 20 56 41 4c 55 45 53 28 31 39 2c 20 32 30  t1 VALUES(19, 20
4860: 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ) }.    catchsql
4870: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4880: 31 20 56 41 4c 55 45 53 28 32 31 2c 20 32 32 29  1 VALUES(21, 22)
4890: 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62   }.  } {1 {datab
48a0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
48b0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
48c0: 2e 24 74 6e 2e 33 32 20 7b 0a 20 20 20 20 23 20  .$tn.32 {.    # 
48d0: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  This statement w
48e0: 6f 75 6c 64 20 66 61 69 6c 20 77 68 65 6e 20 74  ould fail when t
48f0: 68 65 20 62 75 67 20 77 61 73 20 70 72 65 73 65  he bug was prese
4900: 6e 74 2e 0a 20 20 20 20 73 71 6c 32 20 7b 20 49  nt..    sql2 { I
4910: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4920: 4c 55 45 53 28 32 31 2c 20 32 32 29 20 7d 0a 20  LUES(21, 22) }. 
4930: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
4940: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 33 20 7b 0a  wal-10.$tn.33 {.
4950: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
4960: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 3b  LECT * FROM t1 ;
4970: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 7d 20 7b 31   COMMIT }.  } {1
4980: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
4990: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
49a0: 31 35 20 31 36 20 31 37 20 31 38 7d 0a 20 20 64  15 16 17 18}.  d
49b0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
49c0: 6e 2e 33 34 20 7b 0a 20 20 20 20 65 78 65 63 73  n.34 {.    execs
49d0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
49e0: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32  OM t1 }.  } {1 2
49f0: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
4a00: 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  0 11 12 13 14 15
4a10: 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30 20   16 17 18 19 20 
4a20: 32 31 20 32 32 7d 0a 0a 20 20 23 20 54 65 73 74  21 22}..  # Test
4a30: 20 74 68 61 74 20 69 66 20 61 20 63 68 65 63 6b   that if a check
4a40: 70 6f 69 6e 74 65 72 20 63 61 6e 6e 6f 74 20 6f  pointer cannot o
4a50: 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72  btain the requir
4a60: 65 64 20 6c 6f 63 6b 73 2c 20 69 74 0a 20 20 23  ed locks, it.  #
4a70: 20 72 65 6c 65 61 73 65 73 20 61 6c 6c 20 6c 6f   releases all lo
4a80: 63 6b 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  cks before retur
4a90: 6e 69 6e 67 20 61 20 62 75 73 79 20 65 72 72 6f  ning a busy erro
4aa0: 72 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  r..  #.  do_test
4ab0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 35 20 7b   wal-10.$tn.35 {
4ac0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
4ad0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
4ae0: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
4af0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4b00: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
4b10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4b20: 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  1 VALUES('c', 'd
4b30: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ');.    }.    sq
4b40: 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  l2 {.      BEGIN
4b50: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
4b60: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
4b70: 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64 7d 0a  }.  } {a b c d}.
4b80: 20 20 70 72 6f 63 20 62 75 73 79 68 61 6e 64 6c    proc busyhandl
4b90: 65 72 20 78 20 7b 20 72 65 74 75 72 6e 20 31 20  er x { return 1 
4ba0: 7d 0a 20 20 64 62 20 62 75 73 79 20 62 75 73 79  }.  db busy busy
4bb0: 68 61 6e 64 6c 65 72 0a 20 20 64 6f 5f 74 65 73  handler.  do_tes
4bc0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36 20  t wal-10.$tn.36 
4bd0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
4be0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4bf0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 31 20  kpoint }.  } {1 
4c00: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
4c10: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
4c20: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a  wal-10.$tn.36 {.
4c30: 20 20 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52      sql3 { INSER
4c40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4c50: 28 27 65 27 2c 20 27 66 27 29 20 7d 0a 20 20 20  ('e', 'f') }.   
4c60: 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a   sql2 { SELECT *
4c70: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
4c80: 61 20 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65  a b c d}.  do_te
4c90: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 37  st wal-10.$tn.37
4ca0: 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d   {.    sql2 COMM
4cb0: 49 54 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  IT.    execsql {
4cc0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4cd0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a  kpoint }.  } {}.
4ce0: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c  .  catch { db cl
4cf0: 6f 73 65 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  ose }.  catch { 
4d00: 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73  code2 { db2 clos
4d10: 65 20 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  e } }.  catch { 
4d20: 63 6f 64 65 33 20 7b 20 64 62 33 20 63 6c 6f 73  code3 { db3 clos
4d30: 65 20 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  e } }.  catch { 
4d40: 63 6c 6f 73 65 20 24 3a 3a 63 6f 64 65 32 5f 63  close $::code2_c
4d50: 68 61 6e 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  han }.  catch { 
4d60: 63 6c 6f 73 65 20 24 3a 3a 63 6f 64 65 33 5f 63  close $::code3_c
4d70: 68 61 6e 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  han }.}..#------
4d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dc0: 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b  ---.# This block
4dd0: 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31   of tests, wal-1
4de0: 31 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 6e  1.*, test that n
4df0: 6f 74 68 69 6e 67 20 67 6f 65 73 20 74 65 72 72  othing goes terr
4e00: 69 62 6c 79 20 77 72 6f 6e 67 0a 23 20 69 66 20  ibly wrong.# if 
4e10: 66 72 61 6d 65 73 20 6d 75 73 74 20 62 65 20 77  frames must be w
4e20: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
4e30: 67 20 66 69 6c 65 20 62 65 66 6f 72 65 20 61 20  g file before a 
4e40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 23  transaction is.#
4e50: 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 20 6f   committed (in o
4e60: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
4e70: 6d 65 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74 65  memory)..#.do_te
4e80: 73 74 20 77 61 6c 2d 31 31 2e 31 20 7b 0a 20 20  st wal-11.1 {.  
4e90: 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63  reopen_db.  exec
4ea0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
4eb0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
4ec0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  ;.    PRAGMA pag
4ed0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
4ee0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4ef0: 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(x PRIMARY KEY
4f00: 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  );.  }.  list [e
4f10: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
4f20: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65  est.db]/1024] [e
4f30: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
4f40: 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34  est.db-wal]/1044
4f50: 5d 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73  ].} {1 3}.do_tes
4f60: 74 20 77 61 6c 2d 31 31 2e 32 20 7b 0a 20 20 65  t wal-11.2 {.  e
4f70: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
4f80: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
4f90: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4fa0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4fb0: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
4fc0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
4fd0: 7d 20 5b 6c 69 73 74 20 33 20 5b 6c 6f 67 5f 66  } [list 3 [log_f
4fe0: 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d  ile_size 3 1024]
4ff0: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
5000: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
5010: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5020: 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39 30 30  VALUES( blob(900
5030: 29 20 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78  ) ) }.  list [ex
5040: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
5050: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69  st.db]/1024] [fi
5060: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
5070: 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b  wal].} [list 3 [
5080: 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 34 20  log_file_size 4 
5090: 31 30 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20  1024]]..do_test 
50a0: 77 61 6c 2d 31 31 2e 34 20 7b 0a 20 20 65 78 65  wal-11.4 {.  exe
50b0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
50c0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
50d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
50e0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
50f0: 3b 20 20 20 2d 2d 20 32 0a 20 20 20 20 20 20 49  ;   -- 2.      I
5100: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
5110: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
5120: 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 34 0a 20  ROM t1;   -- 4. 
5130: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5140: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
5150: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
5160: 2d 2d 20 38 0a 20 20 20 20 20 20 49 4e 53 45 52  -- 8.      INSER
5170: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
5180: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
5190: 74 31 3b 20 20 20 2d 2d 20 31 36 0a 20 20 7d 0a  t1;   -- 16.  }.
51a0: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
51b0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
51c0: 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a  /1024] [file siz
51d0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
51e0: 20 5b 6c 69 73 74 20 33 20 5b 6c 6f 67 5f 66 69   [list 3 [log_fi
51f0: 6c 65 5f 73 69 7a 65 20 33 32 20 31 30 32 34 5d  le_size 32 1024]
5200: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
5210: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
5220: 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75   .    SELECT cou
5230: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
5240: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
5250: 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d  ity_check;.  }.}
5260: 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74   {16 ok}.do_test
5270: 20 77 61 6c 2d 31 31 2e 36 20 7b 0a 20 20 65 78   wal-11.6 {.  ex
5280: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c  ecsql COMMIT.  l
5290: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
52a0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
52b0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
52c0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
52d0: 69 73 74 20 33 20 5b 6c 6f 67 5f 66 69 6c 65 5f  ist 3 [log_file_
52e0: 73 69 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a 64  size 41 1024]].d
52f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 37 20  o_test wal-11.7 
5300: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
5310: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
5320: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
5330: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
5340: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31  _check;.  }.} {1
5350: 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  6 ok}.do_test wa
5360: 6c 2d 31 31 2e 38 20 7b 0a 20 20 65 78 65 63 73  l-11.8 {.  execs
5370: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
5380: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c  checkpoint }.  l
5390: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
53a0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
53b0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
53c0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
53d0: 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65  ist 37 [log_file
53e0: 5f 73 69 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a  _size 41 1024]].
53f0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 39  do_test wal-11.9
5400: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
5410: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
5420: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
5430: 30 32 34 5d 20 5b 6c 6f 67 5f 64 65 6c 65 74 65  024] [log_delete
5440: 64 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  d test.db-wal].}
5450: 20 7b 33 37 20 31 7d 0a 73 71 6c 69 74 65 33 5f   {37 1}.sqlite3_
5460: 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 64  wal db test.db.d
5470: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 30  o_test wal-11.10
5480: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5490: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
54a0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42  size = 10;.    B
54b0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
54c0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
54d0: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
54e0: 20 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20 20 20   t1;   -- 32.   
54f0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
5500: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  *) FROM t1;.  }.
5510: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
5520: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
5530: 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a  /1024] [file siz
5540: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
5550: 20 5b 6c 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66   [list 37 [log_f
5560: 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32 34  ile_size 37 1024
5570: 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  ]].do_test wal-1
5580: 31 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.11 {.  execsql
5590: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
55a0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
55b0: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
55c0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
55d0: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  (*) FROM t1;.  }
55e0: 0a 7d 20 7b 33 32 20 31 36 7d 0a 64 6f 5f 74 65  .} {32 16}.do_te
55f0: 73 74 20 77 61 6c 2d 31 31 2e 31 32 20 7b 0a 20  st wal-11.12 {. 
5600: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
5610: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
5620: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
5630: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
5640: 5b 6c 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69  [list 37 [log_fi
5650: 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32 34 5d  le_size 37 1024]
5660: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
5670: 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .13 {.  execsql 
5680: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
5690: 4f 20 74 31 20 56 41 4c 55 45 53 28 20 62 6c 6f  O t1 VALUES( blo
56a0: 62 28 39 30 30 29 20 29 3b 0a 20 20 20 20 53 45  b(900) );.    SE
56b0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
56c0: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
56d0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
56e0: 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d  k;.  }.} {17 ok}
56f0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
5700: 31 34 20 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70  14 {.  list [exp
5710: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
5720: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c  t.db]/1024] [fil
5730: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
5740: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b  al].} [list 37 [
5750: 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 33 37  log_file_size 37
5760: 20 31 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d   1024]]...#-----
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
57c0: 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d  k of tests, wal-
57d0: 31 32 2e 2a 2c 20 74 65 73 74 73 20 74 68 65 20  12.*, tests the 
57e0: 66 69 78 20 66 6f 72 20 61 20 70 72 6f 62 6c 65  fix for a proble
57f0: 6d 20 74 68 61 74 20 0a 23 20 63 6f 75 6c 64 20  m that .# could 
5800: 6f 63 63 75 72 20 69 66 20 61 20 6c 6f 67 20 74  occur if a log t
5810: 68 61 74 20 69 73 20 61 20 70 72 65 66 69 78 20  hat is a prefix 
5820: 6f 66 20 61 6e 20 6f 6c 64 65 72 20 6c 6f 67 20  of an older log 
5830: 69 73 20 77 72 69 74 74 65 6e 20 0a 23 20 69 6e  is written .# in
5840: 74 6f 20 61 20 72 65 75 73 65 64 20 6c 6f 67 20  to a reused log 
5850: 66 69 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64  file..#.reopen_d
5860: 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32  b.do_test wal-12
5870: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5880: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
5890: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
58a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
58b0: 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45  1(x, y);.    CRE
58c0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20  ATE TABLE t2(x, 
58d0: 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  y);.    INSERT I
58e0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41  NTO t1 VALUES('A
58f0: 27 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c 69 73  ', 1);.  }.  lis
5900: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
5910: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
5920: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
5930: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
5940: 74 20 31 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69  t 1 [log_file_si
5950: 7a 65 20 35 20 31 30 32 34 5d 5d 0a 64 6f 5f 74  ze 5 1024]].do_t
5960: 65 73 74 20 77 61 6c 2d 31 32 2e 32 20 7b 0a 20  est wal-12.2 {. 
5970: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
5980: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
5990: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
59a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
59b0: 73 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20  s = normal;.    
59c0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
59d0: 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27 41  = 0 WHERE x = 'A
59e0: 27 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  ';.  }.  list [e
59f0: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5a00: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65  est.db]/1024] [e
5a10: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5a20: 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34  est.db-wal]/1044
5a30: 5d 0a 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74 65 73  ].} {3 1}.do_tes
5a40: 74 20 77 61 6c 2d 31 32 2e 33 20 7b 0a 20 20 65  t wal-12.3 {.  e
5a50: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
5a60: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
5a70: 42 27 2c 20 31 29 20 7d 0a 20 20 6c 69 73 74 20  B', 1) }.  list 
5a80: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
5a90: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
5aa0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
5ab0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
5ac0: 34 34 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74  44].} {3 2}.do_t
5ad0: 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20  est wal-12.4 {. 
5ae0: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
5af0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e  e test.db test2.
5b00: 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d  db.  file copy -
5b10: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77 61  force test.db-wa
5b20: 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  l test2.db-wal. 
5b30: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32   sqlite3_wal db2
5b40: 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63   test2.db.  exec
5b50: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
5b60: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
5b70: 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64  B 1}.db2 close.d
5b80: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 35 20  o_test wal-12.5 
5b90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5ba0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
5bb0: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44  ckpoint;.    UPD
5bc0: 41 54 45 20 74 32 20 53 45 54 20 79 20 3d 20 32  ATE t2 SET y = 2
5bd0: 20 57 48 45 52 45 20 78 20 3d 20 27 42 27 3b 20   WHERE x = 'B'; 
5be0: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
5bf0: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20  checkpoint;.    
5c00: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
5c10: 3d 20 31 20 57 48 45 52 45 20 78 20 3d 20 27 41  = 1 WHERE x = 'A
5c20: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  ';.    PRAGMA wa
5c30: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
5c40: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
5c50: 79 20 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20  y = 0 WHERE x = 
5c60: 27 41 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  'A';.    SELECT 
5c70: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
5c80: 20 7b 42 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77   {B 2}.do_test w
5c90: 61 6c 2d 31 32 2e 36 20 7b 0a 20 20 66 69 6c 65  al-12.6 {.  file
5ca0: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
5cb0: 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20  t.db test2.db.  
5cc0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
5cd0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
5ce0: 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69  t2.db-wal.  sqli
5cf0: 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74  te3_wal db2 test
5d00: 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  2.db.  execsql {
5d10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5d20: 32 20 7d 20 64 62 32 0a 7d 20 7b 42 20 32 7d 0a  2 } db2.} {B 2}.
5d30: 64 62 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f  db2 close.db clo
5d40: 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  se..#-----------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5d90: 20 54 65 73 74 20 6c 61 72 67 65 20 6c 6f 67 20   Test large log 
5da0: 73 75 6d 6d 61 72 69 65 73 2e 0a 23 0a 23 20 49  summaries..#.# I
5db0: 6e 20 74 68 69 73 20 63 61 73 65 20 22 6c 61 72  n this case "lar
5dc0: 67 65 22 20 75 73 75 61 6c 6c 79 20 6d 65 61 6e  ge" usually mean
5dd0: 73 20 61 20 6c 6f 67 20 66 69 6c 65 20 74 68 61  s a log file tha
5de0: 74 20 72 65 71 75 69 72 65 73 20 61 20 77 61 6c  t requires a wal
5df0: 2d 69 6e 64 65 78 0a 23 20 6d 61 70 70 69 6e 67  -index.# mapping
5e00: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 36 34 4b   larger than 64K
5e10: 42 20 28 74 68 65 20 64 65 66 61 75 6c 74 20 69  B (the default i
5e20: 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f  nitial allocatio
5e30: 6e 29 2e 20 41 20 36 34 4b 42 20 77 61 6c 2d 69  n). A 64KB wal-i
5e40: 6e 64 65 78 0a 23 20 69 73 20 6c 61 72 67 65 20  ndex.# is large 
5e50: 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6c 6f 67  enough for a log
5e60: 20 66 69 6c 65 20 74 68 61 74 20 63 6f 6e 74 61   file that conta
5e70: 69 6e 73 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  ins approximatel
5e80: 79 20 31 33 31 30 30 20 66 72 61 6d 65 73 2e 0a  y 13100 frames..
5e90: 23 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  # So the followi
5ea0: 6e 67 20 74 65 73 74 73 20 63 72 65 61 74 65 20  ng tests create 
5eb0: 6c 6f 67 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  logs containing 
5ec0: 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 6d 61  at least this ma
5ed0: 6e 79 20 66 72 61 6d 65 73 2e 0a 23 0a 23 20 77  ny frames..#.# w
5ee0: 61 6c 2d 31 33 2e 31 2e 2a 3a 20 54 68 69 73 20  al-13.1.*: This 
5ef0: 74 65 73 74 20 63 61 73 65 20 63 72 65 61 74 65  test case create
5f00: 73 20 61 20 76 65 72 79 20 6c 61 72 67 65 20 6c  s a very large l
5f10: 6f 67 20 66 69 6c 65 20 77 69 74 68 69 6e 20 74  og file within t
5f20: 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  he.#            
5f30: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 28 61 72   file-system (ar
5f40: 6f 75 6e 64 20 32 30 30 4d 42 29 2e 20 54 68 65  ound 200MB). The
5f50: 20 6c 6f 67 20 66 69 6c 65 20 64 6f 65 73 20 6e   log file does n
5f60: 6f 74 20 63 6f 6e 74 61 69 6e 0a 23 20 20 20 20  ot contain.#    
5f70: 20 20 20 20 20 20 20 20 20 61 6e 79 20 76 61 6c           any val
5f80: 69 64 20 66 72 61 6d 65 73 2e 20 54 65 73 74 20  id frames. Test 
5f90: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
5fa0: 65 20 66 69 6c 65 20 63 61 6e 20 73 74 69 6c 6c  e file can still
5fb0: 20 62 65 0a 23 20 20 20 20 20 20 20 20 20 20 20   be.#           
5fc0: 20 20 6f 70 65 6e 65 64 20 61 6e 64 20 71 75 65    opened and que
5fd0: 72 69 65 64 2c 20 61 6e 64 20 74 68 61 74 20 74  ried, and that t
5fe0: 68 65 20 69 6e 76 61 6c 69 64 20 6c 6f 67 20 66  he invalid log f
5ff0: 69 6c 65 20 63 61 75 73 65 73 20 6e 6f 20 0a 23  ile causes no .#
6000: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f               pro
6010: 62 6c 65 6d 73 2e 0a 23 0a 23 20 77 61 6c 2d 31  blems..#.# wal-1
6020: 33 2e 32 2e 2a 3a 20 54 65 73 74 20 74 68 61 74  3.2.*: Test that
6030: 20 61 20 70 72 6f 63 65 73 73 20 6d 61 79 20 63   a process may c
6040: 72 65 61 74 65 20 61 20 6c 61 72 67 65 20 6c 6f  reate a large lo
6050: 67 20 66 69 6c 65 20 61 6e 64 20 71 75 65 72 79  g file and query
6060: 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .#             t
6070: 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 63  he database (inc
6080: 6c 75 64 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  luding the log f
6090: 69 6c 65 20 74 68 61 74 20 69 74 20 69 74 73 65  ile that it itse
60a0: 6c 66 20 63 72 65 61 74 65 64 29 2e 0a 23 0a 23  lf created)..#.#
60b0: 20 77 61 6c 2d 31 33 2e 33 2e 2a 3a 20 54 65 73   wal-13.3.*: Tes
60c0: 74 20 74 68 61 74 20 69 66 20 61 20 76 65 72 79  t that if a very
60d0: 20 6c 61 72 67 65 20 6c 6f 67 20 66 69 6c 65 20   large log file 
60e0: 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 64 20  is created, and 
60f0: 74 68 65 6e 20 61 0a 23 20 20 20 20 20 20 20 20  then a.#        
6100: 20 20 20 20 20 73 65 63 6f 6e 64 20 63 6f 6e 6e       second conn
6110: 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64  ection is opened
6120: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
6130: 20 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73   file, it is pos
6140: 73 69 62 6c 65 0a 23 20 20 20 20 20 20 20 20 20  sible.#         
6150: 20 20 20 20 74 6f 20 71 75 65 72 79 20 74 68 65      to query the
6160: 20 64 61 74 61 62 61 73 65 20 28 61 6e 64 20 74   database (and t
6170: 68 65 20 76 65 72 79 20 6c 61 72 67 65 20 6c 6f  he very large lo
6180: 67 29 20 75 73 69 6e 67 20 74 68 65 0a 23 20 20  g) using the.#  
6190: 20 20 20 20 20 20 20 20 20 20 20 73 65 63 6f 6e             secon
61a0: 64 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23 0a  d connection..#.
61b0: 23 20 77 61 6c 2d 31 33 2e 34 2e 2a 3a 20 53 61  # wal-13.4.*: Sa
61c0: 6d 65 20 74 65 73 74 20 61 73 20 77 61 6c 2d 31  me test as wal-1
61d0: 33 2e 33 2e 2a 2e 20 45 78 63 65 70 74 20 69 6e  3.3.*. Except in
61e0: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 73   this case the s
61f0: 65 63 6f 6e 64 0a 23 20 20 20 20 20 20 20 20 20  econd.#         
6200: 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69      connection i
6210: 73 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65  s opened by an e
6220: 78 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 2e  xternal process.
6230: 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .#.do_test wal-1
6240: 33 2e 31 2e 31 20 7b 0a 20 20 6c 69 73 74 20 5b  3.1.1 {.  list [
6250: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
6260: 2e 64 62 5d 20 5b 66 69 6c 65 20 65 78 69 73 74  .db] [file exist
6270: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  s test.db-wal].}
6280: 20 7b 31 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77   {1 0}.do_test w
6290: 61 6c 2d 31 33 2e 31 2e 32 20 7b 0a 20 20 73 65  al-13.1.2 {.  se
62a0: 74 20 66 64 20 5b 6f 70 65 6e 20 74 65 73 74 2e  t fd [open test.
62b0: 64 62 2d 77 61 6c 20 77 5d 0a 20 20 73 65 65 6b  db-wal w].  seek
62c0: 20 24 66 64 20 5b 65 78 70 72 20 32 30 30 2a 31   $fd [expr 200*1
62d0: 30 32 34 2a 31 30 32 34 5d 0a 20 20 70 75 74 73  024*1024].  puts
62e0: 20 24 66 64 20 22 22 0a 20 20 63 6c 6f 73 65 20   $fd "".  close 
62f0: 24 66 64 0a 20 20 73 71 6c 69 74 65 33 20 64 62  $fd.  sqlite3 db
6300: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
6310: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
6320: 4f 4d 20 74 32 20 7d 0a 7d 20 7b 42 20 32 7d 0a  OM t2 }.} {B 2}.
6330: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 31  do_test wal-13.1
6340: 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .3 {.  db close.
6350: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
6360: 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a  st.db-wal.} {0}.
6370: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e  .do_test wal-13.
6380: 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  2.1 {.  sqlite3 
6390: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65  db test.db.  exe
63a0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
63b0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d  unt(*) FROM t2 }
63c0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
63d0: 61 6c 2d 31 33 2e 32 2e 32 20 7b 0a 20 20 66 6f  al-13.2.2 {.  fo
63e0: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 20  r {set i 0} {$i 
63f0: 3c 20 31 36 7d 20 7b 69 6e 63 72 20 69 7d 20 7b  < 16} {incr i} {
6400: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49  .    execsql { I
6410: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
6420: 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  LECT randomblob(
6430: 34 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  400), randomblob
6440: 28 34 30 30 29 20 46 52 4f 4d 20 74 32 20 7d 0a  (400) FROM t2 }.
6450: 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20    }.  execsql { 
6460: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
6470: 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 5b 65 78 70  FROM t2 }.} [exp
6480: 72 20 69 6e 74 28 70 6f 77 28 32 2c 20 31 36 29  r int(pow(2, 16)
6490: 29 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  )].do_test wal-1
64a0: 33 2e 32 2e 31 20 7b 0a 20 20 66 69 6c 65 20 73  3.2.1 {.  file s
64b0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  ize test.db-wal.
64c0: 7d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65  } [log_file_size
64d0: 20 33 33 31 32 33 20 31 30 32 34 5d 0a 0a 66 6f   33123 1024]..fo
64e0: 72 65 61 63 68 20 63 6f 64 65 20 5b 6c 69 73 74  reach code [list
64f0: 20 7b 0a 20 20 73 65 74 20 74 6e 20 33 0a 20 20   {.  set tn 3.  
6500: 70 72 6f 63 20 62 75 64 64 79 20 7b 74 63 6c 7d  proc buddy {tcl}
6510: 20 7b 20 75 70 6c 65 76 65 6c 20 23 30 20 24 74   { uplevel #0 $t
6520: 63 6c 20 7d 0a 7d 20 7b 0a 20 20 73 65 74 20 74  cl }.} {.  set t
6530: 6e 20 34 0a 20 20 73 65 74 20 3a 3a 62 75 64 64  n 4.  set ::budd
6540: 79 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74 66 69  y [launch_testfi
6550: 78 74 75 72 65 5d 0a 20 20 70 72 6f 63 20 62 75  xture].  proc bu
6560: 64 64 79 20 7b 74 63 6c 7d 20 7b 20 74 65 73 74  ddy {tcl} { test
6570: 66 69 78 74 75 72 65 20 24 3a 3a 62 75 64 64 79  fixture $::buddy
6580: 20 24 74 63 6c 20 7d 0a 7d 5d 20 7b 0a 0a 20 20   $tcl }.}] {..  
6590: 65 76 61 6c 20 24 63 6f 64 65 0a 20 20 72 65 6f  eval $code.  reo
65a0: 70 65 6e 5f 64 62 0a 0a 20 20 64 6f 5f 74 65 73  pen_db..  do_tes
65b0: 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 30 20 7b  t wal-13.$tn.0 {
65c0: 0a 20 20 20 20 62 75 64 64 79 20 7b 20 73 71 6c  .    buddy { sql
65d0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
65e0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
65f0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f  .      PRAGMA jo
6600: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
6610: 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20 54  ;.      CREATE T
6620: 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20 20  ABLE t1(x);.    
6630: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6640: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6650: 6f 62 28 38 30 30 29 3b 0a 20 20 20 20 7d 0a 20  ob(800);.    }. 
6660: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
6670: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
6680: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 7d 0a 0a  M t1 }.  } {1}..
6690: 20 20 66 6f 72 20 7b 73 65 74 20 69 69 20 31 7d    for {set ii 1}
66a0: 20 7b 24 69 69 3c 31 36 7d 20 7b 69 6e 63 72 20   {$ii<16} {incr 
66b0: 69 69 7d 20 7b 0a 20 20 20 20 64 6f 5f 74 65 73  ii} {.    do_tes
66c0: 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e 24 69 69  t wal-13.$tn.$ii
66d0: 2e 61 20 7b 0a 20 20 20 20 20 20 62 75 64 64 79  .a {.      buddy
66e0: 20 7b 20 64 62 32 20 65 76 61 6c 20 7b 20 49 4e   { db2 eval { IN
66f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
6700: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 38  ECT randomblob(8
6710: 30 30 29 20 46 52 4f 4d 20 74 31 20 7d 20 7d 0a  00) FROM t1 } }.
6720: 20 20 20 20 20 20 62 75 64 64 79 20 7b 20 64 62        buddy { db
6730: 32 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  2 eval { SELECT 
6740: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
6750: 20 7d 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72   } }.    } [expr
6760: 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64   (1<<$ii)].    d
6770: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74  o_test wal-13.$t
6780: 6e 2e 24 69 69 2e 62 20 7b 0a 20 20 20 20 20 20  n.$ii.b {.      
6790: 64 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54  db eval { SELECT
67a0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
67b0: 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72 20  1 }.    } [expr 
67c0: 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f  (1<<$ii)].    do
67d0: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e  _test wal-13.$tn
67e0: 2e 24 69 69 2e 63 20 7b 0a 20 20 20 20 20 20 64  .$ii.c {.      d
67f0: 62 20 65 76 61 6c 20 7b 20 53 45 4c 45 43 54 20  b eval { SELECT 
6800: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
6810: 20 7d 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 28   }.    } [expr (
6820: 31 3c 3c 24 69 69 29 5d 0a 20 20 20 20 64 6f 5f  1<<$ii)].    do_
6830: 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e 2e  test wal-13.$tn.
6840: 24 69 69 2e 64 20 7b 0a 20 20 20 20 20 20 64 62  $ii.d {.      db
6850: 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 69   eval { PRAGMA i
6860: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
6870: 0a 20 20 20 20 7d 20 7b 6f 6b 7d 0a 20 20 7d 0a  .    } {ok}.  }.
6880: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 32 20 63  .  catch { db2 c
6890: 6c 6f 73 65 20 7d 0a 20 20 63 61 74 63 68 20 7b  lose }.  catch {
68a0: 20 63 6c 6f 73 65 20 24 3a 3a 62 75 64 64 79 20   close $::buddy 
68b0: 7d 0a 20 20 64 62 20 63 6c 6f 73 65 0a 7d 0a 0a  }.  db close.}..
68c0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
68d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
68f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65  ----------.# Che
6910: 63 6b 20 61 20 66 75 6e 20 63 6f 72 72 75 70 74  ck a fun corrupt
6920: 69 6f 6e 20 63 61 73 65 20 68 61 73 20 62 65 65  ion case has bee
6930: 6e 20 66 69 78 65 64 2e 0a 23 0a 23 20 54 68 65  n fixed..#.# The
6940: 20 70 72 6f 62 6c 65 6d 20 77 61 73 20 74 68 61   problem was tha
6950: 74 20 61 66 74 65 72 20 70 65 72 66 6f 72 6d 69  t after performi
6960: 6e 67 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  ng a checkpoint 
6970: 75 73 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  using a connecti
6980: 6f 6e 0a 23 20 74 68 61 74 20 68 61 64 20 61 6e  on.# that had an
6990: 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 70 61 67   out-of-date pag
69a0: 65 72 2d 63 61 63 68 65 2c 20 74 68 65 20 6e 65  er-cache, the ne
69b0: 78 74 20 74 69 6d 65 20 74 68 65 20 63 6f 6e 6e  xt time the conn
69c0: 65 63 74 69 6f 6e 20 77 61 73 0a 23 20 75 73 65  ection was.# use
69d0: 64 20 69 74 20 64 69 64 20 6e 6f 74 20 72 65 61  d it did not rea
69e0: 6c 69 7a 65 20 74 68 65 20 63 61 63 68 65 20 77  lize the cache w
69f0: 61 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 61  as out-of-date a
6a00: 6e 64 20 70 72 6f 63 65 65 64 65 64 20 74 6f 0a  nd proceeded to.
6a10: 23 20 6f 70 65 72 61 74 65 20 77 69 74 68 20 61  # operate with a
6a20: 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63  n inconsistent c
6a30: 61 63 68 65 2e 20 4c 65 61 64 69 6e 67 20 74 6f  ache. Leading to
6a40: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23 0a 63   corruption..#.c
6a50: 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20  atch { db close 
6a60: 7d 0a 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c  }.catch { db2 cl
6a70: 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62  ose }.catch { db
6a80: 33 20 63 6c 6f 73 65 20 7d 0a 66 69 6c 65 20 64  3 close }.file d
6a90: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
6aa0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
6ab0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
6ac0: 2e 64 62 0a 73 71 6c 69 74 65 33 20 64 62 32 20  .db.sqlite3 db2 
6ad0: 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20  test.db.do_test 
6ae0: 77 61 6c 2d 31 34 20 7b 0a 20 20 65 78 65 63 73  wal-14 {.  execs
6af0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
6b00: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
6b10: 41 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  AL;.    CREATE T
6b20: 41 42 4c 45 20 74 31 28 61 20 50 52 49 4d 41 52  ABLE t1(a PRIMAR
6b30: 59 20 4b 45 59 2c 20 62 29 3b 0a 20 20 20 20 49  Y KEY, b);.    I
6b40: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
6b50: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
6b60: 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  10), randomblob(
6b70: 31 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52  100));.    INSER
6b80: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
6b90: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c   randomblob(10),
6ba0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
6bb0: 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e   FROM t1;.    IN
6bc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
6bd0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
6be0: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
6bf0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  00) FROM t1;.   
6c00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6c10: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
6c20: 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  b(10), randomblo
6c30: 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(100) FROM t1;.
6c40: 20 20 7d 0a 0a 20 20 64 62 32 20 65 76 61 6c 20    }..  db2 eval 
6c50: 7b 20 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  { .    INSERT IN
6c60: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
6c70: 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e  domblob(10), ran
6c80: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20 20  domblob(100);.  
6c90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
6ca0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6cb0: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
6cc0: 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53  ob(100);.    INS
6cd0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
6ce0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  CT randomblob(10
6cf0: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
6d00: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
6d10: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
6d20: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
6d30: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20  ndomblob(100);. 
6d40: 20 7d 0a 0a 20 20 23 20 41 66 74 65 72 20 65 78   }..  # After ex
6d50: 65 63 75 74 69 6e 67 20 74 68 65 20 22 50 52 41  ecuting the "PRA
6d60: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
6d70: 6e 74 22 2c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  nt", connection 
6d80: 5b 64 62 5d 20 77 61 73 20 62 65 69 6e 67 0a 20  [db] was being. 
6d90: 20 23 20 6c 65 66 74 20 77 69 74 68 20 61 6e 20   # left with an 
6da0: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
6db0: 68 65 2e 20 52 75 6e 6e 69 6e 67 20 74 68 65 20  he. Running the 
6dc0: 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
6dd0: 74 65 6d 65 6e 74 0a 20 20 23 20 69 6e 20 74 68  tement.  # in th
6de0: 69 73 20 73 74 61 74 65 20 6c 65 64 20 74 6f 20  is state led to 
6df0: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
6e00: 69 6f 6e 2e 0a 20 20 63 61 74 63 68 73 71 6c 20  ion..  catchsql 
6e10: 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  { .    PRAGMA wa
6e20: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
6e30: 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
6e40: 31 20 6f 6e 20 74 31 28 62 29 3b 0a 20 20 7d 0a  1 on t1(b);.  }.
6e50: 20 20 20 0a 20 20 64 62 32 20 65 76 61 6c 20 7b     .  db2 eval {
6e60: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
6e70: 79 5f 63 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d  y_check }.} {ok}
6e80: 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f  ..catch { db clo
6e90: 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 32  se }.catch { db2
6ea0: 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d   close }..#-----
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f  ----.# The follo
6f00: 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65  wing block of te
6f10: 73 74 73 20 2d 20 77 61 6c 2d 31 35 2e 2a 20 2d  sts - wal-15.* -
6f20: 20 66 6f 63 75 73 20 6f 6e 20 74 65 73 74 69 6e   focus on testin
6f30: 67 20 74 68 65 20 0a 23 20 69 6d 70 6c 65 6d 65  g the .# impleme
6f40: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
6f50: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
6f60: 70 6f 69 6e 74 28 29 20 69 6e 74 65 72 66 61 63  point() interfac
6f70: 65 2e 0a 23 0a 66 69 6c 65 20 64 65 6c 65 74 65  e..#.file delete
6f80: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
6f90: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 73 71 6c 69  test.db-wal.sqli
6fa0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 64  te3 db test.db.d
6fb0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 31 20  o_test wal-15.1 
6fc0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
6fd0: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
6fe0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
6ff0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
7000: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 7d 0a 20 20  de = WAL;.  }.  
7010: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
7020: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
7030: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
7040: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
7050: 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  , 2);.  }.} {}..
7060: 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 65  # Test that an e
7070: 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
7080: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
7090: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72 65 63   name is not rec
70a0: 6f 67 6e 69 7a 65 64 0a 23 0a 64 6f 5f 74 65 73  ognized.#.do_tes
70b0: 74 20 77 61 6c 2d 31 35 2e 32 2e 31 20 7b 0a 20  t wal-15.2.1 {. 
70c0: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
70d0: 63 6b 70 6f 69 6e 74 20 64 62 20 61 75 78 0a 7d  ckpoint db aux.}
70e0: 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a   {SQLITE_ERROR}.
70f0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 32  do_test wal-15.2
7100: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .2 {.  sqlite3_e
7110: 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c  rrcode db.} {SQL
7120: 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65  ITE_ERROR}.do_te
7130: 73 74 20 77 61 6c 2d 31 35 2e 32 2e 33 20 7b 0a  st wal-15.2.3 {.
7140: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
7150: 20 64 62 0a 7d 20 7b 75 6e 6b 6e 6f 77 6e 20 64   db.} {unknown d
7160: 61 74 61 62 61 73 65 3a 20 61 75 78 7d 0a 0a 23  atabase: aux}..#
7170: 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 65 72   Test that an er
7180: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
7190: 69 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  if an attempt is
71a0: 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
71b0: 69 6e 74 0a 23 20 69 66 20 61 20 74 72 61 6e 73  int.# if a trans
71c0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
71d0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
71e0: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  #.do_test wal-15
71f0: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
7200: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
7210: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7220: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
7230: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c   }.  sqlite3_wal
7240: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 6d  _checkpoint db m
7250: 61 69 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f  ain.} {SQLITE_LO
7260: 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20 77 61  CKED}.do_test wa
7270: 6c 2d 31 35 2e 33 2e 32 20 7b 0a 20 20 73 71 6c  l-15.3.2 {.  sql
7280: 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62 0a  ite3_errcode db.
7290: 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  } {SQLITE_LOCKED
72a0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
72b0: 2e 33 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  .3.3 {.  sqlite3
72c0: 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 64 61  _errmsg db.} {da
72d0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
72e0: 6c 6f 63 6b 65 64 7d 0a 0a 23 20 41 6c 73 6f 20  locked}..# Also 
72f0: 74 65 73 74 20 74 68 61 74 20 61 6e 20 65 72 72  test that an err
7300: 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
7310: 66 20 74 68 65 20 64 62 20 63 61 6e 6e 6f 74 20  f the db cannot 
7320: 62 65 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 0a  be checkpointed.
7330: 23 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  # because of loc
7340: 6b 73 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ks held by anoth
7350: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 23  er connection..#
7360: 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73  .sqlite3 db2 tes
7370: 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c  t.db.do_test wal
7380: 2d 31 35 2e 34 2e 31 20 7b 0a 20 20 65 78 65 63  -15.4.1 {.  exec
7390: 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b  sql {.    BEGIN;
73a0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
73b0: 4f 4d 20 74 31 3b 0a 20 20 7d 20 64 62 32 0a 7d  OM t1;.  } db2.}
73c0: 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77   {1 2}.do_test w
73d0: 61 6c 2d 31 35 2e 34 2e 32 20 7b 0a 20 20 65 78  al-15.4.2 {.  ex
73e0: 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d  ecsql { COMMIT }
73f0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  .  sqlite3_wal_c
7400: 68 65 63 6b 70 6f 69 6e 74 20 64 62 0a 7d 20 7b  heckpoint db.} {
7410: 53 51 4c 49 54 45 5f 42 55 53 59 7d 0a 64 6f 5f  SQLITE_BUSY}.do_
7420: 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 33 20  test wal-15.4.3 
7430: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  {.  sqlite3_errm
7440: 73 67 20 64 62 0a 7d 20 7b 64 61 74 61 62 61 73  sg db.} {databas
7450: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 0a 0a 23 20  e is locked}..# 
7460: 41 66 74 65 72 20 5b 64 62 32 5d 20 64 72 6f 70  After [db2] drop
7470: 73 20 69 74 73 20 6c 6f 63 6b 2c 20 5b 64 62 5d  s its lock, [db]
7480: 20 6d 61 79 20 63 68 65 63 6b 70 6f 69 6e 74 20   may checkpoint 
7490: 74 68 65 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73  the db..#.do_tes
74a0: 74 20 77 61 6c 2d 31 35 2e 34 2e 34 20 7b 0a 20  t wal-15.4.4 {. 
74b0: 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49   execsql { COMMI
74c0: 54 20 7d 20 64 62 32 0a 20 20 73 71 6c 69 74 65  T } db2.  sqlite
74d0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
74e0: 20 64 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b   db.} {SQLITE_OK
74f0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
7500: 2e 34 2e 35 20 7b 0a 20 20 73 71 6c 69 74 65 33  .4.5 {.  sqlite3
7510: 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 6e 6f  _errmsg db.} {no
7520: 74 20 61 6e 20 65 72 72 6f 72 7d 0a 64 6f 5f 74  t an error}.do_t
7530: 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 36 20 7b  est wal-15.4.6 {
7540: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
7550: 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 30 32  t.db.} [expr 102
7560: 34 2a 32 5d 0a 0a 63 61 74 63 68 20 7b 20 64 62  4*2]..catch { db
7570: 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20  2 close }.catch 
7580: 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d  { db close }..#-
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66  --------.# The f
75e0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f  ollowing block o
75f0: 66 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 36  f tests - wal-16
7600: 2e 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 69  .* - test that i
7610: 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  f a NULL pointer
7620: 20 6f 72 0a 23 20 61 6e 20 65 6d 70 74 79 20 73   or.# an empty s
7630: 74 72 69 6e 67 20 69 73 20 70 61 73 73 65 64 20  tring is passed 
7640: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
7650: 67 75 6d 65 6e 74 20 6f 66 20 74 68 65 20 77 61  gument of the wa
7660: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 29 0a 23  l_checkpoint().#
7670: 20 41 50 49 2c 20 61 6e 20 61 74 74 65 6d 70 74   API, an attempt
7680: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63   is made to chec
7690: 6b 70 6f 69 6e 74 20 61 6c 6c 20 61 74 74 61 63  kpoint all attac
76a0: 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a 23  hed databases..#
76b0: 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 63 6b 70  .foreach {tn ckp
76c0: 74 5f 63 6d 64 20 63 6b 70 74 5f 72 65 73 20 63  t_cmd ckpt_res c
76d0: 6b 70 74 5f 6d 61 69 6e 20 63 6b 70 74 5f 61 75  kpt_main ckpt_au
76e0: 78 7d 20 7b 0a 20 20 31 20 7b 73 71 6c 69 74 65  x} {.  1 {sqlite
76f0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
7700: 20 64 62 7d 20 20 20 20 20 20 20 20 20 20 20 20   db}            
7710: 20 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20    SQLITE_OK     
7720: 31 20 31 0a 20 20 32 20 7b 73 71 6c 69 74 65 33  1 1.  2 {sqlite3
7730: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
7740: 64 62 20 22 22 7d 20 20 20 20 20 20 20 20 20 20  db ""}          
7750: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31   SQLITE_OK     1
7760: 20 31 0a 20 20 33 20 7b 64 62 20 65 76 61 6c 20   1.  3 {db eval 
7770: 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63  "PRAGMA wal_chec
7780: 6b 70 6f 69 6e 74 22 7d 20 20 20 20 20 20 20 20  kpoint"}        
7790: 7b 7d 20 20 20 20 20 20 20 20 20 20 20 20 31 20  {}            1 
77a0: 31 0a 0a 20 20 34 20 7b 73 71 6c 69 74 65 33 5f  1..  4 {sqlite3_
77b0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
77c0: 62 20 6d 61 69 6e 7d 20 20 20 20 20 20 20 20 20  b main}         
77d0: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20  SQLITE_OK     1 
77e0: 30 0a 20 20 35 20 7b 73 71 6c 69 74 65 33 5f 77  0.  5 {sqlite3_w
77f0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
7800: 20 61 75 78 7d 20 20 20 20 20 20 20 20 20 20 53   aux}          S
7810: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 30 20 31  QLITE_OK     0 1
7820: 0a 20 20 36 20 7b 73 71 6c 69 74 65 33 5f 77 61  .  6 {sqlite3_wa
7830: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
7840: 74 65 6d 70 7d 20 20 20 20 20 20 20 20 20 53 51  temp}         SQ
7850: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 30 20 30 0a  LITE_OK     0 0.
7860: 20 20 37 20 7b 64 62 20 65 76 61 6c 20 22 50 52    7 {db eval "PR
7870: 41 47 4d 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68  AGMA main.wal_ch
7880: 65 63 6b 70 6f 69 6e 74 22 7d 20 20 20 7b 7d 20  eckpoint"}   {} 
7890: 20 20 20 20 20 20 20 20 20 20 20 31 20 30 0a 20             1 0. 
78a0: 20 38 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41   8 {db eval "PRA
78b0: 47 4d 41 20 61 75 78 2e 77 61 6c 5f 63 68 65 63  GMA aux.wal_chec
78c0: 6b 70 6f 69 6e 74 22 7d 20 20 20 20 7b 7d 20 20  kpoint"}    {}  
78d0: 20 20 20 20 20 20 20 20 20 20 30 20 31 0a 20 20            0 1.  
78e0: 39 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47  9 {db eval "PRAG
78f0: 4d 41 20 74 65 6d 70 2e 77 61 6c 5f 63 68 65 63  MA temp.wal_chec
7900: 6b 70 6f 69 6e 74 22 7d 20 20 20 7b 7d 20 20 20  kpoint"}   {}   
7910: 20 20 20 20 20 20 20 20 20 30 20 30 0a 7d 20 7b           0 0.} {
7920: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
7930: 36 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 66 69  6.$tn.1 {.    fi
7940: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
7950: 20 74 65 73 74 32 2e 64 62 20 74 65 73 74 32 2e   test2.db test2.
7960: 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62 2d  db-wal test2.db-
7970: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 66 69 6c 65  journal.    file
7980: 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74   delete -force t
7990: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
79a0: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
79b0: 61 6c 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 20  al..    sqlite3 
79c0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65  db test.db.    e
79d0: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41  xecsql {.      A
79e0: 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27  TTACH 'test2.db'
79f0: 20 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20 50   AS aux;.      P
7a00: 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e  RAGMA main.journ
7a10: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
7a20: 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e       PRAGMA aux.
7a30: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
7a40: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
7a50: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e   synchronous = N
7a60: 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  ORMAL;.    }.  }
7a70: 20 7b 77 61 6c 20 77 61 6c 7d 0a 0a 20 20 64 6f   {wal wal}..  do
7a80: 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e  _test wal-16.$tn
7a90: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
7aa0: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
7ab0: 54 41 42 4c 45 20 6d 61 69 6e 2e 74 31 28 61 2c  TABLE main.t1(a,
7ac0: 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
7ad0: 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 43 52  a, b));.      CR
7ae0: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
7af0: 32 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  2(a, b, PRIMARY 
7b00: 4b 45 59 28 61 2c 20 62 29 29 3b 0a 0a 20 20 20  KEY(a, b));..   
7b10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
7b20: 32 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64  2 VALUES(1, rand
7b30: 6f 6d 62 6c 6f 62 28 31 30 30 30 29 29 3b 0a 20  omblob(1000));. 
7b40: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
7b50: 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 72 61   t2 VALUES(2, ra
7b60: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 29 29 3b  ndomblob(1000));
7b70: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
7b80: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
7b90: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20  ROM t2;.    }.  
7ba0: 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  .    list [file 
7bb0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66  size test.db] [f
7bc0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
7bd0: 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20  -wal].  } [list 
7be0: 5b 65 78 70 72 20 31 2a 31 30 32 34 5d 20 5b 6c  [expr 1*1024] [l
7bf0: 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 31 30 20  og_file_size 10 
7c00: 31 30 32 34 5d 5d 0a 20 20 64 6f 5f 74 65 73 74  1024]].  do_test
7c10: 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 33 20 7b 0a   wal-16.$tn.3 {.
7c20: 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73      list [file s
7c30: 69 7a 65 20 74 65 73 74 32 2e 64 62 5d 20 5b 66  ize test2.db] [f
7c40: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64  ile size test2.d
7c50: 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74  b-wal].  } [list
7c60: 20 5b 65 78 70 72 20 31 2a 31 30 32 34 5d 20 5b   [expr 1*1024] [
7c70: 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 31 36  log_file_size 16
7c80: 20 31 30 32 34 5d 5d 0a 20 20 0a 20 20 64 6f 5f   1024]].  .  do_
7c90: 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e  test wal-16.$tn.
7ca0: 34 20 5b 6c 69 73 74 20 65 76 61 6c 20 24 63 6b  4 [list eval $ck
7cb0: 70 74 5f 63 6d 64 5d 20 24 63 6b 70 74 5f 72 65  pt_cmd] $ckpt_re
7cc0: 73 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 77  s.  .  do_test w
7cd0: 61 6c 2d 31 36 2e 24 74 6e 2e 35 20 7b 0a 20 20  al-16.$tn.5 {.  
7ce0: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a    list [file siz
7cf0: 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65  e test.db] [file
7d00: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
7d10: 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78  l].  } [list [ex
7d20: 70 72 20 28 24 63 6b 70 74 5f 6d 61 69 6e 20 3f  pr ($ckpt_main ?
7d30: 20 37 20 3a 20 31 29 2a 31 30 32 34 5d 20 5b 6c   7 : 1)*1024] [l
7d40: 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 31 30 20  og_file_size 10 
7d50: 31 30 32 34 5d 5d 0a 0a 20 20 64 6f 5f 74 65 73  1024]]..  do_tes
7d60: 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 36 20 7b  t wal-16.$tn.6 {
7d70: 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  .    list [file 
7d80: 73 69 7a 65 20 74 65 73 74 32 2e 64 62 5d 20 5b  size test2.db] [
7d90: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e  file size test2.
7da0: 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73  db-wal].  } [lis
7db0: 74 20 5b 65 78 70 72 20 28 24 63 6b 70 74 5f 61  t [expr ($ckpt_a
7dc0: 75 78 20 3f 20 37 20 3a 20 31 29 2a 31 30 32 34  ux ? 7 : 1)*1024
7dd0: 5d 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65  ] [log_file_size
7de0: 20 31 36 20 31 30 32 34 5d 5d 0a 0a 20 20 63 61   16 1024]]..  ca
7df0: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
7e00: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
7e50: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
7e60: 65 73 74 73 20 2d 20 77 61 6c 2d 31 37 2e 2a 20  ests - wal-17.* 
7e70: 2d 20 61 74 74 65 6d 70 74 20 74 6f 20 76 65 72  - attempt to ver
7e80: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 72  ify that the cor
7e90: 72 65 63 74 0a 23 20 6e 75 6d 62 65 72 20 6f 66  rect.# number of
7ea0: 20 22 70 61 64 64 69 6e 67 22 20 66 72 61 6d 65   "padding" frame
7eb0: 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  s are appended t
7ec0: 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77  o the log file w
7ed0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
7ee0: 6e 0a 23 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  n.# is committed
7ef0: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d   in synchronous=
7f00: 46 55 4c 4c 20 6d 6f 64 65 2e 0a 23 20 0a 23 20  FULL mode..# .# 
7f10: 44 6f 20 74 68 69 73 20 62 79 20 63 72 65 61 74  Do this by creat
7f20: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 74  ing a database t
7f30: 68 61 74 20 75 73 65 73 20 35 31 32 20 62 79 74  hat uses 512 byt
7f40: 65 20 70 61 67 65 73 2e 20 54 68 65 6e 20 77 72  e pages. Then wr
7f50: 69 74 69 6e 67 0a 23 20 61 20 74 72 61 6e 73 61  iting.# a transa
7f60: 63 74 69 6f 6e 20 74 68 61 74 20 6d 6f 64 69 66  ction that modif
7f70: 69 65 73 20 31 37 31 20 70 61 67 65 73 2e 20 49  ies 171 pages. I
7f80: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  n synchronous=NO
7f90: 52 4d 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 0a  RMAL mode, this.
7fa0: 23 20 70 72 6f 64 75 63 65 73 20 61 20 6c 6f 67  # produces a log
7fb0: 20 66 69 6c 65 20 6f 66 3a 0a 23 0a 23 20 20 20   file of:.#.#   
7fc0: 31 32 20 2b 20 28 31 36 2b 35 31 32 29 2a 31 37  12 + (16+512)*17
7fd0: 31 20 3d 20 39 30 33 30 30 20 62 79 74 65 73 2e  1 = 90300 bytes.
7fe0: 0a 23 0a 23 20 53 6c 69 67 68 74 6c 79 20 6c 61  .#.# Slightly la
7ff0: 72 67 65 72 20 74 68 61 6e 20 31 31 2a 38 31 39  rger than 11*819
8000: 32 20 3d 20 39 30 31 31 32 20 62 79 74 65 73 2e  2 = 90112 bytes.
8010: 0a 23 0a 23 20 52 75 6e 20 74 68 65 20 74 65 73  .#.# Run the tes
8020: 74 20 75 73 69 6e 67 20 76 61 72 69 6f 75 73 20  t using various 
8030: 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
8040: 2d 73 69 7a 65 73 2e 20 49 6e 20 65 61 63 68 20  -sizes. In each 
8050: 63 61 73 65 2c 20 74 68 65 0a 23 20 57 41 4c 20  case, the.# WAL 
8060: 63 6f 64 65 20 73 68 6f 75 6c 64 20 77 72 69 74  code should writ
8070: 65 20 74 68 65 20 39 30 33 30 30 20 62 79 74 65  e the 90300 byte
8080: 73 20 6f 66 20 6c 6f 67 20 66 69 6c 65 20 63 6f  s of log file co
8090: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 0a 23 20  ntaining the .# 
80a0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
80b0: 6e 20 61 70 70 65 6e 64 20 61 73 20 6d 61 79 20  n append as may 
80c0: 66 72 61 6d 65 73 20 61 73 20 61 72 65 20 72 65  frames as are re
80d0: 71 75 69 72 65 64 20 74 6f 20 65 78 74 65 6e 64  quired to extend
80e0: 20 74 68 65 0a 23 20 6c 6f 67 20 66 69 6c 65 20   the.# log file 
80f0: 73 6f 20 74 68 61 74 20 6e 6f 20 70 61 72 74 20  so that no part 
8100: 6f 66 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  of the next tran
8110: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
8120: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 23 20 61  written into.# a
8130: 20 64 69 73 6b 2d 73 65 63 74 6f 72 20 75 73 65   disk-sector use
8140: 64 20 62 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  d by transaction
8150: 20 6a 75 73 74 20 63 6f 6d 6d 69 74 74 65 64 2e   just committed.
8160: 0a 23 0a 73 65 74 20 6f 6c 64 5f 70 65 6e 64 69  .#.set old_pendi
8170: 6e 67 5f 62 79 74 65 20 5b 73 71 6c 69 74 65 33  ng_byte [sqlite3
8180: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65  _test_control_pe
8190: 6e 64 69 6e 67 5f 62 79 74 65 20 30 78 31 30 30  nding_byte 0x100
81a0: 30 30 30 30 30 5d 0a 63 61 74 63 68 20 7b 20 64  00000].catch { d
81b0: 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 65 61 63  b close }.foreac
81c0: 68 20 7b 74 6e 20 73 65 63 74 6f 72 73 69 7a 65  h {tn sectorsize
81d0: 20 6c 6f 67 73 69 7a 65 7d 20 7b 0a 20 20 31 20   logsize} {.  1 
81e0: 20 20 31 32 38 20 20 39 30 38 32 38 0a 20 20 32    128  90828.  2
81f0: 20 20 20 32 35 36 20 20 39 30 38 32 38 0a 20 20     256  90828.  
8200: 33 20 20 20 35 31 32 20 20 39 30 38 32 38 20 0a  3   512  90828 .
8210: 20 20 34 20 20 31 30 32 34 20 20 39 31 33 35 36    4  1024  91356
8220: 0a 20 20 35 20 20 32 30 34 38 20 20 39 32 34 31  .  5  2048  9241
8230: 32 0a 20 20 36 20 20 34 30 39 36 20 20 39 34 35  2.  6  4096  945
8240: 32 34 0a 20 20 37 20 20 38 31 39 32 20 20 39 38  24.  7  8192  98
8250: 37 34 38 0a 7d 20 7b 0a 20 20 66 69 6c 65 20 64  748.} {.  file d
8260: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
8270: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
8280: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
8290: 0a 20 20 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c  .  sqlite3_simul
82a0: 61 74 65 5f 64 65 76 69 63 65 20 2d 73 65 63 74  ate_device -sect
82b0: 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 73 69  orsize $sectorsi
82c0: 7a 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  ze.  sqlite3 db 
82d0: 74 65 73 74 2e 64 62 20 2d 76 66 73 20 64 65 76  test.db -vfs dev
82e0: 73 79 6d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77  sym..  do_test w
82f0: 61 6c 2d 31 37 2e 24 74 6e 2e 31 20 7b 0a 20 20  al-17.$tn.1 {.  
8300: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
8310: 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61    PRAGMA auto_va
8320: 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cuum = 0;.      
8330: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
8340: 20 3d 20 35 31 32 3b 0a 20 20 20 20 20 20 50 52   = 512;.      PR
8350: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
8360: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50  e = WAL;.      P
8370: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
8380: 73 20 3d 20 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  s = FULL;.    }.
8390: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
83a0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
83b0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 28   CREATE TABLE t(
83c0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  x);.    }.    fo
83d0: 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c  r {set i 0} {$i<
83e0: 31 36 36 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a  166} {incr i} {.
83f0: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20        execsql { 
8400: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 20 56 41  INSERT INTO t VA
8410: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
8420: 34 30 30 29 29 20 7d 0a 20 20 20 20 7d 0a 20 20  400)) }.    }.  
8430: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
8440: 0a 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20  ..    file size 
8450: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 7d 20  test.db-wal.  } 
8460: 24 6c 6f 67 73 69 7a 65 0a 0a 20 20 64 6f 5f 74  $logsize..  do_t
8470: 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 32  est wal-17.$tn.2
8480: 20 7b 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65   {.    file size
8490: 20 74 65 73 74 2e 64 62 0a 20 20 7d 20 35 31 32   test.db.  } 512
84a0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..  do_test wal-
84b0: 31 37 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 64  17.$tn.3 {.    d
84c0: 62 20 63 6c 6f 73 65 0a 20 20 20 20 66 69 6c 65  b close.    file
84d0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
84e0: 7d 20 5b 65 78 70 72 20 35 31 32 2a 31 37 31 5d  } [expr 512*171]
84f0: 0a 7d 0a 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .}.sqlite3_test_
8500: 63 6f 6e 74 72 6f 6c 5f 70 65 6e 64 69 6e 67 5f  control_pending_
8510: 62 79 74 65 20 24 6f 6c 64 5f 70 65 6e 64 69 6e  byte $old_pendin
8520: 67 5f 62 79 74 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  g_byte..#-------
8530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8570: 2d 2d 0a 23 20 54 68 69 73 20 74 65 73 74 20 2d  --.# This test -
8580: 20 77 61 6c 2d 31 38 2e 2a 20 2d 20 76 65 72 69   wal-18.* - veri
8590: 66 69 65 73 20 61 20 63 6f 75 70 6c 65 20 6f 66  fies a couple of
85a0: 20 73 70 65 63 69 66 69 63 20 63 6f 6e 64 69 74   specific condit
85b0: 69 6f 6e 73 20 74 68 61 74 0a 23 20 6d 61 79 20  ions that.# may 
85c0: 62 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77  be encountered w
85d0: 68 69 6c 65 20 72 65 63 6f 76 65 72 69 6e 67 20  hile recovering 
85e0: 61 20 6c 6f 67 20 66 69 6c 65 20 61 72 65 20 68  a log file are h
85f0: 61 6e 64 6c 65 64 20 63 6f 72 72 65 63 74 6c 79  andled correctly
8600: 3a 0a 23 0a 23 20 20 20 77 61 6c 2d 31 38 2e 31  :.#.#   wal-18.1
8610: 2e 2a 20 57 68 65 6e 20 74 68 65 20 66 69 72 73  .* When the firs
8620: 74 20 33 32 2d 62 69 74 73 20 6f 66 20 61 20 66  t 32-bits of a f
8630: 72 61 6d 65 20 63 68 65 63 6b 73 75 6d 20 69 73  rame checksum is
8640: 20 63 6f 72 72 65 63 74 20 62 75 74 20 0a 23 20   correct but .# 
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
8660: 20 73 65 63 6f 6e 64 20 33 32 2d 62 69 74 73 20   second 32-bits 
8670: 61 72 65 20 66 61 6c 73 65 2c 20 61 6e 64 0a 23  are false, and.#
8680: 0a 23 20 20 20 77 61 6c 2d 31 38 2e 32 2e 2a 20  .#   wal-18.2.* 
8690: 57 68 65 6e 20 74 68 65 20 70 61 67 65 2d 73 69  When the page-si
86a0: 7a 65 20 66 69 65 6c 64 20 74 68 61 74 20 6f 63  ze field that oc
86b0: 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72  curs at the star
86c0: 74 20 6f 66 20 61 20 6c 6f 67 0a 23 20 20 20 20  t of a log.#    
86d0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 69            file i
86e0: 73 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  s a power of 2 g
86f0: 72 65 61 74 65 72 20 74 68 61 6e 20 31 36 33 38  reater than 1638
8700: 34 20 6f 72 20 73 6d 61 6c 6c 65 72 20 74 68 61  4 or smaller tha
8710: 6e 20 35 31 32 2e 0a 23 0a 66 69 6c 65 20 64 65  n 512..#.file de
8720: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
8730: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  .db test.db-wal 
8740: 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a  test.db-journal.
8750: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 30  do_test wal-18.0
8760: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   {.  sqlite3 db 
8770: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
8780: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
8790: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
87a0: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
87b0: 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20  _vacuum = 0;.   
87c0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
87d0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
87e0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
87f0: 75 73 20 3d 20 4f 46 46 3b 0a 0a 20 20 20 20 43  us = OFF;..    C
8800: 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61  REATE TABLE t1(a
8810: 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20 62  , b, UNIQUE(a, b
8820: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
8830: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 30 2c  NTO t1 VALUES(0,
8840: 20 30 29 3b 0a 20 20 20 20 50 52 41 47 4d 41 20   0);.    PRAGMA 
8850: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
8860: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
8870: 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29   t1 VALUES(1, 2)
8880: 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20 66 72  ;          -- fr
8890: 61 6d 65 73 20 31 20 61 6e 64 20 32 0a 20 20 20  ames 1 and 2.   
88a0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
88b0: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 20 20 20  VALUES(3, 4);   
88c0: 20 20 20 20 20 20 20 2d 2d 20 66 72 61 6d 65 73         -- frames
88d0: 20 33 20 61 6e 64 20 34 0a 20 20 20 20 49 4e 53   3 and 4.    INS
88e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
88f0: 45 53 28 35 2c 20 36 29 3b 20 20 20 20 20 20 20  ES(5, 6);       
8900: 20 20 20 2d 2d 20 66 72 61 6d 65 73 20 35 20 61     -- frames 5 a
8910: 6e 64 20 36 0a 20 20 7d 0a 0a 20 20 66 69 6c 65  nd 6.  }..  file
8920: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
8930: 74 2e 64 62 20 74 65 73 74 58 2e 64 62 0a 20 20  t.db testX.db.  
8940: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
8950: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
8960: 74 58 2e 64 62 2d 77 61 6c 0a 20 20 64 62 20 63  tX.db-wal.  db c
8970: 6c 6f 73 65 0a 20 20 6c 69 73 74 20 5b 66 69 6c  lose.  list [fil
8980: 65 20 73 69 7a 65 20 74 65 73 74 58 2e 64 62 5d  e size testX.db]
8990: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
89a0: 58 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  X.db-wal].} [lis
89b0: 74 20 5b 65 78 70 72 20 33 2a 31 30 32 34 5d 20  t [expr 3*1024] 
89c0: 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 36  [log_file_size 6
89d0: 20 31 30 32 34 5d 5d 0a 0a 66 6f 72 65 61 63 68   1024]]..foreach
89e0: 20 7b 6e 46 72 61 6d 65 20 72 65 73 75 6c 74 7d   {nFrame result}
89f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 30 20 20 20   {.         0   
8a00: 20 20 20 7b 30 20 30 7d 0a 20 20 20 20 20 20 20     {0 0}.       
8a10: 20 20 31 20 20 20 20 20 20 7b 30 20 30 7d 0a 20    1      {0 0}. 
8a20: 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 7b          2      {
8a30: 30 20 30 20 31 20 32 7d 0a 20 20 20 20 20 20 20  0 0 1 2}.       
8a40: 20 20 33 20 20 20 20 20 20 7b 30 20 30 20 31 20    3      {0 0 1 
8a50: 32 7d 0a 20 20 20 20 20 20 20 20 20 34 20 20 20  2}.         4   
8a60: 20 20 20 7b 30 20 30 20 31 20 32 20 33 20 34 7d     {0 0 1 2 3 4}
8a70: 0a 20 20 20 20 20 20 20 20 20 35 20 20 20 20 20  .         5     
8a80: 20 7b 30 20 30 20 31 20 32 20 33 20 34 7d 0a 20   {0 0 1 2 3 4}. 
8a90: 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 7b          6      {
8aa0: 30 20 30 20 31 20 32 20 33 20 34 20 35 20 36 7d  0 0 1 2 3 4 5 6}
8ab0: 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73 74 20 77  .} {.  do_test w
8ac0: 61 6c 2d 31 38 2e 31 2e 24 6e 46 72 61 6d 65 20  al-18.1.$nFrame 
8ad0: 7b 0a 20 20 20 20 66 69 6c 65 20 63 6f 70 79 20  {.    file copy 
8ae0: 2d 66 6f 72 63 65 20 74 65 73 74 58 2e 64 62 20  -force testX.db 
8af0: 74 65 73 74 2e 64 62 0a 20 20 20 20 66 69 6c 65  test.db.    file
8b00: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
8b10: 74 58 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64  tX.db-wal test.d
8b20: 62 2d 77 61 6c 0a 0a 20 20 20 20 68 65 78 69 6f  b-wal..    hexio
8b30: 5f 77 72 69 74 65 20 74 65 73 74 2e 64 62 2d 77  _write test.db-w
8b40: 61 6c 20 5b 65 78 70 72 20 31 32 20 2b 20 24 6e  al [expr 12 + $n
8b50: 46 72 61 6d 65 2a 28 31 36 2b 31 30 32 34 29 20  Frame*(16+1024) 
8b60: 2b 20 31 32 5d 20 30 30 30 30 30 30 30 30 0a 0a  + 12] 00000000..
8b70: 20 20 20 20 73 71 6c 69 74 65 33 20 64 62 20 74      sqlite3 db t
8b80: 65 73 74 2e 64 62 0a 20 20 20 20 65 78 65 63 73  est.db.    execs
8b90: 71 6c 20 7b 20 0a 20 20 20 20 20 20 53 45 4c 45  ql { .      SELE
8ba0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20  CT * FROM t1;.  
8bb0: 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67      PRAGMA integ
8bc0: 72 69 74 79 5f 63 68 65 63 6b 3b 20 0a 20 20 20  rity_check; .   
8bd0: 20 7d 0a 20 20 7d 20 5b 63 6f 6e 63 61 74 20 24   }.  } [concat $
8be0: 72 65 73 75 6c 74 20 6f 6b 5d 0a 20 20 64 62 20  result ok].  db 
8bf0: 63 6c 6f 73 65 0a 7d 20 0a 0a 70 72 6f 63 20 72  close.} ..proc r
8c00: 61 6e 64 6f 6d 62 6c 6f 62 20 7b 70 67 73 7a 7d  andomblob {pgsz}
8c10: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 72 62 64   {.  sqlite3 rbd
8c20: 62 20 3a 6d 65 6d 6f 72 79 3a 0a 20 20 73 65 74  b :memory:.  set
8c30: 20 62 6c 6f 62 20 5b 72 62 64 62 20 6f 6e 65 20   blob [rbdb one 
8c40: 7b 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c  {SELECT randombl
8c50: 6f 62 28 24 70 67 73 7a 29 7d 5d 0a 20 20 72 62  ob($pgsz)}].  rb
8c60: 64 62 20 63 6c 6f 73 65 0a 20 20 73 65 74 20 62  db close.  set b
8c70: 6c 6f 62 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67 63  lob.}..proc logc
8c80: 6b 73 75 6d 20 7b 63 6b 76 31 20 63 6b 76 32 20  ksum {ckv1 ckv2 
8c90: 62 6c 6f 62 7d 20 7b 0a 20 20 75 70 76 61 72 20  blob} {.  upvar 
8ca0: 24 63 6b 76 31 20 63 31 0a 20 20 75 70 76 61 72  $ckv1 c1.  upvar
8cb0: 20 24 63 6b 76 32 20 63 32 0a 0a 20 20 62 69 6e   $ckv2 c2..  bin
8cc0: 61 72 79 20 73 63 61 6e 20 24 62 6c 6f 62 20 69  ary scan $blob i
8cd0: 75 2a 20 76 61 6c 75 65 73 0a 20 20 66 6f 72 65  u* values.  fore
8ce0: 61 63 68 20 76 20 24 76 61 6c 75 65 73 20 7b 0a  ach v $values {.
8cf0: 20 20 20 20 69 6e 63 72 20 63 31 20 24 76 0a 20      incr c1 $v. 
8d00: 20 20 20 69 6e 63 72 20 63 32 20 24 63 31 0a 20     incr c2 $c1. 
8d10: 20 7d 0a 0a 20 20 73 65 74 20 63 31 20 5b 65 78   }..  set c1 [ex
8d20: 70 72 20 28 24 63 31 20 2b 20 28 24 63 31 3e 3e  pr ($c1 + ($c1>>
8d30: 32 34 29 29 26 30 78 46 46 46 46 46 46 46 46 5d  24))&0xFFFFFFFF]
8d40: 0a 20 20 73 65 74 20 63 32 20 5b 65 78 70 72 20  .  set c2 [expr 
8d50: 28 24 63 32 20 2b 20 28 24 63 32 3e 3e 32 34 29  ($c2 + ($c2>>24)
8d60: 29 26 30 78 46 46 46 46 46 46 46 46 5d 0a 7d 0a  )&0xFFFFFFFF].}.
8d70: 0a 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63  .file copy -forc
8d80: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 58 2e  e test.db testX.
8d90: 64 62 0a 66 6f 72 65 61 63 68 20 7b 74 6e 20 70  db.foreach {tn p
8da0: 67 73 7a 20 77 6f 72 6b 73 7d 20 7b 20 0a 20 20  gsz works} { .  
8db0: 31 20 20 20 20 31 32 38 20 20 20 20 30 0a 20 20  1    128    0.  
8dc0: 32 20 20 20 20 32 35 36 20 20 20 20 30 0a 20 20  2    256    0.  
8dd0: 33 20 20 20 20 35 31 32 20 20 20 20 31 0a 20 20  3    512    1.  
8de0: 34 20 20 20 31 30 32 34 20 20 20 20 31 0a 20 20  4   1024    1.  
8df0: 35 20 20 20 32 30 34 38 20 20 20 20 31 0a 20 20  5   2048    1.  
8e00: 36 20 20 20 34 30 39 36 20 20 20 20 31 0a 20 20  6   4096    1.  
8e10: 37 20 20 20 38 31 39 32 20 20 20 20 31 0a 20 20  7   8192    1.  
8e20: 38 20 20 31 36 33 38 34 20 20 20 20 31 0a 20 20  8  16384    1.  
8e30: 39 20 20 33 32 37 36 38 20 20 20 20 31 0a 20 31  9  32768    1. 1
8e40: 30 20 20 36 35 35 33 36 20 20 20 20 30 0a 7d 20  0  65536    0.} 
8e50: 7b 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 70 67  {..  for {set pg
8e60: 20 31 7d 20 7b 24 70 67 20 3c 3d 20 33 7d 20 7b   1} {$pg <= 3} {
8e70: 69 6e 63 72 20 70 67 7d 20 7b 0a 20 20 20 20 66  incr pg} {.    f
8e80: 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20  ile copy -force 
8e90: 74 65 73 74 58 2e 64 62 20 74 65 73 74 2e 64 62  testX.db test.db
8ea0: 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65  .    file delete
8eb0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d   -force test.db-
8ec0: 77 61 6c 0a 20 20 0a 20 20 20 20 23 20 43 68 65  wal.  .    # Che
8ed0: 63 6b 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ck that the data
8ee0: 62 61 73 65 20 6e 6f 77 20 65 78 69 73 74 73 20  base now exists 
8ef0: 61 6e 64 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  and consists of 
8f00: 74 68 72 65 65 20 70 61 67 65 73 2e 20 41 6e 64  three pages. And
8f10: 0a 20 20 20 20 23 20 74 68 61 74 20 74 68 65 72  .    # that ther
8f20: 65 20 69 73 20 6e 6f 20 61 73 73 6f 63 69 61 74  e is no associat
8f30: 65 64 20 77 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ed wal file..   
8f40: 20 23 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77   #.    do_test w
8f50: 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e  al-18.2.$tn.$pg.
8f60: 31 20 7b 20 66 69 6c 65 20 65 78 69 73 74 73 20  1 { file exists 
8f70: 74 65 73 74 2e 64 62 2d 77 61 6c 20 7d 20 30 0a  test.db-wal } 0.
8f80: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
8f90: 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 32 20 7b  18.2.$tn.$pg.2 {
8fa0: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
8fb0: 74 2e 64 62 20 7d 20 31 0a 20 20 20 20 64 6f 5f  t.db } 1.    do_
8fc0: 74 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74  test wal-18.2.$t
8fd0: 6e 2e 24 70 67 2e 33 20 7b 20 66 69 6c 65 20 73  n.$pg.3 { file s
8fe0: 69 7a 65 20 74 65 73 74 2e 64 62 20 7d 20 5b 65  ize test.db } [e
8ff0: 78 70 72 20 31 30 32 34 2a 33 5d 0a 20 20 0a 20  xpr 1024*3].  . 
9000: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31     do_test wal-1
9010: 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 34 20 7b 0a  8.2.$tn.$pg.4 {.
9020: 0a 20 20 20 20 20 20 23 20 43 72 65 61 74 65 20  .      # Create 
9030: 61 20 77 61 6c 20 66 69 6c 65 20 74 68 61 74 20  a wal file that 
9040: 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
9050: 65 20 66 72 61 6d 65 20 28 64 61 74 61 62 61 73  e frame (databas
9060: 65 20 70 61 67 65 0a 20 20 20 20 20 20 23 20 6e  e page.      # n
9070: 75 6d 62 65 72 20 24 70 67 29 20 77 69 74 68 20  umber $pg) with 
9080: 74 68 65 20 63 6f 6d 6d 69 74 20 66 6c 61 67 20  the commit flag 
9090: 73 65 74 2e 20 54 68 65 20 66 72 61 6d 65 20 63  set. The frame c
90a0: 68 65 63 6b 73 75 6d 20 69 73 0a 20 20 20 20 20  hecksum is.     
90b0: 20 23 20 63 6f 72 72 65 63 74 2c 20 62 75 74 20   # correct, but 
90c0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
90d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
90e0: 65 20 61 72 65 20 63 6f 72 72 75 70 74 2e 0a 20  e are corrupt.. 
90f0: 20 20 20 20 20 23 0a 20 20 20 20 20 20 23 20 54       #.      # T
9100: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 6e 20  he page-size in 
9110: 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 68 65 61  the log file hea
9120: 64 65 72 20 69 73 20 73 65 74 20 74 6f 20 24 70  der is set to $p
9130: 67 73 7a 2e 20 49 66 20 74 68 65 0a 20 20 20 20  gsz. If the.    
9140: 20 20 23 20 57 41 4c 20 63 6f 64 65 20 63 6f 6e    # WAL code con
9150: 73 69 64 65 72 73 20 24 70 67 73 7a 20 74 6f 20  siders $pgsz to 
9160: 62 65 20 61 20 76 61 6c 69 64 20 53 51 4c 69 74  be a valid SQLit
9170: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
9180: 70 61 67 65 2d 73 69 7a 65 2c 0a 20 20 20 20 20  page-size,.     
9190: 20 23 20 74 68 65 20 64 61 74 61 62 61 73 65 20   # the database 
91a0: 77 69 6c 6c 20 62 65 20 63 6f 72 72 75 70 74 20  will be corrupt 
91b0: 28 62 65 63 61 75 73 65 20 74 68 65 20 67 61 72  (because the gar
91c0: 62 61 67 65 20 66 72 61 6d 65 20 63 6f 6e 74 65  bage frame conte
91d0: 6e 74 73 0a 20 20 20 20 20 20 23 20 77 69 6c 6c  nts.      # will
91e0: 20 62 65 20 74 72 65 61 74 65 64 20 61 73 20 76   be treated as v
91f0: 61 6c 69 64 20 63 6f 6e 74 65 6e 74 29 2e 20 49  alid content). I
9200: 66 20 24 70 67 73 7a 20 69 73 20 69 6e 76 61 6c  f $pgsz is inval
9210: 69 64 20 28 74 6f 6f 20 73 6d 61 6c 6c 0a 20 20  id (too small.  
9220: 20 20 20 20 23 20 6f 72 20 74 6f 6f 20 6c 61 72      # or too lar
9230: 67 65 29 2c 20 74 68 65 20 64 62 20 77 69 6c 6c  ge), the db will
9240: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 20   not be corrupt 
9250: 61 73 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  as the log file 
9260: 77 69 6c 6c 0a 20 20 20 20 20 20 23 20 62 65 20  will.      # be 
9270: 69 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 23  ignored..      #
9280: 0a 20 20 20 20 20 20 73 65 74 20 63 31 20 32 32  .      set c1 22
9290: 0a 20 20 20 20 20 20 73 65 74 20 63 32 20 32 33  .      set c2 23
92a0: 0a 20 20 20 20 20 20 73 65 74 20 77 61 6c 68 64  .      set walhd
92b0: 72 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d 61 74  r [binary format
92c0: 20 49 49 49 20 24 70 67 73 7a 20 24 63 31 20 24   III $pgsz $c1 $
92d0: 63 32 5d 0a 20 20 20 20 20 20 73 65 74 20 66 72  c2].      set fr
92e0: 61 6d 65 62 6f 64 79 20 5b 72 61 6e 64 6f 6d 62  amebody [randomb
92f0: 6c 6f 62 20 24 70 67 73 7a 5d 0a 20 20 20 20 20  lob $pgsz].     
9300: 20 73 65 74 20 66 72 61 6d 65 68 64 72 20 20 5b   set framehdr  [
9310: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49  binary format II
9320: 20 24 70 67 20 35 5d 0a 20 20 20 20 20 20 6c 6f   $pg 5].      lo
9330: 67 63 6b 73 75 6d 20 63 31 20 63 32 20 24 66 72  gcksum c1 c2 $fr
9340: 61 6d 65 68 64 72 0a 20 20 20 20 20 20 6c 6f 67  amehdr.      log
9350: 63 6b 73 75 6d 20 63 31 20 63 32 20 24 66 72 61  cksum c1 c2 $fra
9360: 6d 65 62 6f 64 79 0a 20 20 20 20 20 20 73 65 74  mebody.      set
9370: 20 66 72 61 6d 65 68 64 72 20 5b 62 69 6e 61 72   framehdr [binar
9380: 79 20 66 6f 72 6d 61 74 20 49 49 49 49 20 24 70  y format IIII $p
9390: 67 20 35 20 24 63 31 20 24 63 32 5d 0a 20 20 20  g 5 $c1 $c2].   
93a0: 20 20 20 73 65 74 20 66 64 20 5b 6f 70 65 6e 20     set fd [open 
93b0: 74 65 73 74 2e 64 62 2d 77 61 6c 20 77 5d 0a 20  test.db-wal w]. 
93c0: 20 20 20 20 20 66 63 6f 6e 66 69 67 75 72 65 20       fconfigure 
93d0: 24 66 64 20 2d 65 6e 63 6f 64 69 6e 67 20 62 69  $fd -encoding bi
93e0: 6e 61 72 79 20 2d 74 72 61 6e 73 6c 61 74 69 6f  nary -translatio
93f0: 6e 20 62 69 6e 61 72 79 0a 20 20 20 20 20 20 70  n binary.      p
9400: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 24  uts -nonewline $
9410: 66 64 20 24 77 61 6c 68 64 72 0a 20 20 20 20 20  fd $walhdr.     
9420: 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65   puts -nonewline
9430: 20 24 66 64 20 24 66 72 61 6d 65 68 64 72 0a 20   $fd $framehdr. 
9440: 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77       puts -nonew
9450: 6c 69 6e 65 20 24 66 64 20 24 66 72 61 6d 65 62  line $fd $frameb
9460: 6f 64 79 0a 20 20 20 20 20 20 63 6c 6f 73 65 20  ody.      close 
9470: 24 66 64 0a 20 20 0a 20 20 20 20 20 20 66 69 6c  $fd.  .      fil
9480: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
9490: 61 6c 0a 20 20 20 20 7d 20 5b 6c 6f 67 5f 66 69  al.    } [log_fi
94a0: 6c 65 5f 73 69 7a 65 20 31 20 24 70 67 73 7a 5d  le_size 1 $pgsz]
94b0: 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73 74 20  .  .    do_test 
94c0: 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24 70 67  wal-18.2.$tn.$pg
94d0: 2e 35 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  .5 {.      sqlit
94e0: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
94f0: 20 20 20 20 73 65 74 20 72 63 20 5b 63 61 74 63      set rc [catc
9500: 68 20 7b 20 64 62 20 6f 6e 65 20 7b 50 52 41 47  h { db one {PRAG
9510: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
9520: 63 6b 7d 20 7d 20 6d 73 67 5d 0a 20 20 20 20 20  ck} } msg].     
9530: 20 65 78 70 72 20 7b 20 24 72 63 21 3d 30 20 7c   expr { $rc!=0 |
9540: 7c 20 24 6d 73 67 21 3d 22 6f 6b 22 20 7d 0a 20  | $msg!="ok" }. 
9550: 20 20 20 7d 20 24 77 6f 72 6b 73 0a 20 20 0a 20     } $works.  . 
9560: 20 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 7d 0a     db close.  }.
9570: 7d 0a 0a 63 61 74 63 68 20 7b 20 64 62 32 20 63  }..catch { db2 c
9580: 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64  lose }.catch { d
9590: 62 20 63 6c 6f 73 65 20 7d 0a 66 69 6e 69 73 68  b close }.finish
95a0: 5f 74 65 73 74 0a 0a                             _test..