/ Hex Artifact Content
Login

Artifact 9f142c65c436b209ffdce0eba37b1b90d2998c1a:


0000: 23 20 32 30 31 30 20 41 70 72 69 6c 20 31 33 0a  # 2010 April 13.
0010: 23 0a 23 20 54 68 65 20 61 75 74 68 6f 72 20 64  #.# The author d
0020: 69 73 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67  isclaims copyrig
0030: 68 74 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63  ht to this sourc
0040: 65 20 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63  e code.  In plac
0050: 65 20 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e  e of.# a legal n
0060: 6f 74 69 63 65 2c 20 68 65 72 65 20 69 73 20 61  otice, here is a
0070: 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20   blessing:.#.#  
0080: 20 20 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f    May you do goo
0090: 64 20 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a  d and not evil..
00a0: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e  #    May you fin
00b0: 64 20 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f  d forgiveness fo
00c0: 72 20 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66  r yourself and f
00d0: 6f 72 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23  orgive others..#
00e0: 20 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72      May you shar
00f0: 65 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20  e freely, never 
0100: 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  taking more than
0110: 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a   you give..#.#**
0120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 0a 23 20 54 68 69 73 20 66 69 6c  *****.# This fil
0170: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67  e implements reg
0180: 72 65 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f  ression tests fo
0190: 72 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  r SQLite library
01a0: 2e 20 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f  .  The.# focus o
01b0: 66 20 74 68 69 73 20 66 69 6c 65 20 69 73 20 74  f this file is t
01c0: 65 73 74 69 6e 67 20 74 68 65 20 6f 70 65 72 61  esting the opera
01d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69 62 72  tion of the libr
01e0: 61 72 79 20 69 6e 0a 23 20 22 50 52 41 47 4d 41  ary in.# "PRAGMA
01f0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41   journal_mode=WA
0200: 4c 22 20 6d 6f 64 65 2e 0a 23 0a 0a 73 65 74 20  L" mode..#..set 
0210: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0220: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0230: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0240: 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20  ster.tcl.source 
0250: 24 74 65 73 74 64 69 72 2f 6c 6f 63 6b 5f 63 6f  $testdir/lock_co
0260: 6d 6d 6f 6e 2e 74 63 6c 0a 0a 69 66 63 61 70 61  mmon.tcl..ifcapa
0270: 62 6c 65 20 21 77 61 6c 20 7b 66 69 6e 69 73 68  ble !wal {finish
0280: 5f 74 65 73 74 20 3b 20 72 65 74 75 72 6e 20 7d  _test ; return }
0290: 0a 0a 70 72 6f 63 20 72 65 6f 70 65 6e 5f 64 62  ..proc reopen_db
02a0: 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68 20 7b 20   {} {.  catch { 
02b0: 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20 66 69 6c  db close }.  fil
02c0: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20  e delete -force 
02d0: 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d  test.db test.db-
02e0: 77 61 6c 20 74 65 73 74 2e 64 62 2d 77 61 6c 2d  wal test.db-wal-
02f0: 73 75 6d 6d 61 72 79 0a 20 20 73 71 6c 69 74 65  summary.  sqlite
0300: 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62  3_wal db test.db
0310: 0a 7d 0a 0a 73 65 74 20 3a 3a 62 6c 6f 62 63 6e  .}..set ::blobcn
0320: 74 20 30 0a 70 72 6f 63 20 62 6c 6f 62 20 7b 6e  t 0.proc blob {n
0330: 42 79 74 65 7d 20 7b 0a 20 20 69 6e 63 72 20 3a  Byte} {.  incr :
0340: 3a 62 6c 6f 62 63 6e 74 0a 20 20 72 65 74 75 72  :blobcnt.  retur
0350: 6e 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20  n [string range 
0360: 5b 73 74 72 69 6e 67 20 72 65 70 65 61 74 20 22  [string repeat "
0370: 24 7b 3a 3a 62 6c 6f 62 63 6e 74 7d 78 22 20 24  ${::blobcnt}x" $
0380: 6e 42 79 74 65 5d 20 31 20 24 6e 42 79 74 65 5d  nByte] 1 $nByte]
0390: 0a 7d 0a 0a 70 72 6f 63 20 73 71 6c 69 74 65 33  .}..proc sqlite3
03a0: 5f 77 61 6c 20 7b 61 72 67 73 7d 20 7b 0a 20 20  _wal {args} {.  
03b0: 65 76 61 6c 20 73 71 6c 69 74 65 33 20 24 61 72  eval sqlite3 $ar
03c0: 67 73 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72  gs.  [lindex $ar
03d0: 67 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41  gs 0] eval { PRA
03e0: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
03f0: 31 30 32 34 20 7d 0a 20 20 5b 6c 69 6e 64 65 78  1024 }.  [lindex
0400: 20 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b   $args 0] eval {
0410: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
0420: 6d 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20 5b  mode = wal }.  [
0430: 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20  lindex $args 0] 
0440: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 73 79  eval { PRAGMA sy
0450: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d  nchronous = norm
0460: 61 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24  al }.  [lindex $
0470: 61 72 67 73 20 30 5d 20 66 75 6e 63 74 69 6f 6e  args 0] function
0480: 20 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a 0a 70 72   blob blob.}..pr
0490: 6f 63 20 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65  oc log_file_size
04a0: 20 7b 6e 46 72 61 6d 65 20 70 67 73 7a 7d 20 7b   {nFrame pgsz} {
04b0: 0a 20 20 65 78 70 72 20 7b 31 32 20 2b 20 28 24  .  expr {12 + ($
04c0: 70 67 73 7a 2b 31 36 29 2a 24 6e 46 72 61 6d 65  pgsz+16)*$nFrame
04d0: 7d 0a 7d 0a 0a 70 72 6f 63 20 6c 6f 67 5f 64 65  }.}..proc log_de
04e0: 6c 65 74 65 64 20 7b 6c 6f 67 66 69 6c 65 7d 20  leted {logfile} 
04f0: 7b 0a 20 20 72 65 74 75 72 6e 20 5b 65 78 70 72  {.  return [expr
0500: 20 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 6c   [file exists $l
0510: 6f 67 66 69 6c 65 5d 3d 3d 30 5d 0a 7d 0a 0a 23  ogfile]==0].}..#
0520: 0a 23 20 54 68 65 73 65 20 61 72 65 20 27 77 61  .# These are 'wa
0530: 72 6d 2d 62 6f 64 79 27 20 74 65 73 74 73 20 75  rm-body' tests u
0540: 73 65 64 20 77 68 69 6c 65 20 64 65 76 65 6c 6f  sed while develo
0550: 70 69 6e 67 20 74 68 65 20 57 41 4c 20 63 6f 64  ping the WAL cod
0560: 65 2e 20 54 68 65 79 0a 23 20 73 65 72 76 65 20  e. They.# serve 
0570: 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 61 20  to prove that a 
0580: 66 65 77 20 72 65 61 6c 6c 79 20 73 69 6d 70 6c  few really simpl
0590: 65 20 63 61 73 65 73 20 77 6f 72 6b 3a 0a 23 0a  e cases work:.#.
05a0: 23 20 77 61 6c 2d 31 2e 2a 3a 20 52 65 61 64 20  # wal-1.*: Read 
05b0: 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 64 61  and write the da
05c0: 74 61 62 61 73 65 2e 0a 23 20 77 61 6c 2d 32 2e  tabase..# wal-2.
05d0: 2a 3a 20 54 65 73 74 20 4d 56 43 43 20 77 69 74  *: Test MVCC wit
05e0: 68 20 6f 6e 65 20 72 65 61 64 65 72 2c 20 6f 6e  h one reader, on
05f0: 65 20 77 72 69 74 65 72 2e 0a 23 20 77 61 6c 2d  e writer..# wal-
0600: 33 2e 2a 3a 20 54 65 73 74 20 74 72 61 6e 73 61  3.*: Test transa
0610: 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 2e 0a  ction rollback..
0620: 23 20 77 61 6c 2d 34 2e 2a 3a 20 54 65 73 74 20  # wal-4.*: Test 
0630: 73 61 76 65 70 6f 69 6e 74 2f 73 74 61 74 65 6d  savepoint/statem
0640: 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 23 20  ent rollback..# 
0650: 77 61 6c 2d 35 2e 2a 3a 20 54 65 73 74 20 74 68  wal-5.*: Test th
0660: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
0670: 0a 23 20 77 61 6c 2d 36 2e 2a 3a 20 54 65 73 74  .# wal-6.*: Test
0680: 20 63 72 65 61 74 69 6e 67 20 64 61 74 61 62 61   creating databa
0690: 73 65 73 20 77 69 74 68 20 64 69 66 66 65 72 65  ses with differe
06a0: 6e 74 20 70 61 67 65 20 73 69 7a 65 73 2e 0a 23  nt page sizes..#
06b0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 30 2e  ..do_test wal-0.
06c0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  1 {.  execsql { 
06d0: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
06e0: 75 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a 20 20  us = normal }.  
06f0: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
0700: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
0710: 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f  wal }.} {wal}.do
0720: 5f 74 65 73 74 20 77 61 6c 2d 30 2e 32 20 7b 0a  _test wal-0.2 {.
0730: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
0740: 2e 64 62 0a 7d 20 7b 31 30 32 34 7d 0a 0a 64 6f  .db.} {1024}..do
0750: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 30 20 7b 0a  _test wal-1.0 {.
0760: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
0770: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
0780: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0790: 29 3b 20 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  ); .  }.  list [
07a0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
07b0: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5c 0a 20  .db-journal] \. 
07c0: 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78 69 73        [file exis
07d0: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ts test.db-wal] 
07e0: 20 20 20 20 5c 0a 20 20 20 20 20 20 20 5b 66 69      \.       [fi
07f0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
0800: 0a 7d 20 7b 30 20 31 20 31 30 32 34 7d 0a 64 6f  .} {0 1 1024}.do
0810: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 31 20 7b 0a  _test wal-1.1 {.
0820: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
0830: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78  .  list [file ex
0840: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
0850: 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73  rnal] [file exis
0860: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ts test.db-wal].
0870: 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {0 1}.do_test 
0880: 77 61 6c 2d 31 2e 32 20 7b 0a 20 20 23 20 54 68  wal-1.2 {.  # Th
0890: 65 72 65 20 61 72 65 20 6e 6f 77 20 74 77 6f 20  ere are now two 
08a0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  pages in the log
08b0: 2e 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  ..  file size te
08c0: 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 5b 6c 6f 67  st.db-wal.} [log
08d0: 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30 32  _file_size 2 102
08e0: 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]..do_test wal-
08f0: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
0900: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0910: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a  sqlite_master }.
0920: 7d 20 7b 74 61 62 6c 65 20 74 31 20 74 31 20 32  } {table t1 t1 2
0930: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
0940: 31 28 61 2c 20 62 29 7d 7d 0a 0a 64 6f 5f 74 65  1(a, b)}}..do_te
0950: 73 74 20 77 61 6c 2d 31 2e 34 20 7b 0a 20 20 65  st wal-1.4 {.  e
0960: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
0970: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0980: 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c  , 2) }.  execsql
0990: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
09a0: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d  1 VALUES(3, 4) }
09b0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
09c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
09d0: 45 53 28 35 2c 20 36 29 20 7d 0a 20 20 65 78 65  ES(5, 6) }.  exe
09e0: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
09f0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20  TO t1 VALUES(7, 
0a00: 38 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  8) }.  execsql {
0a10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0a20: 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a  VALUES(9, 10) }.
0a30: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  } {}..do_test wa
0a40: 6c 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  l-1.5 {.  execsq
0a50: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0a60: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
0a70: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0a80: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 31  .do_test wal-2.1
0a90: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c   {.  sqlite3_wal
0aa0: 20 64 62 32 20 2e 2f 74 65 73 74 2e 64 62 0a 20   db2 ./test.db. 
0ab0: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
0ac0: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
0ad0: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20  t1 } db2.} {1 2 
0ae0: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0af0: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0b00: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0b10: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0b20: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d  VALUES(11, 12) }
0b30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0b40: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0b50: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0b60: 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 0a   8 9 10 11 12}..
0b70: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 33 20  do_test wal-2.3 
0b80: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0b90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0ba0: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20   db2.} {1 2 3 4 
0bb0: 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 64  5 6 7 8 9 10}..d
0bc0: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 34 20 7b  o_test wal-2.4 {
0bd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0be0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0bf0: 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20 65  ES(13, 14) }.  e
0c00: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0c10: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
0c20: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0c30: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d   10 11 12 13 14}
0c40: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0c50: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
0c60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0c70: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
0c80: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0c90: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 36  .do_test wal-2.6
0ca0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
0cb0: 4f 4d 4d 49 54 3b 20 53 45 4c 45 43 54 20 2a 20  OMMIT; SELECT * 
0cc0: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
0cd0: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0ce0: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
0cf0: 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4}..do_test wal-
0d00: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
0d10: 7b 20 42 45 47 49 4e 3b 20 44 45 4c 45 54 45 20  { BEGIN; DELETE 
0d20: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65 63  FROM t1 }.  exec
0d30: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0d40: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a 64 6f  ROM t1 }.} {}.do
0d50: 5f 74 65 73 74 20 77 61 6c 2d 33 2e 32 20 7b 0a  _test wal-3.2 {.
0d60: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0d70: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
0d80: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
0d90: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
0da0: 20 31 33 20 31 34 7d 0a 64 6f 5f 74 65 73 74 20   13 14}.do_test 
0db0: 77 61 6c 2d 33 2e 33 20 7b 0a 20 20 65 78 65 63  wal-3.3 {.  exec
0dc0: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
0dd0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0de0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0df0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0e00: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
0e10: 20 31 34 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a   14}.db2 close..
0e20: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
0e70: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
0e80: 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74 65 73 74 20  , wal-4.*, test 
0e90: 74 68 61 74 20 73 61 76 65 70 6f 69 6e 74 73 20  that savepoints 
0ea0: 77 6f 72 6b 20 77 69 74 68 20 57 41 4c 20 0a 23  work with WAL .#
0eb0: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 64 6f   databases..#.do
0ec0: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 31 20 7b 0a  _test wal-4.1 {.
0ed0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0ee0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
0ef0: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0f00: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0f10: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
0f20: 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
0f30: 54 20 73 70 3b 0a 20 20 20 20 20 20 20 20 49 4e  T sp;.        IN
0f40: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0f50: 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20  UES('c', 'd');. 
0f60: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
0f70: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
0f80: 61 20 62 20 63 20 64 7d 0a 64 6f 5f 74 65 73 74  a b c d}.do_test
0f90: 20 77 61 6c 2d 34 2e 32 20 7b 0a 20 20 65 78 65   wal-4.2 {.  exe
0fa0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 52 4f 4c  csql {.      ROL
0fb0: 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
0fc0: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
0fd0: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d   t1;.  }.} {a b}
0fe0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 33  .do_test wal-4.3
0ff0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1000: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53     COMMIT;.    S
1010: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
1020: 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a 0a 64 6f  .  }.} {a b}..do
1030: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 31 20  _test wal-4.4.1 
1040: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
1050: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
1060: 62 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62  b.  db func blob
1070: 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20 5b 65 78   blob.  list [ex
1080: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
1090: 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b 66 69 6c   FROM t1 }] [fil
10a0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
10b0: 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20 30 7d 0a  al].} {{a b} 0}.
10c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
10d0: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
10e0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
10f0: 65 20 3d 20 31 30 20 7d 0a 20 20 65 78 65 63 73  e = 10 }.  execs
1100: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1110: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
1120: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1130: 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34  t2 VALUES(blob(4
1140: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b  00), blob(400));
1150: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74  .    SAVEPOINT t
1160: 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  r;.      INSERT 
1170: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
1180: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
1190: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
11a0: 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   2 */.      INSE
11b0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
11c0: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
11d0: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
11e0: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
11f0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1200: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1210: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1220: 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20  2; /*  8 */.    
1230: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1240: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1250: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1260: 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20  M t2; /* 16 */. 
1270: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1280: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
1290: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
12a0: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a  FROM t2; /* 32 *
12b0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
12c0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
12d0: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
12e0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20  0) FROM t1; /*  
12f0: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
1300: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1310: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1320: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1330: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
1340: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1350: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1360: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
1370: 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20  ; /*  8 */.     
1380: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1390: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
13a0: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
13b0: 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20   t1; /* 16 */.  
13c0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
13d0: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
13e0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
13f0: 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f  ROM t1; /* 32 */
1400: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
1410: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a  unt(*) FROM t2;.
1420: 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65    }.} {32}.do_te
1430: 73 74 20 77 61 6c 2d 34 2e 34 2e 33 20 7b 0a 20  st wal-4.4.3 {. 
1440: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
1450: 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d  ACK TO tr }.} {}
1460: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34  .do_test wal-4.4
1470: 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69  .4 {.  set logsi
1480: 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  ze [file size te
1490: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65  st.db-wal].  exe
14a0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
14b0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
14c0: 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20  ES('x', 'y');.  
14d0: 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20    RELEASE tr;.  
14e0: 7d 0a 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73  }.  expr { $logs
14f0: 69 7a 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a  ize == [file siz
1500: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d  e test.db-wal] }
1510: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
1520: 61 6c 2d 34 2e 34 2e 35 20 7b 0a 20 20 65 78 65  al-4.4.5 {.  exe
1530: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
1540: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d  unt(*) FROM t2 }
1550: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
1560: 61 6c 2d 34 2e 34 2e 36 20 7b 0a 20 20 66 69 6c  al-4.4.6 {.  fil
1570: 65 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65  e copy -force te
1580: 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20  st.db test2.db. 
1590: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
15a0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65  e test.db-wal te
15b0: 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c  st2.db-wal.  sql
15c0: 69 74 65 33 20 64 62 32 20 74 65 73 74 32 2e 64  ite3 db2 test2.d
15d0: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
15e0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
15f0: 4f 4d 20 74 32 20 3b 20 53 45 4c 45 43 54 20 63  OM t2 ; SELECT c
1600: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 20  ount(*) FROM t1 
1610: 7d 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f  } db2.} {1 2}.do
1620: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 37 20  _test wal-4.4.7 
1630: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52  {.  execsql { PR
1640: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
1650: 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
1660: 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64 6f 5f  }.db2 close..do_
1670: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 31 20 7b  test wal-4.5.1 {
1680: 0a 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 64  .  reopen_db.  d
1690: 62 20 66 75 6e 63 20 62 6c 6f 62 20 62 6c 6f 62  b func blob blob
16a0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
16b0: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
16c0: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
16d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
16e0: 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52  a, b);.    INSER
16f0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1700: 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 7d 0a  ('a', 'b');.  }.
1710: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
1720: 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63 20 62  t.db.  db func b
1730: 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20  lob blob.  list 
1740: 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43  [execsql { SELEC
1750: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b  T * FROM t1 }] [
1760: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
1770: 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20  b-wal].} {{a b} 
1780: 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  0}.do_test wal-4
1790: 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.2 {.  execsql
17a0: 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f   { PRAGMA cache_
17b0: 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20 65 78  size = 10 }.  ex
17c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
17d0: 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c 20 62  TE TABLE t2(a, b
17e0: 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20  );.    BEGIN;.  
17f0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1800: 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34 30 30   VALUES(blob(400
1810: 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b 0a 20  ), blob(400));. 
1820: 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74 72 3b     SAVEPOINT tr;
1830: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1840: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f  TO t2 SELECT blo
1850: 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30  b(400), blob(400
1860: 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 20 32  ) FROM t2; /*  2
1870: 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54   */.      INSERT
1880: 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20   INTO t2 SELECT 
1890: 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28  blob(400), blob(
18a0: 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a  400) FROM t2; /*
18b0: 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53    4 */.      INS
18c0: 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45  ERT INTO t2 SELE
18d0: 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c  CT blob(400), bl
18e0: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b  ob(400) FROM t2;
18f0: 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20 20   /*  8 */.      
1900: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53  INSERT INTO t2 S
1910: 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c  ELECT blob(400),
1920: 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20   blob(400) FROM 
1930: 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20  t2; /* 16 */.   
1940: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
1950: 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30  2 SELECT blob(40
1960: 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52  0), blob(400) FR
1970: 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a 2f 0a  OM t2; /* 32 */.
1980: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1990: 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62  O t1 SELECT blob
19a0: 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29  (400), blob(400)
19b0: 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20 32 20   FROM t1; /*  2 
19c0: 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  */.      INSERT 
19d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
19e0: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
19f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20  00) FROM t1; /* 
1a00: 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   4 */.      INSE
1a10: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1a20: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1a30: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(400) FROM t1; 
1a40: 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20 20 49  /*  8 */.      I
1a50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
1a60: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1a70: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1a80: 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20  1; /* 16 */.    
1a90: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
1aa0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1ab0: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
1ac0: 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f 0a 20  M t1; /* 32 */. 
1ad0: 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e       SELECT coun
1ae0: 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a 20 20  t(*) FROM t2;.  
1af0: 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65 73 74  }.} {32}.do_test
1b00: 20 77 61 6c 2d 34 2e 35 2e 33 20 7b 0a 20 20 65   wal-4.5.3 {.  e
1b10: 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43  xecsql { ROLLBAC
1b20: 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d 0a 64  K TO tr }.} {}.d
1b30: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 34  o_test wal-4.5.4
1b40: 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69 7a 65   {.  set logsize
1b50: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
1b60: 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65 63 73  .db-wal].  execs
1b70: 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53 45 52  ql {.      INSER
1b80: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
1b90: 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20 20 20  ('x', 'y');.    
1ba0: 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20 20 20  RELEASE tr;.    
1bb0: 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20 65 78  COMMIT;.  }.  ex
1bc0: 70 72 20 7b 20 24 6c 6f 67 73 69 7a 65 20 3d 3d  pr { $logsize ==
1bd0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
1be0: 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d 20 7b 31 7d  .db-wal] }.} {1}
1bf0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
1c00: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
1c10: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
1c20: 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c 45 43   FROM t2 ; SELEC
1c30: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1c40: 74 31 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f  t1 }.} {1 2}.do_
1c50: 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 36 20 7b  test wal-4.5.6 {
1c60: 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f  .  file copy -fo
1c70: 72 63 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  rce test.db test
1c80: 32 2e 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79  2.db.  file copy
1c90: 20 2d 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d   -force test.db-
1ca0: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
1cb0: 0a 20 20 73 71 6c 69 74 65 33 20 64 62 32 20 74  .  sqlite3 db2 t
1cc0: 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63 73 71  est2.db.  execsq
1cd0: 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74  l { SELECT count
1ce0: 28 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45  (*) FROM t2 ; SE
1cf0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1d00: 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31  OM t1 } db2.} {1
1d10: 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d   2}.do_test wal-
1d20: 34 2e 35 2e 37 20 7b 0a 20 20 65 78 65 63 73 71  4.5.7 {.  execsq
1d30: 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67  l { PRAGMA integ
1d40: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32  rity_check } db2
1d50: 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73  .} {ok}.db2 clos
1d60: 65 0a 0a 0a 72 65 6f 70 65 6e 5f 64 62 0a 64 6f  e...reopen_db.do
1d70: 5f 74 65 73 74 20 77 61 6c 2d 35 2e 31 20 7b 0a  _test wal-5.1 {.
1d80: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1d90: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
1da0: 45 20 74 32 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t2(a, b);.    
1db0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56  INSERT INTO t2 V
1dc0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
1dd0: 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  .} {}.do_test wa
1de0: 6c 2d 35 2e 32 20 7b 0a 20 20 65 78 65 63 73 71  l-5.2 {.  execsq
1df0: 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20  l {.    BEGIN;. 
1e00: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1e10: 20 74 32 20 56 41 4c 55 45 53 28 33 2c 20 34 29   t2 VALUES(3, 4)
1e20: 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  ;.      SELECT *
1e30: 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20   FROM t2;.  }.} 
1e40: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73  {1 2 3 4}.do_tes
1e50: 74 20 77 61 6c 2d 35 2e 33 20 7b 0a 20 20 65 78  t wal-5.3 {.  ex
1e60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 52 4f 4c 4c  ecsql {.    ROLL
1e70: 42 41 43 4b 3b 0a 20 20 20 20 53 45 4c 45 43 54  BACK;.    SELECT
1e80: 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a   * FROM t2;.  }.
1e90: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
1ea0: 77 61 6c 2d 35 2e 34 20 7b 0a 20 20 65 78 65 63  wal-5.4 {.  exec
1eb0: 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45  sql {.    CREATE
1ec0: 20 54 45 4d 50 20 54 41 42 4c 45 20 74 33 28 78   TEMP TABLE t3(x
1ed0: 20 55 4e 49 51 55 45 29 3b 0a 20 20 20 20 42 45   UNIQUE);.    BE
1ee0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
1ef0: 54 20 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53  T INTO t2 VALUES
1f00: 28 33 2c 20 34 29 3b 0a 20 20 20 20 20 20 49 4e  (3, 4);.      IN
1f10: 53 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c  SERT INTO t3 VAL
1f20: 55 45 53 28 27 61 62 63 27 29 3b 0a 20 20 7d 0a  UES('abc');.  }.
1f30: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
1f40: 45 52 54 20 49 4e 54 4f 20 74 33 20 56 41 4c 55  ERT INTO t3 VALU
1f50: 45 53 28 27 61 62 63 27 29 20 7d 0a 7d 20 7b 31  ES('abc') }.} {1
1f60: 20 7b 63 6f 6c 75 6d 6e 20 78 20 69 73 20 6e 6f   {column x is no
1f70: 74 20 75 6e 69 71 75 65 7d 7d 0a 64 6f 5f 74 65  t unique}}.do_te
1f80: 73 74 20 77 61 6c 2d 35 2e 35 20 7b 0a 20 20 65  st wal-5.5 {.  e
1f90: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 4f 4d  xecsql {.    COM
1fa0: 4d 49 54 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  MIT;.    SELECT 
1fb0: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
1fc0: 20 7b 31 20 32 20 33 20 34 7d 0a 64 62 20 63 6c   {1 2 3 4}.db cl
1fd0: 6f 73 65 0a 0a 66 6f 72 65 61 63 68 20 73 65 63  ose..foreach sec
1fe0: 74 6f 72 20 7b 35 31 32 20 34 30 39 36 7d 20 7b  tor {512 4096} {
1ff0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 69 6d 75 6c  .  sqlite3_simul
2000: 61 74 65 5f 64 65 76 69 63 65 20 2d 73 65 63 74  ate_device -sect
2010: 6f 72 73 69 7a 65 20 24 73 65 63 74 6f 72 0a 20  orsize $sector. 
2020: 20 66 6f 72 65 61 63 68 20 70 67 73 7a 20 7b 35   foreach pgsz {5
2030: 31 32 20 31 30 32 34 20 32 30 34 38 20 34 30 39  12 1024 2048 409
2040: 36 7d 20 7b 0a 20 20 20 20 66 69 6c 65 20 64 65  6} {.    file de
2050: 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74  lete -force test
2060: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  .db test.db-wal.
2070: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
2080: 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a 2e  6.$sector.$pgsz.
2090: 31 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1 {.      sqlite
20a0: 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d 76 66  3 db test.db -vf
20b0: 73 20 64 65 76 73 79 6d 0a 20 20 20 20 20 20 65  s devsym.      e
20c0: 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20 20 20  xecsql ".       
20d0: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
20e0: 65 20 3d 20 24 70 67 73 7a 3b 0a 20 20 20 20 20  e = $pgsz;.     
20f0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
2100: 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20  l_mode = wal;.  
2110: 20 20 20 20 22 0a 20 20 20 20 20 20 65 78 65 63      ".      exec
2120: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 43 52  sql ".        CR
2130: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2140: 20 62 29 3b 0a 20 20 20 20 20 20 20 20 49 4e 53   b);.        INS
2150: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2160: 45 53 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  ES(1, 2);.      
2170: 22 0a 20 20 20 20 20 20 64 62 20 63 6c 6f 73 65  ".      db close
2180: 0a 20 20 20 20 20 20 66 69 6c 65 20 73 69 7a 65  .      file size
2190: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 7d 20 5b   test.db.    } [
21a0: 65 78 70 72 20 24 70 67 73 7a 2a 32 5d 0a 20 20  expr $pgsz*2].  
21b0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
21c0: 2d 36 2e 24 73 65 63 74 6f 72 2e 24 70 67 73 7a  -6.$sector.$pgsz
21d0: 2e 32 20 7b 0a 20 20 20 20 20 20 6c 6f 67 5f 64  .2 {.      log_d
21e0: 65 6c 65 74 65 64 20 74 65 73 74 2e 64 62 2d 77  eleted test.db-w
21f0: 61 6c 0a 20 20 20 20 7d 20 7b 31 7d 0a 20 20 7d  al.    } {1}.  }
2200: 0a 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  .}..do_test wal-
2210: 37 2e 31 20 7b 0a 20 20 66 69 6c 65 20 64 65 6c  7.1 {.  file del
2220: 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73 74 2e  ete -force test.
2230: 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20  db test.db-wal. 
2240: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20   sqlite3_wal db 
2250: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
2260: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  l {.    PRAGMA p
2270: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
2280: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
2290: 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20  E t1(a, b);.    
22a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
22b0: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d  ALUES(1, 2);.  }
22c0: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69  .  list [file si
22d0: 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c  ze test.db] [fil
22e0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
22f0: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 31 30 32 34  al].} [list 1024
2300: 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20   [log_file_size 
2310: 33 20 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74  3 1024]].do_test
2320: 20 77 61 6c 2d 37 2e 32 20 7b 0a 20 20 65 78 65   wal-7.2 {.  exe
2330: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
2340: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
2350: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
2360: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20   test.db] [file 
2370: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
2380: 5d 0a 7d 20 5b 6c 69 73 74 20 32 30 34 38 20 5b  ].} [list 2048 [
2390: 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20  log_file_size 3 
23a0: 31 30 32 34 5d 5d 0a 0a 23 20 45 78 65 63 75 74  1024]]..# Execut
23b0: 65 20 73 6f 6d 65 20 74 72 61 6e 73 61 63 74 69  e some transacti
23c0: 6f 6e 73 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ons in auto-vacu
23d0: 75 6d 20 6d 6f 64 65 20 74 6f 20 74 65 73 74 20  um mode to test 
23e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20  database file.# 
23f0: 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 23 0a 64 6f  truncation..#.do
2400: 5f 74 65 73 74 20 77 61 6c 2d 38 2e 31 20 7b 0a  _test wal-8.1 {.
2410: 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 63 61    reopen_db.  ca
2420: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
2430: 0a 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  .  file delete -
2440: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 20 74 65  force test.db te
2450: 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 73 71 6c  st.db-wal..  sql
2460: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
2470: 20 20 64 62 20 66 75 6e 63 74 69 6f 6e 20 62 6c    db function bl
2480: 6f 62 20 62 6c 6f 62 0a 20 20 65 78 65 63 73 71  ob blob.  execsq
2490: 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61  l {.    PRAGMA a
24a0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 31 3b 0a  uto_vacuum = 1;.
24b0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
24c0: 61 6c 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20  al_mode = wal;. 
24d0: 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f 76     PRAGMA auto_v
24e0: 61 63 75 75 6d 3b 0a 20 20 7d 0a 7d 20 7b 77 61  acuum;.  }.} {wa
24f0: 6c 20 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  l 1}.do_test wal
2500: 2d 38 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c  -8.2 {.  execsql
2510: 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61   {.    PRAGMA pa
2520: 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  ge_size = 1024;.
2530: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
2540: 20 74 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45   t1(x);.    INSE
2550: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
2560: 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20  S(blob(900));.  
2570: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2580: 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30 30   VALUES(blob(900
2590: 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  ));.    INSERT I
25a0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
25b0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
25c0: 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f 0a         /*  4 */.
25d0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
25e0: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
25f0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
2600: 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20     /*  8 */.    
2610: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2620: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
2630: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
2640: 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53 45  * 16 */.    INSE
2650: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2660: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
2670: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33 32   t1;       /* 32
2680: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
2690: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
26a0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
26b0: 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f 0a         /* 64 */.
26c0: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
26d0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20  heckpoint;.  }. 
26e0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
26f0: 64 62 0a 7d 20 5b 65 78 70 72 20 36 38 2a 31 30  db.} [expr 68*10
2700: 32 34 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  24].do_test wal-
2710: 38 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  8.3 {.  execsql 
2720: 7b 20 0a 20 20 20 20 44 45 4c 45 54 45 20 46 52  { .    DELETE FR
2730: 4f 4d 20 74 31 20 57 48 45 52 45 20 72 6f 77 69  OM t1 WHERE rowi
2740: 64 3c 35 34 3b 0a 20 20 20 20 50 52 41 47 4d 41  d<54;.    PRAGMA
2750: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
2760: 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65  .  }.  file size
2770: 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70 72   test.db.} [expr
2780: 20 31 34 2a 31 30 32 34 5d 0a 0a 23 20 52 75 6e   14*1024]..# Run
2790: 20 73 6f 6d 65 20 22 77 61 72 6d 2d 62 6f 64 79   some "warm-body
27a0: 22 20 74 65 73 74 73 20 74 6f 20 65 6e 73 75 72  " tests to ensur
27b0: 65 20 74 68 61 74 20 6c 6f 67 2d 73 75 6d 6d 61  e that log-summa
27c0: 72 79 20 66 69 6c 65 73 20 77 69 74 68 20 6d 6f  ry files with mo
27d0: 72 65 0a 23 20 74 68 61 6e 20 32 35 36 20 65 6e  re.# than 256 en
27e0: 74 72 69 65 73 20 28 6c 6f 67 20 73 75 6d 6d 61  tries (log summa
27f0: 72 69 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ries that contai
2800: 6e 20 69 6e 64 65 78 20 62 6c 6f 63 6b 73 29 20  n index blocks) 
2810: 77 6f 72 6b 20 4f 6b 2e 0a 23 0a 64 6f 5f 74 65  work Ok..#.do_te
2820: 73 74 20 77 61 6c 2d 39 2e 31 20 7b 0a 20 20 72  st wal-9.1 {.  r
2830: 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63 73  eopen_db.  execs
2840: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
2850: 54 41 42 4c 45 20 74 31 28 78 20 50 52 49 4d 41  TABLE t1(x PRIMA
2860: 52 59 20 4b 45 59 29 3b 0a 20 20 20 20 49 4e 53  RY KEY);.    INS
2870: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
2880: 45 53 28 62 6c 6f 62 28 39 30 30 29 29 3b 0a 20  ES(blob(900));. 
2890: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
28a0: 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30  1 VALUES(blob(90
28b0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
28c0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
28d0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
28e0: 3b 20 20 20 20 20 20 20 2f 2a 20 20 34 20 2a 2f  ;       /*  4 */
28f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2900: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2910: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2920: 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20      /*  8 */.   
2930: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
2940: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
2950: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
2960: 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20 49 4e 53  /* 16 */.    INS
2970: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
2980: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
2990: 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 33  M t1;       /* 3
29a0: 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20  2 */.    INSERT 
29b0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
29c0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
29d0: 3b 20 20 20 20 20 20 20 2f 2a 20 36 34 20 2a 2f  ;       /* 64 */
29e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
29f0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2a00: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2a10: 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f 0a 20 20      /* 128 */.  
2a20: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
2a30: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30   SELECT blob(900
2a40: 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20  ) FROM t1;      
2a50: 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 7d 0a 20   /* 256 */.  }. 
2a60: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
2a70: 64 62 0a 7d 20 31 30 32 34 0a 64 6f 5f 74 65 73  db.} 1024.do_tes
2a80: 74 20 77 61 6c 2d 39 2e 32 20 7b 0a 20 20 73 71  t wal-9.2 {.  sq
2a90: 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65  lite3_wal db2 te
2aa0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
2ab0: 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  {PRAGMA integrit
2ac0: 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20  y_check } db2.} 
2ad0: 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  {ok}..do_test wa
2ae0: 6c 2d 39 2e 33 20 7b 0a 20 20 66 69 6c 65 20 64  l-9.3 {.  file d
2af0: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 74 65 73  elete -force tes
2b00: 74 32 2e 64 62 20 74 65 73 74 32 2e 64 62 2d 77  t2.db test2.db-w
2b10: 61 6c 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 74  al.  file copy t
2b20: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
2b30: 20 20 66 69 6c 65 20 63 6f 70 79 20 74 65 73 74    file copy test
2b40: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
2b50: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 5f 77  -wal.  sqlite3_w
2b60: 61 6c 20 64 62 33 20 74 65 73 74 32 2e 64 62 20  al db3 test2.db 
2b70: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
2b80: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
2b90: 63 6b 20 7d 20 64 62 33 0a 7d 20 7b 6f 6b 7d 0a  ck } db3.} {ok}.
2ba0: 64 62 33 20 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65  db3 close..do_te
2bb0: 73 74 20 77 61 6c 2d 39 2e 34 20 7b 0a 20 20 65  st wal-9.4 {.  e
2bc0: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
2bd0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
2be0: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 73  .  db2 close.  s
2bf0: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32 20 74  qlite3_wal db2 t
2c00: 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c  est.db.  execsql
2c10: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   {PRAGMA integri
2c20: 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d  ty_check } db2.}
2c30: 20 7b 6f 6b 7d 0a 0a 66 6f 72 65 61 63 68 20 68   {ok}..foreach h
2c40: 61 6e 64 6c 65 20 7b 64 62 20 64 62 32 20 64 62  andle {db db2 db
2c50: 33 7d 20 7b 20 63 61 74 63 68 20 7b 20 24 68 61  3} { catch { $ha
2c60: 6e 64 6c 65 20 63 6c 6f 73 65 20 7d 20 7d 0a 75  ndle close } }.u
2c70: 6e 73 65 74 20 68 61 6e 64 6c 65 0a 0a 23 2d 2d  nset handle..#--
2c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2cc0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f  -------.# The fo
2cd0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66  llowing block of
2ce0: 20 74 65 73 74 73 20 2d 20 77 61 6c 2d 31 30 2e   tests - wal-10.
2cf0: 2a 20 2d 20 74 65 73 74 20 74 68 61 74 20 74 68  * - test that th
2d00: 65 20 57 41 4c 20 6c 6f 63 6b 69 6e 67 20 0a 23  e WAL locking .#
2d10: 20 73 63 68 65 6d 65 20 77 6f 72 6b 73 20 69 6e   scheme works in
2d20: 20 73 69 6d 70 6c 65 20 63 61 73 65 73 2e 20 54   simple cases. T
2d30: 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  his block of tes
2d40: 74 73 20 69 73 20 72 75 6e 20 74 77 69 63 65 2e  ts is run twice.
2d50: 20 4f 6e 63 65 0a 23 20 75 73 69 6e 67 20 6d 75   Once.# using mu
2d60: 6c 74 69 70 6c 65 20 63 6f 6e 6e 65 63 74 69 6f  ltiple connectio
2d70: 6e 73 20 69 6e 20 74 68 65 20 61 64 64 72 65 73  ns in the addres
2d80: 73 20 73 70 61 63 65 20 6f 66 20 74 68 65 20 63  s space of the c
2d90: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2c 0a  urrent process,.
2da0: 23 20 61 6e 64 20 6f 6e 63 65 20 77 69 74 68 20  # and once with 
2db0: 61 6c 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  all connections 
2dc0: 65 78 63 65 70 74 20 6f 6e 65 20 72 75 6e 6e 69  except one runni
2dd0: 6e 67 20 69 6e 20 65 78 74 65 72 6e 61 6c 20 70  ng in external p
2de0: 72 6f 63 65 73 73 65 73 2e 0a 23 0a 66 6f 72 65  rocesses..#.fore
2df0: 61 63 68 20 63 6f 64 65 20 5b 6c 69 73 74 20 7b  ach code [list {
2e00: 0a 20 20 73 65 74 20 3a 3a 63 6f 64 65 32 5f 63  .  set ::code2_c
2e10: 68 61 6e 20 5b 6c 61 75 6e 63 68 5f 74 65 73 74  han [launch_test
2e20: 66 69 78 74 75 72 65 5d 0a 20 20 73 65 74 20 3a  fixture].  set :
2e30: 3a 63 6f 64 65 33 5f 63 68 61 6e 20 5b 6c 61 75  :code3_chan [lau
2e40: 6e 63 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d  nch_testfixture]
2e50: 0a 20 20 70 72 6f 63 20 63 6f 64 65 32 20 7b 74  .  proc code2 {t
2e60: 63 6c 7d 20 7b 20 74 65 73 74 66 69 78 74 75 72  cl} { testfixtur
2e70: 65 20 24 3a 3a 63 6f 64 65 32 5f 63 68 61 6e 20  e $::code2_chan 
2e80: 24 74 63 6c 20 7d 0a 20 20 70 72 6f 63 20 63 6f  $tcl }.  proc co
2e90: 64 65 33 20 7b 74 63 6c 7d 20 7b 20 74 65 73 74  de3 {tcl} { test
2ea0: 66 69 78 74 75 72 65 20 24 3a 3a 63 6f 64 65 33  fixture $::code3
2eb0: 5f 63 68 61 6e 20 24 74 63 6c 20 7d 0a 20 20 73  _chan $tcl }.  s
2ec0: 65 74 20 74 6e 20 31 0a 7d 20 7b 0a 20 20 70 72  et tn 1.} {.  pr
2ed0: 6f 63 20 63 6f 64 65 32 20 7b 74 63 6c 7d 20 7b  oc code2 {tcl} {
2ee0: 20 75 70 6c 65 76 65 6c 20 23 30 20 24 74 63 6c   uplevel #0 $tcl
2ef0: 20 7d 0a 20 20 70 72 6f 63 20 63 6f 64 65 33 20   }.  proc code3 
2f00: 7b 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c 20  {tcl} { uplevel 
2f10: 23 30 20 24 74 63 6c 20 7d 0a 20 20 73 65 74 20  #0 $tcl }.  set 
2f20: 74 6e 20 32 0a 7d 5d 20 7b 0a 0a 20 20 65 76 61  tn 2.}] {..  eva
2f30: 6c 20 24 63 6f 64 65 0a 20 20 72 65 6f 70 65 6e  l $code.  reopen
2f40: 5f 64 62 0a 0a 20 20 23 20 4f 70 65 6e 20 63 6f  _db..  # Open co
2f50: 6e 6e 65 63 74 69 6f 6e 73 20 5b 64 62 32 5d 20  nnections [db2] 
2f60: 61 6e 64 20 5b 64 62 33 5d 2e 20 44 65 70 65 6e  and [db3]. Depen
2f70: 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 69 74  ding on which it
2f80: 65 72 61 74 69 6f 6e 20 74 68 69 73 0a 20 20 23  eration this.  #
2f90: 20 69 73 2c 20 74 68 65 20 63 6f 6e 6e 65 63 74   is, the connect
2fa0: 69 6f 6e 73 20 6d 61 79 20 62 65 20 63 72 65 61  ions may be crea
2fb0: 74 65 64 20 69 6e 20 74 68 69 73 20 69 6e 74 65  ted in this inte
2fc0: 72 70 72 65 74 65 72 2c 20 6f 72 20 69 6e 20 0a  rpreter, or in .
2fd0: 20 20 23 20 69 6e 74 65 72 70 72 65 74 65 72 73    # interpreters
2fe0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6f 74 68 65   running in othe
2ff0: 72 20 4f 53 20 70 72 6f 63 65 73 73 65 73 2e 20  r OS processes. 
3000: 41 73 20 73 75 63 68 2c 20 74 68 65 20 5b 64 62  As such, the [db
3010: 32 5d 20 61 6e 64 20 5b 64 62 33 5d 0a 20 20 23  2] and [db3].  #
3020: 20 63 6f 6d 6d 61 6e 64 73 20 73 68 6f 75 6c 64   commands should
3030: 20 6f 6e 6c 79 20 62 65 20 61 63 63 65 73 73 65   only be accesse
3040: 64 20 77 69 74 68 69 6e 20 5b 63 6f 64 65 32 5d  d within [code2]
3050: 20 61 6e 64 20 5b 63 6f 64 65 33 5d 20 62 6c 6f   and [code3] blo
3060: 63 6b 73 2c 0a 20 20 23 20 72 65 73 70 65 63 74  cks,.  # respect
3070: 69 76 65 6c 79 2e 0a 20 20 23 0a 20 20 63 6f 64  ively..  #.  cod
3080: 65 32 20 7b 20 73 71 6c 69 74 65 33 20 64 62 32  e2 { sqlite3 db2
3090: 20 74 65 73 74 2e 64 62 20 3b 20 64 62 32 20 65   test.db ; db2 e
30a0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 6a 6f 75  val { PRAGMA jou
30b0: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 20  rnal_mode = WAL 
30c0: 7d 20 7d 0a 20 20 63 6f 64 65 33 20 7b 20 73 71  } }.  code3 { sq
30d0: 6c 69 74 65 33 20 64 62 33 20 74 65 73 74 2e 64  lite3 db3 test.d
30e0: 62 20 3b 20 64 62 33 20 65 76 61 6c 20 7b 20 50  b ; db3 eval { P
30f0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
3100: 64 65 20 3d 20 57 41 4c 20 7d 20 7d 0a 0a 20 20  de = WAL } }..  
3110: 23 20 53 68 6f 72 74 68 61 6e 64 20 63 6f 6d 6d  # Shorthand comm
3120: 61 6e 64 73 2e 20 45 78 65 63 75 74 65 20 53 51  ands. Execute SQ
3130: 4c 20 75 73 69 6e 67 20 64 61 74 61 62 61 73 65  L using database
3140: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 32   connection [db2
3150: 5d 20 6f 72 20 0a 20 20 23 20 5b 64 62 33 5d 2e  ] or .  # [db3].
3160: 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75   Return the resu
3170: 6c 74 73 2e 0a 20 20 23 0a 20 20 70 72 6f 63 20  lts..  #.  proc 
3180: 73 71 6c 32 20 7b 73 71 6c 7d 20 7b 20 63 6f 64  sql2 {sql} { cod
3190: 65 32 20 5b 6c 69 73 74 20 64 62 32 20 65 76 61  e2 [list db2 eva
31a0: 6c 20 24 73 71 6c 5d 20 7d 0a 20 20 70 72 6f 63  l $sql] }.  proc
31b0: 20 73 71 6c 33 20 7b 73 71 6c 7d 20 7b 20 63 6f   sql3 {sql} { co
31c0: 64 65 33 20 5b 6c 69 73 74 20 64 62 33 20 65 76  de3 [list db3 ev
31d0: 61 6c 20 24 73 71 6c 5d 20 7d 0a 0a 20 20 23 20  al $sql] }..  # 
31e0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 64  Initialize the d
31f0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 61  atabase schema a
3200: 6e 64 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 23  nd contents..  #
3210: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3220: 30 2e 24 74 6e 2e 31 20 7b 0a 20 20 20 20 65 78  0.$tn.1 {.    ex
3230: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 43 52  ecsql {.      CR
3240: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
3250: 20 62 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52   b);.      INSER
3260: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3270: 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 53 45  (1, 2);.      SE
3280: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a  LECT * FROM t1;.
3290: 20 20 20 20 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a      }.  } {1 2}.
32a0: 0a 20 20 23 20 4f 70 65 6e 20 61 20 74 72 61 6e  .  # Open a tran
32b0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 77 72 69 74  saction and writ
32c0: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
32d0: 65 20 75 73 69 6e 67 20 5b 64 62 5d 2e 20 43 68  e using [db]. Ch
32e0: 65 63 6b 20 74 68 61 74 20 5b 64 62 32 5d 0a 20  eck that [db2]. 
32f0: 20 23 20 69 73 20 73 74 69 6c 6c 20 61 62 6c 65   # is still able
3300: 20 74 6f 20 72 65 61 64 20 74 68 65 20 73 6e 61   to read the sna
3310: 70 73 68 6f 74 20 62 65 66 6f 72 65 20 74 68 65  pshot before the
3320: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
3330: 20 6f 70 65 6e 65 64 2e 0a 20 20 23 0a 20 20 64   opened..  #.  d
3340: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3350: 6e 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.2 {.    execsq
3360: 6c 20 7b 20 42 45 47 49 4e 3b 20 49 4e 53 45 52  l { BEGIN; INSER
3370: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
3380: 28 33 2c 20 34 29 3b 20 7d 0a 20 20 20 20 73 71  (3, 4); }.    sq
3390: 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  l2 {SELECT * FRO
33a0: 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 7d 0a  M t1}.  } {1 2}.
33b0: 0a 20 20 23 20 48 61 76 65 20 5b 64 62 5d 20 63  .  # Have [db] c
33c0: 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61  ommit the transa
33d0: 63 74 69 6f 6e 2e 20 43 68 65 63 6b 20 74 68 61  ction. Check tha
33e0: 74 20 5b 64 62 32 5d 20 69 73 20 6e 6f 77 20 73  t [db2] is now s
33f0: 65 65 69 6e 67 20 74 68 65 20 0a 20 20 23 20 6e  eeing the .  # n
3400: 65 77 2c 20 75 70 64 61 74 65 64 20 73 6e 61 70  ew, updated snap
3410: 73 68 6f 74 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  shot..  #.  do_t
3420: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33  est wal-10.$tn.3
3430: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3440: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20 20 73 71   COMMIT }.    sq
3450: 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46 52 4f  l2 {SELECT * FRO
3460: 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32 20 33  M t1}.  } {1 2 3
3470: 20 34 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64   4}..  # Have [d
3480: 62 32 5d 20 6f 70 65 6e 20 61 20 72 65 61 64 20  b2] open a read 
3490: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
34a0: 6e 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  n write to the d
34b0: 62 20 76 69 61 20 5b 64 62 5d 2e 20 43 68 65 63  b via [db]. Chec
34c0: 6b 0a 20 20 23 20 74 68 61 74 20 5b 64 62 32 5d  k.  # that [db2]
34d0: 20 69 73 20 73 74 69 6c 6c 20 73 65 65 69 6e 67   is still seeing
34e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 6e   the original sn
34f0: 61 70 73 68 6f 74 2e 20 54 68 65 6e 20 72 65 61  apshot. Then rea
3500: 64 20 77 69 74 68 20 5b 64 62 33 5d 2e 0a 20 20  d with [db3]..  
3510: 23 20 5b 64 62 33 5d 20 73 68 6f 75 6c 64 20 73  # [db3] should s
3520: 65 65 20 74 68 65 20 6e 65 77 6c 79 20 63 6f 6d  ee the newly com
3530: 6d 69 74 74 65 64 20 64 61 74 61 2e 0a 20 20 23  mitted data..  #
3540: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3550: 30 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 73 71  0.$tn.4 {.    sq
3560: 6c 32 20 7b 20 42 45 47 49 4e 20 3b 20 53 45 4c  l2 { BEGIN ; SEL
3570: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
3580: 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64   } {1 2 3 4}.  d
3590: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
35a0: 6e 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71  n.5 {.    execsq
35b0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
35c0: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
35d0: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c   }.    sql2 {SEL
35e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
35f0: 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 20 20 64   } {1 2 3 4}.  d
3600: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3610: 6e 2e 36 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b  n.6 {.    sql3 {
3620: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3630: 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35  }.  } {1 2 3 4 5
3640: 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61   6}.  do_test wa
3650: 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20 20 20  l-10.$tn.7 {.   
3660: 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 7d   sql2 COMMIT.  }
3670: 20 7b 7d 0a 0a 20 20 23 20 48 61 76 65 20 5b 64   {}..  # Have [d
3680: 62 32 5d 20 6f 70 65 6e 20 61 20 77 72 69 74 65  b2] open a write
3690: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68   transaction. Th
36a0: 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  en attempt to wr
36b0: 69 74 65 20 74 6f 20 74 68 65 20 0a 20 20 23 20  ite to the .  # 
36c0: 64 61 74 61 62 61 73 65 20 76 69 61 20 5b 64 62  database via [db
36d0: 5d 2e 20 54 68 69 73 20 73 68 6f 75 6c 64 20 66  ]. This should f
36e0: 61 69 6c 20 28 77 72 69 74 65 72 20 6c 6f 63 6b  ail (writer lock
36f0: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
3700: 6e 65 64 29 2e 0a 20 20 23 0a 20 20 23 20 54 68  ned)..  #.  # Th
3710: 65 6e 20 6f 70 65 6e 20 61 20 72 65 61 64 2d 74  en open a read-t
3720: 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 74 68 20  ransaction with 
3730: 5b 64 62 5d 2e 20 43 6f 6d 6d 69 74 20 74 68 65  [db]. Commit the
3740: 20 5b 64 62 32 5d 20 74 72 61 6e 73 61 63 74 69   [db2] transacti
3750: 6f 6e 0a 20 20 23 20 74 6f 20 64 69 73 6b 2e 20  on.  # to disk. 
3760: 56 65 72 69 66 79 20 74 68 61 74 20 5b 64 62 5d  Verify that [db]
3770: 20 73 74 69 6c 6c 20 63 61 6e 6e 6f 74 20 77 72   still cannot wr
3780: 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ite to the datab
3790: 61 73 65 20 28 62 65 63 61 75 73 65 0a 20 20 23  ase (because.  #
37a0: 20 69 74 20 69 73 20 72 65 61 64 69 6e 67 20 61   it is reading a
37b0: 6e 20 6f 6c 64 20 73 6e 61 70 73 68 6f 74 29 2e  n old snapshot).
37c0: 0a 20 20 23 0a 20 20 23 20 43 6c 6f 73 65 20 74  .  #.  # Close t
37d0: 68 65 20 63 75 72 72 65 6e 74 20 5b 64 62 5d 20  he current [db] 
37e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 70 65  transaction. Ope
37f0: 6e 20 61 20 6e 65 77 20 6f 6e 65 2e 20 5b 64 62  n a new one. [db
3800: 5d 20 63 61 6e 20 6e 6f 77 20 77 72 69 74 65 0a  ] can now write.
3810: 20 20 23 20 74 6f 20 74 68 65 20 64 61 74 61 62    # to the datab
3820: 61 73 65 20 28 61 73 20 69 74 20 69 73 20 6e 6f  ase (as it is no
3830: 74 20 6c 6f 63 6b 65 64 20 61 6e 64 20 5b 64 62  t locked and [db
3840: 5d 20 69 73 20 72 65 61 64 69 6e 67 20 74 68 65  ] is reading the
3850: 20 6c 61 74 65 73 74 0a 20 20 23 20 73 6e 61 70   latest.  # snap
3860: 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20 64 6f 5f  shot)..  #.  do_
3870: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3880: 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  7 {.    sql2 { B
3890: 45 47 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54  EGIN; INSERT INT
38a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38  O t1 VALUES(7, 8
38b0: 29 20 3b 20 7d 0a 20 20 20 20 63 61 74 63 68 73  ) ; }.    catchs
38c0: 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f  ql { INSERT INTO
38d0: 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31 30   t1 VALUES(9, 10
38e0: 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61  ) }.  } {1 {data
38f0: 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d  base is locked}}
3900: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3910: 30 2e 24 74 6e 2e 38 20 7b 0a 20 20 20 20 65 78  0.$tn.8 {.    ex
3920: 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20 3b 20  ecsql { BEGIN ; 
3930: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
3940: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3950: 35 20 36 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  5 6}.  do_test w
3960: 61 6c 2d 31 30 2e 24 74 6e 2e 39 20 7b 0a 20 20  al-10.$tn.9 {.  
3970: 20 20 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20    sql2 COMMIT.  
3980: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e 53    catchsql { INS
3990: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
39a0: 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20 7d 20  ES(9, 10) }.  } 
39b0: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
39c0: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
39d0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 30  st wal-10.$tn.10
39e0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
39f0: 20 43 4f 4d 4d 49 54 3b 20 42 45 47 49 4e 3b 20   COMMIT; BEGIN; 
3a00: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3a10: 41 4c 55 45 53 28 39 2c 20 31 30 29 3b 20 43 4f  ALUES(9, 10); CO
3a20: 4d 4d 49 54 3b 20 7d 0a 20 20 20 20 65 78 65 63  MMIT; }.    exec
3a30: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
3a40: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3a50: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
3a60: 31 30 7d 0a 0a 20 20 23 20 4f 70 65 6e 20 61 20  10}..  # Open a 
3a70: 72 65 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e  read transaction
3a80: 20 77 69 74 68 20 5b 64 62 32 5d 2e 20 43 68 65   with [db2]. Che
3a90: 63 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 65  ck that this pre
3aa0: 76 65 6e 74 73 20 5b 64 62 5d 20 66 72 6f 6d 0a  vents [db] from.
3ab0: 20 20 23 20 63 68 65 63 6b 70 6f 69 6e 74 69 6e    # checkpointin
3ac0: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  g the database. 
3ad0: 42 75 74 20 6e 6f 74 20 66 72 6f 6d 20 77 72 69  But not from wri
3ae0: 74 69 6e 67 20 74 6f 20 69 74 2e 0a 20 20 23 0a  ting to it..  #.
3af0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3b00: 2e 24 74 6e 2e 31 31 20 7b 0a 20 20 20 20 73 71  .$tn.11 {.    sq
3b10: 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53 45 4c 45  l2 { BEGIN; SELE
3b20: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20  CT * FROM t1 }. 
3b30: 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20   } {1 2 3 4 5 6 
3b40: 37 20 38 20 39 20 31 30 7d 0a 20 20 64 6f 5f 74  7 8 9 10}.  do_t
3b50: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3b60: 32 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  2 {.    catchsql
3b70: 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68   { PRAGMA wal_ch
3b80: 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20  eckpoint } .  } 
3b90: 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73 20  {1 {database is 
3ba0: 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65  locked}}.  do_te
3bb0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 33  st wal-10.$tn.13
3bc0: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3bd0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3be0: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d  VALUES(11, 12) }
3bf0: 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43  .    sql2 {SELEC
3c00: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d  T * FROM t1}.  }
3c10: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3c20: 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 43 6f 6e  8 9 10}..  # Con
3c30: 6e 65 63 74 69 6f 6e 20 5b 64 62 32 5d 20 69 73  nection [db2] is
3c40: 20 68 6f 6c 64 69 6e 67 20 61 20 6c 6f 63 6b 20   holding a lock 
3c50: 6f 6e 20 61 20 73 6e 61 70 73 68 6f 74 2c 20 70  on a snapshot, p
3c60: 72 65 76 65 6e 74 69 6e 67 20 5b 64 62 5d 20 66  reventing [db] f
3c70: 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b 70 6f 69  rom.  # checkpoi
3c80: 6e 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  nting the databa
3c90: 73 65 2e 20 41 64 64 20 61 20 62 75 73 79 2d 68  se. Add a busy-h
3ca0: 61 6e 64 6c 65 72 20 74 6f 20 5b 64 62 5d 2e 20  andler to [db]. 
3cb0: 49 66 20 5b 64 62 32 5d 20 63 6f 6d 70 6c 65 74  If [db2] complet
3cc0: 65 73 0a 20 20 23 20 69 74 73 20 74 72 61 6e 73  es.  # its trans
3cd0: 61 63 74 69 6f 6e 20 66 72 6f 6d 20 77 69 74 68  action from with
3ce0: 69 6e 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  in the busy-hand
3cf0: 6c 65 72 2c 20 5b 64 62 5d 20 69 73 20 61 62 6c  ler, [db] is abl
3d00: 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 0a 20 20  e to complete.  
3d10: 23 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  # the checkpoint
3d20: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 23 0a   operation..  #.
3d30: 20 20 70 72 6f 63 20 62 75 73 79 68 61 6e 64 6c    proc busyhandl
3d40: 65 72 20 78 20 7b 0a 20 20 20 20 69 66 20 7b 24  er x {.    if {$
3d50: 78 3d 3d 34 7d 20 7b 20 73 71 6c 32 20 43 4f 4d  x==4} { sql2 COM
3d60: 4d 49 54 20 7d 0a 20 20 20 20 69 66 20 7b 24 78  MIT }.    if {$x
3d70: 3c 35 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d  <5} { return 0 }
3d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 0a 20 20  .    return 1.  
3d90: 7d 0a 20 20 64 62 20 62 75 73 79 20 62 75 73 79  }.  db busy busy
3da0: 68 61 6e 64 6c 65 72 0a 20 20 64 6f 5f 74 65 73  handler.  do_tes
3db0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 34 20  t wal-10.$tn.14 
3dc0: 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20  {.    execsql { 
3dd0: 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b  PRAGMA wal_check
3de0: 70 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a  point } .  } {}.
3df0: 0a 20 20 23 20 53 69 6d 69 6c 61 72 20 74 6f 20  .  # Similar to 
3e00: 74 68 65 20 74 65 73 74 20 61 62 6f 76 65 2e 20  the test above. 
3e10: 45 78 63 65 70 74 20 74 68 69 73 20 74 69 6d 65  Except this time
3e20: 2c 20 61 20 6e 65 77 20 72 65 61 64 20 74 72 61  , a new read tra
3e30: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 23 20  nsaction is.  # 
3e40: 73 74 61 72 74 65 64 20 28 64 62 33 29 20 77 68  started (db3) wh
3e50: 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
3e60: 6e 74 65 72 20 69 73 20 77 61 69 74 69 6e 67 20  nter is waiting 
3e70: 66 6f 72 20 61 6e 20 6f 6c 64 20 6f 6e 65 20 28  for an old one (
3e80: 64 62 32 29 20 74 6f 20 0a 20 20 23 20 66 69 6e  db2) to .  # fin
3e90: 69 73 68 2e 20 54 68 65 20 63 68 65 63 6b 70 6f  ish. The checkpo
3ea0: 69 6e 74 65 72 20 63 61 6e 20 66 69 6e 69 73 68  inter can finish
3eb0: 2c 20 62 75 74 20 61 6e 79 20 73 75 62 73 65 71  , but any subseq
3ec0: 75 65 6e 74 20 77 72 69 74 65 20 6f 70 65 72 61  uent write opera
3ed0: 74 69 6f 6e 73 20 0a 20 20 23 20 6d 75 73 74 20  tions .  # must 
3ee0: 77 61 69 74 20 75 6e 74 69 6c 20 61 66 74 65 72  wait until after
3ef0: 20 64 62 33 20 68 61 73 20 63 6c 6f 73 65 64 20   db3 has closed 
3f00: 74 68 65 20 72 65 61 64 20 74 72 61 6e 73 61 63  the read transac
3f10: 74 69 6f 6e 2c 20 61 73 20 64 62 33 20 69 73 20  tion, as db3 is 
3f20: 61 0a 20 20 23 20 22 72 65 67 69 6f 6e 20 44 22  a.  # "region D"
3f30: 20 77 72 69 74 65 72 2e 0a 20 20 23 0a 20 20 64   writer..  #.  d
3f40: 62 20 62 75 73 79 20 7b 7d 0a 20 20 64 6f 5f 74  b busy {}.  do_t
3f50: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3f60: 35 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42  5 {.    sql2 { B
3f70: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
3f80: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31  ROM t1; }.  } {1
3f90: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
3fa0: 20 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f   10 11 12}.  do_
3fb0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3fc0: 31 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  16 {.    catchsq
3fd0: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
3fe0: 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d  heckpoint } .  }
3ff0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
4000: 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 70 72 6f 63   locked}}.  proc
4010: 20 62 75 73 79 68 61 6e 64 6c 65 72 20 78 20 7b   busyhandler x {
4020: 0a 20 20 20 20 69 66 20 7b 24 78 3d 3d 33 7d 20  .    if {$x==3} 
4030: 7b 20 73 71 6c 33 20 7b 20 42 45 47 49 4e 3b 20  { sql3 { BEGIN; 
4040: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
4050: 20 7d 20 7d 0a 20 20 20 20 69 66 20 7b 24 78 3d   } }.    if {$x=
4060: 3d 34 7d 20 7b 20 73 71 6c 32 20 43 4f 4d 4d 49  =4} { sql2 COMMI
4070: 54 20 7d 0a 20 20 20 20 69 66 20 7b 24 78 3c 35  T }.    if {$x<5
4080: 7d 20 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  }  { return 0 }.
4090: 20 20 20 20 72 65 74 75 72 6e 20 31 0a 20 20 7d      return 1.  }
40a0: 0a 20 20 64 62 20 62 75 73 79 20 62 75 73 79 68  .  db busy busyh
40b0: 61 6e 64 6c 65 72 0a 20 20 64 6f 5f 74 65 73 74  andler.  do_test
40c0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 37 20 7b   wal-10.$tn.17 {
40d0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
40e0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
40f0: 6f 69 6e 74 20 7d 20 0a 20 20 7d 20 7b 7d 0a 20  oint } .  } {}. 
4100: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4110: 24 74 6e 2e 31 38 20 7b 0a 20 20 20 20 73 71 6c  $tn.18 {.    sql
4120: 33 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  3 { SELECT * FRO
4130: 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20  M t1 }.  } {1 2 
4140: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
4150: 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74 65 73   11 12}.  do_tes
4160: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 39 20  t wal-10.$tn.19 
4170: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
4180: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4190: 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29 20 7d  VALUES(13, 14) }
41a0: 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73  .  } {1 {databas
41b0: 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20  e is locked}}.  
41c0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
41d0: 74 6e 2e 32 30 20 7b 0a 20 20 20 20 65 78 65 63  tn.20 {.    exec
41e0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
41f0: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
4200: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
4210: 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74  10 11 12}.  do_t
4220: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
4230: 31 20 7b 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d  1 {.    sql3 COM
4240: 4d 49 54 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  MIT.  } {}.  do_
4250: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4260: 32 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  22 {.    execsql
4270: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4280: 31 20 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29  1 VALUES(13, 14)
4290: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
42a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
42b0: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
42c0: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
42d0: 20 31 32 20 31 33 20 31 34 7d 0a 0a 20 20 23 20   12 13 14}..  # 
42e0: 53 65 74 20 5b 64 62 33 5d 20 75 70 20 61 73 20  Set [db3] up as 
42f0: 61 20 22 72 65 67 69 6f 6e 20 44 22 20 72 65 61  a "region D" rea
4300: 64 65 72 20 61 67 61 69 6e 2e 20 54 68 65 6e 20  der again. Then 
4310: 75 70 67 72 61 64 65 20 69 74 20 74 6f 20 61 20  upgrade it to a 
4320: 77 72 69 74 65 72 0a 20 20 23 20 61 6e 64 20 62  writer.  # and b
4330: 61 63 6b 20 64 6f 77 6e 20 74 6f 20 61 20 72 65  ack down to a re
4340: 61 64 65 72 2e 20 54 68 65 6e 2c 20 63 68 65 63  ader. Then, chec
4350: 6b 20 74 68 61 74 20 61 20 63 68 65 63 6b 70 6f  k that a checkpo
4360: 69 6e 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  int is not possi
4370: 62 6c 65 0a 20 20 23 20 28 61 73 20 5b 64 62 33  ble.  # (as [db3
4380: 5d 20 73 74 69 6c 6c 20 68 61 73 20 61 20 73 6e  ] still has a sn
4390: 61 70 73 68 6f 74 20 6c 6f 63 6b 65 64 29 2e 0a  apshot locked)..
43a0: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
43b0: 6c 2d 31 30 2e 24 74 6e 2e 32 33 20 7b 0a 20 20  l-10.$tn.23 {.  
43c0: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
43d0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
43e0: 74 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  t }.  } {}.  do_
43f0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4400: 32 34 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20  24 {.    sql2 { 
4410: 42 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20  BEGIN; SELECT * 
4420: 46 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b  FROM t1; }.  } {
4430: 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20  1 2 3 4 5 6 7 8 
4440: 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34  9 10 11 12 13 14
4450: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4460: 31 30 2e 24 74 6e 2e 32 35 20 7b 0a 20 20 20 20  10.$tn.25 {.    
4470: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4480: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4490: 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65  }.  } {}.  do_te
44a0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36  st wal-10.$tn.26
44b0: 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20   {.    catchsql 
44c0: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
44d0: 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36 29 20   VALUES(15, 16) 
44e0: 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62 61  }.  } {1 {databa
44f0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20  se is locked}}. 
4500: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4510: 24 74 6e 2e 32 37 20 7b 0a 20 20 20 20 73 71 6c  $tn.27 {.    sql
4520: 33 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  3 { INSERT INTO 
4530: 74 31 20 56 41 4c 55 45 53 28 31 35 2c 20 31 36  t1 VALUES(15, 16
4540: 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64 6f 5f  ) }.  } {}.  do_
4550: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
4560: 32 38 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b  28 {.    code3 {
4570: 0a 20 20 20 20 20 20 73 65 74 20 3a 3a 53 54 4d  .      set ::STM
4580: 54 20 5b 73 71 6c 69 74 65 33 5f 70 72 65 70 61  T [sqlite3_prepa
4590: 72 65 20 64 62 33 20 22 53 45 4c 45 43 54 20 2a  re db3 "SELECT *
45a0: 20 46 52 4f 4d 20 74 31 22 20 2d 31 20 54 41 49   FROM t1" -1 TAI
45b0: 4c 5d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  L].      sqlite3
45c0: 5f 73 74 65 70 20 24 3a 3a 53 54 4d 54 0a 20 20  _step $::STMT.  
45d0: 20 20 7d 0a 20 20 20 20 73 71 6c 33 20 43 4f 4d    }.    sql3 COM
45e0: 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71 6c 20  MIT.    execsql 
45f0: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
4600: 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20  t1 }.  } {1 2 3 
4610: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31  4 5 6 7 8 9 10 1
4620: 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31 36  1 12 13 14 15 16
4630: 7d 0a 20 20 64 62 20 62 75 73 79 20 7b 7d 0a 20  }.  db busy {}. 
4640: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
4650: 24 74 6e 2e 32 39 20 7b 0a 20 20 20 20 65 78 65  $tn.29 {.    exe
4660: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
4670: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 37 2c  TO t1 VALUES(17,
4680: 20 31 38 29 20 7d 0a 20 20 20 20 63 61 74 63 68   18) }.    catch
4690: 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c  sql { PRAGMA wal
46a0: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20  _checkpoint }.  
46b0: 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69  } {1 {database i
46c0: 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f  s locked}}.  do_
46d0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
46e0: 33 30 20 7b 0a 20 20 20 20 63 6f 64 65 33 20 7b  30 {.    code3 {
46f0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
4700: 65 20 24 3a 3a 53 54 4d 54 20 7d 0a 20 20 20 20  e $::STMT }.    
4710: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
4720: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4730: 7d 0a 20 20 7d 20 7b 7d 0a 0a 20 20 23 20 41 74  }.  } {}..  # At
4740: 20 6f 6e 65 20 70 6f 69 6e 74 2c 20 69 66 20 61   one point, if a
4750: 20 72 65 61 64 65 72 20 66 61 69 6c 65 64 20 74   reader failed t
4760: 6f 20 75 70 67 72 61 64 65 20 74 6f 20 61 20 77  o upgrade to a w
4770: 72 69 74 65 72 20 62 65 63 61 75 73 65 20 69 74  riter because it
4780: 0a 20 20 23 20 77 61 73 20 72 65 61 64 69 6e 67  .  # was reading
4790: 20 61 6e 20 6f 6c 64 20 73 6e 61 70 73 68 6f 74   an old snapshot
47a0: 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b  , the write-lock
47b0: 73 20 77 65 72 65 20 6e 6f 74 20 62 65 69 6e 67  s were not being
47c0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 23 20 54   released..  # T
47d0: 65 73 74 20 74 68 61 74 20 74 68 69 73 20 62 75  est that this bu
47e0: 67 20 68 61 73 20 62 65 65 6e 20 66 69 78 65 64  g has been fixed
47f0: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
4800: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 31 20 7b 0a  wal-10.$tn.31 {.
4810: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45      execsql { BE
4820: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  GIN ; SELECT * F
4830: 52 4f 4d 20 74 31 20 7d 0a 20 20 20 20 73 71 6c  ROM t1 }.    sql
4840: 32 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  2 { INSERT INTO 
4850: 74 31 20 56 41 4c 55 45 53 28 31 39 2c 20 32 30  t1 VALUES(19, 20
4860: 29 20 7d 0a 20 20 20 20 63 61 74 63 68 73 71 6c  ) }.    catchsql
4870: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4880: 31 20 56 41 4c 55 45 53 28 32 31 2c 20 32 32 29  1 VALUES(21, 22)
4890: 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74 61 62   }.  } {1 {datab
48a0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a  ase is locked}}.
48b0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
48c0: 2e 24 74 6e 2e 33 32 20 7b 0a 20 20 20 20 23 20  .$tn.32 {.    # 
48d0: 54 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  This statement w
48e0: 6f 75 6c 64 20 66 61 69 6c 20 77 68 65 6e 20 74  ould fail when t
48f0: 68 65 20 62 75 67 20 77 61 73 20 70 72 65 73 65  he bug was prese
4900: 6e 74 2e 0a 20 20 20 20 73 71 6c 32 20 7b 20 49  nt..    sql2 { I
4910: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4920: 4c 55 45 53 28 32 31 2c 20 32 32 29 20 7d 0a 20  LUES(21, 22) }. 
4930: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
4940: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 33 20 7b 0a  wal-10.$tn.33 {.
4950: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
4960: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 3b  LECT * FROM t1 ;
4970: 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 7d 20 7b 31   COMMIT }.  } {1
4980: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
4990: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
49a0: 31 35 20 31 36 20 31 37 20 31 38 7d 0a 20 20 64  15 16 17 18}.  d
49b0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
49c0: 6e 2e 33 34 20 7b 0a 20 20 20 20 65 78 65 63 73  n.34 {.    execs
49d0: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
49e0: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20 32  OM t1 }.  } {1 2
49f0: 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31   3 4 5 6 7 8 9 1
4a00: 30 20 31 31 20 31 32 20 31 33 20 31 34 20 31 35  0 11 12 13 14 15
4a10: 20 31 36 20 31 37 20 31 38 20 31 39 20 32 30 20   16 17 18 19 20 
4a20: 32 31 20 32 32 7d 0a 0a 20 20 23 20 54 65 73 74  21 22}..  # Test
4a30: 20 74 68 61 74 20 69 66 20 61 20 63 68 65 63 6b   that if a check
4a40: 70 6f 69 6e 74 65 72 20 63 61 6e 6e 6f 74 20 6f  pointer cannot o
4a50: 62 74 61 69 6e 20 74 68 65 20 72 65 71 75 69 72  btain the requir
4a60: 65 64 20 6c 6f 63 6b 73 2c 20 69 74 0a 20 20 23  ed locks, it.  #
4a70: 20 72 65 6c 65 61 73 65 73 20 61 6c 6c 20 6c 6f   releases all lo
4a80: 63 6b 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  cks before retur
4a90: 6e 69 6e 67 20 61 20 62 75 73 79 20 65 72 72 6f  ning a busy erro
4aa0: 72 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  r..  #.  do_test
4ab0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 35 20 7b   wal-10.$tn.35 {
4ac0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 0a  .    execsql { .
4ad0: 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f        DELETE FRO
4ae0: 4d 20 74 31 3b 0a 20 20 20 20 20 20 49 4e 53 45  M t1;.      INSE
4af0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
4b00: 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20 20  S('a', 'b');.   
4b10: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
4b20: 31 20 56 41 4c 55 45 53 28 27 63 27 2c 20 27 64  1 VALUES('c', 'd
4b30: 27 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ');.    }.    sq
4b40: 6c 32 20 7b 0a 20 20 20 20 20 20 42 45 47 49 4e  l2 {.      BEGIN
4b50: 3b 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54  ;.        SELECT
4b60: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20   * FROM t1;.    
4b70: 7d 0a 20 20 7d 20 7b 61 20 62 20 63 20 64 7d 0a  }.  } {a b c d}.
4b80: 20 20 70 72 6f 63 20 62 75 73 79 68 61 6e 64 6c    proc busyhandl
4b90: 65 72 20 78 20 7b 20 72 65 74 75 72 6e 20 31 20  er x { return 1 
4ba0: 7d 0a 20 20 64 62 20 62 75 73 79 20 62 75 73 79  }.  db busy busy
4bb0: 68 61 6e 64 6c 65 72 0a 20 20 64 6f 5f 74 65 73  handler.  do_tes
4bc0: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36 20  t wal-10.$tn.36 
4bd0: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
4be0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4bf0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 31 20  kpoint }.  } {1 
4c00: 7b 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  {database is loc
4c10: 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74 65 73 74 20  ked}}.  do_test 
4c20: 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36 20 7b 0a  wal-10.$tn.36 {.
4c30: 20 20 20 20 73 71 6c 33 20 7b 20 49 4e 53 45 52      sql3 { INSER
4c40: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4c50: 28 27 65 27 2c 20 27 66 27 29 20 7d 0a 20 20 20  ('e', 'f') }.   
4c60: 20 73 71 6c 32 20 7b 20 53 45 4c 45 43 54 20 2a   sql2 { SELECT *
4c70: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
4c80: 61 20 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65  a b c d}.  do_te
4c90: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 37  st wal-10.$tn.37
4ca0: 20 7b 0a 20 20 20 20 73 71 6c 32 20 43 4f 4d 4d   {.    sql2 COMM
4cb0: 49 54 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  IT.    execsql {
4cc0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4cd0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 7d 0a  kpoint }.  } {}.
4ce0: 0a 20 20 63 61 74 63 68 20 7b 20 64 62 20 63 6c  .  catch { db cl
4cf0: 6f 73 65 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  ose }.  catch { 
4d00: 63 6f 64 65 32 20 7b 20 64 62 32 20 63 6c 6f 73  code2 { db2 clos
4d10: 65 20 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  e } }.  catch { 
4d20: 63 6f 64 65 33 20 7b 20 64 62 33 20 63 6c 6f 73  code3 { db3 clos
4d30: 65 20 7d 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  e } }.  catch { 
4d40: 63 6c 6f 73 65 20 24 3a 3a 63 6f 64 65 32 5f 63  close $::code2_c
4d50: 68 61 6e 20 7d 0a 20 20 63 61 74 63 68 20 7b 20  han }.  catch { 
4d60: 63 6c 6f 73 65 20 24 3a 3a 63 6f 64 65 33 5f 63  close $::code3_c
4d70: 68 61 6e 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d  han }.}..#------
4d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4dc0: 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63 6b  ---.# This block
4dd0: 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d 31   of tests, wal-1
4de0: 31 2e 2a 2c 20 74 65 73 74 20 74 68 61 74 20 6e  1.*, test that n
4df0: 6f 74 68 69 6e 67 20 67 6f 65 73 20 74 65 72 72  othing goes terr
4e00: 69 62 6c 79 20 77 72 6f 6e 67 0a 23 20 69 66 20  ibly wrong.# if 
4e10: 66 72 61 6d 65 73 20 6d 75 73 74 20 62 65 20 77  frames must be w
4e20: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6c 6f  ritten to the lo
4e30: 67 20 66 69 6c 65 20 62 65 66 6f 72 65 20 61 20  g file before a 
4e40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 23  transaction is.#
4e50: 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e 20 6f   committed (in o
4e60: 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70 20  rder to free up 
4e70: 6d 65 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f 74 65  memory)..#.do_te
4e80: 73 74 20 77 61 6c 2d 31 31 2e 31 20 7b 0a 20 20  st wal-11.1 {.  
4e90: 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78 65 63  reopen_db.  exec
4ea0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
4eb0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
4ec0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  ;.    PRAGMA pag
4ed0: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
4ee0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
4ef0: 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(x PRIMARY KEY
4f00: 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  );.  }.  list [e
4f10: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
4f20: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65  est.db]/1024] [e
4f30: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
4f40: 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34  est.db-wal]/1044
4f50: 5d 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74 65 73  ].} {1 3}.do_tes
4f60: 74 20 77 61 6c 2d 31 31 2e 32 20 7b 0a 20 20 65  t wal-11.2 {.  e
4f70: 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20  xecsql { PRAGMA 
4f80: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d  wal_checkpoint }
4f90: 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66  .  list [expr [f
4fa0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
4fb0: 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69  ]/1024] [file si
4fc0: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
4fd0: 7d 20 5b 6c 69 73 74 20 33 20 5b 6c 6f 67 5f 66  } [list 3 [log_f
4fe0: 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32 34 5d  ile_size 3 1024]
4ff0: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
5000: 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .3 {.  execsql {
5010: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
5020: 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39 30 30  VALUES( blob(900
5030: 29 20 29 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78  ) ) }.  list [ex
5040: 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  pr [file size te
5050: 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69  st.db]/1024] [fi
5060: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
5070: 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b  wal].} [list 3 [
5080: 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 34 20  log_file_size 4 
5090: 31 30 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73 74 20  1024]]..do_test 
50a0: 77 61 6c 2d 31 31 2e 34 20 7b 0a 20 20 65 78 65  wal-11.4 {.  exe
50b0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
50c0: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
50d0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62  INTO t1 SELECT b
50e0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
50f0: 3b 20 20 20 2d 2d 20 32 0a 20 20 20 20 20 20 49  ;   -- 2.      I
5100: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
5110: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
5120: 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 34 0a 20  ROM t1;   -- 4. 
5130: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
5140: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
5150: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
5160: 2d 2d 20 38 0a 20 20 20 20 20 20 49 4e 53 45 52  -- 8.      INSER
5170: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
5180: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
5190: 74 31 3b 20 20 20 2d 2d 20 31 36 0a 20 20 7d 0a  t1;   -- 16.  }.
51a0: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
51b0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
51c0: 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a  /1024] [file siz
51d0: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
51e0: 20 5b 6c 69 73 74 20 33 20 5b 6c 6f 67 5f 66 69   [list 3 [log_fi
51f0: 6c 65 5f 73 69 7a 65 20 33 32 20 31 30 32 34 5d  le_size 32 1024]
5200: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
5210: 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .5 {.  execsql {
5220: 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75   .    SELECT cou
5230: 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20  nt(*) FROM t1;. 
5240: 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72     PRAGMA integr
5250: 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d  ity_check;.  }.}
5260: 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74   {16 ok}.do_test
5270: 20 77 61 6c 2d 31 31 2e 36 20 7b 0a 20 20 65 78   wal-11.6 {.  ex
5280: 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20 20 6c  ecsql COMMIT.  l
5290: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
52a0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
52b0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
52c0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
52d0: 69 73 74 20 33 20 5b 6c 6f 67 5f 66 69 6c 65 5f  ist 3 [log_file_
52e0: 73 69 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a 64  size 41 1024]].d
52f0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 37 20  o_test wal-11.7 
5300: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20  {.  execsql { . 
5310: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
5320: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
5330: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
5340: 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20 7b 31  _check;.  }.} {1
5350: 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 77 61  6 ok}.do_test wa
5360: 6c 2d 31 31 2e 38 20 7b 0a 20 20 65 78 65 63 73  l-11.8 {.  execs
5370: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
5380: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c  checkpoint }.  l
5390: 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20  ist [expr [file 
53a0: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30  size test.db]/10
53b0: 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  24] [file size t
53c0: 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c  est.db-wal].} [l
53d0: 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69 6c 65  ist 37 [log_file
53e0: 5f 73 69 7a 65 20 34 31 20 31 30 32 34 5d 5d 0a  _size 41 1024]].
53f0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 39  do_test wal-11.9
5400: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
5410: 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c 65  list [expr [file
5420: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31   size test.db]/1
5430: 30 32 34 5d 20 5b 6c 6f 67 5f 64 65 6c 65 74 65  024] [log_delete
5440: 64 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  d test.db-wal].}
5450: 20 7b 33 37 20 31 7d 0a 73 71 6c 69 74 65 33 5f   {37 1}.sqlite3_
5460: 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 64  wal db test.db.d
5470: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 30  o_test wal-11.10
5480: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
5490: 20 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f     PRAGMA cache_
54a0: 73 69 7a 65 20 3d 20 31 30 3b 0a 20 20 20 20 42  size = 10;.    B
54b0: 45 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45  EGIN;.      INSE
54c0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
54d0: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
54e0: 20 74 31 3b 20 20 20 2d 2d 20 33 32 0a 20 20 20   t1;   -- 32.   
54f0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
5500: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a  *) FROM t1;.  }.
5510: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
5520: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
5530: 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a  /1024] [file siz
5540: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d  e test.db-wal].}
5550: 20 5b 6c 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66   [list 37 [log_f
5560: 69 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32 34  ile_size 37 1024
5570: 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  ]].do_test wal-1
5580: 31 2e 31 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  1.11 {.  execsql
5590: 20 7b 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20   {.      SELECT 
55a0: 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31  count(*) FROM t1
55b0: 3b 0a 20 20 20 20 52 4f 4c 4c 42 41 43 4b 3b 0a  ;.    ROLLBACK;.
55c0: 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74      SELECT count
55d0: 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d  (*) FROM t1;.  }
55e0: 0a 7d 20 7b 33 32 20 31 36 7d 0a 64 6f 5f 74 65  .} {32 16}.do_te
55f0: 73 74 20 77 61 6c 2d 31 31 2e 31 32 20 7b 0a 20  st wal-11.12 {. 
5600: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
5610: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
5620: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
5630: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
5640: 5b 6c 69 73 74 20 33 37 20 5b 6c 6f 67 5f 66 69  [list 37 [log_fi
5650: 6c 65 5f 73 69 7a 65 20 33 37 20 31 30 32 34 5d  le_size 37 1024]
5660: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
5670: 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .13 {.  execsql 
5680: 7b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  {.    INSERT INT
5690: 4f 20 74 31 20 56 41 4c 55 45 53 28 20 62 6c 6f  O t1 VALUES( blo
56a0: 62 28 39 30 30 29 20 29 3b 0a 20 20 20 20 53 45  b(900) );.    SE
56b0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
56c0: 4f 4d 20 74 31 3b 0a 20 20 20 20 50 52 41 47 4d  OM t1;.    PRAGM
56d0: 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  A integrity_chec
56e0: 6b 3b 0a 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d  k;.  }.} {17 ok}
56f0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
5700: 31 34 20 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70  14 {.  list [exp
5710: 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  r [file size tes
5720: 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c  t.db]/1024] [fil
5730: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
5740: 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b  al].} [list 37 [
5750: 6c 6f 67 5f 66 69 6c 65 5f 73 69 7a 65 20 33 37  log_file_size 37
5760: 20 31 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d   1024]]...#-----
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
57c0: 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d  k of tests, wal-
57d0: 31 32 2e 2a 2c 20 74 65 73 74 73 20 74 68 65 20  12.*, tests the 
57e0: 66 69 78 20 66 6f 72 20 61 20 70 72 6f 62 6c 65  fix for a proble
57f0: 6d 20 74 68 61 74 20 0a 23 20 63 6f 75 6c 64 20  m that .# could 
5800: 6f 63 63 75 72 20 69 66 20 61 20 6c 6f 67 20 74  occur if a log t
5810: 68 61 74 20 69 73 20 61 20 70 72 65 66 69 78 20  hat is a prefix 
5820: 6f 66 20 61 6e 20 6f 6c 64 65 72 20 6c 6f 67 20  of an older log 
5830: 69 73 20 77 72 69 74 74 65 6e 20 0a 23 20 69 6e  is written .# in
5840: 74 6f 20 61 20 72 65 75 73 65 64 20 6c 6f 67 20  to a reused log 
5850: 66 69 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64  file..#.reopen_d
5860: 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32  b.do_test wal-12
5870: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
5880: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
5890: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
58a0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
58b0: 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45  1(x, y);.    CRE
58c0: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20  ATE TABLE t2(x, 
58d0: 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  y);.    INSERT I
58e0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41  NTO t1 VALUES('A
58f0: 27 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c 69 73  ', 1);.  }.  lis
5900: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
5910: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
5920: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
5930: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
5940: 74 20 31 20 5b 6c 6f 67 5f 66 69 6c 65 5f 73 69  t 1 [log_file_si
5950: 7a 65 20 35 20 31 30 32 34 5d 5d 0a 64 6f 5f 74  ze 5 1024]].do_t
5960: 65 73 74 20 77 61 6c 2d 31 32 2e 32 20 7b 0a 20  est wal-12.2 {. 
5970: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
5980: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
5990: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
59a0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
59b0: 73 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20  s = normal;.    
59c0: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
59d0: 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27 41  = 0 WHERE x = 'A
59e0: 27 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  ';.  }.  list [e
59f0: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5a00: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65  est.db]/1024] [e
5a10: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5a20: 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34  est.db-wal]/1044
5a30: 5d 0a 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74 65 73  ].} {3 1}.do_tes
5a40: 74 20 77 61 6c 2d 31 32 2e 33 20 7b 0a 20 20 65  t wal-12.3 {.  e
5a50: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
5a60: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
5a70: 42 27 2c 20 31 29 20 7d 0a 20 20 6c 69 73 74 20  B', 1) }.  list 
5a80: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
5a90: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
5aa0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
5ab0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
5ac0: 34 34 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74  44].} {3 2}.do_t
5ad0: 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20  est wal-12.4 {. 
5ae0: 20 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63   file copy -forc
5af0: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e  e test.db test2.
5b00: 64 62 0a 20 20 66 69 6c 65 20 63 6f 70 79 20 2d  db.  file copy -
5b10: 66 6f 72 63 65 20 74 65 73 74 2e 64 62 2d 77 61  force test.db-wa
5b20: 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  l test2.db-wal. 
5b30: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32   sqlite3_wal db2
5b40: 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78 65 63   test2.db.  exec
5b50: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
5b60: 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d 20 7b  ROM t2 } db2.} {
5b70: 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 64  B 1}.db2 close.d
5b80: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e 35 20  o_test wal-12.5 
5b90: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20  {.  execsql {.  
5ba0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
5bb0: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55 50 44  ckpoint;.    UPD
5bc0: 41 54 45 20 74 32 20 53 45 54 20 79 20 3d 20 32  ATE t2 SET y = 2
5bd0: 20 57 48 45 52 45 20 78 20 3d 20 27 42 27 3b 20   WHERE x = 'B'; 
5be0: 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f  .    PRAGMA wal_
5bf0: 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20  checkpoint;.    
5c00: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
5c10: 3d 20 31 20 57 48 45 52 45 20 78 20 3d 20 27 41  = 1 WHERE x = 'A
5c20: 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  ';.    PRAGMA wa
5c30: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
5c40: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
5c50: 79 20 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20  y = 0 WHERE x = 
5c60: 27 41 27 3b 0a 20 20 20 20 53 45 4c 45 43 54 20  'A';.    SELECT 
5c70: 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d  * FROM t2;.  }.}
5c80: 20 7b 42 20 32 7d 0a 64 6f 5f 74 65 73 74 20 77   {B 2}.do_test w
5c90: 61 6c 2d 31 32 2e 36 20 7b 0a 20 20 66 69 6c 65  al-12.6 {.  file
5ca0: 20 63 6f 70 79 20 2d 66 6f 72 63 65 20 74 65 73   copy -force tes
5cb0: 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20  t.db test2.db.  
5cc0: 66 69 6c 65 20 63 6f 70 79 20 2d 66 6f 72 63 65  file copy -force
5cd0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73   test.db-wal tes
5ce0: 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69  t2.db-wal.  sqli
5cf0: 74 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74  te3_wal db2 test
5d00: 32 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  2.db.  execsql {
5d10: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
5d20: 32 20 7d 20 64 62 32 0a 7d 20 7b 42 20 32 7d 0a  2 } db2.} {B 2}.
5d30: 64 62 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f  db2 close.db clo
5d40: 73 65 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  se..#-----------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
5d90: 20 54 65 73 74 20 6c 61 72 67 65 20 6c 6f 67 20   Test large log 
5da0: 73 75 6d 6d 61 72 69 65 73 2e 0a 23 0a 64 6f 5f  summaries..#.do_
5db0: 74 65 73 74 20 77 61 6c 2d 31 33 2e 31 2e 31 20  test wal-13.1.1 
5dc0: 7b 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65  {.  list [file e
5dd0: 78 69 73 74 73 20 74 65 73 74 2e 64 62 5d 20 5b  xists test.db] [
5de0: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
5df0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 31 20 30 7d  .db-wal].} {1 0}
5e00: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e  .do_test wal-13.
5e10: 31 2e 32 20 7b 0a 20 20 73 65 74 20 66 64 20 5b  1.2 {.  set fd [
5e20: 6f 70 65 6e 20 74 65 73 74 2e 64 62 2d 77 61 6c  open test.db-wal
5e30: 20 77 5d 0a 20 20 73 65 65 6b 20 24 66 64 20 5b   w].  seek $fd [
5e40: 65 78 70 72 20 32 30 30 2a 31 30 32 34 2a 31 30  expr 200*1024*10
5e50: 32 34 5d 0a 20 20 70 75 74 73 20 24 66 64 20 22  24].  puts $fd "
5e60: 22 0a 20 20 63 6c 6f 73 65 20 24 66 64 0a 20 20  ".  close $fd.  
5e70: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
5e80: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
5e90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
5ea0: 7d 0a 7d 20 7b 42 20 32 7d 0a 64 6f 5f 74 65 73  }.} {B 2}.do_tes
5eb0: 74 20 77 61 6c 2d 31 33 2e 31 2e 33 20 7b 0a 20  t wal-13.1.3 {. 
5ec0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 66 69 6c 65   db close.  file
5ed0: 20 65 78 69 73 74 73 20 74 65 73 74 2e 64 62 2d   exists test.db-
5ee0: 77 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f 74 65 73  wal.} {0}.do_tes
5ef0: 74 20 77 61 6c 2d 31 33 2e 31 2e 34 20 7b 0a 20  t wal-13.1.4 {. 
5f00: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
5f10: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
5f20: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
5f30: 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 31 7d 0a  FROM t2 }.} {1}.
5f40: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 31  do_test wal-13.1
5f50: 2e 35 20 7b 0a 20 20 66 6f 72 20 7b 73 65 74 20  .5 {.  for {set 
5f60: 69 20 30 7d 20 7b 24 69 20 3c 20 36 7d 20 7b 69  i 0} {$i < 6} {i
5f70: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 65 78 65  ncr i} {.    exe
5f80: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
5f90: 54 4f 20 74 32 20 53 45 4c 45 43 54 20 72 61 6e  TO t2 SELECT ran
5fa0: 64 6f 6d 62 6c 6f 62 28 34 30 30 29 2c 20 72 61  domblob(400), ra
5fb0: 6e 64 6f 6d 62 6c 6f 62 28 34 30 30 29 20 46 52  ndomblob(400) FR
5fc0: 4f 4d 20 74 32 20 7d 0a 20 20 7d 0a 20 20 65 78  OM t2 }.  }.  ex
5fd0: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
5fe0: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
5ff0: 7d 0a 7d 20 5b 65 78 70 72 20 69 6e 74 28 70 6f  }.} [expr int(po
6000: 77 28 32 2c 20 36 29 29 5d 0a 64 6f 5f 74 65 73  w(2, 6))].do_tes
6010: 74 20 77 61 6c 2d 31 33 2e 31 2e 36 20 7b 0a 20  t wal-13.1.6 {. 
6020: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
6030: 64 62 2d 77 61 6c 0a 7d 20 5b 6c 6f 67 5f 66 69  db-wal.} [log_fi
6040: 6c 65 5f 73 69 7a 65 20 38 30 20 31 30 32 34 5d  le_size 80 1024]
6050: 0a 0a 66 6f 72 65 61 63 68 20 63 6f 64 65 20 5b  ..foreach code [
6060: 6c 69 73 74 20 7b 0a 20 20 73 65 74 20 74 6e 20  list {.  set tn 
6070: 32 0a 20 20 70 72 6f 63 20 62 75 64 64 79 20 7b  2.  proc buddy {
6080: 74 63 6c 7d 20 7b 20 75 70 6c 65 76 65 6c 20 23  tcl} { uplevel #
6090: 30 20 24 74 63 6c 20 7d 0a 7d 20 7b 0a 20 20 73  0 $tcl }.} {.  s
60a0: 65 74 20 74 6e 20 33 0a 20 20 73 65 74 20 3a 3a  et tn 3.  set ::
60b0: 62 75 64 64 79 20 5b 6c 61 75 6e 63 68 5f 74 65  buddy [launch_te
60c0: 73 74 66 69 78 74 75 72 65 5d 0a 20 20 70 72 6f  stfixture].  pro
60d0: 63 20 62 75 64 64 79 20 7b 74 63 6c 7d 20 7b 20  c buddy {tcl} { 
60e0: 74 65 73 74 66 69 78 74 75 72 65 20 24 3a 3a 62  testfixture $::b
60f0: 75 64 64 79 20 24 74 63 6c 20 7d 0a 7d 5d 20 7b  uddy $tcl }.}] {
6100: 0a 0a 20 20 65 76 61 6c 20 24 63 6f 64 65 0a 20  ..  eval $code. 
6110: 20 72 65 6f 70 65 6e 5f 64 62 0a 0a 20 20 64 6f   reopen_db..  do
6120: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e  _test wal-13.$tn
6130: 2e 30 20 7b 0a 20 20 20 20 62 75 64 64 79 20 7b  .0 {.    buddy {
6140: 20 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73   sqlite3 db2 tes
6150: 74 2e 64 62 20 7d 0a 20 20 20 20 65 78 65 63 73  t.db }.    execs
6160: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
6170: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
6180: 20 57 41 4c 3b 0a 20 20 20 20 20 20 43 52 45 41   WAL;.      CREA
6190: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a  TE TABLE t1(x);.
61a0: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
61b0: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
61c0: 6f 6d 62 6c 6f 62 28 34 30 30 29 3b 0a 20 20 20  omblob(400);.   
61d0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
61e0: 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29   SELECT count(*)
61f0: 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b   FROM t1 }.  } {
6200: 31 7d 0a 0a 20 20 66 6f 72 20 7b 73 65 74 20 69  1}..  for {set i
6210: 69 20 31 7d 20 7b 24 69 69 3c 31 36 7d 20 7b 69  i 1} {$ii<16} {i
6220: 6e 63 72 20 69 69 7d 20 7b 0a 20 20 20 20 64 6f  ncr ii} {.    do
6230: 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e 24 74 6e  _test wal-13.$tn
6240: 2e 24 69 69 2e 61 20 7b 0a 20 20 20 20 20 20 62  .$ii.a {.      b
6250: 75 64 64 79 20 7b 20 64 62 32 20 65 76 61 6c 20  uddy { db2 eval 
6260: 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31  { INSERT INTO t1
6270: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
6280: 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31 20  ob(400) FROM t1 
6290: 7d 20 7d 0a 20 20 20 20 20 20 62 75 64 64 79 20  } }.      buddy 
62a0: 7b 20 64 62 32 20 65 76 61 6c 20 7b 20 53 45 4c  { db2 eval { SEL
62b0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
62c0: 4d 20 74 31 20 7d 20 7d 0a 20 20 20 20 7d 20 5b  M t1 } }.    } [
62d0: 65 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20  expr (1<<$ii)]. 
62e0: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31     do_test wal-1
62f0: 33 2e 24 74 6e 2e 24 69 69 2e 62 20 7b 0a 20 20  3.$tn.$ii.b {.  
6300: 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45      db eval { SE
6310: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
6320: 4f 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65  OM t1 }.    } [e
6330: 78 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20  xpr (1<<$ii)].  
6340: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33    do_test wal-13
6350: 2e 24 74 6e 2e 24 69 69 2e 63 20 7b 0a 20 20 20  .$tn.$ii.c {.   
6360: 20 20 20 64 62 20 65 76 61 6c 20 7b 20 53 45 4c     db eval { SEL
6370: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
6380: 4d 20 74 31 20 7d 0a 20 20 20 20 7d 20 5b 65 78  M t1 }.    } [ex
6390: 70 72 20 28 31 3c 3c 24 69 69 29 5d 0a 20 20 20  pr (1<<$ii)].   
63a0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 33 2e   do_test wal-13.
63b0: 24 74 6e 2e 24 69 69 2e 64 20 7b 0a 20 20 20 20  $tn.$ii.d {.    
63c0: 20 20 64 62 20 65 76 61 6c 20 7b 20 50 52 41 47    db eval { PRAG
63d0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
63e0: 63 6b 20 7d 0a 20 20 20 20 7d 20 7b 6f 6b 7d 0a  ck }.    } {ok}.
63f0: 20 20 7d 0a 0a 20 20 63 61 74 63 68 20 7b 20 64    }..  catch { d
6400: 62 32 20 63 6c 6f 73 65 20 7d 0a 20 20 63 61 74  b2 close }.  cat
6410: 63 68 20 7b 20 63 6c 6f 73 65 20 24 3a 3a 62 75  ch { close $::bu
6420: 64 64 79 20 7d 0a 20 20 64 62 20 63 6c 6f 73 65  ddy }.  db close
6430: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
6480: 20 43 68 65 63 6b 20 61 20 66 75 6e 20 63 6f 72   Check a fun cor
6490: 72 75 70 74 69 6f 6e 20 63 61 73 65 20 68 61 73  ruption case has
64a0: 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 23 0a 23   been fixed..#.#
64b0: 20 54 68 65 20 70 72 6f 62 6c 65 6d 20 77 61 73   The problem was
64c0: 20 74 68 61 74 20 61 66 74 65 72 20 70 65 72 66   that after perf
64d0: 6f 72 6d 69 6e 67 20 61 20 63 68 65 63 6b 70 6f  orming a checkpo
64e0: 69 6e 74 20 75 73 69 6e 67 20 61 20 63 6f 6e 6e  int using a conn
64f0: 65 63 74 69 6f 6e 0a 23 20 74 68 61 74 20 68 61  ection.# that ha
6500: 64 20 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74 65  d an out-of-date
6510: 20 70 61 67 65 72 2d 63 61 63 68 65 2c 20 74 68   pager-cache, th
6520: 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
6530: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 0a 23  connection was.#
6540: 20 75 73 65 64 20 69 74 20 64 69 64 20 6e 6f 74   used it did not
6550: 20 72 65 61 6c 69 7a 65 20 74 68 65 20 63 61 63   realize the cac
6560: 68 65 20 77 61 73 20 6f 75 74 2d 6f 66 2d 64 61  he was out-of-da
6570: 74 65 20 61 6e 64 20 70 72 6f 63 65 65 64 65 64  te and proceeded
6580: 20 74 6f 0a 23 20 6f 70 65 72 61 74 65 20 77 69   to.# operate wi
6590: 74 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  th an inconsiste
65a0: 6e 74 20 63 61 63 68 65 2e 20 4c 65 61 64 69 6e  nt cache. Leadin
65b0: 67 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 2e  g to corruption.
65c0: 0a 23 0a 0a 63 61 74 63 68 20 7b 20 64 62 20 63  .#..catch { db c
65d0: 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64  lose }.catch { d
65e0: 62 32 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68  b2 close }.catch
65f0: 20 7b 20 64 62 33 20 63 6c 6f 73 65 20 7d 0a 66   { db3 close }.f
6600: 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63  ile delete -forc
6610: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
6620: 62 2d 77 61 6c 0a 73 71 6c 69 74 65 33 20 64 62  b-wal.sqlite3 db
6630: 20 74 65 73 74 2e 64 62 0a 73 71 6c 69 74 65 33   test.db.sqlite3
6640: 20 64 62 32 20 74 65 73 74 2e 64 62 0a 0a 64 6f   db2 test.db..do
6650: 5f 74 65 73 74 20 77 61 6c 2d 31 34 20 7b 0a 20  _test wal-14 {. 
6660: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
6670: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
6680: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52  de = WAL;.    CR
6690: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 20  EATE TABLE t1(a 
66a0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b  PRIMARY KEY, b);
66b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
66c0: 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f   t1 VALUES(rando
66d0: 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f  mblob(10), rando
66e0: 6d 62 6c 6f 62 28 31 30 30 29 29 3b 0a 20 20 20  mblob(100));.   
66f0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
6700: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
6710: 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  b(10), randomblo
6720: 62 28 31 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(100) FROM t1;.
6730: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
6740: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
6750: 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d  blob(10), random
6760: 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d 20 74  blob(100) FROM t
6770: 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  1;.    INSERT IN
6780: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e  TO t1 SELECT ran
6790: 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e  domblob(10), ran
67a0: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f  domblob(100) FRO
67b0: 4d 20 74 31 3b 0a 20 20 7d 0a 0a 20 20 64 62 32  M t1;.  }..  db2
67c0: 20 65 76 61 6c 20 7b 20 0a 20 20 20 20 49 4e 53   eval { .    INS
67d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
67e0: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  CT randomblob(10
67f0: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
6800: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
6810: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
6820: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
6830: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20  ndomblob(100);. 
6840: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6850: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
6860: 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62  lob(10), randomb
6870: 6c 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e  lob(100);.    IN
6880: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
6890: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  ECT randomblob(1
68a0: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
68b0: 30 30 29 3b 0a 20 20 7d 0a 0a 20 20 23 20 41 66  00);.  }..  # Af
68c0: 74 65 72 20 65 78 65 63 75 74 69 6e 67 20 74 68  ter executing th
68d0: 65 20 22 50 52 41 47 4d 41 20 77 61 6c 5f 63 68  e "PRAGMA wal_ch
68e0: 65 63 6b 70 6f 69 6e 74 22 2c 20 63 6f 6e 6e 65  eckpoint", conne
68f0: 63 74 69 6f 6e 20 5b 64 62 5d 20 77 61 73 20 62  ction [db] was b
6900: 65 69 6e 67 0a 20 20 23 20 6c 65 66 74 20 77 69  eing.  # left wi
6910: 74 68 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  th an inconsiste
6920: 6e 74 20 63 61 63 68 65 2e 20 52 75 6e 6e 69 6e  nt cache. Runnin
6930: 67 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  g the CREATE IND
6940: 45 58 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 23  EX statement.  #
6950: 20 69 6e 20 74 68 69 73 20 73 74 61 74 65 20 6c   in this state l
6960: 65 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ed to database c
6970: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 63 61 74  orruption..  cat
6980: 63 68 73 71 6c 20 7b 20 0a 20 20 20 20 50 52 41  chsql { .    PRA
6990: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
69a0: 6e 74 3b 0a 20 20 20 20 43 52 45 41 54 45 20 49  nt;.    CREATE I
69b0: 4e 44 45 58 20 69 31 20 6f 6e 20 74 31 28 62 29  NDEX i1 on t1(b)
69c0: 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 64 62 32 20  ;.  }.   .  db2 
69d0: 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 69 6e  eval { PRAGMA in
69e0: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d 0a  tegrity_check }.
69f0: 7d 20 7b 6f 6b 7d 0a 0a 63 61 74 63 68 20 7b 20  } {ok}..catch { 
6a00: 64 62 20 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68  db close }.catch
6a10: 20 7b 20 64 62 32 20 63 6c 6f 73 65 20 7d 0a 66   { db2 close }.f
6a20: 69 6e 69 73 68 5f 74 65 73 74 0a                 inish_test.