/ Hex Artifact Content
Login

Artifact 5fa3cdf2e93e79b0891af6cf7fab8ef9e07a23c6:


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 70 72 6f 63 20 72  mmon.tcl..proc r
0270: 65 6f 70 65 6e 5f 64 62 20 7b 7d 20 7b 0a 20 20  eopen_db {} {.  
0280: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
0290: 20 7d 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65   }.  file delete
02a0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
02b0: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 73 71  test.db-wal.  sq
02c0: 6c 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65 73  lite3_wal db tes
02d0: 74 2e 64 62 0a 7d 0a 0a 70 72 6f 63 20 73 71 6c  t.db.}..proc sql
02e0: 69 74 65 33 5f 77 61 6c 20 7b 61 72 67 73 7d 20  ite3_wal {args} 
02f0: 7b 0a 20 20 65 76 61 6c 20 73 71 6c 69 74 65 33  {.  eval sqlite3
0300: 20 24 61 72 67 73 0a 20 20 5b 6c 69 6e 64 65 78   $args.  [lindex
0310: 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b   $args 0] eval {
0320: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
0330: 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 7d 0a 0a  mode = wal }.}..
0340: 70 72 6f 63 20 6c 6f 67 5f 66 69 6c 65 5f 73 69  proc log_file_si
0350: 7a 65 20 7b 6e 46 72 61 6d 65 20 70 67 73 7a 7d  ze {nFrame pgsz}
0360: 20 7b 0a 20 20 65 78 70 72 20 7b 31 32 20 2b 20   {.  expr {12 + 
0370: 28 24 70 67 73 7a 2b 31 36 29 2a 24 6e 46 72 61  ($pgsz+16)*$nFra
0380: 6d 65 7d 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67 5f  me}.}..proc log_
0390: 64 65 6c 65 74 65 64 20 7b 6c 6f 67 66 69 6c 65  deleted {logfile
03a0: 7d 20 7b 0a 20 20 72 65 74 75 72 6e 20 5b 65 78  } {.  return [ex
03b0: 70 72 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20  pr [file exists 
03c0: 24 6c 6f 67 66 69 6c 65 5d 3d 3d 30 5d 0a 7d 0a  $logfile]==0].}.
03d0: 0a 23 0a 23 20 54 68 65 73 65 20 61 72 65 20 27  .#.# These are '
03e0: 77 61 72 6d 2d 62 6f 64 79 27 20 74 65 73 74 73  warm-body' tests
03f0: 20 75 73 65 64 20 77 68 69 6c 65 20 64 65 76 65   used while deve
0400: 6c 6f 70 69 6e 67 20 74 68 65 20 57 41 4c 20 63  loping the WAL c
0410: 6f 64 65 2e 20 54 68 65 79 0a 23 20 73 65 72 76  ode. They.# serv
0420: 65 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20  e to prove that 
0430: 61 20 66 65 77 20 72 65 61 6c 6c 79 20 73 69 6d  a few really sim
0440: 70 6c 65 20 63 61 73 65 73 20 77 6f 72 6b 3a 0a  ple cases work:.
0450: 23 0a 23 20 77 61 6c 2d 31 2e 2a 3a 20 52 65 61  #.# wal-1.*: Rea
0460: 64 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20  d and write the 
0470: 64 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c 2d  database..# wal-
0480: 32 2e 2a 3a 20 54 65 73 74 20 4d 56 43 43 20 77  2.*: Test MVCC w
0490: 69 74 68 20 6f 6e 65 20 72 65 61 64 65 72 2c 20  ith one reader, 
04a0: 6f 6e 65 20 77 72 69 74 65 72 2e 0a 23 20 77 61  one writer..# wa
04b0: 6c 2d 33 2e 2a 3a 20 54 65 73 74 20 74 72 61 6e  l-3.*: Test tran
04c0: 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
04d0: 2e 0a 23 20 77 61 6c 2d 34 2e 2a 3a 20 54 65 73  ..# wal-4.*: Tes
04e0: 74 20 73 61 76 65 70 6f 69 6e 74 2f 73 74 61 74  t savepoint/stat
04f0: 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ement rollback..
0500: 23 20 77 61 6c 2d 35 2e 2a 3a 20 54 65 73 74 20  # wal-5.*: Test 
0510: 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
0520: 65 2e 0a 23 20 77 61 6c 2d 36 2e 2a 3a 20 54 65  e..# wal-6.*: Te
0530: 73 74 20 63 72 65 61 74 69 6e 67 20 64 61 74 61  st creating data
0540: 62 61 73 65 73 20 77 69 74 68 20 64 69 66 66 65  bases with diffe
0550: 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 73 2e  rent page sizes.
0560: 0a 23 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  .#..do_test wal-
0570: 30 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  0.1 {.  execsql 
0580: 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  { PRAGMA journal
0590: 5f 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 7d 20  _mode = wal }.} 
05a0: 7b 77 61 6c 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  {wal}..do_test w
05b0: 61 6c 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63 73  al-1.0 {.  execs
05c0: 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b  ql { .    BEGIN;
05d0: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
05e0: 45 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 7d  E t1(a, b); .  }
05f0: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78  .  list [file ex
0600: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
0610: 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73  rnal] [file exis
0620: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ts test.db-wal].
0630: 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {0 1}.do_test 
0640: 77 61 6c 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63  wal-1.1 {.  exec
0650: 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73  sql COMMIT.  lis
0660: 74 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74  t [file exists t
0670: 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20  est.db-journal] 
0680: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73  [file exists tes
0690: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 30 20 31  t.db-wal].} {0 1
06a0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e  }.do_test wal-1.
06b0: 32 20 7b 0a 20 20 23 20 54 68 65 72 65 20 61 72  2 {.  # There ar
06c0: 65 20 6e 6f 77 20 74 77 6f 20 70 61 67 65 73 20  e now two pages 
06d0: 69 6e 20 74 68 65 20 6c 6f 67 2e 0a 20 20 66 69  in the log..  fi
06e0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
06f0: 77 61 6c 0a 7d 20 5b 6c 6f 67 5f 66 69 6c 65 5f  wal.} [log_file_
0700: 73 69 7a 65 20 32 20 31 30 32 34 5d 0a 0a 64 6f  size 2 1024]..do
0710: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 33 20 7b 0a  _test wal-1.3 {.
0720: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0730: 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65  CT * FROM sqlite
0740: 5f 6d 61 73 74 65 72 20 7d 0a 7d 20 7b 74 61 62  _master }.} {tab
0750: 6c 65 20 74 31 20 74 31 20 32 20 7b 43 52 45 41  le t1 t1 2 {CREA
0760: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0770: 29 7d 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  )}}..do_test wal
0780: 2d 31 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -1.4 {.  execsql
0790: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
07a0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 20 7d  1 VALUES(1, 2) }
07b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
07c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
07d0: 45 53 28 33 2c 20 34 29 20 7d 0a 20 20 65 78 65  ES(3, 4) }.  exe
07e0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
07f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 35 2c 20  TO t1 VALUES(5, 
0800: 36 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  6) }.  execsql {
0810: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0820: 56 41 4c 55 45 53 28 37 2c 20 38 29 20 7d 0a 20  VALUES(7, 8) }. 
0830: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0840: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0850: 28 39 2c 20 31 30 29 20 7d 0a 7d 20 7b 7d 0a 0a  (9, 10) }.} {}..
0860: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 35 20  do_test wal-1.5 
0870: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0880: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0890: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
08a0: 37 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65  7 8 9 10}..do_te
08b0: 73 74 20 77 61 6c 2d 32 2e 31 20 7b 0a 20 20 73  st wal-2.1 {.  s
08c0: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 2e  qlite3_wal db2 .
08d0: 2f 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73  /test.db.  execs
08e0: 71 6c 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45  ql { BEGIN; SELE
08f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
0900: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
0910: 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f  6 7 8 9 10}..do_
0920: 74 65 73 74 20 77 61 6c 2d 32 2e 32 20 7b 0a 20  test wal-2.2 {. 
0930: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
0940: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
0950: 28 31 31 2c 20 31 32 29 20 7d 0a 20 20 65 78 65  (11, 12) }.  exe
0960: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0970: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
0980: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0990: 30 20 31 31 20 31 32 7d 0a 0a 64 6f 5f 74 65 73  0 11 12}..do_tes
09a0: 74 20 77 61 6c 2d 32 2e 33 20 7b 0a 20 20 65 78  t wal-2.3 {.  ex
09b0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
09c0: 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d   FROM t1 } db2.}
09d0: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
09e0: 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74  8 9 10}..do_test
09f0: 20 77 61 6c 2d 32 2e 34 20 7b 0a 20 20 65 78 65   wal-2.4 {.  exe
0a00: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0a10: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c  TO t1 VALUES(13,
0a20: 20 31 34 29 20 7d 0a 20 20 65 78 65 63 73 71 6c   14) }.  execsql
0a30: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0a40: 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34   t1 }.} {1 2 3 4
0a50: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
0a60: 20 31 32 20 31 33 20 31 34 7d 0a 0a 64 6f 5f 74   12 13 14}..do_t
0a70: 65 73 74 20 77 61 6c 2d 32 2e 35 20 7b 0a 20 20  est wal-2.5 {.  
0a80: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
0a90: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32   * FROM t1 } db2
0aa0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
0ab0: 37 20 38 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65  7 8 9 10}..do_te
0ac0: 73 74 20 77 61 6c 2d 32 2e 36 20 7b 0a 20 20 65  st wal-2.6 {.  e
0ad0: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 3b  xecsql { COMMIT;
0ae0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0af0: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33  1 } db2.} {1 2 3
0b00: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
0b10: 31 31 20 31 32 20 31 33 20 31 34 7d 0a 0a 64 6f  11 12 13 14}..do
0b20: 5f 74 65 73 74 20 77 61 6c 2d 33 2e 31 20 7b 0a  _test wal-3.1 {.
0b30: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
0b40: 4e 3b 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  N; DELETE FROM t
0b50: 31 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 }.  execsql { 
0b60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0b70: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
0b80: 77 61 6c 2d 33 2e 32 20 7b 0a 20 20 65 78 65 63  wal-3.2 {.  exec
0b90: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0ba0: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b  ROM t1 } db2.} {
0bb0: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
0bc0: 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34  9 10 11 12 13 14
0bd0: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33 2e  }.do_test wal-3.
0be0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
0bf0: 52 4f 4c 4c 42 41 43 4b 20 7d 0a 20 20 65 78 65  ROLLBACK }.  exe
0c00: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
0c10: 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32  FROM t1 }.} {1 2
0c20: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0c30: 30 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a 64  0 11 12 13 14}.d
0c40: 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73  b2 close..do_tes
0c50: 74 20 77 61 6c 2d 34 2e 31 20 7b 0a 20 20 65 78  t wal-4.1 {.  ex
0c60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45  ecsql {.    DELE
0c70: 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  TE FROM t1;.    
0c80: 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53  BEGIN;.      INS
0c90: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0ca0: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
0cb0: 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
0cc0: 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54  ;.        INSERT
0cd0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
0ce0: 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20 20  'c', 'd');.     
0cf0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0d00: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 20   t1;.  }.} {a b 
0d10: 63 20 64 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  c d}.do_test wal
0d20: 2d 34 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -4.2 {.  execsql
0d30: 20 7b 0a 20 20 20 20 20 20 52 4f 4c 4c 42 41 43   {.      ROLLBAC
0d40: 4b 20 54 4f 20 73 70 3b 0a 20 20 20 20 20 20 53  K TO sp;.      S
0d50: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
0d60: 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a 64 6f 5f  .  }.} {a b}.do_
0d70: 74 65 73 74 20 77 61 6c 2d 34 2e 33 20 7b 0a 20  test wal-4.3 {. 
0d80: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43   execsql {.    C
0d90: 4f 4d 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43  OMMIT;.    SELEC
0da0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  T * FROM t1;.  }
0db0: 0a 7d 20 7b 61 20 62 7d 0a 0a 64 6f 5f 74 65 73  .} {a b}..do_tes
0dc0: 74 20 77 61 6c 2d 35 2e 31 20 7b 0a 20 20 65 78  t wal-5.1 {.  ex
0dd0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0de0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 74 32  TE TEMP TABLE t2
0df0: 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45  (a, b);.    INSE
0e00: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0e10: 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b  S(1, 2);.  }.} {
0e20: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e  }.do_test wal-5.
0e30: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  2 {.  execsql {.
0e40: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0e50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20   INSERT INTO t2 
0e60: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20  VALUES(3, 4);.  
0e70: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
0e80: 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32  M t2;.  }.} {1 2
0e90: 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74 20 77 61   3 4}.do_test wa
0ea0: 6c 2d 35 2e 33 20 7b 0a 20 20 65 78 65 63 73 71  l-5.3 {.  execsq
0eb0: 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b  l {.    ROLLBACK
0ec0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
0ed0: 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31  ROM t2;.  }.} {1
0ee0: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   2}.do_test wal-
0ef0: 35 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.4 {.  execsql 
0f00: 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 45 4d  {.    CREATE TEM
0f10: 50 20 54 41 42 4c 45 20 74 33 28 78 20 55 4e 49  P TABLE t3(x UNI
0f20: 51 55 45 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b  QUE);.    BEGIN;
0f30: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
0f40: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20  TO t2 VALUES(3, 
0f50: 34 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54  4);.      INSERT
0f60: 20 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28   INTO t3 VALUES(
0f70: 27 61 62 63 27 29 3b 0a 20 20 7d 0a 20 20 63 61  'abc');.  }.  ca
0f80: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
0f90: 49 4e 54 4f 20 74 33 20 56 41 4c 55 45 53 28 27  INTO t3 VALUES('
0fa0: 61 62 63 27 29 20 7d 0a 7d 20 7b 31 20 7b 63 6f  abc') }.} {1 {co
0fb0: 6c 75 6d 6e 20 78 20 69 73 20 6e 6f 74 20 75 6e  lumn x is not un
0fc0: 69 71 75 65 7d 7d 0a 64 6f 5f 74 65 73 74 20 77  ique}}.do_test w
0fd0: 61 6c 2d 35 2e 35 20 7b 0a 20 20 65 78 65 63 73  al-5.5 {.  execs
0fe0: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
0ff0: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
1000: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
1010: 32 20 33 20 34 7d 0a 64 62 20 63 6c 6f 73 65 0a  2 3 4}.db close.
1020: 0a 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 20  .foreach sector 
1030: 7b 35 31 32 20 34 30 39 36 7d 20 7b 0a 20 20 73  {512 4096} {.  s
1040: 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f  qlite3_simulate_
1050: 64 65 76 69 63 65 20 2d 73 65 63 74 6f 72 73 69  device -sectorsi
1060: 7a 65 20 24 73 65 63 74 6f 72 0a 20 20 66 6f 72  ze $sector.  for
1070: 65 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31  each pgsz {512 1
1080: 30 32 34 20 32 30 34 38 20 34 30 39 36 7d 20 7b  024 2048 4096} {
1090: 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65  .    file delete
10a0: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
10b0: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20  test.db-wal.    
10c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 36 2e 24 73  do_test wal-6.$s
10d0: 65 63 74 6f 72 2e 24 70 67 73 7a 2e 31 20 7b 0a  ector.$pgsz.1 {.
10e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61        sqlite3_wa
10f0: 6c 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66  l db test.db -vf
1100: 73 20 64 65 76 73 79 6d 0a 20 20 20 20 20 20 65  s devsym.      e
1110: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20  xecsql ".       
1120: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
1130: 65 20 3d 20 24 70 67 73 7a 20 3b 0a 20 20 20 20  e = $pgsz ;.    
1140: 20 20 22 0a 20 20 20 20 20 20 65 78 65 63 73 71    ".      execsq
1150: 6c 20 22 0a 20 20 20 20 20 20 20 20 43 52 45 41  l ".        CREA
1160: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
1170: 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  );.        INSER
1180: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1190: 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 22 0a  (1, 2);.      ".
11a0: 20 20 20 20 20 20 64 62 20 63 6c 6f 73 65 0a 20        db close. 
11b0: 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74       file size t
11c0: 65 73 74 2e 64 62 0a 20 20 20 20 7d 20 5b 65 78  est.db.    } [ex
11d0: 70 72 20 24 70 67 73 7a 2a 32 5d 0a 20 20 0a 20  pr $pgsz*2].  . 
11e0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 36     do_test wal-6
11f0: 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e 32  .$sector.$pgsz.2
1200: 20 7b 0a 20 20 20 20 20 20 6c 6f 67 5f 64 65 6c   {.      log_del
1210: 65 74 65 64 20 74 65 73 74 2e 64 62 2d 77 61 6c  eted test.db-wal
1220: 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d 0a 7d  .    } {1}.  }.}
1230: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 37 2e  ..do_test wal-7.
1240: 31 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  1 {.  file delet
1250: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  e -force test.db
1260: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 73   test.db-wal.  s
1270: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65  qlite3_wal db te
1280: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
1290: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
12a0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
12b0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
12c0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
12d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
12e0: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
12f0: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
1300: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20   test.db] [file 
1310: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
1320: 5d 0a 7d 20 5b 6c 69 73 74 20 30 20 5b 6c 6f 67  ].} [list 0 [log
1330: 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32  _file_size 3 102
1340: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
1350: 37 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  7.2 {.  execsql 
1360: 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  { PRAGMA checkpo
1370: 69 6e 74 20 7d 0a 20 20 6c 69 73 74 20 5b 66 69  int }.  list [fi
1380: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
1390: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
13a0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
13b0: 20 32 30 34 38 20 5b 6c 6f 67 5f 66 69 6c 65 5f   2048 [log_file_
13c0: 73 69 7a 65 20 33 20 31 30 32 34 5d 5d 0a 0a 23  size 3 1024]]..#
13d0: 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20 74 72   Execute some tr
13e0: 61 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20 61 75  ansactions in au
13f0: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
1400: 6f 20 74 65 73 74 20 64 61 74 61 62 61 73 65 20  o test database 
1410: 66 69 6c 65 0a 23 20 74 72 75 6e 63 61 74 69 6f  file.# truncatio
1420: 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c  n..#.do_test wal
1430: 2d 38 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f  -8.1 {.  reopen_
1440: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
1450: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
1460: 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20 20 50  acuum = 1;.    P
1470: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
1480: 6d 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64 6f 5f  m;.  }.} {1}.do_
1490: 74 65 73 74 20 77 61 6c 2d 38 2e 32 20 7b 0a 20  test wal-8.2 {. 
14a0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
14b0: 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20  RAGMA page_size 
14c0: 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41  = 1024;.    CREA
14d0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
14e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
14f0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
1500: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
1510: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1520: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
1530: 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (900));.    INSE
1540: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1550: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
1560: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
1570: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e   /*  4 */.    IN
1580: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1590: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
15a0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
15b0: 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20     /*  8 */.    
15c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
15d0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
15e0: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
15f0: 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20       /* 16 */.  
1600: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1610: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
1620: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
1630: 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a         /* 32 */.
1640: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1650: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
1660: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
1670: 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a  1;       /* 64 *
1680: 2f 0a 20 20 20 20 50 52 41 47 4d 41 20 63 68 65  /.    PRAGMA che
1690: 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20 66  ckpoint;.  }.  f
16a0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
16b0: 0a 7d 20 5b 65 78 70 72 20 36 38 2a 31 30 32 34  .} [expr 68*1024
16c0: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 38 2e  ].do_test wal-8.
16d0: 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  3 {.  execsql { 
16e0: 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d  .    DELETE FROM
16f0: 20 74 31 20 57 48 45 52 45 20 72 6f 77 69 64 3c   t1 WHERE rowid<
1700: 35 34 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 63  54;.    PRAGMA c
1710: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20  heckpoint;.  }. 
1720: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
1730: 64 62 0a 7d 20 5b 65 78 70 72 20 31 34 2a 31 30  db.} [expr 14*10
1740: 32 34 5d 0a 0a 23 20 52 75 6e 20 73 6f 6d 65 20  24]..# Run some 
1750: 22 77 61 72 6d 2d 62 6f 64 79 22 20 74 65 73 74  "warm-body" test
1760: 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
1770: 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66 69 6c   log-summary fil
1780: 65 73 20 77 69 74 68 20 6d 6f 72 65 0a 23 20 74  es with more.# t
1790: 68 61 6e 20 32 35 36 20 65 6e 74 72 69 65 73 20  han 256 entries 
17a0: 28 6c 6f 67 20 73 75 6d 6d 61 72 69 65 73 20 74  (log summaries t
17b0: 68 61 74 20 63 6f 6e 74 61 69 6e 20 69 6e 64 65  hat contain inde
17c0: 78 20 62 6c 6f 63 6b 73 29 20 77 6f 72 6b 20 4f  x blocks) work O
17d0: 6b 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c  k..#.do_test wal
17e0: 2d 39 2e 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f  -9.1 {.  reopen_
17f0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  db.  execsql {. 
1800: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
1810: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
1820: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1830: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
1840: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1850: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
1860: 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20  blob(900));.    
1870: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
1880: 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62  ALUES(randomblob
1890: 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (900));.    INSE
18a0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
18b0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
18c0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
18d0: 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e   /*  4 */.    IN
18e0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
18f0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
1900: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
1910: 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20     /*  8 */.    
1920: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1930: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
1940: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
1950: 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20       /* 16 */.  
1960: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1970: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
1980: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
1990: 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a 2f 0a         /* 32 */.
19a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
19b0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
19c0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
19d0: 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a  1;       /* 64 *
19e0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
19f0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
1a00: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
1a10: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 32   t1;       /* 12
1a20: 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  8 */.    INSERT 
1a30: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
1a40: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
1a50: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
1a60: 20 32 35 36 20 2a 2f 0a 20 20 7d 0a 20 20 66 69   256 */.  }.  fi
1a70: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
1a80: 7d 20 30 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  } 0.do_test wal-
1a90: 39 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  9.2 {.  sqlite3_
1aa0: 77 61 6c 20 64 62 32 20 74 65 73 74 2e 64 62 0a  wal db2 test.db.
1ab0: 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
1ac0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
1ad0: 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a  k } db2.} {ok}..
1ae0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e 33 20  do_test wal-9.3 
1af0: 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20  {.  file delete 
1b00: 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64 62 20  -force test2.db 
1b10: 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 66  test2.db-wal.  f
1b20: 69 6c 65 20 63 6f 70 79 20 74 65 73 74 2e 64 62  ile copy test.db
1b30: 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65   test2.db.  file
1b40: 20 63 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61   copy test.db-wa
1b50: 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  l test2.db-wal. 
1b60: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 33   sqlite3_wal db3
1b70: 20 74 65 73 74 32 2e 64 62 20 0a 20 20 65 78 65   test2.db .  exe
1b80: 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74  csql {PRAGMA int
1b90: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64  egrity_check } d
1ba0: 62 33 0a 7d 20 7b 6f 6b 7d 0a 64 62 33 20 63 6c  b3.} {ok}.db3 cl
1bb0: 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  ose..do_test wal
1bc0: 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c  -9.4 {.  execsql
1bd0: 20 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70   { PRAGMA checkp
1be0: 6f 69 6e 74 20 7d 0a 20 20 64 62 32 20 63 6c 6f  oint }.  db2 clo
1bf0: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  se.  sqlite3_wal
1c00: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 65   db2 test.db.  e
1c10: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
1c20: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
1c30: 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 66 6f 72   db2.} {ok}..for
1c40: 65 61 63 68 20 68 61 6e 64 6c 65 20 7b 64 62 20  each handle {db 
1c50: 64 62 32 20 64 62 33 7d 20 7b 20 63 61 74 63 68  db2 db3} { catch
1c60: 20 7b 20 24 68 61 6e 64 6c 65 20 63 6c 6f 73 65   { $handle close
1c70: 20 7d 20 7d 0a 75 6e 73 65 74 20 68 61 6e 64 6c   } }.unset handl
1c80: 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e..#------------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
1cd0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
1ce0: 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d 20 77  ock of tests - w
1cf0: 61 6c 2d 31 30 2e 2a 20 2d 20 74 65 73 74 20 74  al-10.* - test t
1d00: 68 61 74 20 74 68 65 20 57 41 4c 20 6c 6f 63 6b  hat the WAL lock
1d10: 69 6e 67 20 0a 23 20 73 63 68 65 6d 65 20 77 6f  ing .# scheme wo
1d20: 72 6b 73 20 69 6e 20 73 69 6d 70 6c 65 20 63 61  rks in simple ca
1d30: 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20  ses. This block 
1d40: 6f 66 20 74 65 73 74 73 20 69 73 20 72 75 6e 20  of tests is run 
1d50: 74 77 69 63 65 2e 20 4f 6e 63 65 0a 23 20 75 73  twice. Once.# us
1d60: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e  ing multiple con
1d70: 6e 65 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  nections in the 
1d80: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f 66  address space of
1d90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
1da0: 63 65 73 73 2c 0a 23 20 61 6e 64 20 6f 6e 63 65  cess,.# and once
1db0: 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 6e 65 63   with all connec
1dc0: 74 69 6f 6e 73 20 65 78 63 65 70 74 20 6f 6e 65  tions except one
1dd0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 74 65   running in exte
1de0: 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73 2e 0a  rnal processes..
1df0: 23 0a 66 6f 72 65 61 63 68 20 63 6f 64 65 20 5b  #.foreach code [
1e00: 6c 69 73 74 20 7b 0a 20 20 73 65 74 20 3a 3a 63  list {.  set ::c
1e10: 6f 64 65 32 5f 63 68 61 6e 20 5b 6c 61 75 6e 63  ode2_chan [launc
1e20: 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d 0a 20  h_testfixture]. 
1e30: 20 73 65 74 20 3a 3a 63 6f 64 65 33 5f 63 68 61   set ::code3_cha
1e40: 6e 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74 66 69  n [launch_testfi
1e50: 78 74 75 72 65 5d 0a 20 20 70 72 6f 63 20 63 6f  xture].  proc co
1e60: 64 65 32 20 7b 74 63 6c 7d 20 7b 20 74 65 73 74  de2 {tcl} { test
1e70: 66 69 78 74 75 72 65 20 24 3a 3a 63 6f 64 65 32  fixture $::code2
1e80: 5f 63 68 61 6e 20 24 74 63 6c 20 7d 0a 20 20 70  _chan $tcl }.  p
1e90: 72 6f 63 20 63 6f 64 65 33 20 7b 74 63 6c 7d 20  roc code3 {tcl} 
1ea0: 7b 20 74 65 73 74 66 69 78 74 75 72 65 20 24 3a  { testfixture $:
1eb0: 3a 63 6f 64 65 33 5f 63 68 61 6e 20 24 74 63 6c  :code3_chan $tcl
1ec0: 20 7d 0a 20 20 73 65 74 20 74 6e 20 31 0a 7d 20   }.  set tn 1.} 
1ed0: 7b 0a 20 20 70 72 6f 63 20 63 6f 64 65 32 20 7b  {.  proc code2 {
1ee0: 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c 20 23  tcl} { uplevel #
1ef0: 30 20 24 74 63 6c 20 7d 0a 20 20 70 72 6f 63 20  0 $tcl }.  proc 
1f00: 63 6f 64 65 33 20 7b 74 63 6c 7d 20 7b 20 75 70  code3 {tcl} { up
1f10: 6c 65 76 65 6c 20 23 30 20 24 74 63 6c 20 7d 0a  level #0 $tcl }.
1f20: 20 20 73 65 74 20 74 6e 20 32 0a 7d 5d 20 7b 0a    set tn 2.}] {.
1f30: 0a 20 20 65 76 61 6c 20 24 63 6f 64 65 0a 20 20  .  eval $code.  
1f40: 72 65 6f 70 65 6e 5f 64 62 0a 0a 20 20 23 20 4f  reopen_db..  # O
1f50: 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  pen connections 
1f60: 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62 33 5d 2e  [db2] and [db3].
1f70: 20 44 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   Depending on wh
1f80: 69 63 68 20 69 74 65 72 61 74 69 6f 6e 20 74 68  ich iteration th
1f90: 69 73 0a 20 20 23 20 69 73 2c 20 74 68 65 20 63  is.  # is, the c
1fa0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 6d 61 79 20 62  onnections may b
1fb0: 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 69  e created in thi
1fc0: 73 20 69 6e 74 65 72 70 72 65 74 65 72 2c 20 6f  s interpreter, o
1fd0: 72 20 69 6e 20 0a 20 20 23 20 69 6e 74 65 72 70  r in .  # interp
1fe0: 72 65 74 65 72 73 20 72 75 6e 6e 69 6e 67 20 69  reters running i
1ff0: 6e 20 6f 74 68 65 72 20 4f 53 20 70 72 6f 63 65  n other OS proce
2000: 73 73 65 73 2e 20 41 73 20 73 75 63 68 2c 20 74  sses. As such, t
2010: 68 65 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62  he [db2] and [db
2020: 33 5d 0a 20 20 23 20 63 6f 6d 6d 61 6e 64 73 20  3].  # commands 
2030: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 61  should only be a
2040: 63 63 65 73 73 65 64 20 77 69 74 68 69 6e 20 5b  ccessed within [
2050: 63 6f 64 65 32 5d 20 61 6e 64 20 5b 63 6f 64 65  code2] and [code
2060: 33 5d 20 62 6c 6f 63 6b 73 2c 0a 20 20 23 20 72  3] blocks,.  # r
2070: 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20 23  espectively..  #
2080: 0a 20 20 63 6f 64 65 32 20 7b 20 73 71 6c 69 74  .  code2 { sqlit
2090: 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 20 3b  e3 db2 test.db ;
20a0: 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47   db2 eval { PRAG
20b0: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
20c0: 3d 20 57 41 4c 20 7d 20 7d 0a 20 20 63 6f 64 65  = WAL } }.  code
20d0: 33 20 7b 20 73 71 6c 69 74 65 33 20 64 62 33 20  3 { sqlite3 db3 
20e0: 74 65 73 74 2e 64 62 20 3b 20 64 62 33 20 65 76  test.db ; db3 ev
20f0: 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75 72  al { PRAGMA jour
2100: 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20 7d  nal_mode = WAL }
2110: 20 7d 0a 0a 20 20 23 20 53 68 6f 72 74 68 61 6e   }..  # Shorthan
2120: 64 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 78 65 63  d commands. Exec
2130: 75 74 65 20 53 51 4c 20 75 73 69 6e 67 20 64 61  ute SQL using da
2140: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2150: 6e 20 5b 64 62 32 5d 20 6f 72 20 0a 20 20 23 20  n [db2] or .  # 
2160: 5b 64 62 33 5d 2e 20 52 65 74 75 72 6e 20 74 68  [db3]. Return th
2170: 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 23 0a 20  e results..  #. 
2180: 20 70 72 6f 63 20 73 71 6c 32 20 7b 73 71 6c 7d   proc sql2 {sql}
2190: 20 7b 20 63 6f 64 65 32 20 5b 6c 69 73 74 20 64   { code2 [list d
21a0: 62 32 20 65 76 61 6c 20 24 73 71 6c 5d 20 7d 0a  b2 eval $sql] }.
21b0: 20 20 70 72 6f 63 20 73 71 6c 33 20 7b 73 71 6c    proc sql3 {sql
21c0: 7d 20 7b 20 63 6f 64 65 33 20 5b 6c 69 73 74 20  } { code3 [list 
21d0: 64 62 33 20 65 76 61 6c 20 24 73 71 6c 5d 20 7d  db3 eval $sql] }
21e0: 0a 0a 20 20 23 20 49 6e 69 74 69 61 6c 69 7a 65  ..  # Initialize
21f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2200: 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74  hema and content
2210: 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  s..  #.  do_test
2220: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 20 7b 0a   wal-10.$tn.1 {.
2230: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
2240: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2250: 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20   t1(a, b);.     
2260: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2270: 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20  VALUES(1, 2);.  
2280: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
2290: 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  M t1;.    }.  } 
22a0: 7b 31 20 32 7d 0a 0a 20 20 23 20 4f 70 65 6e 20  {1 2}..  # Open 
22b0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  a transaction an
22c0: 64 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  d write to the d
22d0: 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 5b 64  atabase using [d
22e0: 62 5d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 5b  b]. Check that [
22f0: 64 62 32 5d 0a 20 20 23 20 69 73 20 73 74 69 6c  db2].  # is stil
2300: 6c 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20 74  l able to read t
2310: 68 65 20 73 6e 61 70 73 68 6f 74 20 62 65 66 6f  he snapshot befo
2320: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
2330: 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  on was opened.. 
2340: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
2350: 2d 31 30 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20  -10.$tn.2 {.    
2360: 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 3b  execsql { BEGIN;
2370: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2380: 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 20 7d 0a  VALUES(3, 4); }.
2390: 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54      sql2 {SELECT
23a0: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20   * FROM t1}.  } 
23b0: 7b 31 20 32 7d 0a 0a 20 20 23 20 48 61 76 65 20  {1 2}..  # Have 
23c0: 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 74 68 65 20  [db] commit the 
23d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 43 68 65  transaction. Che
23e0: 63 6b 20 74 68 61 74 20 5b 64 62 32 5d 20 69 73  ck that [db2] is
23f0: 20 6e 6f 77 20 73 65 65 69 6e 67 20 74 68 65 20   now seeing the 
2400: 0a 20 20 23 20 6e 65 77 2c 20 75 70 64 61 74 65  .  # new, update
2410: 64 20 73 6e 61 70 73 68 6f 74 2e 0a 20 20 23 0a  d snapshot..  #.
2420: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
2430: 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 65 78 65  .$tn.3 {.    exe
2440: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a  csql { COMMIT }.
2450: 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43 54      sql2 {SELECT
2460: 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20   * FROM t1}.  } 
2470: 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 23 20 48  {1 2 3 4}..  # H
2480: 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61  ave [db2] open a
2490: 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f   read transactio
24a0: 6e 2e 20 54 68 65 6e 20 77 72 69 74 65 20 74 6f  n. Then write to
24b0: 20 74 68 65 20 64 62 20 76 69 61 20 5b 64 62 5d   the db via [db]
24c0: 2e 20 43 68 65 63 6b 0a 20 20 23 20 74 68 61 74  . Check.  # that
24d0: 20 5b 64 62 32 5d 20 69 73 20 73 74 69 6c 6c 20   [db2] is still 
24e0: 73 65 65 69 6e 67 20 74 68 65 20 6f 72 69 67 69  seeing the origi
24f0: 6e 61 6c 20 73 6e 61 70 73 68 6f 74 2e 20 54 68  nal snapshot. Th
2500: 65 6e 20 72 65 61 64 20 77 69 74 68 20 5b 64 62  en read with [db
2510: 33 5d 2e 0a 20 20 23 20 5b 64 62 33 5d 20 73 68  3]..  # [db3] sh
2520: 6f 75 6c 64 20 73 65 65 20 74 68 65 20 6e 65 77  ould see the new
2530: 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 64 61 74  ly committed dat
2540: 61 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  a..  #.  do_test
2550: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 34 20 7b 0a   wal-10.$tn.4 {.
2560: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
2570: 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   ; SELECT * FROM
2580: 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20   t1}.  } {1 2 3 
2590: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  4}.  do_test wal
25a0: 2d 31 30 2e 24 74 6e 2e 35 20 7b 0a 20 20 20 20  -10.$tn.5 {.    
25b0: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
25c0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
25d0: 35 2c 20 36 29 3b 20 7d 0a 20 20 20 20 73 71 6c  5, 6); }.    sql
25e0: 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  2 {SELECT * FROM
25f0: 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20   t1}.  } {1 2 3 
2600: 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  4}.  do_test wal
2610: 2d 31 30 2e 24 74 6e 2e 36 20 7b 0a 20 20 20 20  -10.$tn.6 {.    
2620: 73 71 6c 33 20 7b 53 45 4c 45 43 54 20 2a 20 46  sql3 {SELECT * F
2630: 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32  ROM t1}.  } {1 2
2640: 20 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f 74   3 4 5 6}.  do_t
2650: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 37  est wal-10.$tn.7
2660: 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d   {.    sql2 COMM
2670: 49 54 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 48  IT.  } {}..  # H
2680: 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e 20 61  ave [db2] open a
2690: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
26a0: 6f 6e 2e 20 54 68 65 6e 20 61 74 74 65 6d 70 74  on. Then attempt
26b0: 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
26c0: 20 0a 20 20 23 20 64 61 74 61 62 61 73 65 20 76   .  # database v
26d0: 69 61 20 5b 64 62 5d 2e 20 54 68 69 73 20 73 68  ia [db]. This sh
26e0: 6f 75 6c 64 20 66 61 69 6c 20 28 77 72 69 74 65  ould fail (write
26f0: 72 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65  r lock cannot be
2700: 20 6f 62 74 61 69 6e 65 64 29 2e 0a 20 20 23 0a   obtained)..  #.
2710: 20 20 23 20 54 68 65 6e 20 6f 70 65 6e 20 61 20    # Then open a 
2720: 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e  read-transaction
2730: 20 77 69 74 68 20 5b 64 62 5d 2e 20 43 6f 6d 6d   with [db]. Comm
2740: 69 74 20 74 68 65 20 5b 64 62 32 5d 20 74 72 61  it the [db2] tra
2750: 6e 73 61 63 74 69 6f 6e 0a 20 20 23 20 74 6f 20  nsaction.  # to 
2760: 64 69 73 6b 2e 20 56 65 72 69 66 79 20 74 68 61  disk. Verify tha
2770: 74 20 5b 64 62 5d 20 73 74 69 6c 6c 20 63 61 6e  t [db] still can
2780: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
2790: 20 64 61 74 61 62 61 73 65 20 28 62 65 63 61 75   database (becau
27a0: 73 65 0a 20 20 23 20 69 74 20 69 73 20 72 65 61  se.  # it is rea
27b0: 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e 61 70  ding an old snap
27c0: 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20 23 20 43  shot)..  #.  # C
27d0: 6c 6f 73 65 20 74 68 65 20 63 75 72 72 65 6e 74  lose the current
27e0: 20 5b 64 62 5d 20 74 72 61 6e 73 61 63 74 69 6f   [db] transactio
27f0: 6e 2e 20 4f 70 65 6e 20 61 20 6e 65 77 20 6f 6e  n. Open a new on
2800: 65 2e 20 5b 64 62 5d 20 63 61 6e 20 6e 6f 77 20  e. [db] can now 
2810: 77 72 69 74 65 0a 20 20 23 20 74 6f 20 74 68 65  write.  # to the
2820: 20 64 61 74 61 62 61 73 65 20 28 61 73 20 69 74   database (as it
2830: 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 61   is not locked a
2840: 6e 64 20 5b 64 62 5d 20 69 73 20 72 65 61 64 69  nd [db] is readi
2850: 6e 67 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20  ng the latest.  
2860: 23 20 73 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23  # snapshot)..  #
2870: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
2880: 30 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 73 71  0.$tn.7 {.    sq
2890: 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45  l2 { BEGIN; INSE
28a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
28b0: 53 28 37 2c 20 38 29 20 3b 20 7d 0a 20 20 20 20  S(7, 8) ; }.    
28c0: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
28d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
28e0: 28 39 2c 20 31 30 29 20 7d 0a 20 20 7d 20 7b 31  (9, 10) }.  } {1
28f0: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
2900: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
2910: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 38 20 7b 0a   wal-10.$tn.8 {.
2920: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45      execsql { BE
2930: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  GIN ; SELECT * F
2940: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
2950: 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64 6f 5f  2 3 4 5 6}.  do_
2960: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
2970: 39 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d  9 {.    sql2 COM
2980: 4d 49 54 0a 20 20 20 20 63 61 74 63 68 73 71 6c  MIT.    catchsql
2990: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
29a0: 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20  1 VALUES(9, 10) 
29b0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
29c0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
29d0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
29e0: 24 74 6e 2e 31 30 20 7b 0a 20 20 20 20 65 78 65  $tn.10 {.    exe
29f0: 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 3b 20 42  csql { COMMIT; B
2a00: 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
2a10: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
2a20: 30 29 3b 20 43 4f 4d 4d 49 54 3b 20 7d 0a 20 20  0); COMMIT; }.  
2a30: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
2a40: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
2a50: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
2a60: 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 4f  7 8 9 10}..  # O
2a70: 70 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73  pen a read trans
2a80: 61 63 74 69 6f 6e 20 77 69 74 68 20 5b 64 62 32  action with [db2
2a90: 5d 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ]. Check that th
2aa0: 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64 62 5d  is prevents [db]
2ab0: 20 66 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b 70   from.  # checkp
2ac0: 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74 61  ointing the data
2ad0: 62 61 73 65 2e 20 42 75 74 20 6e 6f 74 20 66 72  base. But not fr
2ae0: 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 69 74  om writing to it
2af0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
2b00: 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 31 20 7b 0a  wal-10.$tn.11 {.
2b10: 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e      sql2 { BEGIN
2b20: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
2b30: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  t1 }.  } {1 2 3 
2b40: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
2b50: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
2b60: 2e 24 74 6e 2e 31 32 20 7b 0a 20 20 20 20 63 61  .$tn.12 {.    ca
2b70: 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  tchsql { PRAGMA 
2b80: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20  checkpoint } .  
2b90: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
2ba0: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f  s locked}}.  do_
2bb0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
2bc0: 31 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  13 {.    execsql
2bd0: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
2be0: 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29  1 VALUES(11, 12)
2bf0: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c   }.    sql2 {SEL
2c00: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
2c10: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
2c20: 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 43  7 8 9 10}..  # C
2c30: 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 32 5d 20  onnection [db2] 
2c40: 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63  is holding a loc
2c50: 6b 20 6f 6e 20 61 20 73 6e 61 70 73 68 6f 74 2c  k on a snapshot,
2c60: 20 70 72 65 76 65 6e 74 69 6e 67 20 5b 64 62 5d   preventing [db]
2c70: 20 66 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b 70   from.  # checkp
2c80: 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74 61  ointing the data
2c90: 62 61 73 65 2e 20 41 64 64 20 61 20 62 75 73 79  base. Add a busy
2ca0: 2d 68 61 6e 64 6c 65 72 20 74 6f 20 5b 64 62 5d  -handler to [db]
2cb0: 2e 20 49 66 20 5b 64 62 32 5d 20 63 6f 6d 70 6c  . If [db2] compl
2cc0: 65 74 65 73 0a 20 20 23 20 69 74 73 20 74 72 61  etes.  # its tra
2cd0: 6e 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20 77 69  nsaction from wi
2ce0: 74 68 69 6e 20 74 68 65 20 62 75 73 79 2d 68 61  thin the busy-ha
2cf0: 6e 64 6c 65 72 2c 20 5b 64 62 5d 20 69 73 20 61  ndler, [db] is a
2d00: 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 0a  ble to complete.
2d10: 20 20 23 20 74 68 65 20 63 68 65 63 6b 70 6f 69    # the checkpoi
2d20: 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  nt operation..  
2d30: 23 0a 20 20 70 72 6f 63 20 62 75 73 79 68 61 6e  #.  proc busyhan
2d40: 64 6c 65 72 20 78 20 7b 0a 20 20 20 20 69 66 20  dler x {.    if 
2d50: 7b 24 78 3d 3d 34 7d 20 7b 20 73 71 6c 32 20 43  {$x==4} { sql2 C
2d60: 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 69 66 20 7b  OMMIT }.    if {
2d70: 24 78 3c 35 7d 20 7b 20 72 65 74 75 72 6e 20 30  $x<5} { return 0
2d80: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 0a   }.    return 1.
2d90: 20 20 7d 0a 20 20 64 62 20 62 75 73 79 20 62 75    }.  db busy bu
2da0: 73 79 68 61 6e 64 6c 65 72 0a 20 20 64 6f 5f 74  syhandler.  do_t
2db0: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
2dc0: 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  4 {.    execsql 
2dd0: 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  { PRAGMA checkpo
2de0: 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a 0a 20  int } .  } {}.. 
2df0: 20 23 20 53 69 6d 69 6c 61 72 20 74 6f 20 74 68   # Similar to th
2e00: 65 20 74 65 73 74 20 61 62 6f 76 65 2e 20 45 78  e test above. Ex
2e10: 63 65 70 74 20 74 68 69 73 20 74 69 6d 65 2c 20  cept this time, 
2e20: 61 20 6e 65 77 20 72 65 61 64 20 74 72 61 6e 73  a new read trans
2e30: 61 63 74 69 6f 6e 20 69 73 0a 20 20 23 20 73 74  action is.  # st
2e40: 61 72 74 65 64 20 28 64 62 33 29 20 77 68 69 6c  arted (db3) whil
2e50: 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
2e60: 65 72 20 69 73 20 77 61 69 74 69 6e 67 20 66 6f  er is waiting fo
2e70: 72 20 61 6e 20 6f 6c 64 20 6f 6e 65 20 28 64 62  r an old one (db
2e80: 32 29 20 74 6f 20 0a 20 20 23 20 66 69 6e 69 73  2) to .  # finis
2e90: 68 2e 20 54 68 65 20 63 68 65 63 6b 70 6f 69 6e  h. The checkpoin
2ea0: 74 65 72 20 63 61 6e 20 66 69 6e 69 73 68 2c 20  ter can finish, 
2eb0: 62 75 74 20 61 6e 79 20 73 75 62 73 65 71 75 65  but any subseque
2ec0: 6e 74 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  nt write operati
2ed0: 6f 6e 73 20 0a 20 20 23 20 6d 75 73 74 20 77 61  ons .  # must wa
2ee0: 69 74 20 75 6e 74 69 6c 20 61 66 74 65 72 20 64  it until after d
2ef0: 62 33 20 68 61 73 20 63 6c 6f 73 65 64 20 74 68  b3 has closed th
2f00: 65 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  e read transacti
2f10: 6f 6e 2c 20 61 73 20 64 62 33 20 69 73 20 61 0a  on, as db3 is a.
2f20: 20 20 23 20 22 72 65 67 69 6f 6e 20 44 22 20 77    # "region D" w
2f30: 72 69 74 65 72 2e 0a 20 20 23 0a 20 20 64 62 20  riter..  #.  db 
2f40: 62 75 73 79 20 7b 7d 0a 20 20 64 6f 5f 74 65 73  busy {}.  do_tes
2f50: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 35 20  t wal-10.$tn.15 
2f60: 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47  {.    sql2 { BEG
2f70: 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN; SELECT * FRO
2f80: 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31 20 32  M t1; }.  } {1 2
2f90: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
2fa0: 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65  0 11 12}.  do_te
2fb0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 36  st wal-10.$tn.16
2fc0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
2fd0: 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  { PRAGMA checkpo
2fe0: 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 31 20 7b 64  int } .  } {1 {d
2ff0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
3000: 64 7d 7d 0a 20 20 70 72 6f 63 20 62 75 73 79 68  d}}.  proc busyh
3010: 61 6e 64 6c 65 72 20 78 20 7b 0a 20 20 20 20 69  andler x {.    i
3020: 66 20 7b 24 78 3d 3d 33 7d 20 7b 20 73 71 6c 33  f {$x==3} { sql3
3030: 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54   { BEGIN; SELECT
3040: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d 0a 20   * FROM t1 } }. 
3050: 20 20 20 69 66 20 7b 24 78 3d 3d 34 7d 20 7b 20     if {$x==4} { 
3060: 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 0a 20 20  sql2 COMMIT }.  
3070: 20 20 69 66 20 7b 24 78 3c 35 7d 20 20 7b 20 72    if {$x<5}  { r
3080: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 72 65  eturn 0 }.    re
3090: 74 75 72 6e 20 31 0a 20 20 7d 0a 20 20 64 62 20  turn 1.  }.  db 
30a0: 62 75 73 79 20 62 75 73 79 68 61 6e 64 6c 65 72  busy busyhandler
30b0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
30c0: 30 2e 24 74 6e 2e 31 37 20 7b 0a 20 20 20 20 65  0.$tn.17 {.    e
30d0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
30e0: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20  checkpoint } .  
30f0: 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  } {}.  do_test w
3100: 61 6c 2d 31 30 2e 24 74 6e 2e 31 38 20 7b 0a 20  al-10.$tn.18 {. 
3110: 20 20 20 73 71 6c 33 20 7b 20 53 45 4c 45 43 54     sql3 { SELECT
3120: 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d   * FROM t1 }.  }
3130: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3140: 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 20 20  8 9 10 11 12}.  
3150: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3160: 74 6e 2e 31 39 20 7b 0a 20 20 20 20 63 61 74 63  tn.19 {.    catc
3170: 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  hsql { INSERT IN
3180: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 33 2c  TO t1 VALUES(13,
3190: 20 31 34 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64   14) }.  } {1 {d
31a0: 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
31b0: 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  d}}.  do_test wa
31c0: 6c 2d 31 30 2e 24 74 6e 2e 32 30 20 7b 0a 20 20  l-10.$tn.20 {.  
31d0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
31e0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
31f0: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
3200: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a  7 8 9 10 11 12}.
3210: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3220: 2e 24 74 6e 2e 32 31 20 7b 0a 20 20 20 20 73 71  .$tn.21 {.    sq
3230: 6c 33 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d  l3 COMMIT.  } {}
3240: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3250: 30 2e 24 74 6e 2e 32 32 20 7b 0a 20 20 20 20 65  0.$tn.22 {.    e
3260: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
3270: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
3280: 33 2c 20 31 34 29 20 7d 0a 20 20 20 20 65 78 65  3, 14) }.    exe
3290: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
32a0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
32b0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
32c0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d   10 11 12 13 14}
32d0: 0a 0a 20 20 23 20 53 65 74 20 5b 64 62 33 5d 20  ..  # Set [db3] 
32e0: 75 70 20 61 73 20 61 20 22 72 65 67 69 6f 6e 20  up as a "region 
32f0: 44 22 20 72 65 61 64 65 72 20 61 67 61 69 6e 2e  D" reader again.
3300: 20 54 68 65 6e 20 75 70 67 72 61 64 65 20 69 74   Then upgrade it
3310: 20 74 6f 20 61 20 77 72 69 74 65 72 0a 20 20 23   to a writer.  #
3320: 20 61 6e 64 20 62 61 63 6b 20 64 6f 77 6e 20 74   and back down t
3330: 6f 20 61 20 72 65 61 64 65 72 2e 20 54 68 65 6e  o a reader. Then
3340: 2c 20 63 68 65 63 6b 20 74 68 61 74 20 61 20 63  , check that a c
3350: 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74  heckpoint is not
3360: 20 70 6f 73 73 69 62 6c 65 0a 20 20 23 20 28 61   possible.  # (a
3370: 73 20 5b 64 62 33 5d 20 73 74 69 6c 6c 20 68 61  s [db3] still ha
3380: 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6c 6f 63  s a snapshot loc
3390: 6b 65 64 29 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  ked)..  #.  do_t
33a0: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
33b0: 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  3 {.    execsql 
33c0: 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f  { PRAGMA checkpo
33d0: 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64  int }.  } {}.  d
33e0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
33f0: 6e 2e 32 34 20 7b 0a 20 20 20 20 73 71 6c 32 20  n.24 {.    sql2 
3400: 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20  { BEGIN; SELECT 
3410: 2a 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d  * FROM t1; }.  }
3420: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3430: 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20  8 9 10 11 12 13 
3440: 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  14}.  do_test wa
3450: 6c 2d 31 30 2e 24 74 6e 2e 32 35 20 7b 0a 20 20  l-10.$tn.25 {.  
3460: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
3470: 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  MA checkpoint }.
3480: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
3490: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36 20 7b   wal-10.$tn.26 {
34a0: 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20  .    catchsql { 
34b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
34c0: 41 4c 55 45 53 28 31 35 2c 20 31 36 29 20 7d 0a  ALUES(15, 16) }.
34d0: 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
34e0: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
34f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3500: 6e 2e 32 37 20 7b 0a 20 20 20 20 73 71 6c 33 20  n.27 {.    sql3 
3510: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
3520: 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36 29 20   VALUES(15, 16) 
3530: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
3540: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 38  st wal-10.$tn.28
3550: 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b 0a 20   {.    code3 {. 
3560: 20 20 20 20 20 73 65 74 20 3a 3a 53 54 4d 54 20       set ::STMT 
3570: 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  [sqlite3_prepare
3580: 20 64 62 33 20 22 53 45 4c 45 43 54 20 2a 20 46   db3 "SELECT * F
3590: 52 4f 4d 20 74 31 22 20 2d 31 20 54 41 49 4c 5d  ROM t1" -1 TAIL]
35a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
35b0: 74 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20 20 20  tep $::STMT.    
35c0: 7d 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d 4d 49  }.    sql3 COMMI
35d0: 54 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  T.    execsql { 
35e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
35f0: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3600: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
3610: 31 32 20 31 33 20 31 34 20 31 35 20 31 36 7d 0a  12 13 14 15 16}.
3620: 20 20 64 62 20 62 75 73 79 20 7b 7d 0a 20 20 64    db busy {}.  d
3630: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3640: 6e 2e 32 39 20 7b 0a 20 20 20 20 65 78 65 63 73  n.29 {.    execs
3650: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
3660: 20 74 31 20 56 41 4c 55 45 53 28 31 37 2c 20 31   t1 VALUES(17, 1
3670: 38 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71  8) }.    catchsq
3680: 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b  l { PRAGMA check
3690: 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 31 20 7b  point }.  } {1 {
36a0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
36b0: 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  ed}}.  do_test w
36c0: 61 6c 2d 31 30 2e 24 74 6e 2e 33 30 20 7b 0a 20  al-10.$tn.30 {. 
36d0: 20 20 20 63 6f 64 65 33 20 7b 20 73 71 6c 69 74     code3 { sqlit
36e0: 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53  e3_finalize $::S
36f0: 54 4d 54 20 7d 0a 20 20 20 20 65 78 65 63 73 71  TMT }.    execsq
3700: 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b  l { PRAGMA check
3710: 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a 0a  point }.  } {}..
3720: 20 20 23 20 41 74 20 6f 6e 65 20 70 6f 69 6e 74    # At one point
3730: 2c 20 69 66 20 61 20 72 65 61 64 65 72 20 66 61  , if a reader fa
3740: 69 6c 65 64 20 74 6f 20 75 70 67 72 61 64 65 20  iled to upgrade 
3750: 74 6f 20 61 20 77 72 69 74 65 72 20 62 65 63 61  to a writer beca
3760: 75 73 65 20 69 74 0a 20 20 23 20 77 61 73 20 72  use it.  # was r
3770: 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e  eading an old sn
3780: 61 70 73 68 6f 74 2c 20 74 68 65 20 77 72 69 74  apshot, the writ
3790: 65 2d 6c 6f 63 6b 73 20 77 65 72 65 20 6e 6f 74  e-locks were not
37a0: 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65 64 2e   being released.
37b0: 0a 20 20 23 20 54 65 73 74 20 74 68 61 74 20 74  .  # Test that t
37c0: 68 69 73 20 62 75 67 20 68 61 73 20 62 65 65 6e  his bug has been
37d0: 20 66 69 78 65 64 2e 0a 20 20 23 0a 20 20 64 6f   fixed..  #.  do
37e0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
37f0: 2e 33 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .31 {.    execsq
3800: 6c 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c 45  l { BEGIN ; SELE
3810: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
3820: 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52 54     sql2 { INSERT
3830: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3840: 31 39 2c 20 32 30 29 20 7d 0a 20 20 20 20 63 61  19, 20) }.    ca
3850: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
3860: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32  INTO t1 VALUES(2
3870: 31 2c 20 32 32 29 20 7d 0a 20 20 7d 20 7b 31 20  1, 22) }.  } {1 
3880: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
3890: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
38a0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 32 20 7b 0a  wal-10.$tn.32 {.
38b0: 20 20 20 20 23 20 54 68 69 73 20 73 74 61 74 65      # This state
38c0: 6d 65 6e 74 20 77 6f 75 6c 64 20 66 61 69 6c 20  ment would fail 
38d0: 77 68 65 6e 20 74 68 65 20 62 75 67 20 77 61 73  when the bug was
38e0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 20 20 73 71   present..    sq
38f0: 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  l2 { INSERT INTO
3900: 20 74 31 20 56 41 4c 55 45 53 28 32 31 2c 20 32   t1 VALUES(21, 2
3910: 32 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f  2) }.  } {}.  do
3920: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3930: 2e 33 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .33 {.    execsq
3940: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
3950: 4d 20 74 31 20 3b 20 43 4f 4d 4d 49 54 20 7d 0a  M t1 ; COMMIT }.
3960: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
3970: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
3980: 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31  13 14 15 16 17 1
3990: 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  8}.  do_test wal
39a0: 2d 31 30 2e 24 74 6e 2e 33 34 20 7b 0a 20 20 20  -10.$tn.34 {.   
39b0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
39c0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
39d0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
39e0: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
39f0: 20 31 34 20 31 35 20 31 36 20 31 37 20 31 38 20   14 15 16 17 18 
3a00: 31 39 20 32 30 20 32 31 20 32 32 7d 0a 0a 20 20  19 20 21 22}..  
3a10: 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65  catch { db close
3a20: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6f 64   }.  catch { cod
3a30: 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d  e2 { db2 close }
3a40: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6f 64   }.  catch { cod
3a50: 65 33 20 7b 20 64 62 33 20 63 6c 6f 73 65 20 7d  e3 { db3 close }
3a60: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c 6f   }.  catch { clo
3a70: 73 65 20 24 3a 3a 63 6f 64 65 32 5f 63 68 61 6e  se $::code2_chan
3a80: 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63 6c 6f   }.  catch { clo
3a90: 73 65 20 24 3a 3a 63 6f 64 65 33 5f 63 68 61 6e  se $::code3_chan
3aa0: 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d   }.}..#---------
3ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3af0: 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .# This block of
3b00: 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 31 2e 2a   tests, wal-11.*
3b10: 2c 20 74 65 73 74 20 74 68 61 74 20 6e 6f 74 68  , test that noth
3b20: 69 6e 67 20 67 6f 65 73 20 74 65 72 72 69 62 6c  ing goes terribl
3b30: 79 20 77 72 6f 6e 67 0a 23 20 69 66 20 66 72 61  y wrong.# if fra
3b40: 6d 65 73 20 6d 75 73 74 20 62 65 20 77 72 69 74  mes must be writ
3b50: 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67 20 66  ten to the log f
3b60: 69 6c 65 20 62 65 66 6f 72 65 20 61 20 74 72 61  ile before a tra
3b70: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 23 20 63 6f  nsaction is.# co
3b80: 6d 6d 69 74 74 65 64 20 28 69 6e 20 6f 72 64 65  mmitted (in orde
3b90: 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d  r to free up mem
3ba0: 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74 65 73 74 20  ory)..#.do_test 
3bb0: 77 61 6c 2d 31 31 2e 31 20 7b 0a 20 20 72 65 6f  wal-11.1 {.  reo
3bc0: 70 65 6e 5f 64 62 0a 20 20 65 78 65 63 73 71 6c  pen_db.  execsql
3bd0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61   {.    PRAGMA ca
3be0: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
3bf0: 20 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73     PRAGMA page_s
3c00: 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
3c10: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
3c20: 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29 3b 0a  x PRIMARY KEY);.
3c30: 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72    }.  list [expr
3c40: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
3c50: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72  .db]/1024] [expr
3c60: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
3c70: 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d  .db-wal]/1044].}
3c80: 20 7b 30 20 33 7d 0a 64 6f 5f 74 65 73 74 20 77   {0 3}.do_test w
3c90: 61 6c 2d 31 31 2e 32 20 7b 0a 20 20 65 78 65 63  al-11.2 {.  exec
3ca0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65  sql { PRAGMA che
3cb0: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74  ckpoint }.  list
3cc0: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
3cd0: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
3ce0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
3cf0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74  .db-wal].} [list
3d00: 20 33 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a   3 [log_file_siz
3d10: 65 20 33 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65  e 3 1024]].do_te
3d20: 73 74 20 77 61 6c 2d 31 31 2e 33 20 7b 0a 20 20  st wal-11.3 {.  
3d30: 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54  execsql { INSERT
3d40: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
3d50: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
3d60: 20 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70   ) }.  list [exp
3d70: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
3d80: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c  t.db]/1024] [fil
3d90: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
3da0: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 6c  al].} [list 3 [l
3db0: 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 34 20 31  og_file_size 4 1
3dc0: 30 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20 77  024]]..do_test w
3dd0: 61 6c 2d 31 31 2e 34 20 7b 0a 20 20 65 78 65 63  al-11.4 {.  exec
3de0: 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e  sql { .    BEGIN
3df0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
3e00: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
3e10: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
3e20: 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 32 0a 20 20  OM t1;   -- 2.  
3e30: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
3e40: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
3e50: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
3e60: 31 3b 20 20 20 2d 2d 20 34 0a 20 20 20 20 20 20  1;   -- 4.      
3e70: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
3e80: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
3e90: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
3ea0: 20 2d 2d 20 38 0a 20 20 20 20 20 20 49 4e 53 45   -- 8.      INSE
3eb0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
3ec0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  T randomblob(900
3ed0: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20  ) FROM t1;   -- 
3ee0: 31 36 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  16.  }.  list [e
3ef0: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
3f00: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66  est.db]/1024] [f
3f10: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
3f20: 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20  -wal].} [list 3 
3f30: 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 33  [log_file_size 3
3f40: 33 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74  3 1024]].do_test
3f50: 20 77 61 6c 2d 31 31 2e 35 20 7b 0a 20 20 65 78   wal-11.5 {.  ex
3f60: 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c  ecsql { .    SEL
3f70: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
3f80: 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41  M t1;.    PRAGMA
3f90: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
3fa0: 3b 0a 20 20 7d 0a 7d 20 7b 31 36 20 6f 6b 7d 0a  ;.  }.} {16 ok}.
3fb0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 36  do_test wal-11.6
3fc0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 43 4f 4d   {.  execsql COM
3fd0: 4d 49 54 0a 20 20 6c 69 73 74 20 5b 65 78 70 72  MIT.  list [expr
3fe0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
3ff0: 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65  .db]/1024] [file
4000: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
4010: 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 6c 6f  l].} [list 3 [lo
4020: 67 5f 66 69 6c 65 5f 73 69 7a 65 20 34 32 20 31  g_file_size 42 1
4030: 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61  024]].do_test wa
4040: 6c 2d 31 31 2e 37 20 7b 0a 20 20 65 78 65 63 73  l-11.7 {.  execs
4050: 71 6c 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54  ql { .    SELECT
4060: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
4070: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  1;.    PRAGMA in
4080: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
4090: 20 7d 0a 7d 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f   }.} {16 ok}.do_
40a0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 38 20 7b 0a  test wal-11.8 {.
40b0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
40c0: 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  MA checkpoint }.
40d0: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
40e0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
40f0: 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a  /1024] [file siz
4100: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
4110: 20 5b 6c 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66   [list 37 [log_f
4120: 69 6c 65 5f 73 69 7a 65 20 34 32 20 31 30 32 34  ile_size 42 1024
4130: 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  ]].do_test wal-1
4140: 31 2e 39 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  1.9 {.  db close
4150: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
4160: 62 20 74 65 73 74 2e 64 62 0a 20 20 6c 69 73 74  b test.db.  list
4170: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
4180: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
4190: 20 5b 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74 65   [log_deleted te
41a0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 33 37  st.db-wal].} {37
41b0: 20 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c   1}..do_test wal
41c0: 2d 31 31 2e 31 30 20 7b 0a 20 20 65 78 65 63 73  -11.10 {.  execs
41d0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
41e0: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
41f0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
4200: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
4210: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
4220: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
4230: 20 20 20 2d 2d 20 33 32 0a 20 20 20 20 20 20 53     -- 32.      S
4240: 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
4250: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 20 20 6c 69  ROM t1;.  }.  li
4260: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
4270: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
4280: 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  4] [file size te
4290: 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69  st.db-wal].} [li
42a0: 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65 5f  st 37 [log_file_
42b0: 73 69 7a 65 20 34 30 20 31 30 32 34 5d 5d 0a 64  size 40 1024]].d
42c0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 31  o_test wal-11.11
42d0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
42e0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
42f0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4300: 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20    ROLLBACK;.    
4310: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4320: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
4330: 33 32 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 77  32 16}.do_test w
4340: 61 6c 2d 31 31 2e 31 32 20 7b 0a 20 20 6c 69 73  al-11.12 {.  lis
4350: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
4360: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
4370: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
4380: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
4390: 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73  t 37 [log_file_s
43a0: 69 7a 65 20 34 30 20 31 30 32 34 5d 5d 0a 64 6f  ize 40 1024]].do
43b0: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 33 20  _test wal-11.13 
43c0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
43d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
43e0: 20 56 41 4c 55 45 53 28 20 72 61 6e 64 6f 6d 62   VALUES( randomb
43f0: 6c 6f 62 28 39 30 30 29 20 29 3b 0a 20 20 20 20  lob(900) );.    
4400: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
4410: 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41  FROM t1;.    PRA
4420: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
4430: 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 37 20 6f  eck;.  }.} {17 o
4440: 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  k}.do_test wal-1
4450: 31 2e 31 34 20 7b 0a 20 20 6c 69 73 74 20 5b 65  1.14 {.  list [e
4460: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
4470: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66  est.db]/1024] [f
4480: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4490: 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 37  -wal].} [list 37
44a0: 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20   [log_file_size 
44b0: 34 30 20 31 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d  40 1024]]...#---
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4500: 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c  ------.# This bl
4510: 6f 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61  ock of tests, wa
4520: 6c 2d 31 32 2e 2a 2c 20 74 65 73 74 73 20 74 68  l-12.*, tests th
4530: 65 20 66 69 78 20 66 6f 72 20 61 20 70 72 6f 62  e fix for a prob
4540: 6c 65 6d 20 74 68 61 74 20 0a 23 20 63 6f 75 6c  lem that .# coul
4550: 64 20 6f 63 63 75 72 20 69 66 20 61 20 6c 6f 67  d occur if a log
4560: 20 74 68 61 74 20 69 73 20 61 20 70 72 65 66 69   that is a prefi
4570: 78 20 6f 66 20 61 6e 20 6f 6c 64 65 72 20 6c 6f  x of an older lo
4580: 67 20 69 73 20 77 72 69 74 74 65 6e 20 0a 23 20  g is written .# 
4590: 69 6e 74 6f 20 61 20 72 65 75 73 65 64 20 6c 6f  into a reused lo
45a0: 67 20 66 69 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e  g file..#.reopen
45b0: 5f 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  _db.do_test wal-
45c0: 31 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  12.1 {.  execsql
45d0: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
45e0: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
45f0: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
4600: 20 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 43   t1(x, y);.    C
4610: 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78  REATE TABLE t2(x
4620: 2c 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , y);.    INSERT
4630: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
4640: 27 41 27 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c  'A', 1);.  }.  l
4650: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
4660: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
4670: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
4680: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
4690: 69 73 74 20 30 20 5b 6c 6f 67 5f 66 69 6c 65 5f  ist 0 [log_file_
46a0: 73 69 7a 65 20 35 20 31 30 32 34 5d 5d 0a 64 6f  size 5 1024]].do
46b0: 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 32 20 7b  _test wal-12.2 {
46c0: 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71  .  db close.  sq
46d0: 6c 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65 73  lite3_wal db tes
46e0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
46f0: 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53  .    UPDATE t1 S
4700: 45 54 20 79 20 3d 20 30 20 57 48 45 52 45 20 78  ET y = 0 WHERE x
4710: 20 3d 20 27 41 27 3b 0a 20 20 7d 0a 20 20 6c 69   = 'A';.  }.  li
4720: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
4730: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
4740: 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  4] [expr [file s
4750: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4760: 2f 31 30 34 34 5d 0a 7d 20 7b 33 20 31 7d 0a 64  /1044].} {3 1}.d
4770: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 33 20  o_test wal-12.3 
4780: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
4790: 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c  SERT INTO t2 VAL
47a0: 55 45 53 28 27 42 27 2c 20 31 29 20 7d 0a 20 20  UES('B', 1) }.  
47b0: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
47c0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
47d0: 30 32 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65  024] [expr [file
47e0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
47f0: 6c 5d 2f 31 30 34 34 5d 0a 7d 20 7b 33 20 32 7d  l]/1044].} {3 2}
4800: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32  ..do_test wal-12
4810: 2e 34 20 7b 0a 20 20 66 69 6c 65 20 63 6f 70 79  .4 {.  file copy
4820: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20   -force test.db 
4830: 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65 20  test2.db.  file 
4840: 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73 74  copy -force test
4850: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
4860: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77  -wal.  sqlite3_w
4870: 61 6c 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a  al db2 test2.db.
4880: 62 72 65 61 6b 70 6f 69 6e 74 0a 20 20 65 78 65  breakpoint.  exe
4890: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
48a0: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
48b0: 7b 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  {B 1}.db2 close.
48c0: 0a 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63  .file copy -forc
48d0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 41 0a  e test.db-wal A.
48e0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 35  do_test wal-12.5
48f0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
4900: 20 20 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70     PRAGMA checkp
4910: 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54 45  oint;.    UPDATE
4920: 20 74 32 20 53 45 54 20 79 20 3d 20 32 20 57 48   t2 SET y = 2 WH
4930: 45 52 45 20 78 20 3d 20 27 42 27 3b 20 0a 20 20  ERE x = 'B'; .  
4940: 20 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f    PRAGMA checkpo
4950: 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54 45 20  int;.    UPDATE 
4960: 74 31 20 53 45 54 20 79 20 3d 20 31 20 57 48 45  t1 SET y = 1 WHE
4970: 52 45 20 78 20 3d 20 27 41 27 3b 0a 20 20 20 20  RE x = 'A';.    
4980: 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e  PRAGMA checkpoin
4990: 74 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31  t;.    UPDATE t1
49a0: 20 53 45 54 20 79 20 3d 20 30 20 57 48 45 52 45   SET y = 0 WHERE
49b0: 20 78 20 3d 20 27 41 27 3b 0a 20 20 20 20 53 45   x = 'A';.    SE
49c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
49d0: 20 20 7d 0a 7d 20 7b 42 20 32 7d 0a 66 69 6c 65    }.} {B 2}.file
49e0: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
49f0: 74 2e 64 62 2d 77 61 6c 20 42 0a 0a 64 6f 5f 74  t.db-wal B..do_t
4a00: 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20  est wal-12.4 {. 
4a10: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
4a20: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e  e test.db test2.
4a30: 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d  db.  file copy -
4a40: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77 61  force test.db-wa
4a50: 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  l test2.db-wal. 
4a60: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32   sqlite3_wal db2
4a70: 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63   test2.db.  exec
4a80: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
4a90: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
4aa0: 42 20 32 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a  B 2}.db2 close..
4ab0: 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a        .finish_test..