/ Hex Artifact Content
Login

Artifact ff3c101453044e1f9930d0421a164e09619a678c:


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: 23 0a 23 20 54 68 65 73 65 20 61 72 65 20 27 77  #.# These are 'w
0350: 61 72 6d 2d 62 6f 64 79 27 20 74 65 73 74 73 20  arm-body' tests 
0360: 75 73 65 64 20 77 68 69 6c 65 20 64 65 76 65 6c  used while devel
0370: 6f 70 69 6e 67 20 74 68 65 20 57 41 4c 20 63 6f  oping the WAL co
0380: 64 65 2e 20 54 68 65 79 0a 23 20 73 65 72 76 65  de. They.# serve
0390: 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 61   to prove that a
03a0: 20 66 65 77 20 72 65 61 6c 6c 79 20 73 69 6d 70   few really simp
03b0: 6c 65 20 63 61 73 65 73 20 77 6f 72 6b 3a 0a 23  le cases work:.#
03c0: 0a 23 20 77 61 6c 2d 31 2e 2a 3a 20 52 65 61 64  .# wal-1.*: Read
03d0: 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 64   and write the d
03e0: 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c 2d 32  atabase..# wal-2
03f0: 2e 2a 3a 20 54 65 73 74 20 4d 56 43 43 20 77 69  .*: Test MVCC wi
0400: 74 68 20 6f 6e 65 20 72 65 61 64 65 72 2c 20 6f  th one reader, o
0410: 6e 65 20 77 72 69 74 65 72 2e 0a 23 20 77 61 6c  ne writer..# wal
0420: 2d 33 2e 2a 3a 20 54 65 73 74 20 74 72 61 6e 73  -3.*: Test trans
0430: 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2e  action rollback.
0440: 0a 23 20 77 61 6c 2d 34 2e 2a 3a 20 54 65 73 74  .# wal-4.*: Test
0450: 20 73 61 76 65 70 6f 69 6e 74 2f 73 74 61 74 65   savepoint/state
0460: 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23  ment rollback..#
0470: 20 77 61 6c 2d 35 2e 2a 3a 20 54 65 73 74 20 74   wal-5.*: Test t
0480: 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
0490: 2e 0a 23 20 77 61 6c 2d 36 2e 2a 3a 20 54 65 73  ..# wal-6.*: Tes
04a0: 74 20 63 72 65 61 74 69 6e 67 20 64 61 74 61 62  t creating datab
04b0: 61 73 65 73 20 77 69 74 68 20 64 69 66 66 65 72  ases with differ
04c0: 65 6e 74 20 70 61 67 65 20 73 69 7a 65 73 2e 0a  ent page sizes..
04d0: 23 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30  #..do_test wal-0
04e0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
04f0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
0500: 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 7d 20 7b  mode = wal }.} {
0510: 77 61 6c 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  wal}..do_test wa
0520: 6c 2d 31 2e 30 20 7b 0a 20 20 65 78 65 63 73 71  l-1.0 {.  execsq
0530: 6c 20 7b 20 0a 20 20 20 20 42 45 47 49 4e 3b 0a  l { .    BEGIN;.
0540: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
0550: 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 7d 0a   t1(a, b); .  }.
0560: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78 69    list [file exi
0570: 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72  sts test.db-jour
0580: 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73 74  nal] [file exist
0590: 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  s test.db-wal].}
05a0: 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77   {0 1}.do_test w
05b0: 61 6c 2d 31 2e 31 20 7b 0a 20 20 65 78 65 63 73  al-1.1 {.  execs
05c0: 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69 73 74  ql COMMIT.  list
05d0: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 74 65   [file exists te
05e0: 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5b  st.db-journal] [
05f0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
0600: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 30 20 31 7d  .db-wal].} {0 1}
0610: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 32  .do_test wal-1.2
0620: 20 7b 0a 20 20 23 20 54 68 65 72 65 20 61 72 65   {.  # There are
0630: 20 6e 6f 77 20 74 77 6f 20 70 61 67 65 73 20 69   now two pages i
0640: 6e 20 74 68 65 20 6c 6f 67 2e 0a 20 20 66 69 6c  n the log..  fil
0650: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
0660: 61 6c 0a 7d 20 5b 65 78 70 72 20 28 32 30 2b 31  al.} [expr (20+1
0670: 30 32 34 29 2a 32 5d 0a 0a 64 6f 5f 74 65 73 74  024)*2]..do_test
0680: 20 77 61 6c 2d 31 2e 33 20 7b 0a 20 20 65 78 65   wal-1.3 {.  exe
0690: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
06a0: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
06b0: 65 72 20 7d 0a 7d 20 7b 74 61 62 6c 65 20 74 31  er }.} {table t1
06c0: 20 74 31 20 32 20 7b 43 52 45 41 54 45 20 54 41   t1 2 {CREATE TA
06d0: 42 4c 45 20 74 31 28 61 2c 20 62 29 7d 7d 0a 0a  BLE t1(a, b)}}..
06e0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 2e 34 20  do_test wal-1.4 
06f0: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
0700: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0710: 55 45 53 28 31 2c 20 32 29 20 7d 0a 20 20 65 78  UES(1, 2) }.  ex
0720: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
0730: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33 2c  NTO t1 VALUES(3,
0740: 20 34 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20   4) }.  execsql 
0750: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0760: 20 56 41 4c 55 45 53 28 35 2c 20 36 29 20 7d 0a   VALUES(5, 6) }.
0770: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
0780: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
0790: 53 28 37 2c 20 38 29 20 7d 0a 20 20 65 78 65 63  S(7, 8) }.  exec
07a0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
07b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
07c0: 30 29 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65  0) }.} {}..do_te
07d0: 73 74 20 77 61 6c 2d 31 2e 35 20 7b 0a 20 20 65  st wal-1.5 {.  e
07e0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
07f0: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
0800: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0810: 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   10}..do_test wa
0820: 6c 2d 32 2e 31 20 7b 0a 20 20 73 71 6c 69 74 65  l-2.1 {.  sqlite
0830: 33 5f 77 61 6c 20 64 62 32 20 2e 2f 74 65 73 74  3_wal db2 ./test
0840: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
0850: 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20  BEGIN; SELECT * 
0860: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
0870: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0880: 20 39 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20   9 10}..do_test 
0890: 77 61 6c 2d 32 2e 32 20 7b 0a 20 20 65 78 65 63  wal-2.2 {.  exec
08a0: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
08b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20  O t1 VALUES(11, 
08c0: 31 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  12) }.  execsql 
08d0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
08e0: 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  t1 }.} {1 2 3 4 
08f0: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
0900: 31 32 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  12}..do_test wal
0910: 2d 32 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  -2.3 {.  execsql
0920: 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d   { SELECT * FROM
0930: 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32   t1 } db2.} {1 2
0940: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
0950: 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  0}..do_test wal-
0960: 32 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.4 {.  execsql 
0970: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
0980: 20 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20   VALUES(13, 14) 
0990: 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  }.  execsql { SE
09a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
09b0: 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20  .} {1 2 3 4 5 6 
09c0: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
09d0: 33 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  3 14}..do_test w
09e0: 61 6c 2d 32 2e 35 20 7b 0a 20 20 65 78 65 63 73  al-2.5 {.  execs
09f0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
0a00: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t1 } db2.} {1
0a10: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0a20: 20 31 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61   10}..do_test wa
0a30: 6c 2d 32 2e 36 20 7b 0a 20 20 65 78 65 63 73 71  l-2.6 {.  execsq
0a40: 6c 20 7b 20 43 4f 4d 4d 49 54 3b 20 53 45 4c 45  l { COMMIT; SELE
0a50: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
0a60: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
0a70: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
0a80: 20 31 33 20 31 34 7d 0a 0a 64 6f 5f 74 65 73 74   13 14}..do_test
0a90: 20 77 61 6c 2d 33 2e 31 20 7b 0a 20 20 65 78 65   wal-3.1 {.  exe
0aa0: 63 73 71 6c 20 7b 20 42 45 47 49 4e 3b 20 44 45  csql { BEGIN; DE
0ab0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 7d 0a 20  LETE FROM t1 }. 
0ac0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
0ad0: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
0ae0: 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 33  {}.do_test wal-3
0af0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0b00: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0b10: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33  1 } db2.} {1 2 3
0b20: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
0b30: 31 31 20 31 32 20 31 33 20 31 34 7d 0a 64 6f 5f  11 12 13 14}.do_
0b40: 74 65 73 74 20 77 61 6c 2d 33 2e 33 20 7b 0a 20  test wal-3.3 {. 
0b50: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
0b60: 41 43 4b 20 7d 0a 20 20 65 78 65 63 73 71 6c 20  ACK }.  execsql 
0b70: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0b80: 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20  t1 }.} {1 2 3 4 
0b90: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
0ba0: 31 32 20 31 33 20 31 34 7d 0a 64 62 32 20 63 6c  12 13 14}.db2 cl
0bb0: 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c  ose..do_test wal
0bc0: 2d 34 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -4.1 {.  execsql
0bd0: 20 7b 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52   {.    DELETE FR
0be0: 4f 4d 20 74 31 3b 0a 20 20 20 20 42 45 47 49 4e  OM t1;.    BEGIN
0bf0: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
0c00: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 61  NTO t1 VALUES('a
0c10: 27 2c 20 27 62 27 29 3b 0a 20 20 20 20 20 20 53  ', 'b');.      S
0c20: 41 56 45 50 4f 49 4e 54 20 73 70 3b 0a 20 20 20  AVEPOINT sp;.   
0c30: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0c40: 20 74 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20   t1 VALUES('c', 
0c50: 27 64 27 29 3b 0a 20 20 20 20 20 20 20 20 53 45  'd');.        SE
0c60: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
0c70: 20 20 7d 0a 7d 20 7b 61 20 62 20 63 20 64 7d 0a    }.} {a b c d}.
0c80: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 32 20  do_test wal-4.2 
0c90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
0ca0: 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20      ROLLBACK TO 
0cb0: 73 70 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  sp;.      SELECT
0cc0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a   * FROM t1;.  }.
0cd0: 7d 20 7b 61 20 62 7d 0a 64 6f 5f 74 65 73 74 20  } {a b}.do_test 
0ce0: 77 61 6c 2d 34 2e 33 20 7b 0a 20 20 65 78 65 63  wal-4.3 {.  exec
0cf0: 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54  sql {.    COMMIT
0d00: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
0d10: 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61  ROM t1;.  }.} {a
0d20: 20 62 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c   b}..do_test wal
0d30: 2d 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  -5.1 {.  execsql
0d40: 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54 45   {.    CREATE TE
0d50: 4d 50 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  MP TABLE t2(a, b
0d60: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
0d70: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 31 2c 20  TO t2 VALUES(1, 
0d80: 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f  2);.  }.} {}.do_
0d90: 74 65 73 74 20 77 61 6c 2d 35 2e 32 20 7b 0a 20  test wal-5.2 {. 
0da0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
0db0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
0dc0: 52 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45  RT INTO t2 VALUE
0dd0: 53 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  S(3, 4);.      S
0de0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
0df0: 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d  .  }.} {1 2 3 4}
0e00: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 33  .do_test wal-5.3
0e10: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
0e20: 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20     ROLLBACK;.   
0e30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0e40: 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64  2;.  }.} {1 2}.d
0e50: 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e 34 20 7b  o_test wal-5.4 {
0e60: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
0e70: 20 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42   CREATE TEMP TAB
0e80: 4c 45 20 74 33 28 78 20 55 4e 49 51 55 45 29 3b  LE t3(x UNIQUE);
0e90: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
0ea0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
0eb0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
0ec0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
0ed0: 20 74 33 20 56 41 4c 55 45 53 28 27 61 62 63 27   t3 VALUES('abc'
0ee0: 29 3b 0a 20 20 7d 0a 20 20 63 61 74 63 68 73 71  );.  }.  catchsq
0ef0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
0f00: 74 33 20 56 41 4c 55 45 53 28 27 61 62 63 27 29  t3 VALUES('abc')
0f10: 20 7d 0a 7d 20 7b 31 20 7b 63 6f 6c 75 6d 6e 20   }.} {1 {column 
0f20: 78 20 69 73 20 6e 6f 74 20 75 6e 69 71 75 65 7d  x is not unique}
0f30: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e  }.do_test wal-5.
0f40: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
0f50: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20      COMMIT;.    
0f60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32  SELECT * FROM t2
0f70: 3b 0a 20 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34  ;.  }.} {1 2 3 4
0f80: 7d 0a 64 62 20 63 6c 6f 73 65 0a 0a 0a 66 6f 72  }.db close...for
0f90: 65 61 63 68 20 73 65 63 74 6f 72 20 7b 35 31 32  each sector {512
0fa0: 20 34 30 39 36 7d 20 7b 0a 20 20 73 71 6c 69 74   4096} {.  sqlit
0fb0: 65 33 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76 69  e3_simulate_devi
0fc0: 63 65 20 2d 73 65 63 74 6f 72 73 69 7a 65 20 24  ce -sectorsize $
0fd0: 73 65 63 74 6f 72 0a 20 20 66 6f 72 65 61 63 68  sector.  foreach
0fe0: 20 70 67 73 7a 20 7b 35 31 32 20 31 30 32 34 20   pgsz {512 1024 
0ff0: 32 30 34 38 20 34 30 39 36 7d 20 7b 0a 20 20 20  2048 4096} {.   
1000: 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f   file delete -fo
1010: 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  rce test.db test
1020: 2e 64 62 2d 77 61 6c 0a 20 20 20 20 64 6f 5f 74  .db-wal.    do_t
1030: 65 73 74 20 77 61 6c 2d 36 2e 24 73 65 63 74 6f  est wal-6.$secto
1040: 72 2e 24 70 67 73 7a 2e 31 20 7b 0a 20 20 20 20  r.$pgsz.1 {.    
1050: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62    sqlite3_wal db
1060: 20 74 65 73 74 2e 64 62 20 2d 76 66 73 20 64 65   test.db -vfs de
1070: 76 73 79 6d 0a 20 20 20 20 20 20 65 78 65 63 73  vsym.      execs
1080: 71 6c 20 22 0a 20 20 20 20 20 20 20 20 50 52 41  ql ".        PRA
1090: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
10a0: 24 70 67 73 7a 20 3b 0a 20 20 20 20 20 20 22 0a  $pgsz ;.      ".
10b0: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a        execsql ".
10c0: 20 20 20 20 20 20 20 20 43 52 45 41 54 45 20 54          CREATE T
10d0: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
10e0: 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e         INSERT IN
10f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20  TO t1 VALUES(1, 
1100: 32 29 3b 0a 20 20 20 20 20 20 22 0a 20 20 20 20  2);.      ".    
1110: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 20    db close.     
1120: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
1130: 64 62 0a 20 20 20 20 7d 20 5b 65 78 70 72 20 24  db.    } [expr $
1140: 70 67 73 7a 2a 32 5d 0a 20 20 0a 20 20 20 20 64  pgsz*2].  .    d
1150: 6f 5f 74 65 73 74 20 77 61 6c 2d 36 2e 24 73 65  o_test wal-6.$se
1160: 63 74 6f 72 2e 24 70 67 73 7a 2e 32 20 7b 0a 20  ctor.$pgsz.2 {. 
1170: 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74       file size t
1180: 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 20 20 7d  est.db-wal.    }
1190: 20 7b 30 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74   {0}.  }.}..do_t
11a0: 65 73 74 20 77 61 6c 2d 37 2e 31 20 7b 0a 20 20  est wal-7.1 {.  
11b0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
11c0: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e  ce test.db test.
11d0: 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33  db-wal.  sqlite3
11e0: 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a  _wal db test.db.
11f0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1200: 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65  PRAGMA page_size
1210: 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45   = 1024;.    CRE
1220: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
1230: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
1240: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
1250: 20 32 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20   2);.  }.  list 
1260: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
1270: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
1280: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
1290: 69 73 74 20 30 20 5b 65 78 70 72 20 28 31 30 32  ist 0 [expr (102
12a0: 34 2b 32 30 29 2a 33 5d 5d 0a 64 6f 5f 74 65 73  4+20)*3]].do_tes
12b0: 74 20 77 61 6c 2d 37 2e 32 20 7b 0a 20 20 65 78  t wal-7.2 {.  ex
12c0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63  ecsql { PRAGMA c
12d0: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69  heckpoint }.  li
12e0: 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  st [file size te
12f0: 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a  st.db] [file siz
1300: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
1310: 20 5b 6c 69 73 74 20 32 30 34 38 20 5b 65 78 70   [list 2048 [exp
1320: 72 20 28 31 30 32 34 2b 32 30 29 2a 33 5d 5d 0a  r (1024+20)*3]].
1330: 0a 23 20 45 78 65 63 75 74 65 20 73 6f 6d 65 20  .# Execute some 
1340: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20  transactions in 
1350: 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
1360: 20 74 6f 20 74 65 73 74 20 64 61 74 61 62 61 73   to test databas
1370: 65 20 66 69 6c 65 0a 23 20 74 72 75 6e 63 61 74  e file.# truncat
1380: 69 6f 6e 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77  ion..#.do_test w
1390: 61 6c 2d 38 2e 31 20 7b 0a 20 20 72 65 6f 70 65  al-8.1 {.  reope
13a0: 6e 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  n_db.  execsql {
13b0: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
13c0: 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a 20 20 20  _vacuum = 1;.   
13d0: 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63   PRAGMA auto_vac
13e0: 75 75 6d 3b 0a 20 20 7d 0a 7d 20 7b 31 7d 0a 64  uum;.  }.} {1}.d
13f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 38 2e 32 20 7b  o_test wal-8.2 {
1400: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
1410: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
1420: 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 43 52  e = 1024;.    CR
1430: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
1440: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
1450: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
1460: 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20  omblob(900));.  
1470: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1480: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
1490: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e  ob(900));.    IN
14a0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
14b0: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
14c0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
14d0: 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20     /*  4 */.    
14e0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
14f0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
1500: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
1510: 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20       /*  8 */.  
1520: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1530: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
1540: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
1550: 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a         /* 16 */.
1560: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1570: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
1580: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
1590: 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a  1;       /* 32 *
15a0: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
15b0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
15c0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
15d0: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34   t1;       /* 64
15e0: 20 2a 2f 0a 20 20 20 20 50 52 41 47 4d 41 20 63   */.    PRAGMA c
15f0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20  heckpoint;.  }. 
1600: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
1610: 64 62 0a 7d 20 5b 65 78 70 72 20 36 38 2a 31 30  db.} [expr 68*10
1620: 32 34 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  24].do_test wal-
1630: 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.3 {.  execsql 
1640: 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  { .    DELETE FR
1650: 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69  OM t1 WHERE rowi
1660: 64 3c 35 34 3b 0a 20 20 20 20 50 52 41 47 4d 41  d<54;.    PRAGMA
1670: 20 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d   checkpoint;.  }
1680: 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73  .  file size tes
1690: 74 2e 64 62 0a 7d 20 5b 65 78 70 72 20 31 34 2a  t.db.} [expr 14*
16a0: 31 30 32 34 5d 0a 0a 23 20 52 75 6e 20 73 6f 6d  1024]..# Run som
16b0: 65 20 22 77 61 72 6d 2d 62 6f 64 79 22 20 74 65  e "warm-body" te
16c0: 73 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sts to ensure th
16d0: 61 74 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 66  at log-summary f
16e0: 69 6c 65 73 20 77 69 74 68 20 6d 6f 72 65 0a 23  iles with more.#
16f0: 20 74 68 61 6e 20 32 35 36 20 65 6e 74 72 69 65   than 256 entrie
1700: 73 20 28 6c 6f 67 20 73 75 6d 6d 61 72 69 65 73  s (log summaries
1710: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 69 6e   that contain in
1720: 64 65 78 20 62 6c 6f 63 6b 73 29 20 77 6f 72 6b  dex blocks) work
1730: 20 4f 6b 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77   Ok..#.do_test w
1740: 61 6c 2d 39 2e 31 20 7b 0a 20 20 72 65 6f 70 65  al-9.1 {.  reope
1750: 6e 5f 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  n_db.  execsql {
1760: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
1770: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
1780: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1790: 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  1(x PRIMARY KEY)
17a0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
17b0: 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64  O t1 VALUES(rand
17c0: 6f 6d 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20  omblob(900));.  
17d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
17e0: 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c   VALUES(randombl
17f0: 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e  ob(900));.    IN
1800: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1810: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
1820: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
1830: 20 20 20 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20     /*  4 */.    
1840: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
1850: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
1860: 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20  (900) FROM t1;  
1870: 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20       /*  8 */.  
1880: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1890: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
18a0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
18b0: 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a         /* 16 */.
18c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
18d0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
18e0: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
18f0: 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32 20 2a  1;       /* 32 *
1900: 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  /.    INSERT INT
1910: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
1920: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
1930: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34   t1;       /* 64
1940: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
1950: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
1960: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
1970: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
1980: 31 32 38 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52  128 */.    INSER
1990: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
19a0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
19b0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
19c0: 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 7d 0a 20 20  /* 256 */.  }.  
19d0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
19e0: 62 0a 7d 20 30 0a 64 6f 5f 74 65 73 74 20 77 61  b.} 0.do_test wa
19f0: 6c 2d 39 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65  l-9.2 {.  sqlite
1a00: 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e 64  3_wal db2 test.d
1a10: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41  b.  execsql {PRA
1a20: 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
1a30: 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d  eck } db2.} {ok}
1a40: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e  ..do_test wal-9.
1a50: 33 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c 65 74  3 {.  file delet
1a60: 65 20 2d 66 6f 72 63 65 20 74 65 73 74 32 2e 64  e -force test2.d
1a70: 62 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  b test2.db-wal. 
1a80: 20 66 69 6c 65 20 63 6f 70 79 20 74 65 73 74 2e   file copy test.
1a90: 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69  db test2.db.  fi
1aa0: 6c 65 20 63 6f 70 79 20 74 65 73 74 2e 64 62 2d  le copy test.db-
1ab0: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
1ac0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
1ad0: 62 33 20 74 65 73 74 32 2e 64 62 20 0a 20 20 65  b3 test2.db .  e
1ae0: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
1af0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
1b00: 20 64 62 33 0a 7d 20 7b 6f 6b 7d 0a 64 62 33 20   db3.} {ok}.db3 
1b10: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
1b20: 61 6c 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63 73  al-9.4 {.  execs
1b30: 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65 63  ql { PRAGMA chec
1b40: 6b 70 6f 69 6e 74 20 7d 0a 20 20 64 62 32 20 63  kpoint }.  db2 c
1b50: 6c 6f 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 77  lose.  sqlite3_w
1b60: 61 6c 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20  al db2 test.db. 
1b70: 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41   execsql {PRAGMA
1b80: 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
1b90: 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 0a 66   } db2.} {ok}..f
1ba0: 6f 72 65 61 63 68 20 68 61 6e 64 6c 65 20 7b 64  oreach handle {d
1bb0: 62 20 64 62 32 20 64 62 33 7d 20 7b 20 63 61 74  b db2 db3} { cat
1bc0: 63 68 20 7b 20 24 68 61 6e 64 6c 65 20 63 6c 6f  ch { $handle clo
1bd0: 73 65 20 7d 20 7d 0a 75 6e 73 65 74 20 68 61 6e  se } }.unset han
1be0: 64 6c 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  dle..#----------
1bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1c30: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
1c40: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
1c50: 20 77 61 6c 2d 31 30 2e 2a 20 2d 20 74 65 73 74   wal-10.* - test
1c60: 20 74 68 61 74 20 74 68 65 20 57 41 4c 20 6c 6f   that the WAL lo
1c70: 63 6b 69 6e 67 20 0a 23 20 73 63 68 65 6d 65 20  cking .# scheme 
1c80: 77 6f 72 6b 73 20 69 6e 20 73 69 6d 70 6c 65 20  works in simple 
1c90: 63 61 73 65 73 2e 20 54 68 69 73 20 62 6c 6f 63  cases. This bloc
1ca0: 6b 20 6f 66 20 74 65 73 74 73 20 69 73 20 72 75  k of tests is ru
1cb0: 6e 20 74 77 69 63 65 2e 20 4f 6e 63 65 0a 23 20  n twice. Once.# 
1cc0: 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 63  using multiple c
1cd0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 69 6e 20 74 68  onnections in th
1ce0: 65 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  e address space 
1cf0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  of the current p
1d00: 72 6f 63 65 73 73 2c 0a 23 20 61 6e 64 20 6f 6e  rocess,.# and on
1d10: 63 65 20 77 69 74 68 20 61 6c 6c 20 63 6f 6e 6e  ce with all conn
1d20: 65 63 74 69 6f 6e 73 20 65 78 63 65 70 74 20 6f  ections except o
1d30: 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  ne running in ex
1d40: 74 65 72 6e 61 6c 20 70 72 6f 63 65 73 73 65 73  ternal processes
1d50: 2e 0a 23 0a 66 6f 72 65 61 63 68 20 63 6f 64 65  ..#.foreach code
1d60: 20 5b 6c 69 73 74 20 7b 0a 20 20 73 65 74 20 3a   [list {.  set :
1d70: 3a 63 6f 64 65 32 5f 63 68 61 6e 20 5b 6c 61 75  :code2_chan [lau
1d80: 6e 63 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d  nch_testfixture]
1d90: 0a 20 20 73 65 74 20 3a 3a 63 6f 64 65 33 5f 63  .  set ::code3_c
1da0: 68 61 6e 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74  han [launch_test
1db0: 66 69 78 74 75 72 65 5d 0a 20 20 70 72 6f 63 20  fixture].  proc 
1dc0: 63 6f 64 65 32 20 7b 74 63 6c 7d 20 7b 20 74 65  code2 {tcl} { te
1dd0: 73 74 66 69 78 74 75 72 65 20 24 3a 3a 63 6f 64  stfixture $::cod
1de0: 65 32 5f 63 68 61 6e 20 24 74 63 6c 20 7d 0a 20  e2_chan $tcl }. 
1df0: 20 70 72 6f 63 20 63 6f 64 65 33 20 7b 74 63 6c   proc code3 {tcl
1e00: 7d 20 7b 20 74 65 73 74 66 69 78 74 75 72 65 20  } { testfixture 
1e10: 24 3a 3a 63 6f 64 65 33 5f 63 68 61 6e 20 24 74  $::code3_chan $t
1e20: 63 6c 20 7d 0a 20 20 73 65 74 20 74 6e 20 31 0a  cl }.  set tn 1.
1e30: 7d 20 7b 0a 20 20 70 72 6f 63 20 63 6f 64 65 32  } {.  proc code2
1e40: 20 7b 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c   {tcl} { uplevel
1e50: 20 23 30 20 24 74 63 6c 20 7d 0a 20 20 70 72 6f   #0 $tcl }.  pro
1e60: 63 20 63 6f 64 65 33 20 7b 74 63 6c 7d 20 7b 20  c code3 {tcl} { 
1e70: 75 70 6c 65 76 65 6c 20 23 30 20 24 74 63 6c 20  uplevel #0 $tcl 
1e80: 7d 0a 20 20 73 65 74 20 74 6e 20 32 0a 7d 5d 20  }.  set tn 2.}] 
1e90: 7b 0a 0a 20 20 65 76 61 6c 20 24 63 6f 64 65 0a  {..  eval $code.
1ea0: 20 20 72 65 6f 70 65 6e 5f 64 62 0a 0a 20 20 23    reopen_db..  #
1eb0: 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e   Open connection
1ec0: 73 20 5b 64 62 32 5d 20 61 6e 64 20 5b 64 62 33  s [db2] and [db3
1ed0: 5d 2e 20 44 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ]. Depending on 
1ee0: 77 68 69 63 68 20 69 74 65 72 61 74 69 6f 6e 20  which iteration 
1ef0: 74 68 69 73 0a 20 20 23 20 69 73 2c 20 74 68 65  this.  # is, the
1f00: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6d 61 79   connections may
1f10: 20 62 65 20 63 72 65 61 74 65 64 20 69 6e 20 74   be created in t
1f20: 68 69 73 20 69 6e 74 65 72 70 72 65 74 65 72 2c  his interpreter,
1f30: 20 6f 72 20 69 6e 20 0a 20 20 23 20 69 6e 74 65   or in .  # inte
1f40: 72 70 72 65 74 65 72 73 20 72 75 6e 6e 69 6e 67  rpreters running
1f50: 20 69 6e 20 6f 74 68 65 72 20 4f 53 20 70 72 6f   in other OS pro
1f60: 63 65 73 73 65 73 2e 20 41 73 20 73 75 63 68 2c  cesses. As such,
1f70: 20 74 68 65 20 5b 64 62 32 5d 20 61 6e 64 20 5b   the [db2] and [
1f80: 64 62 33 5d 0a 20 20 23 20 63 6f 6d 6d 61 6e 64  db3].  # command
1f90: 73 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  s should only be
1fa0: 20 61 63 63 65 73 73 65 64 20 77 69 74 68 69 6e   accessed within
1fb0: 20 5b 63 6f 64 65 32 5d 20 61 6e 64 20 5b 63 6f   [code2] and [co
1fc0: 64 65 33 5d 20 62 6c 6f 63 6b 73 2c 0a 20 20 23  de3] blocks,.  #
1fd0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20   respectively.. 
1fe0: 20 23 0a 20 20 63 6f 64 65 32 20 7b 20 73 71 6c   #.  code2 { sql
1ff0: 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62  ite3 db2 test.db
2000: 20 3b 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52   ; db2 eval { PR
2010: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
2020: 65 20 3d 20 57 41 4c 20 7d 20 7d 0a 20 20 63 6f  e = WAL } }.  co
2030: 64 65 33 20 7b 20 73 71 6c 69 74 65 33 20 64 62  de3 { sqlite3 db
2040: 33 20 74 65 73 74 2e 64 62 20 3b 20 64 62 33 20  3 test.db ; db3 
2050: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f  eval { PRAGMA jo
2060: 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c  urnal_mode = WAL
2070: 20 7d 20 7d 0a 0a 20 20 23 20 53 68 6f 72 74 68   } }..  # Shorth
2080: 61 6e 64 20 63 6f 6d 6d 61 6e 64 73 2e 20 45 78  and commands. Ex
2090: 65 63 75 74 65 20 53 51 4c 20 75 73 69 6e 67 20  ecute SQL using 
20a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
20b0: 69 6f 6e 20 5b 64 62 32 5d 20 6f 72 20 0a 20 20  ion [db2] or .  
20c0: 23 20 5b 64 62 33 5d 2e 20 52 65 74 75 72 6e 20  # [db3]. Return 
20d0: 74 68 65 20 72 65 73 75 6c 74 73 2e 0a 20 20 23  the results..  #
20e0: 0a 20 20 70 72 6f 63 20 73 71 6c 32 20 7b 73 71  .  proc sql2 {sq
20f0: 6c 7d 20 7b 20 63 6f 64 65 32 20 5b 6c 69 73 74  l} { code2 [list
2100: 20 64 62 32 20 65 76 61 6c 20 24 73 71 6c 5d 20   db2 eval $sql] 
2110: 7d 0a 20 20 70 72 6f 63 20 73 71 6c 33 20 7b 73  }.  proc sql3 {s
2120: 71 6c 7d 20 7b 20 63 6f 64 65 33 20 5b 6c 69 73  ql} { code3 [lis
2130: 74 20 64 62 33 20 65 76 61 6c 20 24 73 71 6c 5d  t db3 eval $sql]
2140: 20 7d 0a 0a 20 20 23 20 49 6e 69 74 69 61 6c 69   }..  # Initiali
2150: 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ze the database 
2160: 73 63 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65  schema and conte
2170: 6e 74 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  nts..  #.  do_te
2180: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 20  st wal-10.$tn.1 
2190: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  {.    execsql {.
21a0: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
21b0: 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
21c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
21d0: 31 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a  1 VALUES(1, 2);.
21e0: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
21f0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20  ROM t1;.    }.  
2200: 7d 20 7b 31 20 32 7d 0a 0a 20 20 23 20 4f 70 65  } {1 2}..  # Ope
2210: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
2220: 61 6e 64 20 77 72 69 74 65 20 74 6f 20 74 68 65  and write to the
2230: 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
2240: 5b 64 62 5d 2e 20 43 68 65 63 6b 20 74 68 61 74  [db]. Check that
2250: 20 5b 64 62 32 5d 0a 20 20 23 20 69 73 20 73 74   [db2].  # is st
2260: 69 6c 6c 20 61 62 6c 65 20 74 6f 20 72 65 61 64  ill able to read
2270: 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 62 65   the snapshot be
2280: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
2290: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
22a0: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
22b0: 61 6c 2d 31 30 2e 24 74 6e 2e 32 20 7b 0a 20 20  al-10.$tn.2 {.  
22c0: 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49    execsql { BEGI
22d0: 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  N; INSERT INTO t
22e0: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 20  1 VALUES(3, 4); 
22f0: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45  }.    sql2 {SELE
2300: 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20  CT * FROM t1}.  
2310: 7d 20 7b 31 20 32 7d 0a 0a 20 20 23 20 48 61 76  } {1 2}..  # Hav
2320: 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 74 68  e [db] commit th
2330: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 43  e transaction. C
2340: 68 65 63 6b 20 74 68 61 74 20 5b 64 62 32 5d 20  heck that [db2] 
2350: 69 73 20 6e 6f 77 20 73 65 65 69 6e 67 20 74 68  is now seeing th
2360: 65 20 0a 20 20 23 20 6e 65 77 2c 20 75 70 64 61  e .  # new, upda
2370: 74 65 64 20 73 6e 61 70 73 68 6f 74 2e 0a 20 20  ted snapshot..  
2380: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
2390: 31 30 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 65  10.$tn.3 {.    e
23a0: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20  xecsql { COMMIT 
23b0: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45  }.    sql2 {SELE
23c0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20  CT * FROM t1}.  
23d0: 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20 23  } {1 2 3 4}..  #
23e0: 20 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e   Have [db2] open
23f0: 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63 74   a read transact
2400: 69 6f 6e 2e 20 54 68 65 6e 20 77 72 69 74 65 20  ion. Then write 
2410: 74 6f 20 74 68 65 20 64 62 20 76 69 61 20 5b 64  to the db via [d
2420: 62 5d 2e 20 43 68 65 63 6b 0a 20 20 23 20 74 68  b]. Check.  # th
2430: 61 74 20 5b 64 62 32 5d 20 69 73 20 73 74 69 6c  at [db2] is stil
2440: 6c 20 73 65 65 69 6e 67 20 74 68 65 20 6f 72 69  l seeing the ori
2450: 67 69 6e 61 6c 20 73 6e 61 70 73 68 6f 74 2e 20  ginal snapshot. 
2460: 54 68 65 6e 20 72 65 61 64 20 77 69 74 68 20 5b  Then read with [
2470: 64 62 33 5d 2e 0a 20 20 23 20 5b 64 62 33 5d 20  db3]..  # [db3] 
2480: 73 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20 6e  should see the n
2490: 65 77 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20 64  ewly committed d
24a0: 61 74 61 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65  ata..  #.  do_te
24b0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 34 20  st wal-10.$tn.4 
24c0: 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47  {.    sql2 { BEG
24d0: 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46 52  IN ; SELECT * FR
24e0: 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20  OM t1}.  } {1 2 
24f0: 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  3 4}.  do_test w
2500: 61 6c 2d 31 30 2e 24 74 6e 2e 35 20 7b 0a 20 20  al-10.$tn.5 {.  
2510: 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45    execsql { INSE
2520: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2530: 53 28 35 2c 20 36 29 3b 20 7d 0a 20 20 20 20 73  S(5, 6); }.    s
2540: 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52  ql2 {SELECT * FR
2550: 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20  OM t1}.  } {1 2 
2560: 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  3 4}.  do_test w
2570: 61 6c 2d 31 30 2e 24 74 6e 2e 36 20 7b 0a 20 20  al-10.$tn.6 {.  
2580: 20 20 73 71 6c 33 20 7b 53 45 4c 45 43 54 20 2a    sql3 {SELECT *
2590: 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31   FROM t1}.  } {1
25a0: 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64 6f   2 3 4 5 6}.  do
25b0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
25c0: 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f  .7 {.    sql2 CO
25d0: 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23  MMIT.  } {}..  #
25e0: 20 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65 6e   Have [db2] open
25f0: 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
2600: 74 69 6f 6e 2e 20 54 68 65 6e 20 61 74 74 65 6d  tion. Then attem
2610: 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
2620: 68 65 20 0a 20 20 23 20 64 61 74 61 62 61 73 65  he .  # database
2630: 20 76 69 61 20 5b 64 62 5d 2e 20 54 68 69 73 20   via [db]. This 
2640: 73 68 6f 75 6c 64 20 66 61 69 6c 20 28 77 72 69  should fail (wri
2650: 74 65 72 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  ter lock cannot 
2660: 62 65 20 6f 62 74 61 69 6e 65 64 29 2e 0a 20 20  be obtained)..  
2670: 23 0a 20 20 23 20 54 68 65 6e 20 6f 70 65 6e 20  #.  # Then open 
2680: 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
2690: 6f 6e 20 77 69 74 68 20 5b 64 62 5d 2e 20 43 6f  on with [db]. Co
26a0: 6d 6d 69 74 20 74 68 65 20 5b 64 62 32 5d 20 74  mmit the [db2] t
26b0: 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 23 20 74  ransaction.  # t
26c0: 6f 20 64 69 73 6b 2e 20 56 65 72 69 66 79 20 74  o disk. Verify t
26d0: 68 61 74 20 5b 64 62 5d 20 73 74 69 6c 6c 20 63  hat [db] still c
26e0: 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  annot write to t
26f0: 68 65 20 64 61 74 61 62 61 73 65 20 28 62 65 63  he database (bec
2700: 61 75 73 65 0a 20 20 23 20 69 74 20 69 73 20 72  ause.  # it is r
2710: 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73 6e  eading an old sn
2720: 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20 23  apshot)..  #.  #
2730: 20 43 6c 6f 73 65 20 74 68 65 20 63 75 72 72 65   Close the curre
2740: 6e 74 20 5b 64 62 5d 20 74 72 61 6e 73 61 63 74  nt [db] transact
2750: 69 6f 6e 2e 20 4f 70 65 6e 20 61 20 6e 65 77 20  ion. Open a new 
2760: 6f 6e 65 2e 20 5b 64 62 5d 20 63 61 6e 20 6e 6f  one. [db] can no
2770: 77 20 77 72 69 74 65 0a 20 20 23 20 74 6f 20 74  w write.  # to t
2780: 68 65 20 64 61 74 61 62 61 73 65 20 28 61 73 20  he database (as 
2790: 69 74 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64  it is not locked
27a0: 20 61 6e 64 20 5b 64 62 5d 20 69 73 20 72 65 61   and [db] is rea
27b0: 64 69 6e 67 20 74 68 65 20 6c 61 74 65 73 74 0a  ding the latest.
27c0: 20 20 23 20 73 6e 61 70 73 68 6f 74 29 2e 0a 20    # snapshot).. 
27d0: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
27e0: 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20  -10.$tn.7 {.    
27f0: 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49 4e  sql2 { BEGIN; IN
2800: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2810: 55 45 53 28 37 2c 20 38 29 20 3b 20 7d 0a 20 20  UES(7, 8) ; }.  
2820: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
2830: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2840: 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20 7d 20  ES(9, 10) }.  } 
2850: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
2860: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
2870: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 38 20  st wal-10.$tn.8 
2880: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
2890: 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a  BEGIN ; SELECT *
28a0: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
28b0: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64  1 2 3 4 5 6}.  d
28c0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
28d0: 6e 2e 39 20 7b 0a 20 20 20 20 73 71 6c 32 20 43  n.9 {.    sql2 C
28e0: 4f 4d 4d 49 54 0a 20 20 20 20 63 61 74 63 68 73  OMMIT.    catchs
28f0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
2900: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30   t1 VALUES(9, 10
2910: 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  ) }.  } {1 {data
2920: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
2930: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
2940: 30 2e 24 74 6e 2e 31 30 20 7b 0a 20 20 20 20 65  0.$tn.10 {.    e
2950: 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 3b  xecsql { COMMIT;
2960: 20 42 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49   BEGIN; INSERT I
2970: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c  NTO t1 VALUES(9,
2980: 20 31 30 29 3b 20 43 4f 4d 4d 49 54 3b 20 7d 0a   10); COMMIT; }.
2990: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
29a0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
29b0: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
29c0: 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23  6 7 8 9 10}..  #
29d0: 20 4f 70 65 6e 20 61 20 72 65 61 64 20 74 72 61   Open a read tra
29e0: 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 20 5b 64  nsaction with [d
29f0: 62 32 5d 2e 20 43 68 65 63 6b 20 74 68 61 74 20  b2]. Check that 
2a00: 74 68 69 73 20 70 72 65 76 65 6e 74 73 20 5b 64  this prevents [d
2a10: 62 5d 20 66 72 6f 6d 0a 20 20 23 20 63 68 65 63  b] from.  # chec
2a20: 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61  kpointing the da
2a30: 74 61 62 61 73 65 2e 20 42 75 74 20 6e 6f 74 20  tabase. But not 
2a40: 66 72 6f 6d 20 77 72 69 74 69 6e 67 20 74 6f 20  from writing to 
2a50: 69 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73  it..  #.  do_tes
2a60: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 31 20  t wal-10.$tn.11 
2a70: 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45 47  {.    sql2 { BEG
2a80: 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  IN; SELECT * FRO
2a90: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20  M t1 }.  } {1 2 
2aa0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
2ab0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
2ac0: 31 30 2e 24 74 6e 2e 31 32 20 7b 0a 20 20 20 20  10.$tn.12 {.    
2ad0: 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d  catchsql { PRAGM
2ae0: 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a  A checkpoint } .
2af0: 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65    } {1 {database
2b00: 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64   is locked}}.  d
2b10: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
2b20: 6e 2e 31 33 20 7b 0a 20 20 20 20 65 78 65 63 73  n.13 {.    execs
2b30: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
2b40: 20 74 31 20 56 41 4c 55 45 53 28 31 31 2c 20 31   t1 VALUES(11, 1
2b50: 32 29 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53  2) }.    sql2 {S
2b60: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d  ELECT * FROM t1}
2b70: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
2b80: 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 20 20 23  6 7 8 9 10}..  #
2b90: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 32   Connection [db2
2ba0: 5d 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 6c  ] is holding a l
2bb0: 6f 63 6b 20 6f 6e 20 61 20 73 6e 61 70 73 68 6f  ock on a snapsho
2bc0: 74 2c 20 70 72 65 76 65 6e 74 69 6e 67 20 5b 64  t, preventing [d
2bd0: 62 5d 20 66 72 6f 6d 0a 20 20 23 20 63 68 65 63  b] from.  # chec
2be0: 6b 70 6f 69 6e 74 69 6e 67 20 74 68 65 20 64 61  kpointing the da
2bf0: 74 61 62 61 73 65 2e 20 41 64 64 20 61 20 62 75  tabase. Add a bu
2c00: 73 79 2d 68 61 6e 64 6c 65 72 20 74 6f 20 5b 64  sy-handler to [d
2c10: 62 5d 2e 20 49 66 20 5b 64 62 32 5d 20 63 6f 6d  b]. If [db2] com
2c20: 70 6c 65 74 65 73 0a 20 20 23 20 69 74 73 20 74  pletes.  # its t
2c30: 72 61 6e 73 61 63 74 69 6f 6e 20 66 72 6f 6d 20  ransaction from 
2c40: 77 69 74 68 69 6e 20 74 68 65 20 62 75 73 79 2d  within the busy-
2c50: 68 61 6e 64 6c 65 72 2c 20 5b 64 62 5d 20 69 73  handler, [db] is
2c60: 20 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74   able to complet
2c70: 65 0a 20 20 23 20 74 68 65 20 63 68 65 63 6b 70  e.  # the checkp
2c80: 6f 69 6e 74 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  oint operation..
2c90: 20 20 23 0a 20 20 70 72 6f 63 20 62 75 73 79 68    #.  proc busyh
2ca0: 61 6e 64 6c 65 72 20 78 20 7b 0a 20 20 20 20 69  andler x {.    i
2cb0: 66 20 7b 24 78 3d 3d 34 7d 20 7b 20 73 71 6c 32  f {$x==4} { sql2
2cc0: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 69 66   COMMIT }.    if
2cd0: 20 7b 24 78 3c 35 7d 20 7b 20 72 65 74 75 72 6e   {$x<5} { return
2ce0: 20 30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20   0 }.    return 
2cf0: 31 0a 20 20 7d 0a 20 20 64 62 20 62 75 73 79 20  1.  }.  db busy 
2d00: 62 75 73 79 68 61 6e 64 6c 65 72 0a 20 20 64 6f  busyhandler.  do
2d10: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
2d20: 2e 31 34 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .14 {.    execsq
2d30: 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b  l { PRAGMA check
2d40: 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a  point } .  } {}.
2d50: 0a 20 20 23 20 53 69 6d 69 6c 61 72 20 74 6f 20  .  # Similar to 
2d60: 74 68 65 20 74 65 73 74 20 61 62 6f 76 65 2e 20  the test above. 
2d70: 45 78 63 65 70 74 20 74 68 69 73 20 74 69 6d 65  Except this time
2d80: 2c 20 61 20 6e 65 77 20 72 65 61 64 20 74 72 61  , a new read tra
2d90: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 23 20  nsaction is.  # 
2da0: 73 74 61 72 74 65 64 20 28 64 62 33 29 20 77 68  started (db3) wh
2db0: 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
2dc0: 6e 74 65 72 20 69 73 20 77 61 69 74 69 6e 67 20  nter is waiting 
2dd0: 66 6f 72 20 61 6e 20 6f 6c 64 20 6f 6e 65 20 28  for an old one (
2de0: 64 62 32 29 20 74 6f 20 0a 20 20 23 20 66 69 6e  db2) to .  # fin
2df0: 69 73 68 2e 20 54 68 65 20 63 68 65 63 6b 70 6f  ish. The checkpo
2e00: 69 6e 74 65 72 20 63 61 6e 20 66 69 6e 69 73 68  inter can finish
2e10: 2c 20 62 75 74 20 61 6e 79 20 73 75 62 73 65 71  , but any subseq
2e20: 75 65 6e 74 20 77 72 69 74 65 20 6f 70 65 72 61  uent write opera
2e30: 74 69 6f 6e 73 20 0a 20 20 23 20 6d 75 73 74 20  tions .  # must 
2e40: 77 61 69 74 20 75 6e 74 69 6c 20 61 66 74 65 72  wait until after
2e50: 20 64 62 33 20 68 61 73 20 63 6c 6f 73 65 64 20   db3 has closed 
2e60: 74 68 65 20 72 65 61 64 20 74 72 61 6e 73 61 63  the read transac
2e70: 74 69 6f 6e 2c 20 61 73 20 64 62 33 20 69 73 20  tion, as db3 is 
2e80: 61 0a 20 20 23 20 22 72 65 67 69 6f 6e 20 44 22  a.  # "region D"
2e90: 20 77 72 69 74 65 72 2e 0a 20 20 23 0a 20 20 64   writer..  #.  d
2ea0: 62 20 62 75 73 79 20 7b 7d 0a 20 20 64 6f 5f 74  b busy {}.  do_t
2eb0: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
2ec0: 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  5 {.    sql2 { B
2ed0: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
2ee0: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31  ROM t1; }.  } {1
2ef0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
2f00: 20 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f   10 11 12}.  do_
2f10: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
2f20: 31 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  16 {.    catchsq
2f30: 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b  l { PRAGMA check
2f40: 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 31 20  point } .  } {1 
2f50: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
2f60: 6b 65 64 7d 7d 0a 20 20 70 72 6f 63 20 62 75 73  ked}}.  proc bus
2f70: 79 68 61 6e 64 6c 65 72 20 78 20 7b 0a 20 20 20  yhandler x {.   
2f80: 20 69 66 20 7b 24 78 3d 3d 33 7d 20 7b 20 73 71   if {$x==3} { sq
2f90: 6c 33 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45  l3 { BEGIN; SELE
2fa0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 7d  CT * FROM t1 } }
2fb0: 0a 20 20 20 20 69 66 20 7b 24 78 3d 3d 34 7d 20  .    if {$x==4} 
2fc0: 7b 20 73 71 6c 32 20 43 4f 4d 4d 49 54 20 7d 0a  { sql2 COMMIT }.
2fd0: 20 20 20 20 69 66 20 7b 24 78 3c 35 7d 20 20 7b      if {$x<5}  {
2fe0: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
2ff0: 72 65 74 75 72 6e 20 31 0a 20 20 7d 0a 20 20 64  return 1.  }.  d
3000: 62 20 62 75 73 79 20 62 75 73 79 68 61 6e 64 6c  b busy busyhandl
3010: 65 72 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  er.  do_test wal
3020: 2d 31 30 2e 24 74 6e 2e 31 37 20 7b 0a 20 20 20  -10.$tn.17 {.   
3030: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
3040: 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a  A checkpoint } .
3050: 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74    } {}.  do_test
3060: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 38 20 7b   wal-10.$tn.18 {
3070: 0a 20 20 20 20 73 71 6c 33 20 7b 20 53 45 4c 45  .    sql3 { SELE
3080: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
3090: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
30a0: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a  7 8 9 10 11 12}.
30b0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
30c0: 2e 24 74 6e 2e 31 39 20 7b 0a 20 20 20 20 63 61  .$tn.19 {.    ca
30d0: 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  tchsql { INSERT 
30e0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
30f0: 33 2c 20 31 34 29 20 7d 0a 20 20 7d 20 7b 31 20  3, 14) }.  } {1 
3100: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
3110: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
3120: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 30 20 7b 0a  wal-10.$tn.20 {.
3130: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
3140: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
3150: 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20  .  } {1 2 3 4 5 
3160: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
3170: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
3180: 31 30 2e 24 74 6e 2e 32 31 20 7b 0a 20 20 20 20  10.$tn.21 {.    
3190: 73 71 6c 33 20 43 4f 4d 4d 49 54 0a 20 20 7d 20  sql3 COMMIT.  } 
31a0: 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  {}.  do_test wal
31b0: 2d 31 30 2e 24 74 6e 2e 32 32 20 7b 0a 20 20 20  -10.$tn.22 {.   
31c0: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
31d0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
31e0: 28 31 33 2c 20 31 34 29 20 7d 0a 20 20 20 20 65  (13, 14) }.    e
31f0: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
3200: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
3210: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
3220: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
3230: 34 7d 0a 0a 20 20 23 20 53 65 74 20 5b 64 62 33  4}..  # Set [db3
3240: 5d 20 75 70 20 61 73 20 61 20 22 72 65 67 69 6f  ] up as a "regio
3250: 6e 20 44 22 20 72 65 61 64 65 72 20 61 67 61 69  n D" reader agai
3260: 6e 2e 20 54 68 65 6e 20 75 70 67 72 61 64 65 20  n. Then upgrade 
3270: 69 74 20 74 6f 20 61 20 77 72 69 74 65 72 0a 20  it to a writer. 
3280: 20 23 20 61 6e 64 20 62 61 63 6b 20 64 6f 77 6e   # and back down
3290: 20 74 6f 20 61 20 72 65 61 64 65 72 2e 20 54 68   to a reader. Th
32a0: 65 6e 2c 20 63 68 65 63 6b 20 74 68 61 74 20 61  en, check that a
32b0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
32c0: 6f 74 20 70 6f 73 73 69 62 6c 65 0a 20 20 23 20  ot possible.  # 
32d0: 28 61 73 20 5b 64 62 33 5d 20 73 74 69 6c 6c 20  (as [db3] still 
32e0: 68 61 73 20 61 20 73 6e 61 70 73 68 6f 74 20 6c  has a snapshot l
32f0: 6f 63 6b 65 64 29 2e 0a 20 20 23 0a 20 20 64 6f  ocked)..  #.  do
3300: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
3310: 2e 32 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71  .23 {.    execsq
3320: 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65 63 6b  l { PRAGMA check
3330: 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a 20  point }.  } {}. 
3340: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3350: 24 74 6e 2e 32 34 20 7b 0a 20 20 20 20 73 71 6c  $tn.24 {.    sql
3360: 32 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45 43  2 { BEGIN; SELEC
3370: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 7d 0a 20  T * FROM t1; }. 
3380: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
3390: 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31  7 8 9 10 11 12 1
33a0: 33 20 31 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20  3 14}.  do_test 
33b0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 35 20 7b 0a  wal-10.$tn.25 {.
33c0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52      execsql { PR
33d0: 41 47 4d 41 20 63 68 65 63 6b 70 6f 69 6e 74 20  AGMA checkpoint 
33e0: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
33f0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36  st wal-10.$tn.26
3400: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
3410: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
3420: 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36 29 20   VALUES(15, 16) 
3430: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
3440: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
3450: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3460: 24 74 6e 2e 32 37 20 7b 0a 20 20 20 20 73 71 6c  $tn.27 {.    sql
3470: 33 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  3 { INSERT INTO 
3480: 74 31 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36  t1 VALUES(15, 16
3490: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ) }.  } {}.  do_
34a0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
34b0: 32 38 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b  28 {.    code3 {
34c0: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 53 54 4d  .      set ::STM
34d0: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
34e0: 72 65 20 64 62 33 20 22 53 45 4c 45 43 54 20 2a  re db3 "SELECT *
34f0: 20 46 52 4f 4d 20 74 31 22 20 2d 31 20 54 41 49   FROM t1" -1 TAI
3500: 4c 5d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  L].      sqlite3
3510: 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20  _step $::STMT.  
3520: 20 20 7d 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d    }.    sql3 COM
3530: 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71 6c 20  MIT.    execsql 
3540: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
3550: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  t1 }.  } {1 2 3 
3560: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
3570: 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36  1 12 13 14 15 16
3580: 7d 0a 20 20 64 62 20 62 75 73 79 20 7b 7d 0a 20  }.  db busy {}. 
3590: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
35a0: 24 74 6e 2e 32 39 20 7b 0a 20 20 20 20 65 78 65  $tn.29 {.    exe
35b0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
35c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 37 2c  TO t1 VALUES(17,
35d0: 20 31 38 29 20 7d 0a 20 20 20 20 63 61 74 63 68   18) }.    catch
35e0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65  sql { PRAGMA che
35f0: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 31  ckpoint }.  } {1
3600: 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   {database is lo
3610: 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74  cked}}.  do_test
3620: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 30 20 7b   wal-10.$tn.30 {
3630: 0a 20 20 20 20 63 6f 64 65 33 20 7b 20 73 71 6c  .    code3 { sql
3640: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20 24 3a  ite3_finalize $:
3650: 3a 53 54 4d 54 20 7d 0a 20 20 20 20 65 78 65 63  :STMT }.    exec
3660: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65  sql { PRAGMA che
3670: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d  ckpoint }.  } {}
3680: 0a 0a 20 20 23 20 41 74 20 6f 6e 65 20 70 6f 69  ..  # At one poi
3690: 6e 74 2c 20 69 66 20 61 20 72 65 61 64 65 72 20  nt, if a reader 
36a0: 66 61 69 6c 65 64 20 74 6f 20 75 70 67 72 61 64  failed to upgrad
36b0: 65 20 74 6f 20 61 20 77 72 69 74 65 72 20 62 65  e to a writer be
36c0: 63 61 75 73 65 20 69 74 0a 20 20 23 20 77 61 73  cause it.  # was
36d0: 20 72 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20   reading an old 
36e0: 73 6e 61 70 73 68 6f 74 2c 20 74 68 65 20 77 72  snapshot, the wr
36f0: 69 74 65 2d 6c 6f 63 6b 73 20 77 65 72 65 20 6e  ite-locks were n
3700: 6f 74 20 62 65 69 6e 67 20 72 65 6c 65 61 73 65  ot being release
3710: 64 2e 0a 20 20 23 20 54 65 73 74 20 74 68 61 74  d..  # Test that
3720: 20 74 68 69 73 20 62 75 67 20 68 61 73 20 62 65   this bug has be
3730: 65 6e 20 66 69 78 65 64 2e 0a 20 20 23 0a 20 20  en fixed..  #.  
3740: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3750: 74 6e 2e 33 31 20 7b 0a 20 20 20 20 65 78 65 63  tn.31 {.    exec
3760: 73 71 6c 20 7b 20 42 45 47 49 4e 20 3b 20 53 45  sql { BEGIN ; SE
3770: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
3780: 0a 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45  .    sql2 { INSE
3790: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
37a0: 53 28 31 39 2c 20 32 30 29 20 7d 0a 20 20 20 20  S(19, 20) }.    
37b0: 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53 45 52  catchsql { INSER
37c0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
37d0: 28 32 31 2c 20 32 32 29 20 7d 0a 20 20 7d 20 7b  (21, 22) }.  } {
37e0: 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c  1 {database is l
37f0: 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73  ocked}}.  do_tes
3800: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 32 20  t wal-10.$tn.32 
3810: 7b 0a 20 20 20 20 23 20 54 68 69 73 20 73 74 61  {.    # This sta
3820: 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 66 61 69  tement would fai
3830: 6c 20 77 68 65 6e 20 74 68 65 20 62 75 67 20 77  l when the bug w
3840: 61 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 20 20  as present..    
3850: 73 71 6c 32 20 7b 20 49 4e 53 45 52 54 20 49 4e  sql2 { INSERT IN
3860: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 32 31 2c  TO t1 VALUES(21,
3870: 20 32 32 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20   22) }.  } {}.  
3880: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3890: 74 6e 2e 33 33 20 7b 0a 20 20 20 20 65 78 65 63  tn.33 {.    exec
38a0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
38b0: 52 4f 4d 20 74 31 20 3b 20 43 4f 4d 4d 49 54 20  ROM t1 ; COMMIT 
38c0: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
38d0: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
38e0: 32 20 31 33 20 31 34 20 31 35 20 31 36 20 31 37  2 13 14 15 16 17
38f0: 20 31 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77   18}.  do_test w
3900: 61 6c 2d 31 30 2e 24 74 6e 2e 33 34 20 7b 0a 20  al-10.$tn.34 {. 
3910: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
3920: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
3930: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
3940: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
3950: 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31  13 14 15 16 17 1
3960: 38 20 31 39 20 32 30 20 32 31 20 32 32 7d 0a 0a  8 19 20 21 22}..
3970: 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f    catch { db clo
3980: 73 65 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63  se }.  catch { c
3990: 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73 65  ode2 { db2 close
39a0: 20 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63   } }.  catch { c
39b0: 6f 64 65 33 20 7b 20 64 62 33 20 63 6c 6f 73 65  ode3 { db3 close
39c0: 20 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63   } }.  catch { c
39d0: 6c 6f 73 65 20 24 3a 3a 63 6f 64 65 32 5f 63 68  lose $::code2_ch
39e0: 61 6e 20 7d 0a 20 20 63 61 74 63 68 20 7b 20 63  an }.  catch { c
39f0: 6c 6f 73 65 20 24 3a 3a 63 6f 64 65 33 5f 63 68  lose $::code3_ch
3a00: 61 6e 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  an }.}..#-------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3a50: 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20  --.# This block 
3a60: 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 31  of tests, wal-11
3a70: 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 6e 6f  .*, test that no
3a80: 74 68 69 6e 67 20 67 6f 65 73 20 74 65 72 72 69  thing goes terri
3a90: 62 6c 79 20 77 72 6f 6e 67 0a 23 20 69 66 20 66  bly wrong.# if f
3aa0: 72 61 6d 65 73 20 6d 75 73 74 20 62 65 20 77 72  rames must be wr
3ab0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f 67  itten to the log
3ac0: 20 66 69 6c 65 20 62 65 66 6f 72 65 20 61 20 74   file before a t
3ad0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 23 20  ransaction is.# 
3ae0: 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 20 6f 72  committed (in or
3af0: 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20 6d  der to free up m
3b00: 65 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74 65 73  emory)..#.do_tes
3b10: 74 20 77 61 6c 2d 31 31 2e 31 20 7b 0a 20 20 72  t wal-11.1 {.  r
3b20: 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63 73  eopen_db.  execs
3b30: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
3b40: 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b  cache_size = 10;
3b50: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
3b60: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
3b70: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
3b80: 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 29  1(x PRIMARY KEY)
3b90: 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78  ;.  }.  list [ex
3ba0: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
3bb0: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78  st.db]/1024] [ex
3bc0: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
3bd0: 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d  st.db-wal]/1044]
3be0: 0a 7d 20 7b 30 20 33 7d 0a 64 6f 5f 74 65 73 74  .} {0 3}.do_test
3bf0: 20 77 61 6c 2d 31 31 2e 32 20 7b 0a 20 20 65 78   wal-11.2 {.  ex
3c00: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63  ecsql { PRAGMA c
3c10: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69  heckpoint }.  li
3c20: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
3c30: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
3c40: 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  4] [expr [file s
3c50: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
3c60: 2f 31 30 34 34 5d 0a 7d 20 7b 33 20 33 7d 0a 64  /1044].} {3 3}.d
3c70: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 33 20  o_test wal-11.3 
3c80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e  {.  execsql { IN
3c90: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
3ca0: 55 45 53 28 20 72 61 6e 64 6f 6d 62 6c 6f 62 28  UES( randomblob(
3cb0: 39 30 30 29 20 29 20 7d 0a 20 20 6c 69 73 74 20  900) ) }.  list 
3cc0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
3cd0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
3ce0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
3cf0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
3d00: 34 34 5d 0a 7d 20 7b 33 20 34 7d 0a 0a 64 6f 5f  44].} {3 4}..do_
3d10: 74 65 73 74 20 77 61 6c 2d 31 31 2e 34 20 7b 0a  test wal-11.4 {.
3d20: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
3d30: 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e   BEGIN;.      IN
3d40: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
3d50: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
3d60: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d  00) FROM t1;   -
3d70: 2d 20 32 0a 20 20 20 20 20 20 49 4e 53 45 52 54  - 2.      INSERT
3d80: 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20   INTO t1 SELECT 
3d90: 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20  randomblob(900) 
3da0: 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 34 0a  FROM t1;   -- 4.
3db0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
3dc0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
3dd0: 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  omblob(900) FROM
3de0: 20 74 31 3b 20 20 20 2d 2d 20 38 0a 20 20 20 20   t1;   -- 8.    
3df0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
3e00: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
3e10: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
3e20: 20 20 20 2d 2d 20 31 36 0a 20 20 7d 0a 20 20 6c     -- 16.  }.  l
3e30: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
3e40: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
3e50: 32 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  24] [expr [file 
3e60: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
3e70: 5d 2f 31 30 34 34 5d 0a 7d 20 7b 33 20 33 33 7d  ]/1044].} {3 33}
3e80: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
3e90: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
3ea0: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
3eb0: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
3ec0: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
3ed0: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
3ee0: 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  {16 ok}.do_test 
3ef0: 77 61 6c 2d 31 31 2e 36 20 7b 0a 20 20 65 78 65  wal-11.6 {.  exe
3f00: 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c 69  csql COMMIT.  li
3f10: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
3f20: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
3f30: 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  4] [expr [file s
3f40: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
3f50: 2f 31 30 34 34 5d 0a 7d 20 7b 33 20 34 32 7d 0a  /1044].} {3 42}.
3f60: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 37  do_test wal-11.7
3f70: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a   {.  execsql { .
3f80: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
3f90: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  (*) FROM t1;.   
3fa0: 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74   PRAGMA integrit
3fb0: 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b  y_check;.  }.} {
3fc0: 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77  16 ok}.do_test w
3fd0: 61 6c 2d 31 31 2e 38 20 7b 0a 20 20 65 78 65 63  al-11.8 {.  exec
3fe0: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 68 65  sql { PRAGMA che
3ff0: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c 69 73 74  ckpoint }.  list
4000: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
4010: 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d  e test.db]/1024]
4020: 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a   [expr [file siz
4030: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31  e test.db-wal]/1
4040: 30 34 34 5d 0a 7d 20 7b 33 37 20 34 32 7d 0a 64  044].} {37 42}.d
4050: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 39 20  o_test wal-11.9 
4060: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
4070: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65  qlite3_wal db te
4080: 73 74 2e 64 62 0a 20 20 6c 69 73 74 20 5b 65 78  st.db.  list [ex
4090: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
40a0: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78  st.db]/1024] [ex
40b0: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
40c0: 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d  st.db-wal]/1044]
40d0: 0a 7d 20 7b 33 37 20 30 7d 0a 0a 64 6f 5f 74 65  .} {37 0}..do_te
40e0: 73 74 20 77 61 6c 2d 31 31 2e 31 30 20 7b 0a 20  st wal-11.10 {. 
40f0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
4100: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
4110: 20 3d 20 31 30 3b 0a 20 20 20 20 42 45 47 49 4e   = 10;.    BEGIN
4120: 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  ;.      INSERT I
4130: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
4140: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
4150: 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20  OM t1;   -- 32. 
4160: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
4170: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4180: 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  }.  list [expr [
4190: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
41a0: 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20 5b  b]/1024] [expr [
41b0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
41c0: 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20 7b  b-wal]/1044].} {
41d0: 33 37 20 33 38 7d 0a 64 6f 5f 74 65 73 74 20 77  37 38}.do_test w
41e0: 61 6c 2d 31 31 2e 31 31 20 7b 0a 20 20 65 78 65  al-11.11 {.  exe
41f0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 53 45 4c  csql {.      SEL
4200: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
4210: 4d 20 74 31 3b 0a 20 20 20 20 52 4f 4c 4c 42 41  M t1;.    ROLLBA
4220: 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 63  CK;.    SELECT c
4230: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
4240: 0a 20 20 7d 0a 7d 20 7b 33 32 20 31 36 7d 0a 64  .  }.} {32 16}.d
4250: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 32  o_test wal-11.12
4260: 20 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   {.  list [expr 
4270: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
4280: 64 62 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20  db]/1024] [expr 
4290: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
42a0: 64 62 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20  db-wal]/1044].} 
42b0: 7b 33 37 20 33 38 7d 0a 64 6f 5f 74 65 73 74 20  {37 38}.do_test 
42c0: 77 61 6c 2d 31 31 2e 31 33 20 7b 0a 20 20 65 78  wal-11.13 {.  ex
42d0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
42e0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
42f0: 53 28 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  S( randomblob(90
4300: 30 29 20 29 3b 0a 20 20 20 20 53 45 4c 45 43 54  0) );.    SELECT
4310: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
4320: 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e  1;.    PRAGMA in
4330: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20  tegrity_check;. 
4340: 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d 0a 64 6f 5f   }.} {17 ok}.do_
4350: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 34 20 7b  test wal-11.14 {
4360: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4370: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4380: 5d 2f 31 30 32 34 5d 20 5b 65 78 70 72 20 5b 66  ]/1024] [expr [f
4390: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
43a0: 2d 77 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20 7b 33  -wal]/1044].} {3
43b0: 37 20 33 38 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  7 38}...#-------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b 20  --.# This block 
4410: 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31 32  of tests, wal-12
4420: 2e 2a 2c 20 74 65 73 74 73 20 61 20 70 72 6f 62  .*, tests a prob
4430: 6c 65 6d 2e 2e 2e 0a 23 0a 72 65 6f 70 65 6e 5f  lem....#.reopen_
4440: 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  db.do_test wal-1
4450: 32 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  2.1 {.  execsql 
4460: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
4470: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
4480: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4490: 74 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52  t1(x, y);.    CR
44a0: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c  EATE TABLE t2(x,
44b0: 20 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   y);.    INSERT 
44c0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27  INTO t1 VALUES('
44d0: 41 27 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c 69  A', 1);.  }.  li
44e0: 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  st [expr [file s
44f0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32  ize test.db]/102
4500: 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73  4] [expr [file s
4510: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4520: 2f 31 30 34 34 5d 0a 7d 20 7b 30 20 35 7d 0a 64  /1044].} {0 5}.d
4530: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 32 20  o_test wal-12.2 
4540: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
4550: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65  qlite3_wal db te
4560: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
4570: 7b 0a 20 20 20 20 55 50 44 41 54 45 20 74 31 20  {.    UPDATE t1 
4580: 53 45 54 20 79 20 3d 20 30 20 57 48 45 52 45 20  SET y = 0 WHERE 
4590: 78 20 3d 20 27 41 27 3b 0a 20 20 7d 0a 20 20 6c  x = 'A';.  }.  l
45a0: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
45b0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
45c0: 32 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  24] [expr [file 
45d0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
45e0: 5d 2f 31 30 34 34 5d 0a 7d 20 7b 33 20 31 7d 0a  ]/1044].} {3 1}.
45f0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 33  do_test wal-12.3
4600: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49   {.  execsql { I
4610: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
4620: 4c 55 45 53 28 27 42 27 2c 20 31 29 20 7d 0a 20  LUES('B', 1) }. 
4630: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4640: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4650: 31 30 32 34 5d 20 5b 65 78 70 72 20 5b 66 69 6c  1024] [expr [fil
4660: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
4670: 61 6c 5d 2f 31 30 34 34 5d 0a 7d 20 7b 33 20 32  al]/1044].} {3 2
4680: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  }..do_test wal-1
4690: 32 2e 34 20 7b 0a 20 20 66 69 6c 65 20 63 6f 70  2.4 {.  file cop
46a0: 79 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62  y -force test.db
46b0: 20 74 65 73 74 32 2e 64 62 0a 20 20 66 69 6c 65   test2.db.  file
46c0: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
46d0: 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64  t.db-wal test2.d
46e0: 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f  b-wal.  sqlite3_
46f0: 77 61 6c 20 64 62 32 20 74 65 73 74 32 2e 64 62  wal db2 test2.db
4700: 0a 62 72 65 61 6b 70 6f 69 6e 74 0a 20 20 65 78  .breakpoint.  ex
4710: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
4720: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
4730: 20 7b 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65   {B 1}.db2 close
4740: 0a 0a 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72  ..file copy -for
4750: 63 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 41  ce test.db-wal A
4760: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e  .do_test wal-12.
4770: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
4780: 20 20 20 20 50 52 41 47 4d 41 20 63 68 65 63 6b      PRAGMA check
4790: 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54  point;.    UPDAT
47a0: 45 20 74 32 20 53 45 54 20 79 20 3d 20 32 20 57  E t2 SET y = 2 W
47b0: 48 45 52 45 20 78 20 3d 20 27 42 27 3b 20 0a 20  HERE x = 'B'; . 
47c0: 20 20 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70     PRAGMA checkp
47d0: 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44 41 54 45  oint;.    UPDATE
47e0: 20 74 31 20 53 45 54 20 79 20 3d 20 31 20 57 48   t1 SET y = 1 WH
47f0: 45 52 45 20 78 20 3d 20 27 41 27 3b 0a 20 20 20  ERE x = 'A';.   
4800: 20 50 52 41 47 4d 41 20 63 68 65 63 6b 70 6f 69   PRAGMA checkpoi
4810: 6e 74 3b 0a 20 20 20 20 55 50 44 41 54 45 20 74  nt;.    UPDATE t
4820: 31 20 53 45 54 20 79 20 3d 20 30 20 57 48 45 52  1 SET y = 0 WHER
4830: 45 20 78 20 3d 20 27 41 27 3b 0a 20 20 20 20 53  E x = 'A';.    S
4840: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b  ELECT * FROM t2;
4850: 0a 20 20 7d 0a 7d 20 7b 42 20 32 7d 0a 66 69 6c  .  }.} {B 2}.fil
4860: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65  e copy -force te
4870: 73 74 2e 64 62 2d 77 61 6c 20 42 0a 0a 64 6f 5f  st.db-wal B..do_
4880: 74 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a  test wal-12.4 {.
4890: 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72    file copy -for
48a0: 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 32  ce test.db test2
48b0: 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20  .db.  file copy 
48c0: 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77  -force test.db-w
48d0: 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a  al test2.db-wal.
48e0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62    sqlite3_wal db
48f0: 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65  2 test2.db.  exe
4900: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
4910: 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20  FROM t2 } db2.} 
4920: 7b 42 20 32 7d 0a 64 62 32 20 63 6c 6f 73 65 0a  {B 2}.db2 close.
4930: 0a 0a 66 69 6e 69 73 68 5f 74 65 73 74 0a 0a     ..finish_test..