/ Hex Artifact Content
Login

Artifact cdf0ca6cc0447520d19ef1c83287824ebeb3e82d75af856511ba96841a79fc9b:


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 73 6f 75 72 63 65 20  mmon.tcl.source 
0270: 24 74 65 73 74 64 69 72 2f 6d 61 6c 6c 6f 63 5f  $testdir/malloc_
0280: 63 6f 6d 6d 6f 6e 2e 74 63 6c 0a 73 6f 75 72 63  common.tcl.sourc
0290: 65 20 24 74 65 73 74 64 69 72 2f 77 61 6c 5f 63  e $testdir/wal_c
02a0: 6f 6d 6d 6f 6e 2e 74 63 6c 0a 0a 73 65 74 20 74  ommon.tcl..set t
02b0: 65 73 74 70 72 65 66 69 78 20 77 61 6c 0a 0a 69  estprefix wal..i
02c0: 66 63 61 70 61 62 6c 65 20 21 77 61 6c 20 7b 66  fcapable !wal {f
02d0: 69 6e 69 73 68 5f 74 65 73 74 20 3b 20 72 65 74  inish_test ; ret
02e0: 75 72 6e 20 7d 0a 74 65 73 74 5f 73 65 74 5f 63  urn }.test_set_c
02f0: 6f 6e 66 69 67 5f 70 61 67 65 63 61 63 68 65 20  onfig_pagecache 
0300: 30 20 30 0a 0a 70 72 6f 63 20 72 65 6f 70 65 6e  0 0..proc reopen
0310: 5f 64 62 20 7b 7d 20 7b 0a 20 20 63 61 74 63 68  _db {} {.  catch
0320: 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20 20   { db close }.  
0330: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
0340: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  .db test.db-wal 
0350: 74 65 73 74 2e 64 62 2d 77 61 6c 2d 73 75 6d 6d  test.db-wal-summ
0360: 61 72 79 0a 20 20 73 71 6c 69 74 65 33 5f 77 61  ary.  sqlite3_wa
0370: 6c 20 64 62 20 74 65 73 74 2e 64 62 0a 7d 0a 0a  l db test.db.}..
0380: 73 65 74 20 3a 3a 62 6c 6f 62 63 6e 74 20 30 0a  set ::blobcnt 0.
0390: 70 72 6f 63 20 62 6c 6f 62 20 7b 6e 42 79 74 65  proc blob {nByte
03a0: 7d 20 7b 0a 20 20 69 6e 63 72 20 3a 3a 62 6c 6f  } {.  incr ::blo
03b0: 62 63 6e 74 0a 20 20 72 65 74 75 72 6e 20 5b 73  bcnt.  return [s
03c0: 74 72 69 6e 67 20 72 61 6e 67 65 20 5b 73 74 72  tring range [str
03d0: 69 6e 67 20 72 65 70 65 61 74 20 22 24 7b 3a 3a  ing repeat "${::
03e0: 62 6c 6f 62 63 6e 74 7d 78 22 20 24 6e 42 79 74  blobcnt}x" $nByt
03f0: 65 5d 20 31 20 24 6e 42 79 74 65 5d 0a 7d 0a 0a  e] 1 $nByte].}..
0400: 70 72 6f 63 20 73 71 6c 69 74 65 33 5f 77 61 6c  proc sqlite3_wal
0410: 20 7b 61 72 67 73 7d 20 7b 0a 20 20 65 76 61 6c   {args} {.  eval
0420: 20 73 71 6c 69 74 65 33 20 24 61 72 67 73 0a 20   sqlite3 $args. 
0430: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
0440: 5d 20 65 76 61 6c 20 7b 20 50 52 41 47 4d 41 20  ] eval { PRAGMA 
0450: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 20  auto_vacuum = 0 
0460: 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  }.  [lindex $arg
0470: 73 20 30 5d 20 65 76 61 6c 20 7b 20 50 52 41 47  s 0] eval { PRAG
0480: 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20 31  MA page_size = 1
0490: 30 32 34 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20  024 }.  [lindex 
04a0: 24 61 72 67 73 20 30 5d 20 65 76 61 6c 20 7b 20  $args 0] eval { 
04b0: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
04c0: 6f 64 65 20 3d 20 77 61 6c 20 7d 0a 20 20 5b 6c  ode = wal }.  [l
04d0: 69 6e 64 65 78 20 24 61 72 67 73 20 30 5d 20 65  index $args 0] e
04e0: 76 61 6c 20 7b 20 50 52 41 47 4d 41 20 73 79 6e  val { PRAGMA syn
04f0: 63 68 72 6f 6e 6f 75 73 20 3d 20 6e 6f 72 6d 61  chronous = norma
0500: 6c 20 7d 0a 20 20 5b 6c 69 6e 64 65 78 20 24 61  l }.  [lindex $a
0510: 72 67 73 20 30 5d 20 66 75 6e 63 74 69 6f 6e 20  rgs 0] function 
0520: 62 6c 6f 62 20 62 6c 6f 62 0a 7d 0a 0a 70 72 6f  blob blob.}..pro
0530: 63 20 6c 6f 67 5f 64 65 6c 65 74 65 64 20 7b 6c  c log_deleted {l
0540: 6f 67 66 69 6c 65 7d 20 7b 0a 20 20 72 65 74 75  ogfile} {.  retu
0550: 72 6e 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 65  rn [expr [file e
0560: 78 69 73 74 73 20 24 6c 6f 67 66 69 6c 65 5d 3d  xists $logfile]=
0570: 3d 30 5d 0a 7d 0a 0a 23 0a 23 20 54 68 65 73 65  =0].}..#.# These
0580: 20 61 72 65 20 27 77 61 72 6d 2d 62 6f 64 79 27   are 'warm-body'
0590: 20 74 65 73 74 73 20 75 73 65 64 20 77 68 69 6c   tests used whil
05a0: 65 20 64 65 76 65 6c 6f 70 69 6e 67 20 74 68 65  e developing the
05b0: 20 57 41 4c 20 63 6f 64 65 2e 20 54 68 65 79 0a   WAL code. They.
05c0: 23 20 73 65 72 76 65 20 74 6f 20 70 72 6f 76 65  # serve to prove
05d0: 20 74 68 61 74 20 61 20 66 65 77 20 72 65 61 6c   that a few real
05e0: 6c 79 20 73 69 6d 70 6c 65 20 63 61 73 65 73 20  ly simple cases 
05f0: 77 6f 72 6b 3a 0a 23 0a 23 20 77 61 6c 2d 31 2e  work:.#.# wal-1.
0600: 2a 3a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  *: Read and writ
0610: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  e the database..
0620: 23 20 77 61 6c 2d 32 2e 2a 3a 20 54 65 73 74 20  # wal-2.*: Test 
0630: 4d 56 43 43 20 77 69 74 68 20 6f 6e 65 20 72 65  MVCC with one re
0640: 61 64 65 72 2c 20 6f 6e 65 20 77 72 69 74 65 72  ader, one writer
0650: 2e 0a 23 20 77 61 6c 2d 33 2e 2a 3a 20 54 65 73  ..# wal-3.*: Tes
0660: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  t transaction ro
0670: 6c 6c 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 34 2e  llback..# wal-4.
0680: 2a 3a 20 54 65 73 74 20 73 61 76 65 70 6f 69 6e  *: Test savepoin
0690: 74 2f 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c  t/statement roll
06a0: 62 61 63 6b 2e 0a 23 20 77 61 6c 2d 35 2e 2a 3a  back..# wal-5.*:
06b0: 20 54 65 73 74 20 74 68 65 20 74 65 6d 70 20 64   Test the temp d
06c0: 61 74 61 62 61 73 65 2e 0a 23 20 77 61 6c 2d 36  atabase..# wal-6
06d0: 2e 2a 3a 20 54 65 73 74 20 63 72 65 61 74 69 6e  .*: Test creatin
06e0: 67 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68  g databases with
06f0: 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 20   different page 
0700: 73 69 7a 65 73 2e 0a 23 0a 23 0a 23 0a 64 6f 5f  sizes..#.#.#.do_
0710: 74 65 73 74 20 77 61 6c 2d 30 2e 31 20 7b 0a 20  test wal-0.1 {. 
0720: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
0730: 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20  A auto_vacuum = 
0740: 30 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  0 }.  execsql { 
0750: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0760: 75 73 20 3d 20 6e 6f 72 6d 61 6c 20 7d 0a 20 20  us = normal }.  
0770: 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41  execsql { PRAGMA
0780: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20   journal_mode = 
0790: 77 61 6c 20 7d 0a 7d 20 7b 77 61 6c 7d 0a 64 6f  wal }.} {wal}.do
07a0: 5f 74 65 73 74 20 77 61 6c 2d 30 2e 32 20 7b 0a  _test wal-0.2 {.
07b0: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
07c0: 2e 64 62 0a 7d 20 7b 31 30 32 34 7d 0a 0a 64 6f  .db.} {1024}..do
07d0: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 30 20 7b 0a  _test wal-1.0 {.
07e0: 20 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20    execsql { .   
07f0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
0800: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
0810: 29 3b 20 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b  ); .  }.  list [
0820: 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74  file exists test
0830: 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5d 20 5c 0a 20  .db-journal] \. 
0840: 20 20 20 20 20 20 5b 66 69 6c 65 20 65 78 69 73        [file exis
0850: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20  ts test.db-wal] 
0860: 20 20 20 20 5c 0a 20 20 20 20 20 20 20 5b 66 69      \.       [fi
0870: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
0880: 0a 7d 20 7b 30 20 31 20 31 30 32 34 7d 0a 64 6f  .} {0 1 1024}.do
0890: 5f 74 65 73 74 20 77 61 6c 2d 31 2e 31 20 7b 0a  _test wal-1.1 {.
08a0: 20 20 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54    execsql COMMIT
08b0: 0a 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 65 78  .  list [file ex
08c0: 69 73 74 73 20 74 65 73 74 2e 64 62 2d 6a 6f 75  ists test.db-jou
08d0: 72 6e 61 6c 5d 20 5b 66 69 6c 65 20 65 78 69 73  rnal] [file exis
08e0: 74 73 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ts test.db-wal].
08f0: 7d 20 7b 30 20 31 7d 0a 64 6f 5f 74 65 73 74 20  } {0 1}.do_test 
0900: 77 61 6c 2d 31 2e 32 20 7b 0a 20 20 23 20 54 68  wal-1.2 {.  # Th
0910: 65 72 65 20 61 72 65 20 6e 6f 77 20 74 77 6f 20  ere are now two 
0920: 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  pages in the log
0930: 2e 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  ..  file size te
0940: 73 74 2e 64 62 2d 77 61 6c 0a 7d 20 5b 77 61 6c  st.db-wal.} [wal
0950: 5f 66 69 6c 65 5f 73 69 7a 65 20 32 20 31 30 32  _file_size 2 102
0960: 34 5d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]..do_test wal-
0970: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
0980: 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  { SELECT * FROM 
0990: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 0a  sqlite_master }.
09a0: 7d 20 7b 74 61 62 6c 65 20 74 31 20 74 31 20 32  } {table t1 t1 2
09b0: 20 7b 43 52 45 41 54 45 20 54 41 42 4c 45 20 74   {CREATE TABLE t
09c0: 31 28 61 2c 20 62 29 7d 7d 0a 0a 64 6f 5f 74 65  1(a, b)}}..do_te
09d0: 73 74 20 77 61 6c 2d 31 2e 34 20 7b 0a 20 20 65  st wal-1.4 {.  e
09e0: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
09f0: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
0a00: 2c 20 32 29 20 7d 0a 20 20 65 78 65 63 73 71 6c  , 2) }.  execsql
0a10: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
0a20: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 20 7d  1 VALUES(3, 4) }
0a30: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0a40: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0a50: 45 53 28 35 2c 20 36 29 20 7d 0a 20 20 65 78 65  ES(5, 6) }.  exe
0a60: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
0a70: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20  TO t1 VALUES(7, 
0a80: 38 29 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  8) }.  execsql {
0a90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0aa0: 56 41 4c 55 45 53 28 39 2c 20 31 30 29 20 7d 0a  VALUES(9, 10) }.
0ab0: 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61  } {}..do_test wa
0ac0: 6c 2d 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71  l-1.5 {.  execsq
0ad0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
0ae0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
0af0: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0b00: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 31  .do_test wal-2.1
0b10: 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c   {.  sqlite3_wal
0b20: 20 64 62 32 20 2e 2f 74 65 73 74 2e 64 62 0a 20   db2 ./test.db. 
0b30: 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e   execsql { BEGIN
0b40: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
0b50: 74 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20  t1 } db2.} {1 2 
0b60: 33 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30  3 4 5 6 7 8 9 10
0b70: 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  }..do_test wal-2
0b80: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0b90: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0ba0: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d  VALUES(11, 12) }
0bb0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0bc0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0bd0: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0be0: 20 38 20 39 20 31 30 20 31 31 20 31 32 7d 0a 0a   8 9 10 11 12}..
0bf0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 33 20  do_test wal-2.3 
0c00: 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  {.  execsql { SE
0c10: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
0c20: 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20   db2.} {1 2 3 4 
0c30: 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 0a 64  5 6 7 8 9 10}..d
0c40: 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 34 20 7b  o_test wal-2.4 {
0c50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53  .  execsql { INS
0c60: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
0c70: 45 53 28 31 33 2c 20 31 34 29 20 7d 0a 20 20 65  ES(13, 14) }.  e
0c80: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
0c90: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 31  * FROM t1 }.} {1
0ca0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
0cb0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d   10 11 12 13 14}
0cc0: 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e  ..do_test wal-2.
0cd0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  5 {.  execsql { 
0ce0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0cf0: 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 20 33 20   } db2.} {1 2 3 
0d00: 34 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a  4 5 6 7 8 9 10}.
0d10: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 2e 36  .do_test wal-2.6
0d20: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43   {.  execsql { C
0d30: 4f 4d 4d 49 54 3b 20 53 45 4c 45 43 54 20 2a 20  OMMIT; SELECT * 
0d40: 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20  FROM t1 } db2.} 
0d50: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
0d60: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
0d70: 34 7d 0a 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4}..do_test wal-
0d80: 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  3.1 {.  execsql 
0d90: 7b 20 42 45 47 49 4e 3b 20 44 45 4c 45 54 45 20  { BEGIN; DELETE 
0da0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 65 78 65 63  FROM t1 }.  exec
0db0: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
0dc0: 52 4f 4d 20 74 31 20 7d 0a 7d 20 7b 7d 0a 64 6f  ROM t1 }.} {}.do
0dd0: 5f 74 65 73 74 20 77 61 6c 2d 33 2e 32 20 7b 0a  _test wal-3.2 {.
0de0: 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45    execsql { SELE
0df0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 20 64  CT * FROM t1 } d
0e00: 62 32 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20  b2.} {1 2 3 4 5 
0e10: 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32  6 7 8 9 10 11 12
0e20: 20 31 33 20 31 34 7d 0a 64 6f 5f 74 65 73 74 20   13 14}.do_test 
0e30: 77 61 6c 2d 33 2e 33 20 7b 0a 20 20 65 78 65 63  wal-3.3 {.  exec
0e40: 73 71 6c 20 7b 20 52 4f 4c 4c 42 41 43 4b 20 7d  sql { ROLLBACK }
0e50: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  .  execsql { SEL
0e60: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
0e70: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
0e80: 20 38 20 39 20 31 30 20 31 31 20 31 32 20 31 33   8 9 10 11 12 13
0e90: 20 31 34 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a   14}.db2 close..
0ea0: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 65  ----------.# The
0ef0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 73   following tests
0f00: 2c 20 77 61 6c 2d 34 2e 2a 2c 20 74 65 73 74 20  , wal-4.*, test 
0f10: 74 68 61 74 20 73 61 76 65 70 6f 69 6e 74 73 20  that savepoints 
0f20: 77 6f 72 6b 20 77 69 74 68 20 57 41 4c 20 0a 23  work with WAL .#
0f30: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 64 6f   databases..#.do
0f40: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 31 20 7b 0a  _test wal-4.1 {.
0f50: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0f60: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a  DELETE FROM t1;.
0f70: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20      BEGIN;.     
0f80: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
0f90: 56 41 4c 55 45 53 28 27 61 27 2c 20 27 62 27 29  VALUES('a', 'b')
0fa0: 3b 0a 20 20 20 20 20 20 53 41 56 45 50 4f 49 4e  ;.      SAVEPOIN
0fb0: 54 20 73 70 3b 0a 20 20 20 20 20 20 20 20 49 4e  T sp;.        IN
0fc0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
0fd0: 55 45 53 28 27 63 27 2c 20 27 64 27 29 3b 0a 20  UES('c', 'd');. 
0fe0: 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20         SELECT * 
0ff0: 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b  FROM t1;.  }.} {
1000: 61 20 62 20 63 20 64 7d 0a 64 6f 5f 74 65 73 74  a b c d}.do_test
1010: 20 77 61 6c 2d 34 2e 32 20 7b 0a 20 20 65 78 65   wal-4.2 {.  exe
1020: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 52 4f 4c  csql {.      ROL
1030: 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
1040: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1050: 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d   t1;.  }.} {a b}
1060: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 33  .do_test wal-4.3
1070: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
1080: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 53     COMMIT;.    S
1090: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
10a0: 0a 20 20 7d 0a 7d 20 7b 61 20 62 7d 0a 0a 64 6f  .  }.} {a b}..do
10b0: 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e 31 20  _test wal-4.4.1 
10c0: 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 73  {.  db close.  s
10d0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
10e0: 62 0a 20 20 64 62 20 66 75 6e 63 20 62 6c 6f 62  b.  db func blob
10f0: 20 62 6c 6f 62 0a 20 20 6c 69 73 74 20 5b 65 78   blob.  list [ex
1100: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
1110: 20 46 52 4f 4d 20 74 31 20 7d 5d 20 5b 66 69 6c   FROM t1 }] [fil
1120: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77  e size test.db-w
1130: 61 6c 5d 0a 7d 20 7b 7b 61 20 62 7d 20 30 7d 0a  al].} {{a b} 0}.
1140: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
1150: 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  2 {.  execsql { 
1160: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1170: 65 20 3d 20 31 30 20 7d 0a 20 20 65 78 65 63 73  e = 10 }.  execs
1180: 71 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20  ql {.    CREATE 
1190: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
11a0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
11b0: 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34  t2 VALUES(blob(4
11c0: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b  00), blob(400));
11d0: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74  .    SAVEPOINT t
11e0: 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  r;.      INSERT 
11f0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
1200: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
1210: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
1220: 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   2 */.      INSE
1230: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
1240: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1250: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
1260: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
1270: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1280: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1290: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
12a0: 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20  2; /*  8 */.    
12b0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
12c0: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
12d0: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
12e0: 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20  M t2; /* 16 */. 
12f0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
1300: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
1310: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
1320: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a  FROM t2; /* 32 *
1330: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
1340: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
1350: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1360: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20  0) FROM t1; /*  
1370: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
1380: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1390: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
13a0: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
13b0: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
13c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
13d0: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
13e0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
13f0: 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20  ; /*  8 */.     
1400: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1410: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1420: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1430: 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20   t1; /* 16 */.  
1440: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1450: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
1460: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1470: 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f  ROM t1; /* 32 */
1480: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
1490: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a  unt(*) FROM t2;.
14a0: 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65    }.} {32}.do_te
14b0: 73 74 20 77 61 6c 2d 34 2e 34 2e 33 20 7b 0a 20  st wal-4.4.3 {. 
14c0: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
14d0: 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d  ACK TO tr }.} {}
14e0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34  .do_test wal-4.4
14f0: 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69  .4 {.  set logsi
1500: 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  ze [file size te
1510: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65  st.db-wal].  exe
1520: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
1530: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1540: 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20  ES('x', 'y');.  
1550: 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20    RELEASE tr;.  
1560: 7d 0a 20 20 65 78 70 72 20 7b 20 24 6c 6f 67 73  }.  expr { $logs
1570: 69 7a 65 20 3d 3d 20 5b 66 69 6c 65 20 73 69 7a  ize == [file siz
1580: 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 20 7d  e test.db-wal] }
1590: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
15a0: 61 6c 2d 34 2e 34 2e 35 20 7b 0a 20 20 65 78 65  al-4.4.5 {.  exe
15b0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63 6f  csql { SELECT co
15c0: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20 7d  unt(*) FROM t2 }
15d0: 0a 7d 20 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 77  .} {1}.do_test w
15e0: 61 6c 2d 34 2e 34 2e 36 20 7b 0a 20 20 66 6f 72  al-4.4.6 {.  for
15f0: 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74  cecopy test.db t
1600: 65 73 74 32 2e 64 62 0a 20 20 66 6f 72 63 65 63  est2.db.  forcec
1610: 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  opy test.db-wal 
1620: 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20 20 73  test2.db-wal.  s
1630: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 32  qlite3 db2 test2
1640: 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  .db.  execsql { 
1650: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1660: 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c 45 43 54  FROM t2 ; SELECT
1670: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
1680: 31 20 7d 20 64 62 32 0a 7d 20 7b 31 20 32 7d 0a  1 } db2.} {1 2}.
1690: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 34 2e  do_test wal-4.4.
16a0: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
16b0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
16c0: 5f 63 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b  _check } db2.} {
16d0: 6f 6b 7d 0a 64 62 32 20 63 6c 6f 73 65 0a 0a 64  ok}.db2 close..d
16e0: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 31  o_test wal-4.5.1
16f0: 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20   {.  reopen_db. 
1700: 20 64 62 20 66 75 6e 63 20 62 6c 6f 62 20 62 6c   db func blob bl
1710: 6f 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20  ob.  execsql {. 
1720: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
1730: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
1740: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
1750: 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53  1(a, b);.    INS
1760: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1770: 45 53 28 27 61 27 2c 20 27 62 27 29 3b 0a 20 20  ES('a', 'b');.  
1780: 7d 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  }.  sqlite3 db t
1790: 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63  est.db.  db func
17a0: 20 62 6c 6f 62 20 62 6c 6f 62 0a 20 20 6c 69 73   blob blob.  lis
17b0: 74 20 5b 65 78 65 63 73 71 6c 20 7b 20 53 45 4c  t [execsql { SEL
17c0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 5d  ECT * FROM t1 }]
17d0: 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74   [file size test
17e0: 2e 64 62 2d 77 61 6c 5d 0a 7d 20 7b 7b 61 20 62  .db-wal].} {{a b
17f0: 7d 20 30 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c  } 0}.do_test wal
1800: 2d 34 2e 35 2e 32 20 7b 0a 20 20 65 78 65 63 73  -4.5.2 {.  execs
1810: 71 6c 20 7b 20 50 52 41 47 4d 41 20 63 61 63 68  ql { PRAGMA cach
1820: 65 5f 73 69 7a 65 20 3d 20 31 30 20 7d 0a 20 20  e_size = 10 }.  
1830: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
1840: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 61 2c  EATE TABLE t2(a,
1850: 20 62 29 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a   b);.    BEGIN;.
1860: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1870: 74 32 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 34  t2 VALUES(blob(4
1880: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 29 3b  00), blob(400));
1890: 0a 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 74  .    SAVEPOINT t
18a0: 72 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  r;.      INSERT 
18b0: 49 4e 54 4f 20 74 32 20 53 45 4c 45 43 54 20 62  INTO t2 SELECT b
18c0: 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34  lob(400), blob(4
18d0: 30 30 29 20 46 52 4f 4d 20 74 32 3b 20 2f 2a 20  00) FROM t2; /* 
18e0: 20 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45   2 */.      INSE
18f0: 52 54 20 49 4e 54 4f 20 74 32 20 53 45 4c 45 43  RT INTO t2 SELEC
1900: 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f  T blob(400), blo
1910: 62 28 34 30 30 29 20 46 52 4f 4d 20 74 32 3b 20  b(400) FROM t2; 
1920: 2f 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49  /*  4 */.      I
1930: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 53 45  NSERT INTO t2 SE
1940: 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20  LECT blob(400), 
1950: 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74  blob(400) FROM t
1960: 32 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20  2; /*  8 */.    
1970: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 32    INSERT INTO t2
1980: 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30   SELECT blob(400
1990: 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f  ), blob(400) FRO
19a0: 4d 20 74 32 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20  M t2; /* 16 */. 
19b0: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
19c0: 20 74 32 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t2 SELECT blob(
19d0: 34 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20  400), blob(400) 
19e0: 46 52 4f 4d 20 74 32 3b 20 2f 2a 20 33 32 20 2a  FROM t2; /* 32 *
19f0: 2f 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49  /.      INSERT I
1a00: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
1a10: 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62 28 34 30  ob(400), blob(40
1a20: 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f 2a 20 20  0) FROM t1; /*  
1a30: 32 20 2a 2f 0a 20 20 20 20 20 20 49 4e 53 45 52  2 */.      INSER
1a40: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
1a50: 20 62 6c 6f 62 28 34 30 30 29 2c 20 62 6c 6f 62   blob(400), blob
1a60: 28 34 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 2f  (400) FROM t1; /
1a70: 2a 20 20 34 20 2a 2f 0a 20 20 20 20 20 20 49 4e  *  4 */.      IN
1a80: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1a90: 45 43 54 20 62 6c 6f 62 28 34 30 30 29 2c 20 62  ECT blob(400), b
1aa0: 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d 20 74 31  lob(400) FROM t1
1ab0: 3b 20 2f 2a 20 20 38 20 2a 2f 0a 20 20 20 20 20  ; /*  8 */.     
1ac0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
1ad0: 53 45 4c 45 43 54 20 62 6c 6f 62 28 34 30 30 29  SELECT blob(400)
1ae0: 2c 20 62 6c 6f 62 28 34 30 30 29 20 46 52 4f 4d  , blob(400) FROM
1af0: 20 74 31 3b 20 2f 2a 20 31 36 20 2a 2f 0a 20 20   t1; /* 16 */.  
1b00: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1b10: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 34  t1 SELECT blob(4
1b20: 30 30 29 2c 20 62 6c 6f 62 28 34 30 30 29 20 46  00), blob(400) F
1b30: 52 4f 4d 20 74 31 3b 20 2f 2a 20 33 32 20 2a 2f  ROM t1; /* 32 */
1b40: 0a 20 20 20 20 20 20 53 45 4c 45 43 54 20 63 6f  .      SELECT co
1b50: 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 3b 0a  unt(*) FROM t2;.
1b60: 20 20 7d 0a 7d 20 7b 33 32 7d 0a 64 6f 5f 74 65    }.} {32}.do_te
1b70: 73 74 20 77 61 6c 2d 34 2e 35 2e 33 20 7b 0a 20  st wal-4.5.3 {. 
1b80: 20 65 78 65 63 73 71 6c 20 7b 20 52 4f 4c 4c 42   execsql { ROLLB
1b90: 41 43 4b 20 54 4f 20 74 72 20 7d 0a 7d 20 7b 7d  ACK TO tr }.} {}
1ba0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35  .do_test wal-4.5
1bb0: 2e 34 20 7b 0a 20 20 73 65 74 20 6c 6f 67 73 69  .4 {.  set logsi
1bc0: 7a 65 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  ze [file size te
1bd0: 73 74 2e 64 62 2d 77 61 6c 5d 0a 20 20 65 78 65  st.db-wal].  exe
1be0: 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 49 4e 53  csql {.      INS
1bf0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
1c00: 45 53 28 27 78 27 2c 20 27 79 27 29 3b 0a 20 20  ES('x', 'y');.  
1c10: 20 20 52 45 4c 45 41 53 45 20 74 72 3b 0a 20 20    RELEASE tr;.  
1c20: 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20 20    COMMIT;.  }.  
1c30: 65 78 70 72 20 7b 20 24 6c 6f 67 73 69 7a 65 20  expr { $logsize 
1c40: 3d 3d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  == [file size te
1c50: 73 74 2e 64 62 2d 77 61 6c 5d 20 7d 0a 7d 20 7b  st.db-wal] }.} {
1c60: 31 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 34  1}.do_test wal-4
1c70: 2e 35 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  .5.5 {.  execsql
1c80: 20 7b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28   { SELECT count(
1c90: 2a 29 20 46 52 4f 4d 20 74 32 20 3b 20 53 45 4c  *) FROM t2 ; SEL
1ca0: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1cb0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64  M t1 }.} {1 2}.d
1cc0: 6f 5f 74 65 73 74 20 77 61 6c 2d 34 2e 35 2e 36  o_test wal-4.5.6
1cd0: 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74   {.  forcecopy t
1ce0: 65 73 74 2e 64 62 20 74 65 73 74 32 2e 64 62 0a  est.db test2.db.
1cf0: 20 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74    forcecopy test
1d00: 2e 64 62 2d 77 61 6c 20 74 65 73 74 32 2e 64 62  .db-wal test2.db
1d10: 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64  -wal.  sqlite3 d
1d20: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78  b2 test2.db.  ex
1d30: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 63  ecsql { SELECT c
1d40: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 32 20  ount(*) FROM t2 
1d50: 3b 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a  ; SELECT count(*
1d60: 29 20 46 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a  ) FROM t1 } db2.
1d70: 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74 65 73 74 20  } {1 2}.do_test 
1d80: 77 61 6c 2d 34 2e 35 2e 37 20 7b 0a 20 20 65 78  wal-4.5.7 {.  ex
1d90: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 69  ecsql { PRAGMA i
1da0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
1db0: 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64 62 32 20   db2.} {ok}.db2 
1dc0: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
1dd0: 61 6c 2d 34 2e 36 2e 31 20 7b 0a 20 20 65 78 65  al-4.6.1 {.  exe
1de0: 63 73 71 6c 20 7b 0a 20 20 20 20 44 45 4c 45 54  csql {.    DELET
1df0: 45 20 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 50  E FROM t2;.    P
1e00: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
1e10: 6f 69 6e 74 3b 0a 20 20 20 20 42 45 47 49 4e 3b  oint;.    BEGIN;
1e20: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
1e30: 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27 77 27  TO t2 VALUES('w'
1e40: 2c 20 27 78 27 29 3b 0a 20 20 20 20 20 20 53 41  , 'x');.      SA
1e50: 56 45 50 4f 49 4e 54 20 73 61 76 65 3b 0a 20 20  VEPOINT save;.  
1e60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
1e70: 4f 20 74 32 20 56 41 4c 55 45 53 28 27 79 27 2c  O t2 VALUES('y',
1e80: 20 27 7a 27 29 3b 0a 20 20 20 20 20 20 52 4f 4c   'z');.      ROL
1e90: 4c 42 41 43 4b 20 54 4f 20 73 61 76 65 3b 0a 20  LBACK TO save;. 
1ea0: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a 20     COMMIT;.  }. 
1eb0: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
1ec0: 54 20 2a 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20  T * FROM t2 }.} 
1ed0: 7b 77 20 78 7d 0a 0a 0a 72 65 6f 70 65 6e 5f 64  {w x}...reopen_d
1ee0: 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 35 2e  b.do_test wal-5.
1ef0: 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  1 {.  execsql {.
1f00: 20 20 20 20 43 52 45 41 54 45 20 54 45 4d 50 20      CREATE TEMP 
1f10: 54 41 42 4c 45 20 74 32 28 61 2c 20 62 29 3b 0a  TABLE t2(a, b);.
1f20: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
1f30: 74 32 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b  t2 VALUES(1, 2);
1f40: 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73  .  }.} {}.do_tes
1f50: 74 20 77 61 6c 2d 35 2e 32 20 7b 0a 20 20 65 78  t wal-5.2 {.  ex
1f60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
1f70: 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20  N;.      INSERT 
1f80: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 33  INTO t2 VALUES(3
1f90: 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 45 4c 45  , 4);.      SELE
1fa0: 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a 20 20  CT * FROM t2;.  
1fb0: 7d 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f  }.} {1 2 3 4}.do
1fc0: 5f 74 65 73 74 20 77 61 6c 2d 35 2e 33 20 7b 0a  _test wal-5.3 {.
1fd0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1fe0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45  ROLLBACK;.    SE
1ff0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 3b 0a  LECT * FROM t2;.
2000: 20 20 7d 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74    }.} {1 2}.do_t
2010: 65 73 74 20 77 61 6c 2d 35 2e 34 20 7b 0a 20 20  est wal-5.4 {.  
2020: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
2030: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
2040: 74 33 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20  t3(x UNIQUE);.  
2050: 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20 49    BEGIN;.      I
2060: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
2070: 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20 20 20 20  LUES(3, 4);.    
2080: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33    INSERT INTO t3
2090: 20 56 41 4c 55 45 53 28 27 61 62 63 27 29 3b 0a   VALUES('abc');.
20a0: 20 20 7d 0a 20 20 63 61 74 63 68 73 71 6c 20 7b    }.  catchsql {
20b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 33 20   INSERT INTO t3 
20c0: 56 41 4c 55 45 53 28 27 61 62 63 27 29 20 7d 0a  VALUES('abc') }.
20d0: 7d 20 7b 31 20 7b 55 4e 49 51 55 45 20 63 6f 6e  } {1 {UNIQUE con
20e0: 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 3a 20  straint failed: 
20f0: 74 33 2e 78 7d 7d 0a 64 6f 5f 74 65 73 74 20 77  t3.x}}.do_test w
2100: 61 6c 2d 35 2e 35 20 7b 0a 20 20 65 78 65 63 73  al-5.5 {.  execs
2110: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
2120: 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  .    SELECT * FR
2130: 4f 4d 20 74 32 3b 0a 20 20 7d 0a 7d 20 7b 31 20  OM t2;.  }.} {1 
2140: 32 20 33 20 34 7d 0a 64 62 20 63 6c 6f 73 65 0a  2 3 4}.db close.
2150: 0a 66 6f 72 65 61 63 68 20 73 65 63 74 6f 72 20  .foreach sector 
2160: 7b 35 31 32 20 34 30 39 36 7d 20 7b 0a 20 20 73  {512 4096} {.  s
2170: 71 6c 69 74 65 33 5f 73 69 6d 75 6c 61 74 65 5f  qlite3_simulate_
2180: 64 65 76 69 63 65 20 2d 73 65 63 74 6f 72 73 69  device -sectorsi
2190: 7a 65 20 24 73 65 63 74 6f 72 0a 20 20 66 6f 72  ze $sector.  for
21a0: 65 61 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31  each pgsz {512 1
21b0: 30 32 34 20 32 30 34 38 20 34 30 39 36 7d 20 7b  024 2048 4096} {
21c0: 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .    forcedelete
21d0: 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62   test.db test.db
21e0: 2d 77 61 6c 0a 20 20 20 20 64 6f 5f 74 65 73 74  -wal.    do_test
21f0: 20 77 61 6c 2d 36 2e 24 73 65 63 74 6f 72 2e 24   wal-6.$sector.$
2200: 70 67 73 7a 2e 31 20 7b 0a 20 20 20 20 20 20 73  pgsz.1 {.      s
2210: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
2220: 62 20 2d 76 66 73 20 64 65 76 73 79 6d 0a 20 20  b -vfs devsym.  
2230: 20 20 20 20 65 78 65 63 73 71 6c 20 22 0a 20 20      execsql ".  
2240: 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61 67        PRAGMA pag
2250: 65 5f 73 69 7a 65 20 3d 20 24 70 67 73 7a 3b 0a  e_size = $pgsz;.
2260: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 61          PRAGMA a
2270: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a  uto_vacuum = 0;.
2280: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a          PRAGMA j
2290: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 77 61  ournal_mode = wa
22a0: 6c 3b 0a 20 20 20 20 20 20 22 0a 20 20 20 20 20  l;.      ".     
22b0: 20 65 78 65 63 73 71 6c 20 22 0a 20 20 20 20 20   execsql ".     
22c0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
22d0: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
22e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
22f0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
2300: 20 20 20 20 20 22 0a 20 20 20 20 20 20 64 62 20       ".      db 
2310: 63 6c 6f 73 65 0a 20 20 20 20 20 20 66 69 6c 65  close.      file
2320: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 20 20   size test.db.  
2330: 20 20 7d 20 5b 65 78 70 72 20 24 70 67 73 7a 2a    } [expr $pgsz*
2340: 32 5d 0a 20 20 0a 20 20 20 20 64 6f 5f 74 65 73  2].  .    do_tes
2350: 74 20 77 61 6c 2d 36 2e 24 73 65 63 74 6f 72 2e  t wal-6.$sector.
2360: 24 70 67 73 7a 2e 32 20 7b 0a 20 20 20 20 20 20  $pgsz.2 {.      
2370: 6c 6f 67 5f 64 65 6c 65 74 65 64 20 74 65 73 74  log_deleted test
2380: 2e 64 62 2d 77 61 6c 0a 20 20 20 20 7d 20 7b 31  .db-wal.    } {1
2390: 7d 0a 20 20 7d 0a 7d 0a 0a 64 6f 5f 74 65 73 74  }.  }.}..do_test
23a0: 20 77 61 6c 2d 37 2e 31 20 7b 0a 20 20 66 6f 72   wal-7.1 {.  for
23b0: 63 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62  cedelete test.db
23c0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 73   test.db-wal.  s
23d0: 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 20 74 65  qlite3_wal db te
23e0: 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20  st.db.  execsql 
23f0: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67  {.    PRAGMA pag
2400: 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20  e_size = 1024;. 
2410: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
2420: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 49 4e  t1(a, b);.    IN
2430: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
2440: 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 7d 0a 20  UES(1, 2);.  }. 
2450: 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65   list [file size
2460: 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20   test.db] [file 
2470: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
2480: 5d 0a 7d 20 5b 6c 69 73 74 20 31 30 32 34 20 5b  ].} [list 1024 [
2490: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20  wal_file_size 3 
24a0: 31 30 32 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77  1024]].do_test w
24b0: 61 6c 2d 37 2e 32 20 7b 0a 20 20 65 78 65 63 73  al-7.2 {.  execs
24c0: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
24d0: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 6c  checkpoint }.  l
24e0: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
24f0: 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69  est.db] [file si
2500: 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a  ze test.db-wal].
2510: 7d 20 5b 6c 69 73 74 20 32 30 34 38 20 5b 77 61  } [list 2048 [wa
2520: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30  l_file_size 3 10
2530: 32 34 5d 5d 0a 0a 23 20 45 78 65 63 75 74 65 20  24]]..# Execute 
2540: 73 6f 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  some transaction
2550: 73 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s in auto-vacuum
2560: 20 6d 6f 64 65 20 74 6f 20 74 65 73 74 20 64 61   mode to test da
2570: 74 61 62 61 73 65 20 66 69 6c 65 0a 23 20 74 72  tabase file.# tr
2580: 75 6e 63 61 74 69 6f 6e 2e 0a 23 0a 64 6f 5f 74  uncation..#.do_t
2590: 65 73 74 20 77 61 6c 2d 38 2e 31 20 7b 0a 20 20  est wal-8.1 {.  
25a0: 72 65 6f 70 65 6e 5f 64 62 0a 20 20 63 61 74 63  reopen_db.  catc
25b0: 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a 20  h { db close }. 
25c0: 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73   forcedelete tes
25d0: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
25e0: 0a 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20 74  ..  sqlite3 db t
25f0: 65 73 74 2e 64 62 0a 20 20 64 62 20 66 75 6e 63  est.db.  db func
2600: 74 69 6f 6e 20 62 6c 6f 62 20 62 6c 6f 62 0a 20  tion blob blob. 
2610: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
2620: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
2630: 6d 20 3d 20 31 3b 0a 20 20 20 20 50 52 41 47 4d  m = 1;.    PRAGM
2640: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d  A journal_mode =
2650: 20 77 61 6c 3b 0a 20 20 20 20 50 52 41 47 4d 41   wal;.    PRAGMA
2660: 20 61 75 74 6f 5f 76 61 63 75 75 6d 3b 0a 20 20   auto_vacuum;.  
2670: 7d 0a 7d 20 7b 77 61 6c 20 31 7d 0a 64 6f 5f 74  }.} {wal 1}.do_t
2680: 65 73 74 20 77 61 6c 2d 38 2e 32 20 7b 0a 20 20  est wal-8.2 {.  
2690: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
26a0: 41 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d  AGMA page_size =
26b0: 20 31 30 32 34 3b 0a 20 20 20 20 43 52 45 41 54   1024;.    CREAT
26c0: 45 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20  E TABLE t1(x);. 
26d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
26e0: 31 20 56 41 4c 55 45 53 28 62 6c 6f 62 28 39 30  1 VALUES(blob(90
26f0: 30 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  0));.    INSERT 
2700: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 62  INTO t1 VALUES(b
2710: 6c 6f 62 28 39 30 30 29 29 3b 0a 20 20 20 20 49  lob(900));.    I
2720: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2730: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
2740: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
2750: 20 20 34 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52    4 */.    INSER
2760: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
2770: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
2780: 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 20 38 20  t1;       /*  8 
2790: 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  */.    INSERT IN
27a0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
27b0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
27c0: 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20        /* 16 */. 
27d0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
27e0: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
27f0: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
2800: 20 20 2f 2a 20 33 32 20 2a 2f 0a 20 20 20 20 49    /* 32 */.    I
2810: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45  NSERT INTO t1 SE
2820: 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46  LECT blob(900) F
2830: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
2840: 20 36 34 20 2a 2f 0a 20 20 20 20 50 52 41 47 4d   64 */.    PRAGM
2850: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
2860: 3b 0a 20 20 7d 0a 20 20 66 69 6c 65 20 73 69 7a  ;.  }.  file siz
2870: 65 20 74 65 73 74 2e 64 62 0a 7d 20 5b 65 78 70  e test.db.} [exp
2880: 72 20 36 38 2a 31 30 32 34 5d 0a 64 6f 5f 74 65  r 68*1024].do_te
2890: 73 74 20 77 61 6c 2d 38 2e 33 20 7b 0a 20 20 65  st wal-8.3 {.  e
28a0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 44 45  xecsql { .    DE
28b0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45  LETE FROM t1 WHE
28c0: 52 45 20 72 6f 77 69 64 3c 35 34 3b 0a 20 20 20  RE rowid<54;.   
28d0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
28e0: 6b 70 6f 69 6e 74 3b 0a 20 20 7d 0a 20 20 66 69  kpoint;.  }.  fi
28f0: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a  le size test.db.
2900: 7d 20 5b 65 78 70 72 20 31 34 2a 31 30 32 34 5d  } [expr 14*1024]
2910: 0a 0a 23 20 52 75 6e 20 73 6f 6d 65 20 22 77 61  ..# Run some "wa
2920: 72 6d 2d 62 6f 64 79 22 20 74 65 73 74 73 20 74  rm-body" tests t
2930: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 6c 6f  o ensure that lo
2940: 67 2d 73 75 6d 6d 61 72 79 20 66 69 6c 65 73 20  g-summary files 
2950: 77 69 74 68 20 6d 6f 72 65 0a 23 20 74 68 61 6e  with more.# than
2960: 20 32 35 36 20 65 6e 74 72 69 65 73 20 28 6c 6f   256 entries (lo
2970: 67 20 73 75 6d 6d 61 72 69 65 73 20 74 68 61 74  g summaries that
2980: 20 63 6f 6e 74 61 69 6e 20 69 6e 64 65 78 20 62   contain index b
2990: 6c 6f 63 6b 73 29 20 77 6f 72 6b 20 4f 6b 2e 0a  locks) work Ok..
29a0: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 39 2e  #.do_test wal-9.
29b0: 31 20 7b 0a 20 20 72 65 6f 70 65 6e 5f 64 62 0a  1 {.  reopen_db.
29c0: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
29d0: 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
29e0: 65 3d 32 30 30 30 3b 0a 20 20 20 20 43 52 45 41  e=2000;.    CREA
29f0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 50 52  TE TABLE t1(x PR
2a00: 49 4d 41 52 59 20 4b 45 59 29 3b 0a 20 20 20 20  IMARY KEY);.    
2a10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
2a20: 41 4c 55 45 53 28 62 6c 6f 62 28 39 30 30 29 29  ALUES(blob(900))
2a30: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
2a40: 4f 20 74 31 20 56 41 4c 55 45 53 28 62 6c 6f 62  O t1 VALUES(blob
2a50: 28 39 30 30 29 29 3b 0a 20 20 20 20 49 4e 53 45  (900));.    INSE
2a60: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2a70: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
2a80: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 20 34   t1;       /*  4
2a90: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
2aa0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
2ab0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
2ac0: 20 20 20 20 20 20 20 2f 2a 20 20 38 20 2a 2f 0a         /*  8 */.
2ad0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2ae0: 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39  t1 SELECT blob(9
2af0: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
2b00: 20 20 20 2f 2a 20 31 36 20 2a 2f 0a 20 20 20 20     /* 16 */.    
2b10: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
2b20: 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29 20  ELECT blob(900) 
2b30: 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f  FROM t1;       /
2b40: 2a 20 33 32 20 2a 2f 0a 20 20 20 20 49 4e 53 45  * 32 */.    INSE
2b50: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
2b60: 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d  T blob(900) FROM
2b70: 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20 36 34   t1;       /* 64
2b80: 20 2a 2f 0a 20 20 20 20 49 4e 53 45 52 54 20 49   */.    INSERT I
2b90: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c  NTO t1 SELECT bl
2ba0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
2bb0: 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20 2a 2f         /* 128 */
2bc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
2bd0: 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28   t1 SELECT blob(
2be0: 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20  900) FROM t1;   
2bf0: 20 20 20 20 2f 2a 20 32 35 36 20 2a 2f 0a 20 20      /* 256 */.  
2c00: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
2c10: 73 74 2e 64 62 0a 7d 20 31 30 32 34 0a 64 6f 5f  st.db.} 1024.do_
2c20: 74 65 73 74 20 77 61 6c 2d 39 2e 32 20 7b 0a 20  test wal-9.2 {. 
2c30: 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64 62 32   sqlite3_wal db2
2c40: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
2c50: 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67  ql {PRAGMA integ
2c60: 72 69 74 79 5f 63 68 65 63 6b 20 7d 20 64 62 32  rity_check } db2
2c70: 0a 7d 20 7b 6f 6b 7d 0a 0a 64 6f 5f 74 65 73 74  .} {ok}..do_test
2c80: 20 77 61 6c 2d 39 2e 33 20 7b 0a 20 20 66 6f 72   wal-9.3 {.  for
2c90: 63 65 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64  cedelete test2.d
2ca0: 62 20 74 65 73 74 32 2e 64 62 2d 77 61 6c 0a 20  b test2.db-wal. 
2cb0: 20 63 6f 70 79 5f 66 69 6c 65 20 74 65 73 74 2e   copy_file test.
2cc0: 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 63 6f  db test2.db.  co
2cd0: 70 79 5f 66 69 6c 65 20 74 65 73 74 2e 64 62 2d  py_file test.db-
2ce0: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
2cf0: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
2d00: 62 33 20 74 65 73 74 32 2e 64 62 20 0a 20 20 65  b3 test2.db .  e
2d10: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69  xecsql {PRAGMA i
2d20: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
2d30: 20 64 62 33 0a 7d 20 7b 6f 6b 7d 0a 64 62 33 20   db3.} {ok}.db3 
2d40: 63 6c 6f 73 65 0a 0a 64 6f 5f 74 65 73 74 20 77  close..do_test w
2d50: 61 6c 2d 39 2e 34 20 7b 0a 20 20 65 78 65 63 73  al-9.4 {.  execs
2d60: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
2d70: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 64  checkpoint }.  d
2d80: 62 32 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69 74  b2 close.  sqlit
2d90: 65 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 2e  e3_wal db2 test.
2da0: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52  db.  execsql {PR
2db0: 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63  AGMA integrity_c
2dc0: 68 65 63 6b 20 7d 20 64 62 32 0a 7d 20 7b 6f 6b  heck } db2.} {ok
2dd0: 7d 0a 0a 66 6f 72 65 61 63 68 20 68 61 6e 64 6c  }..foreach handl
2de0: 65 20 7b 64 62 20 64 62 32 20 64 62 33 7d 20 7b  e {db db2 db3} {
2df0: 20 63 61 74 63 68 20 7b 20 24 68 61 6e 64 6c 65   catch { $handle
2e00: 20 63 6c 6f 73 65 20 7d 20 7d 0a 75 6e 73 65 74   close } }.unset
2e10: 20 68 61 6e 64 6c 65 0a 0a 23 2d 2d 2d 2d 2d 2d   handle..#------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77  ---.# The follow
2e70: 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73  ing block of tes
2e80: 74 73 20 2d 20 77 61 6c 2d 31 30 2e 2a 20 2d 20  ts - wal-10.* - 
2e90: 74 65 73 74 20 74 68 61 74 20 74 68 65 20 57 41  test that the WA
2ea0: 4c 20 6c 6f 63 6b 69 6e 67 20 0a 23 20 73 63 68  L locking .# sch
2eb0: 65 6d 65 20 77 6f 72 6b 73 20 69 6e 20 73 69 6d  eme works in sim
2ec0: 70 6c 65 20 63 61 73 65 73 2e 20 54 68 69 73 20  ple cases. This 
2ed0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 69  block of tests i
2ee0: 73 20 72 75 6e 20 74 77 69 63 65 2e 20 4f 6e 63  s run twice. Onc
2ef0: 65 0a 23 20 75 73 69 6e 67 20 6d 75 6c 74 69 70  e.# using multip
2f00: 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 69  le connections i
2f10: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 73 70  n the address sp
2f20: 61 63 65 20 6f 66 20 74 68 65 20 63 75 72 72 65  ace of the curre
2f30: 6e 74 20 70 72 6f 63 65 73 73 2c 0a 23 20 61 6e  nt process,.# an
2f40: 64 20 6f 6e 63 65 20 77 69 74 68 20 61 6c 6c 20  d once with all 
2f50: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 65 78 63 65  connections exce
2f60: 70 74 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  pt one running i
2f70: 6e 20 65 78 74 65 72 6e 61 6c 20 70 72 6f 63 65  n external proce
2f80: 73 73 65 73 2e 0a 23 0a 64 6f 5f 6d 75 6c 74 69  sses..#.do_multi
2f90: 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 7b  client_test tn {
2fa0: 0a 0a 20 20 23 20 49 6e 69 74 69 61 6c 69 7a 65  ..  # Initialize
2fb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
2fc0: 68 65 6d 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74  hema and content
2fd0: 73 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  s..  #.  do_test
2fe0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 20 7b 0a   wal-10.$tn.1 {.
2ff0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
3000: 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f 5f      PRAGMA auto_
3010: 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20  vacuum = 0;.    
3020: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
3030: 5f 6d 6f 64 65 20 3d 20 77 61 6c 3b 0a 20 20 20  _mode = wal;.   
3040: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
3050: 74 31 28 61 2c 20 62 29 3b 0a 20 20 20 20 20 20  t1(a, b);.      
3060: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
3070: 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20 20 20  ALUES(1, 2);.   
3080: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
3090: 20 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b   t1;.    }.  } {
30a0: 77 61 6c 20 31 20 32 7d 0a 0a 20 20 23 20 4f 70  wal 1 2}..  # Op
30b0: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
30c0: 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 74 68   and write to th
30d0: 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
30e0: 20 5b 64 62 5d 2e 20 43 68 65 63 6b 20 74 68 61   [db]. Check tha
30f0: 74 20 5b 64 62 32 5d 0a 20 20 23 20 69 73 20 73  t [db2].  # is s
3100: 74 69 6c 6c 20 61 62 6c 65 20 74 6f 20 72 65 61  till able to rea
3110: 64 20 74 68 65 20 73 6e 61 70 73 68 6f 74 20 62  d the snapshot b
3120: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
3130: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
3140: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
3150: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 20 7b 0a 20  wal-10.$tn.2 {. 
3160: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 42 45 47     execsql { BEG
3170: 49 4e 3b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  IN; INSERT INTO 
3180: 74 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b  t1 VALUES(3, 4);
3190: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c   }.    sql2 {SEL
31a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
31b0: 20 7d 20 7b 31 20 32 7d 0a 0a 20 20 23 20 48 61   } {1 2}..  # Ha
31c0: 76 65 20 5b 64 62 5d 20 63 6f 6d 6d 69 74 20 74  ve [db] commit t
31d0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
31e0: 43 68 65 63 6b 20 74 68 61 74 20 5b 64 62 32 5d  Check that [db2]
31f0: 20 69 73 20 6e 6f 77 20 73 65 65 69 6e 67 20 74   is now seeing t
3200: 68 65 20 0a 20 20 23 20 6e 65 77 2c 20 75 70 64  he .  # new, upd
3210: 61 74 65 64 20 73 6e 61 70 73 68 6f 74 2e 0a 20  ated snapshot.. 
3220: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
3230: 2d 31 30 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20  -10.$tn.3 {.    
3240: 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  execsql { COMMIT
3250: 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c   }.    sql2 {SEL
3260: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20  ECT * FROM t1}. 
3270: 20 7d 20 7b 31 20 32 20 33 20 34 7d 0a 0a 20 20   } {1 2 3 4}..  
3280: 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65  # Have [db2] ope
3290: 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61 63  n a read transac
32a0: 74 69 6f 6e 2e 20 54 68 65 6e 20 77 72 69 74 65  tion. Then write
32b0: 20 74 6f 20 74 68 65 20 64 62 20 76 69 61 20 5b   to the db via [
32c0: 64 62 5d 2e 20 43 68 65 63 6b 0a 20 20 23 20 74  db]. Check.  # t
32d0: 68 61 74 20 5b 64 62 32 5d 20 69 73 20 73 74 69  hat [db2] is sti
32e0: 6c 6c 20 73 65 65 69 6e 67 20 74 68 65 20 6f 72  ll seeing the or
32f0: 69 67 69 6e 61 6c 20 73 6e 61 70 73 68 6f 74 2e  iginal snapshot.
3300: 20 54 68 65 6e 20 72 65 61 64 20 77 69 74 68 20   Then read with 
3310: 5b 64 62 33 5d 2e 0a 20 20 23 20 5b 64 62 33 5d  [db3]..  # [db3]
3320: 20 73 68 6f 75 6c 64 20 73 65 65 20 74 68 65 20   should see the 
3330: 6e 65 77 6c 79 20 63 6f 6d 6d 69 74 74 65 64 20  newly committed 
3340: 64 61 74 61 2e 0a 20 20 23 0a 20 20 64 6f 5f 74  data..  #.  do_t
3350: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 34  est wal-10.$tn.4
3360: 20 7b 0a 20 20 20 20 73 71 6c 32 20 7b 20 42 45   {.    sql2 { BE
3370: 47 49 4e 20 3b 20 53 45 4c 45 43 54 20 2a 20 46  GIN ; SELECT * F
3380: 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32  ROM t1}.  } {1 2
3390: 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20   3 4}.  do_test 
33a0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 35 20 7b 0a 20  wal-10.$tn.5 {. 
33b0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53     execsql { INS
33c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
33d0: 45 53 28 35 2c 20 36 29 3b 20 7d 0a 20 20 20 20  ES(5, 6); }.    
33e0: 73 71 6c 32 20 7b 53 45 4c 45 43 54 20 2a 20 46  sql2 {SELECT * F
33f0: 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b 31 20 32  ROM t1}.  } {1 2
3400: 20 33 20 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20   3 4}.  do_test 
3410: 77 61 6c 2d 31 30 2e 24 74 6e 2e 36 20 7b 0a 20  wal-10.$tn.6 {. 
3420: 20 20 20 73 71 6c 33 20 7b 53 45 4c 45 43 54 20     sql3 {SELECT 
3430: 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d 20 7b  * FROM t1}.  } {
3440: 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20 64  1 2 3 4 5 6}.  d
3450: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3460: 6e 2e 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 43  n.7 {.    sql2 C
3470: 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d 0a 0a 20 20  OMMIT.  } {}..  
3480: 23 20 48 61 76 65 20 5b 64 62 32 5d 20 6f 70 65  # Have [db2] ope
3490: 6e 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  n a write transa
34a0: 63 74 69 6f 6e 2e 20 54 68 65 6e 20 61 74 74 65  ction. Then atte
34b0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  mpt to write to 
34c0: 74 68 65 20 0a 20 20 23 20 64 61 74 61 62 61 73  the .  # databas
34d0: 65 20 76 69 61 20 5b 64 62 5d 2e 20 54 68 69 73  e via [db]. This
34e0: 20 73 68 6f 75 6c 64 20 66 61 69 6c 20 28 77 72   should fail (wr
34f0: 69 74 65 72 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74  iter lock cannot
3500: 20 62 65 20 6f 62 74 61 69 6e 65 64 29 2e 0a 20   be obtained).. 
3510: 20 23 0a 20 20 23 20 54 68 65 6e 20 6f 70 65 6e   #.  # Then open
3520: 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
3530: 69 6f 6e 20 77 69 74 68 20 5b 64 62 5d 2e 20 43  ion with [db]. C
3540: 6f 6d 6d 69 74 20 74 68 65 20 5b 64 62 32 5d 20  ommit the [db2] 
3550: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 23 20  transaction.  # 
3560: 74 6f 20 64 69 73 6b 2e 20 56 65 72 69 66 79 20  to disk. Verify 
3570: 74 68 61 74 20 5b 64 62 5d 20 73 74 69 6c 6c 20  that [db] still 
3580: 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  cannot write to 
3590: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 62 65  the database (be
35a0: 63 61 75 73 65 0a 20 20 23 20 69 74 20 69 73 20  cause.  # it is 
35b0: 72 65 61 64 69 6e 67 20 61 6e 20 6f 6c 64 20 73  reading an old s
35c0: 6e 61 70 73 68 6f 74 29 2e 0a 20 20 23 0a 20 20  napshot)..  #.  
35d0: 23 20 43 6c 6f 73 65 20 74 68 65 20 63 75 72 72  # Close the curr
35e0: 65 6e 74 20 5b 64 62 5d 20 74 72 61 6e 73 61 63  ent [db] transac
35f0: 74 69 6f 6e 2e 20 4f 70 65 6e 20 61 20 6e 65 77  tion. Open a new
3600: 20 6f 6e 65 2e 20 5b 64 62 5d 20 63 61 6e 20 6e   one. [db] can n
3610: 6f 77 20 77 72 69 74 65 0a 20 20 23 20 74 6f 20  ow write.  # to 
3620: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 61 73  the database (as
3630: 20 69 74 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65   it is not locke
3640: 64 20 61 6e 64 20 5b 64 62 5d 20 69 73 20 72 65  d and [db] is re
3650: 61 64 69 6e 67 20 74 68 65 20 6c 61 74 65 73 74  ading the latest
3660: 0a 20 20 23 20 73 6e 61 70 73 68 6f 74 29 2e 0a  .  # snapshot)..
3670: 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61    #.  do_test wa
3680: 6c 2d 31 30 2e 24 74 6e 2e 37 20 7b 0a 20 20 20  l-10.$tn.7 {.   
3690: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 49   sql2 { BEGIN; I
36a0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
36b0: 4c 55 45 53 28 37 2c 20 38 29 20 3b 20 7d 0a 20  LUES(7, 8) ; }. 
36c0: 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49 4e     catchsql { IN
36d0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
36e0: 55 45 53 28 39 2c 20 31 30 29 20 7d 0a 20 20 7d  UES(9, 10) }.  }
36f0: 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20 69 73   {1 {database is
3700: 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f 5f 74   locked}}.  do_t
3710: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 38  est wal-10.$tn.8
3720: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3730: 20 42 45 47 49 4e 20 3b 20 53 45 4c 45 43 54 20   BEGIN ; SELECT 
3740: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
3750: 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a 20 20  {1 2 3 4 5 6}.  
3760: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3770: 74 6e 2e 39 20 7b 0a 20 20 20 20 73 71 6c 32 20  tn.9 {.    sql2 
3780: 43 4f 4d 4d 49 54 0a 20 20 20 20 63 61 74 63 68  COMMIT.    catch
3790: 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54  sql { INSERT INT
37a0: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
37b0: 30 29 20 7d 0a 20 20 7d 20 7b 31 20 7b 64 61 74  0) }.  } {1 {dat
37c0: 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 7d  abase is locked}
37d0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
37e0: 31 30 2e 24 74 6e 2e 31 30 20 7b 0a 20 20 20 20  10.$tn.10 {.    
37f0: 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54  execsql { COMMIT
3800: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
3810: 20 42 45 47 49 4e 20 7d 0a 20 20 20 20 65 78 65   BEGIN }.    exe
3820: 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  csql { INSERT IN
3830: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20  TO t1 VALUES(9, 
3840: 31 30 29 20 7d 0a 20 20 20 20 65 78 65 63 73 71  10) }.    execsq
3850: 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d 0a 20 20 20  l { COMMIT }.   
3860: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
3870: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
3880: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37  } {1 2 3 4 5 6 7
3890: 20 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 4f 70   8 9 10}..  # Op
38a0: 65 6e 20 61 20 72 65 61 64 20 74 72 61 6e 73 61  en a read transa
38b0: 63 74 69 6f 6e 20 77 69 74 68 20 5b 64 62 32 5d  ction with [db2]
38c0: 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 69  . Check that thi
38d0: 73 20 70 72 65 76 65 6e 74 73 20 5b 64 62 5d 20  s prevents [db] 
38e0: 66 72 6f 6d 0a 20 20 23 20 63 68 65 63 6b 70 6f  from.  # checkpo
38f0: 69 6e 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  inting the datab
3900: 61 73 65 2e 20 42 75 74 20 6e 6f 74 20 66 72 6f  ase. But not fro
3910: 6d 20 77 72 69 74 69 6e 67 20 74 6f 20 69 74 2e  m writing to it.
3920: 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77  .  #.  do_test w
3930: 61 6c 2d 31 30 2e 24 74 6e 2e 31 31 20 7b 0a 20  al-10.$tn.11 {. 
3940: 20 20 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b     sql2 { BEGIN;
3950: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
3960: 31 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34  1 }.  } {1 2 3 4
3970: 20 35 20 36 20 37 20 38 20 39 20 31 30 7d 0a 20   5 6 7 8 9 10}. 
3980: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
3990: 24 74 6e 2e 31 32 20 7b 0a 20 20 20 20 63 61 74  $tn.12 {.    cat
39a0: 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  chsql { PRAGMA w
39b0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20  al_checkpoint } 
39c0: 0a 20 20 7d 20 7b 30 20 7b 30 20 37 20 37 7d 7d  .  } {0 {0 7 7}}
39d0: 20 20 20 3b 23 20 52 65 61 64 65 72 20 6e 6f 20     ;# Reader no 
39e0: 6c 6f 6e 67 65 72 20 62 6c 6f 63 6b 20 63 68 65  longer block che
39f0: 63 6b 70 6f 69 6e 74 73 0a 20 20 64 6f 5f 74 65  ckpoints.  do_te
3a00: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31 33  st wal-10.$tn.13
3a10: 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   {.    execsql {
3a20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
3a30: 56 41 4c 55 45 53 28 31 31 2c 20 31 32 29 20 7d  VALUES(11, 12) }
3a40: 0a 20 20 20 20 73 71 6c 32 20 7b 53 45 4c 45 43  .    sql2 {SELEC
3a50: 54 20 2a 20 46 52 4f 4d 20 74 31 7d 0a 20 20 7d  T * FROM t1}.  }
3a60: 20 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20   {1 2 3 4 5 6 7 
3a70: 38 20 39 20 31 30 7d 0a 0a 20 20 23 20 57 72 69  8 9 10}..  # Wri
3a80: 74 65 72 73 20 64 6f 20 6e 6f 74 20 62 6c 6f 63  ters do not bloc
3a90: 6b 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 61 6e  k checkpoints an
3aa0: 79 20 6d 6f 72 65 20 65 69 74 68 65 72 2e 0a 20  y more either.. 
3ab0: 20 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c   #.  do_test wal
3ac0: 2d 31 30 2e 24 74 6e 2e 31 34 20 7b 0a 20 20 20  -10.$tn.14 {.   
3ad0: 20 63 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47   catchsql { PRAG
3ae0: 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  MA wal_checkpoin
3af0: 74 20 7d 20 0a 20 20 7d 20 7b 30 20 7b 30 20 38  t } .  } {0 {0 8
3b00: 20 37 7d 7d 0a 0a 20 20 23 20 54 68 65 20 66 6f   7}}..  # The fo
3b10: 6c 6c 6f 77 69 6e 67 20 73 65 72 69 65 73 20 6f  llowing series o
3b20: 66 20 74 65 73 74 20 63 61 73 65 73 20 75 73 65  f test cases use
3b30: 64 20 74 6f 20 76 65 72 69 66 79 20 61 6e 6f 74  d to verify anot
3b40: 68 65 72 20 62 6c 6f 63 6b 69 6e 67 0a 20 20 23  her blocking.  #
3b50: 20 63 61 73 65 20 69 6e 20 57 41 4c 20 2d 20 61   case in WAL - a
3b60: 20 63 61 73 65 20 77 68 69 63 68 20 6e 6f 20 6c   case which no l
3b70: 6f 6e 67 65 72 20 62 6c 6f 63 6b 73 2e 0a 20 20  onger blocks..  
3b80: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
3b90: 31 30 2e 24 74 6e 2e 31 35 20 7b 0a 20 20 20 20  10.$tn.15 {.    
3ba0: 73 71 6c 32 20 7b 20 43 4f 4d 4d 49 54 3b 20 42  sql2 { COMMIT; B
3bb0: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
3bc0: 52 4f 4d 20 74 31 3b 20 7d 0a 20 20 7d 20 7b 31  ROM t1; }.  } {1
3bd0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
3be0: 20 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f   10 11 12}.  do_
3bf0: 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e  test wal-10.$tn.
3c00: 31 36 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71  16 {.    catchsq
3c10: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
3c20: 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20 7d  heckpoint } .  }
3c30: 20 7b 30 20 7b 30 20 38 20 38 7d 7d 0a 20 20 64   {0 {0 8 8}}.  d
3c40: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74  o_test wal-10.$t
3c50: 6e 2e 31 37 20 7b 0a 20 20 20 20 65 78 65 63 73  n.17 {.    execs
3c60: 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f  ql { PRAGMA wal_
3c70: 63 68 65 63 6b 70 6f 69 6e 74 20 7d 20 0a 20 20  checkpoint } .  
3c80: 7d 20 7b 30 20 38 20 38 7d 0a 20 20 64 6f 5f 74  } {0 8 8}.  do_t
3c90: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3ca0: 38 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b 20 42  8 {.    sql3 { B
3cb0: 45 47 49 4e 3b 20 53 45 4c 45 43 54 20 2a 20 46  EGIN; SELECT * F
3cc0: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3cd0: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
3ce0: 31 30 20 31 31 20 31 32 7d 0a 20 20 64 6f 5f 74  10 11 12}.  do_t
3cf0: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 31  est wal-10.$tn.1
3d00: 39 20 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c  9 {.    catchsql
3d10: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
3d20: 31 20 56 41 4c 55 45 53 28 31 33 2c 20 31 34 29  1 VALUES(13, 14)
3d30: 20 7d 0a 20 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20   }.  } {0 {}}.  
3d40: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24  do_test wal-10.$
3d50: 74 6e 2e 32 30 20 7b 0a 20 20 20 20 65 78 65 63  tn.20 {.    exec
3d60: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
3d70: 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 20  ROM t1 }.  } {1 
3d80: 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39 20  2 3 4 5 6 7 8 9 
3d90: 31 30 20 31 31 20 31 32 20 31 33 20 31 34 7d 0a  10 11 12 13 14}.
3da0: 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30    do_test wal-10
3db0: 2e 24 74 6e 2e 32 31 20 7b 0a 20 20 20 20 73 71  .$tn.21 {.    sq
3dc0: 6c 33 20 43 4f 4d 4d 49 54 0a 20 20 20 20 73 71  l3 COMMIT.    sq
3dd0: 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 7d 20 7b 7d  l2 COMMIT.  } {}
3de0: 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  .  do_test wal-1
3df0: 30 2e 24 74 6e 2e 32 32 20 7b 0a 20 20 20 20 65  0.$tn.22 {.    e
3e00: 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20  xecsql { SELECT 
3e10: 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20  * FROM t1 }.  } 
3e20: 7b 31 20 32 20 33 20 34 20 35 20 36 20 37 20 38  {1 2 3 4 5 6 7 8
3e30: 20 39 20 31 30 20 31 31 20 31 32 20 31 33 20 31   9 10 11 12 13 1
3e40: 34 7d 0a 0a 20 20 23 20 41 6e 6f 74 68 65 72 20  4}..  # Another 
3e50: 73 65 72 69 65 73 20 6f 66 20 74 65 73 74 73 20  series of tests 
3e60: 74 68 61 74 20 75 73 65 64 20 74 6f 20 64 65 6d  that used to dem
3e70: 6f 6e 73 74 72 61 74 65 20 62 6c 6f 63 6b 69 6e  onstrate blockin
3e80: 67 20 62 65 68 61 76 69 6f 72 0a 20 20 23 20 62  g behavior.  # b
3e90: 75 74 20 77 68 69 63 68 20 6e 6f 77 20 77 6f 72  ut which now wor
3ea0: 6b 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  k..  #.  do_test
3eb0: 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 33 20 7b   wal-10.$tn.23 {
3ec0: 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 50  .    execsql { P
3ed0: 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70  RAGMA wal_checkp
3ee0: 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20 39 20  oint }.  } {0 9 
3ef0: 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  9}.  do_test wal
3f00: 2d 31 30 2e 24 74 6e 2e 32 34 20 7b 0a 20 20 20  -10.$tn.24 {.   
3f10: 20 73 71 6c 32 20 7b 20 42 45 47 49 4e 3b 20 53   sql2 { BEGIN; S
3f20: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b  ELECT * FROM t1;
3f30: 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33 20 34 20   }.  } {1 2 3 4 
3f40: 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20  5 6 7 8 9 10 11 
3f50: 31 32 20 31 33 20 31 34 7d 0a 20 20 64 6f 5f 74  12 13 14}.  do_t
3f60: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
3f70: 35 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  5 {.    execsql 
3f80: 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65  { PRAGMA wal_che
3f90: 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30  ckpoint }.  } {0
3fa0: 20 39 20 39 7d 0a 20 20 64 6f 5f 74 65 73 74 20   9 9}.  do_test 
3fb0: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 36 20 7b 0a  wal-10.$tn.26 {.
3fc0: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
3fd0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
3fe0: 4c 55 45 53 28 31 35 2c 20 31 36 29 20 7d 0a 20  LUES(15, 16) }. 
3ff0: 20 7d 20 7b 30 20 7b 7d 7d 0a 20 20 64 6f 5f 74   } {0 {}}.  do_t
4000: 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 32  est wal-10.$tn.2
4010: 37 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b 20 49  7 {.    sql3 { I
4020: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4030: 4c 55 45 53 28 31 37 2c 20 31 38 29 20 7d 0a 20  LUES(17, 18) }. 
4040: 20 7d 20 7b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   } {}.  do_test 
4050: 77 61 6c 2d 31 30 2e 24 74 6e 2e 32 38 20 7b 0a  wal-10.$tn.28 {.
4060: 20 20 20 20 63 6f 64 65 33 20 7b 0a 20 20 20 20      code3 {.    
4070: 20 20 73 65 74 20 3a 3a 53 54 4d 54 20 5b 73 71    set ::STMT [sq
4080: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 64 62  lite3_prepare db
4090: 33 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  3 "SELECT * FROM
40a0: 20 74 31 22 20 2d 31 20 54 41 49 4c 5d 0a 20 20   t1" -1 TAIL].  
40b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
40c0: 20 24 3a 3a 53 54 4d 54 0a 20 20 20 20 7d 0a 20   $::STMT.    }. 
40d0: 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c     execsql { SEL
40e0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a  ECT * FROM t1 }.
40f0: 20 20 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36    } {1 2 3 4 5 6
4100: 20 37 20 38 20 39 20 31 30 20 31 31 20 31 32 20   7 8 9 10 11 12 
4110: 31 33 20 31 34 20 31 35 20 31 36 20 31 37 20 31  13 14 15 16 17 1
4120: 38 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  8}.  do_test wal
4130: 2d 31 30 2e 24 74 6e 2e 32 39 20 7b 0a 20 20 20  -10.$tn.29 {.   
4140: 20 65 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52   execsql { INSER
4150: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4160: 28 31 39 2c 20 32 30 29 20 7d 0a 20 20 20 20 63  (19, 20) }.    c
4170: 61 74 63 68 73 71 6c 20 7b 20 50 52 41 47 4d 41  atchsql { PRAGMA
4180: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20   wal_checkpoint 
4190: 7d 0a 20 20 7d 20 7b 30 20 7b 30 20 33 20 30 7d  }.  } {0 {0 3 0}
41a0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
41b0: 31 30 2e 24 74 6e 2e 33 30 20 7b 0a 20 20 20 20  10.$tn.30 {.    
41c0: 63 6f 64 65 33 20 7b 20 73 71 6c 69 74 65 33 5f  code3 { sqlite3_
41d0: 66 69 6e 61 6c 69 7a 65 20 24 3a 3a 53 54 4d 54  finalize $::STMT
41e0: 20 7d 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b   }.    execsql {
41f0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
4200: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20  kpoint }.  } {0 
4210: 33 20 30 7d 0a 0a 20 20 23 20 41 74 20 6f 6e 65  3 0}..  # At one
4220: 20 70 6f 69 6e 74 2c 20 69 66 20 61 20 72 65 61   point, if a rea
4230: 64 65 72 20 66 61 69 6c 65 64 20 74 6f 20 75 70  der failed to up
4240: 67 72 61 64 65 20 74 6f 20 61 20 77 72 69 74 65  grade to a write
4250: 72 20 62 65 63 61 75 73 65 20 69 74 0a 20 20 23  r because it.  #
4260: 20 77 61 73 20 72 65 61 64 69 6e 67 20 61 6e 20   was reading an 
4270: 6f 6c 64 20 73 6e 61 70 73 68 6f 74 2c 20 74 68  old snapshot, th
4280: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 77 65  e write-locks we
4290: 72 65 20 6e 6f 74 20 62 65 69 6e 67 20 72 65 6c  re not being rel
42a0: 65 61 73 65 64 2e 0a 20 20 23 20 54 65 73 74 20  eased..  # Test 
42b0: 74 68 61 74 20 74 68 69 73 20 62 75 67 20 68 61  that this bug ha
42c0: 73 20 62 65 65 6e 20 66 69 78 65 64 2e 0a 20 20  s been fixed..  
42d0: 23 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  #.  do_test wal-
42e0: 31 30 2e 24 74 6e 2e 33 31 20 7b 0a 20 20 20 20  10.$tn.31 {.    
42f0: 73 71 6c 32 20 43 4f 4d 4d 49 54 0a 20 20 20 20  sql2 COMMIT.    
4300: 65 78 65 63 73 71 6c 20 7b 20 42 45 47 49 4e 20  execsql { BEGIN 
4310: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
4320: 74 31 20 7d 0a 20 20 20 20 73 71 6c 32 20 7b 20  t1 }.    sql2 { 
4330: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
4340: 41 4c 55 45 53 28 32 31 2c 20 32 32 29 20 7d 0a  ALUES(21, 22) }.
4350: 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b 20 49      catchsql { I
4360: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
4370: 4c 55 45 53 28 32 33 2c 20 32 34 29 20 7d 0a 20  LUES(23, 24) }. 
4380: 20 7d 20 7b 31 20 7b 64 61 74 61 62 61 73 65 20   } {1 {database 
4390: 69 73 20 6c 6f 63 6b 65 64 7d 7d 0a 20 20 64 6f  is locked}}.  do
43a0: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
43b0: 2e 33 32 20 7b 0a 20 20 20 20 23 20 54 68 69 73  .32 {.    # This
43c0: 20 73 74 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64   statement would
43d0: 20 66 61 69 6c 20 77 68 65 6e 20 74 68 65 20 62   fail when the b
43e0: 75 67 20 77 61 73 20 70 72 65 73 65 6e 74 2e 0a  ug was present..
43f0: 20 20 20 20 73 71 6c 32 20 7b 20 49 4e 53 45 52      sql2 { INSER
4400: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4410: 28 32 33 2c 20 32 34 29 20 7d 0a 20 20 7d 20 7b  (23, 24) }.  } {
4420: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
4430: 31 30 2e 24 74 6e 2e 33 33 20 7b 0a 20 20 20 20  10.$tn.33 {.    
4440: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
4450: 20 2a 20 46 52 4f 4d 20 74 31 20 3b 20 43 4f 4d   * FROM t1 ; COM
4460: 4d 49 54 20 7d 0a 20 20 7d 20 7b 31 20 32 20 33  MIT }.  } {1 2 3
4470: 20 34 20 35 20 36 20 37 20 38 20 39 20 31 30 20   4 5 6 7 8 9 10 
4480: 31 31 20 31 32 20 31 33 20 31 34 20 31 35 20 31  11 12 13 14 15 1
4490: 36 20 31 37 20 31 38 20 31 39 20 32 30 7d 0a 20  6 17 18 19 20}. 
44a0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
44b0: 24 74 6e 2e 33 34 20 7b 0a 20 20 20 20 65 78 65  $tn.34 {.    exe
44c0: 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20  csql { SELECT * 
44d0: 46 52 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31  FROM t1 }.  } {1
44e0: 20 32 20 33 20 34 20 35 20 36 20 37 20 38 20 39   2 3 4 5 6 7 8 9
44f0: 20 31 30 20 31 31 20 31 32 20 31 33 20 31 34 20   10 11 12 13 14 
4500: 31 35 20 31 36 20 31 37 20 31 38 20 31 39 20 32  15 16 17 18 19 2
4510: 30 20 32 31 20 32 32 20 32 33 20 32 34 7d 0a 0a  0 21 22 23 24}..
4520: 20 20 23 20 54 65 73 74 20 74 68 61 74 20 69 66    # Test that if
4530: 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 65 72 20   a checkpointer 
4540: 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 20 74 68  cannot obtain th
4550: 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73  e required locks
4560: 2c 20 69 74 0a 20 20 23 20 72 65 6c 65 61 73 65  , it.  # release
4570: 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 62 65 66 6f  s all locks befo
4580: 72 65 20 72 65 74 75 72 6e 69 6e 67 20 61 20 62  re returning a b
4590: 75 73 79 20 65 72 72 6f 72 2e 0a 20 20 23 0a 20  usy error..  #. 
45a0: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e   do_test wal-10.
45b0: 24 74 6e 2e 33 35 20 7b 0a 20 20 20 20 65 78 65  $tn.35 {.    exe
45c0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 20 20 44 45  csql { .      DE
45d0: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
45e0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
45f0: 74 31 20 56 41 4c 55 45 53 28 27 61 27 2c 20 27  t1 VALUES('a', '
4600: 62 27 29 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  b');.      INSER
4610: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
4620: 28 27 63 27 2c 20 27 64 27 29 3b 0a 20 20 20 20  ('c', 'd');.    
4630: 7d 0a 20 20 20 20 73 71 6c 32 20 7b 0a 20 20 20  }.    sql2 {.   
4640: 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 20 20     BEGIN;.      
4650: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4660: 74 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 61  t1;.    }.  } {a
4670: 20 62 20 63 20 64 7d 0a 20 20 64 6f 5f 74 65 73   b c d}.  do_tes
4680: 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36 20  t wal-10.$tn.36 
4690: 7b 0a 20 20 20 20 63 61 74 63 68 73 71 6c 20 7b  {.    catchsql {
46a0: 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65 63   PRAGMA wal_chec
46b0: 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20 7b 30 20  kpoint }.  } {0 
46c0: 7b 30 20 38 20 38 7d 7d 0a 20 20 64 6f 5f 74 65  {0 8 8}}.  do_te
46d0: 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e 2e 33 36  st wal-10.$tn.36
46e0: 20 7b 0a 20 20 20 20 73 71 6c 33 20 7b 20 49 4e   {.    sql3 { IN
46f0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
4700: 55 45 53 28 27 65 27 2c 20 27 66 27 29 20 7d 0a  UES('e', 'f') }.
4710: 20 20 20 20 73 71 6c 32 20 7b 20 53 45 4c 45 43      sql2 { SELEC
4720: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 20 20  T * FROM t1 }.  
4730: 7d 20 7b 61 20 62 20 63 20 64 7d 0a 20 20 64 6f  } {a b c d}.  do
4740: 5f 74 65 73 74 20 77 61 6c 2d 31 30 2e 24 74 6e  _test wal-10.$tn
4750: 2e 33 37 20 7b 0a 20 20 20 20 73 71 6c 32 20 43  .37 {.    sql2 C
4760: 4f 4d 4d 49 54 0a 20 20 20 20 65 78 65 63 73 71  OMMIT.    execsq
4770: 6c 20 7b 20 50 52 41 47 4d 41 20 77 61 6c 5f 63  l { PRAGMA wal_c
4780: 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20 20 7d 20  heckpoint }.  } 
4790: 7b 30 20 39 20 39 7d 0a 7d 0a 0a 23 2d 2d 2d 2d  {0 9 9}.}..#----
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f  -----.# This blo
47f0: 63 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c  ck of tests, wal
4800: 2d 31 31 2e 2a 2c 20 74 65 73 74 20 74 68 61 74  -11.*, test that
4810: 20 6e 6f 74 68 69 6e 67 20 67 6f 65 73 20 74 65   nothing goes te
4820: 72 72 69 62 6c 79 20 77 72 6f 6e 67 0a 23 20 69  rribly wrong.# i
4830: 66 20 66 72 61 6d 65 73 20 6d 75 73 74 20 62 65  f frames must be
4840: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
4850: 6c 6f 67 20 66 69 6c 65 20 62 65 66 6f 72 65 20  log file before 
4860: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
4870: 0a 23 20 63 6f 6d 6d 69 74 74 65 64 20 28 69 6e  .# committed (in
4880: 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
4890: 70 20 6d 65 6d 6f 72 79 29 2e 0a 23 0a 64 6f 5f  p memory)..#.do_
48a0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 20 7b 0a  test wal-11.1 {.
48b0: 20 20 72 65 6f 70 65 6e 5f 64 62 0a 20 20 65 78    reopen_db.  ex
48c0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47  ecsql {.    PRAG
48d0: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20  MA cache_size = 
48e0: 31 30 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 70  10;.    PRAGMA p
48f0: 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b  age_size = 1024;
4900: 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  .    CREATE TABL
4910: 45 20 74 31 28 78 20 50 52 49 4d 41 52 59 20 4b  E t1(x PRIMARY K
4920: 45 59 29 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20  EY);.  }.  list 
4930: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4940: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
4950: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
4960: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
4970: 34 34 5d 0a 7d 20 7b 31 20 33 7d 0a 64 6f 5f 74  44].} {1 3}.do_t
4980: 65 73 74 20 77 61 6c 2d 31 31 2e 32 20 7b 0a 20  est wal-11.2 {. 
4990: 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47 4d   execsql { PRAGM
49a0: 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  A wal_checkpoint
49b0: 20 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20   }.  list [expr 
49c0: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
49d0: 64 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20  db]/1024] [file 
49e0: 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  size test.db-wal
49f0: 5d 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c  ].} [list 3 [wal
4a00: 5f 66 69 6c 65 5f 73 69 7a 65 20 33 20 31 30 32  _file_size 3 102
4a10: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
4a20: 31 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.3 {.  execsql
4a30: 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74   { INSERT INTO t
4a40: 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39  1 VALUES( blob(9
4a50: 30 30 29 20 29 20 7d 0a 20 20 6c 69 73 74 20 5b  00) ) }.  list [
4a60: 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20  expr [file size 
4a70: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b  test.db]/1024] [
4a80: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4a90: 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33  b-wal].} [list 3
4aa0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
4ab0: 34 20 31 30 32 34 5d 5d 0a 0a 64 6f 5f 74 65 73  4 1024]]..do_tes
4ac0: 74 20 77 61 6c 2d 31 31 2e 34 20 7b 0a 20 20 65  t wal-11.4 {.  e
4ad0: 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45  xecsql { .    BE
4ae0: 47 49 4e 3b 0a 20 20 20 20 20 20 49 4e 53 45 52  GIN;.      INSER
4af0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
4b00: 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20   blob(900) FROM 
4b10: 74 31 3b 20 20 20 2d 2d 20 32 0a 20 20 20 20 20  t1;   -- 2.     
4b20: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
4b30: 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30 30 29  SELECT blob(900)
4b40: 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d 20 34   FROM t1;   -- 4
4b50: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
4b60: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 62 6c 6f  TO t1 SELECT blo
4b70: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
4b80: 20 20 2d 2d 20 38 0a 20 20 20 20 20 20 49 4e 53    -- 8.      INS
4b90: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
4ba0: 43 54 20 62 6c 6f 62 28 39 30 30 29 20 46 52 4f  CT blob(900) FRO
4bb0: 4d 20 74 31 3b 20 20 20 2d 2d 20 31 36 0a 20 20  M t1;   -- 16.  
4bc0: 7d 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  }.  list [expr [
4bd0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
4be0: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
4bf0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
4c00: 0a 7d 20 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f  .} [list 3 [wal_
4c10: 66 69 6c 65 5f 73 69 7a 65 20 33 32 20 31 30 32  file_size 32 102
4c20: 34 5d 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d  4]].do_test wal-
4c30: 31 31 2e 35 20 7b 0a 20 20 65 78 65 63 73 71 6c  11.5 {.  execsql
4c40: 20 7b 20 0a 20 20 20 20 53 45 4c 45 43 54 20 63   { .    SELECT c
4c50: 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b  ount(*) FROM t1;
4c60: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 74 65  .    PRAGMA inte
4c70: 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d  grity_check;.  }
4c80: 0a 7d 20 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65  .} {16 ok}.do_te
4c90: 73 74 20 77 61 6c 2d 31 31 2e 36 20 7b 0a 20 20  st wal-11.6 {.  
4ca0: 65 78 65 63 73 71 6c 20 43 4f 4d 4d 49 54 0a 20  execsql COMMIT. 
4cb0: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4cc0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4cd0: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4ce0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4cf0: 5b 6c 69 73 74 20 33 20 5b 77 61 6c 5f 66 69 6c  [list 3 [wal_fil
4d00: 65 5f 73 69 7a 65 20 34 30 20 31 30 32 34 5d 5d  e_size 40 1024]]
4d10: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e  .do_test wal-11.
4d20: 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 20  7 {.  execsql { 
4d30: 0a 20 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e  .    SELECT coun
4d40: 74 28 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20  t(*) FROM t1;.  
4d50: 20 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69    PRAGMA integri
4d60: 74 79 5f 63 68 65 63 6b 3b 0a 20 20 7d 0a 7d 20  ty_check;.  }.} 
4d70: 7b 31 36 20 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20  {16 ok}.do_test 
4d80: 77 61 6c 2d 31 31 2e 38 20 7b 0a 20 20 65 78 65  wal-11.8 {.  exe
4d90: 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77 61  csql { PRAGMA wa
4da0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a 20  l_checkpoint }. 
4db0: 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69 6c   list [expr [fil
4dc0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 2f  e size test.db]/
4dd0: 31 30 32 34 5d 20 5b 66 69 6c 65 20 73 69 7a 65  1024] [file size
4de0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20   test.db-wal].} 
4df0: 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c 5f 66 69  [list 37 [wal_fi
4e00: 6c 65 5f 73 69 7a 65 20 34 30 20 31 30 32 34 5d  le_size 40 1024]
4e10: 5d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31  ].do_test wal-11
4e20: 2e 39 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a  .9 {.  db close.
4e30: 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b 66 69    list [expr [fi
4e40: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 5d  le size test.db]
4e50: 2f 31 30 32 34 5d 20 5b 6c 6f 67 5f 64 65 6c 65  /1024] [log_dele
4e60: 74 65 64 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ted test.db-wal]
4e70: 0a 7d 20 7b 33 37 20 31 7d 0a 73 71 6c 69 74 65  .} {37 1}.sqlite
4e80: 33 5f 77 61 6c 20 64 62 20 74 65 73 74 2e 64 62  3_wal db test.db
4e90: 0a 0a 23 20 41 66 74 65 72 20 61 64 64 69 6e 67  ..# After adding
4ea0: 20 74 68 65 20 63 61 70 61 62 69 6c 69 74 79 20   the capability 
4eb0: 6f 66 20 57 41 4c 20 74 6f 20 6f 76 65 72 77 72  of WAL to overwr
4ec0: 69 74 65 20 70 72 69 6f 72 20 75 6e 63 6f 6d 6d  ite prior uncomm
4ed0: 69 74 74 65 64 0a 23 20 66 72 61 6d 65 20 69 6e  itted.# frame in
4ee0: 20 74 68 65 20 57 41 4c 2d 66 69 6c 65 20 77 69   the WAL-file wi
4ef0: 74 68 20 72 65 76 69 73 65 64 20 63 6f 6e 74 65  th revised conte
4f00: 6e 74 2c 20 74 68 65 20 73 69 7a 65 20 6f 66 20  nt, the size of 
4f10: 74 68 65 20 57 41 4c 20 66 69 6c 65 0a 23 20 66  the WAL file.# f
4f20: 6f 6c 6c 6f 77 69 6e 67 20 63 61 63 68 65 2d 73  ollowing cache-s
4f30: 70 69 6c 6c 20 69 73 20 73 6d 61 6c 6c 65 72 2e  pill is smaller.
4f40: 0a 23 0a 23 73 65 74 20 6e 57 61 6c 20 33 39 0a  .#.#set nWal 39.
4f50: 23 69 66 20 7b 5b 70 65 72 6d 75 74 61 74 69 6f  #if {[permutatio
4f60: 6e 5d 21 3d 22 6d 6d 61 70 22 7d 20 7b 73 65 74  n]!="mmap"} {set
4f70: 20 6e 57 61 6c 20 33 37 7d 0a 23 69 66 63 61 70   nWal 37}.#ifcap
4f80: 61 62 6c 65 20 21 6d 6d 61 70 20 7b 73 65 74 20  able !mmap {set 
4f90: 6e 57 61 6c 20 33 37 7d 0a 73 65 74 20 6e 57 61  nWal 37}.set nWa
4fa0: 6c 20 33 34 0a 0a 64 6f 5f 74 65 73 74 20 77 61  l 34..do_test wa
4fb0: 6c 2d 31 31 2e 31 30 20 7b 0a 20 20 65 78 65 63  l-11.10 {.  exec
4fc0: 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  sql {.    PRAGMA
4fd0: 20 63 61 63 68 65 5f 73 69 7a 65 20 3d 20 31 30   cache_size = 10
4fe0: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
4ff0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5000: 31 20 53 45 4c 45 43 54 20 62 6c 6f 62 28 39 30  1 SELECT blob(90
5010: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 2d 2d  0) FROM t1;   --
5020: 20 33 32 0a 20 20 20 20 20 20 53 45 4c 45 43 54   32.      SELECT
5030: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
5040: 31 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  1;.  }.  list [e
5050: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5060: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 66  est.db]/1024] [f
5070: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
5080: 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20 33 37  -wal].} [list 37
5090: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
50a0: 24 6e 57 61 6c 20 31 30 32 34 5d 5d 0a 64 6f 5f  $nWal 1024]].do_
50b0: 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 31 20 7b  test wal-11.11 {
50c0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
50d0: 20 20 20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28     SELECT count(
50e0: 2a 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20 20  *) FROM t1;.    
50f0: 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 53 45  ROLLBACK;.    SE
5100: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
5110: 4f 4d 20 74 31 3b 0a 20 20 7d 0a 7d 20 7b 33 32  OM t1;.  }.} {32
5120: 20 31 36 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c   16}.do_test wal
5130: 2d 31 31 2e 31 32 20 7b 0a 20 20 6c 69 73 74 20  -11.12 {.  list 
5140: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
5150: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
5160: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
5170: 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73 74 20  db-wal].} [list 
5180: 33 37 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  37 [wal_file_siz
5190: 65 20 24 6e 57 61 6c 20 31 30 32 34 5d 5d 0a 64  e $nWal 1024]].d
51a0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 33  o_test wal-11.13
51b0: 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   {.  execsql {. 
51c0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
51d0: 31 20 56 41 4c 55 45 53 28 20 62 6c 6f 62 28 39  1 VALUES( blob(9
51e0: 30 30 29 20 29 3b 0a 20 20 20 20 53 45 4c 45 43  00) );.    SELEC
51f0: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
5200: 74 31 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 69  t1;.    PRAGMA i
5210: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b 0a  ntegrity_check;.
5220: 20 20 7d 0a 7d 20 7b 31 37 20 6f 6b 7d 0a 64 6f    }.} {17 ok}.do
5230: 5f 74 65 73 74 20 77 61 6c 2d 31 31 2e 31 34 20  _test wal-11.14 
5240: 7b 0a 20 20 6c 69 73 74 20 5b 65 78 70 72 20 5b  {.  list [expr [
5250: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
5260: 62 5d 2f 31 30 32 34 5d 20 5b 66 69 6c 65 20 73  b]/1024] [file s
5270: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
5280: 0a 7d 20 5b 6c 69 73 74 20 33 37 20 5b 77 61 6c  .} [list 37 [wal
5290: 5f 66 69 6c 65 5f 73 69 7a 65 20 24 6e 57 61 6c  _file_size $nWal
52a0: 20 31 30 32 34 5d 5d 0a 0a 0a 23 2d 2d 2d 2d 2d   1024]]...#-----
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 0a 23 20 54 68 69 73 20 62 6c 6f 63  ----.# This bloc
5300: 6b 20 6f 66 20 74 65 73 74 73 2c 20 77 61 6c 2d  k of tests, wal-
5310: 31 32 2e 2a 2c 20 74 65 73 74 73 20 74 68 65 20  12.*, tests the 
5320: 66 69 78 20 66 6f 72 20 61 20 70 72 6f 62 6c 65  fix for a proble
5330: 6d 20 74 68 61 74 20 0a 23 20 63 6f 75 6c 64 20  m that .# could 
5340: 6f 63 63 75 72 20 69 66 20 61 20 6c 6f 67 20 74  occur if a log t
5350: 68 61 74 20 69 73 20 61 20 70 72 65 66 69 78 20  hat is a prefix 
5360: 6f 66 20 61 6e 20 6f 6c 64 65 72 20 6c 6f 67 20  of an older log 
5370: 69 73 20 77 72 69 74 74 65 6e 20 0a 23 20 69 6e  is written .# in
5380: 74 6f 20 61 20 72 65 75 73 65 64 20 6c 6f 67 20  to a reused log 
5390: 66 69 6c 65 2e 0a 23 0a 72 65 6f 70 65 6e 5f 64  file..#.reopen_d
53a0: 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32  b.do_test wal-12
53b0: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
53c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
53d0: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
53e0: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
53f0: 31 28 78 2c 20 79 29 3b 0a 20 20 20 20 43 52 45  1(x, y);.    CRE
5400: 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 2c 20  ATE TABLE t2(x, 
5410: 79 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  y);.    INSERT I
5420: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 27 41  NTO t1 VALUES('A
5430: 27 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 6c 69 73  ', 1);.  }.  lis
5440: 74 20 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69  t [expr [file si
5450: 7a 65 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34  ze test.db]/1024
5460: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
5470: 74 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b 6c 69 73  t.db-wal].} [lis
5480: 74 20 31 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69  t 1 [wal_file_si
5490: 7a 65 20 35 20 31 30 32 34 5d 5d 0a 64 6f 5f 74  ze 5 1024]].do_t
54a0: 65 73 74 20 77 61 6c 2d 31 32 2e 32 20 7b 0a 20  est wal-12.2 {. 
54b0: 20 64 62 20 63 6c 6f 73 65 0a 20 20 73 71 6c 69   db close.  sqli
54c0: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20  te3 db test.db. 
54d0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
54e0: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
54f0: 73 20 3d 20 6e 6f 72 6d 61 6c 3b 0a 20 20 20 20  s = normal;.    
5500: 55 50 44 41 54 45 20 74 31 20 53 45 54 20 79 20  UPDATE t1 SET y 
5510: 3d 20 30 20 57 48 45 52 45 20 78 20 3d 20 27 41  = 0 WHERE x = 'A
5520: 27 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 65  ';.  }.  list [e
5530: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5540: 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20 5b 65  est.db]/1024] [e
5550: 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  xpr [file size t
5560: 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30 34 34  est.db-wal]/1044
5570: 5d 0a 7d 20 7b 33 20 31 7d 0a 64 6f 5f 74 65 73  ].} {3 1}.do_tes
5580: 74 20 77 61 6c 2d 31 32 2e 33 20 7b 0a 20 20 65  t wal-12.3 {.  e
5590: 78 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20  xecsql { INSERT 
55a0: 49 4e 54 4f 20 74 32 20 56 41 4c 55 45 53 28 27  INTO t2 VALUES('
55b0: 42 27 2c 20 31 29 20 7d 0a 20 20 6c 69 73 74 20  B', 1) }.  list 
55c0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
55d0: 20 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 5d 20   test.db]/1024] 
55e0: 5b 65 78 70 72 20 5b 66 69 6c 65 20 73 69 7a 65  [expr [file size
55f0: 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d 2f 31 30   test.db-wal]/10
5600: 34 34 5d 0a 7d 20 7b 33 20 32 7d 0a 64 6f 5f 74  44].} {3 2}.do_t
5610: 65 73 74 20 77 61 6c 2d 31 32 2e 34 20 7b 0a 20  est wal-12.4 {. 
5620: 20 66 6f 72 63 65 63 6f 70 79 20 74 65 73 74 2e   forcecopy test.
5630: 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 66 6f  db test2.db.  fo
5640: 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 2d  rcecopy test.db-
5650: 77 61 6c 20 74 65 73 74 32 2e 64 62 2d 77 61 6c  wal test2.db-wal
5660: 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 20 64  .  sqlite3_wal d
5670: 62 32 20 74 65 73 74 32 2e 64 62 0a 20 20 65 78  b2 test2.db.  ex
5680: 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a  ecsql { SELECT *
5690: 20 46 52 4f 4d 20 74 32 20 7d 20 64 62 32 0a 7d   FROM t2 } db2.}
56a0: 20 7b 42 20 31 7d 0a 64 62 32 20 63 6c 6f 73 65   {B 1}.db2 close
56b0: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 32 2e  .do_test wal-12.
56c0: 35 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  5 {.  execsql {.
56d0: 20 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63      PRAGMA wal_c
56e0: 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 55  heckpoint;.    U
56f0: 50 44 41 54 45 20 74 32 20 53 45 54 20 79 20 3d  PDATE t2 SET y =
5700: 20 32 20 57 48 45 52 45 20 78 20 3d 20 27 42 27   2 WHERE x = 'B'
5710: 3b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 77 61  ; .    PRAGMA wa
5720: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a 20 20  l_checkpoint;.  
5730: 20 20 55 50 44 41 54 45 20 74 31 20 53 45 54 20    UPDATE t1 SET 
5740: 79 20 3d 20 31 20 57 48 45 52 45 20 78 20 3d 20  y = 1 WHERE x = 
5750: 27 41 27 3b 0a 20 20 20 20 50 52 41 47 4d 41 20  'A';.    PRAGMA 
5760: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b 0a  wal_checkpoint;.
5770: 20 20 20 20 55 50 44 41 54 45 20 74 31 20 53 45      UPDATE t1 SE
5780: 54 20 79 20 3d 20 30 20 57 48 45 52 45 20 78 20  T y = 0 WHERE x 
5790: 3d 20 27 41 27 3b 0a 20 20 7d 0a 20 20 65 78 65  = 'A';.  }.  exe
57a0: 63 73 71 6c 20 7b 20 20 53 45 4c 45 43 54 20 2a  csql {  SELECT *
57b0: 20 46 52 4f 4d 20 74 32 20 7d 0a 7d 20 7b 42 20   FROM t2 }.} {B 
57c0: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  2}.do_test wal-1
57d0: 32 2e 36 20 7b 0a 20 20 66 6f 72 63 65 63 6f 70  2.6 {.  forcecop
57e0: 79 20 74 65 73 74 2e 64 62 20 74 65 73 74 32 2e  y test.db test2.
57f0: 64 62 0a 20 20 66 6f 72 63 65 63 6f 70 79 20 74  db.  forcecopy t
5800: 65 73 74 2e 64 62 2d 77 61 6c 20 74 65 73 74 32  est.db-wal test2
5810: 2e 64 62 2d 77 61 6c 0a 20 20 73 71 6c 69 74 65  .db-wal.  sqlite
5820: 33 5f 77 61 6c 20 64 62 32 20 74 65 73 74 32 2e  3_wal db2 test2.
5830: 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53  db.  execsql { S
5840: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 20  ELECT * FROM t2 
5850: 7d 20 64 62 32 0a 7d 20 7b 42 20 32 7d 0a 64 62  } db2.} {B 2}.db
5860: 32 20 63 6c 6f 73 65 0a 64 62 20 63 6c 6f 73 65  2 close.db close
5870: 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ..#-------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43  ------------.# C
58c0: 68 65 63 6b 20 61 20 66 75 6e 20 63 6f 72 72 75  heck a fun corru
58d0: 70 74 69 6f 6e 20 63 61 73 65 20 68 61 73 20 62  ption case has b
58e0: 65 65 6e 20 66 69 78 65 64 2e 0a 23 0a 23 20 54  een fixed..#.# T
58f0: 68 65 20 70 72 6f 62 6c 65 6d 20 77 61 73 20 74  he problem was t
5900: 68 61 74 20 61 66 74 65 72 20 70 65 72 66 6f 72  hat after perfor
5910: 6d 69 6e 67 20 61 20 63 68 65 63 6b 70 6f 69 6e  ming a checkpoin
5920: 74 20 75 73 69 6e 67 20 61 20 63 6f 6e 6e 65 63  t using a connec
5930: 74 69 6f 6e 0a 23 20 74 68 61 74 20 68 61 64 20  tion.# that had 
5940: 61 6e 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20 70  an out-of-date p
5950: 61 67 65 72 2d 63 61 63 68 65 2c 20 74 68 65 20  ager-cache, the 
5960: 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 63 6f  next time the co
5970: 6e 6e 65 63 74 69 6f 6e 20 77 61 73 0a 23 20 75  nnection was.# u
5980: 73 65 64 20 69 74 20 64 69 64 20 6e 6f 74 20 72  sed it did not r
5990: 65 61 6c 69 7a 65 20 74 68 65 20 63 61 63 68 65  ealize the cache
59a0: 20 77 61 73 20 6f 75 74 2d 6f 66 2d 64 61 74 65   was out-of-date
59b0: 20 61 6e 64 20 70 72 6f 63 65 65 64 65 64 20 74   and proceeded t
59c0: 6f 0a 23 20 6f 70 65 72 61 74 65 20 77 69 74 68  o.# operate with
59d0: 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
59e0: 20 63 61 63 68 65 2e 20 4c 65 61 64 69 6e 67 20   cache. Leading 
59f0: 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 23  to corruption..#
5a00: 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c 6f 73  .catch { db clos
5a10: 65 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 32 20  e }.catch { db2 
5a20: 63 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20  close }.catch { 
5a30: 64 62 33 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 63  db3 close }.forc
5a40: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 20  edelete test.db 
5a50: 74 65 73 74 2e 64 62 2d 77 61 6c 0a 73 71 6c 69  test.db-wal.sqli
5a60: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 73  te3 db test.db.s
5a70: 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e  qlite3 db2 test.
5a80: 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  db.do_test wal-1
5a90: 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a  4 {.  execsql {.
5aa0: 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e      PRAGMA journ
5ab0: 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20  al_mode = WAL;. 
5ac0: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5ad0: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
5ae0: 2c 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  , b);.    INSERT
5af0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
5b00: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20  randomblob(10), 
5b10: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29  randomblob(100))
5b20: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
5b30: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
5b40: 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64  omblob(10), rand
5b50: 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46 52 4f 4d  omblob(100) FROM
5b60: 20 74 31 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   t1;.    INSERT 
5b70: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
5b80: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72  andomblob(10), r
5b90: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 20 46  andomblob(100) F
5ba0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
5bb0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
5bc0: 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 29  T randomblob(10)
5bd0: 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  , randomblob(100
5be0: 29 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 0a 0a  ) FROM t1;.  }..
5bf0: 20 20 64 62 32 20 65 76 61 6c 20 7b 20 0a 20 20    db2 eval { .  
5c00: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
5c10: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
5c20: 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62 6c  ob(10), randombl
5c30: 6f 62 28 31 30 30 29 3b 0a 20 20 20 20 49 4e 53  ob(100);.    INS
5c40: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
5c50: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  CT randomblob(10
5c60: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
5c70: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
5c80: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
5c90: 6e 64 6f 6d 62 6c 6f 62 28 31 30 29 2c 20 72 61  ndomblob(10), ra
5ca0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 3b 0a 20  ndomblob(100);. 
5cb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
5cc0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
5cd0: 6c 6f 62 28 31 30 29 2c 20 72 61 6e 64 6f 6d 62  lob(10), randomb
5ce0: 6c 6f 62 28 31 30 30 29 3b 0a 20 20 7d 0a 0a 20  lob(100);.  }.. 
5cf0: 20 23 20 41 66 74 65 72 20 65 78 65 63 75 74 69   # After executi
5d00: 6e 67 20 74 68 65 20 22 50 52 41 47 4d 41 20 77  ng the "PRAGMA w
5d10: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20  al_checkpoint", 
5d20: 63 6f 6e 6e 65 63 74 69 6f 6e 20 5b 64 62 5d 20  connection [db] 
5d30: 77 61 73 20 62 65 69 6e 67 0a 20 20 23 20 6c 65  was being.  # le
5d40: 66 74 20 77 69 74 68 20 61 6e 20 69 6e 63 6f 6e  ft with an incon
5d50: 73 69 73 74 65 6e 74 20 63 61 63 68 65 2e 20 52  sistent cache. R
5d60: 75 6e 6e 69 6e 67 20 74 68 65 20 43 52 45 41 54  unning the CREAT
5d70: 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
5d80: 74 0a 20 20 23 20 69 6e 20 74 68 69 73 20 73 74  t.  # in this st
5d90: 61 74 65 20 6c 65 64 20 74 6f 20 64 61 74 61 62  ate led to datab
5da0: 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
5db0: 20 20 63 61 74 63 68 73 71 6c 20 7b 20 0a 20 20    catchsql { .  
5dc0: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
5dd0: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 43 52 45  ckpoint;.    CRE
5de0: 41 54 45 20 49 4e 44 45 58 20 69 31 20 6f 6e 20  ATE INDEX i1 on 
5df0: 74 31 28 62 29 3b 0a 20 20 7d 0a 20 20 20 0a 20  t1(b);.  }.   . 
5e00: 20 64 62 32 20 65 76 61 6c 20 7b 20 50 52 41 47   db2 eval { PRAG
5e10: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
5e20: 63 6b 20 7d 0a 7d 20 7b 6f 6b 7d 0a 0a 63 61 74  ck }.} {ok}..cat
5e30: 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d 0a  ch { db close }.
5e40: 63 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73  catch { db2 clos
5e50: 65 20 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  e }..#----------
5e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5ea0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
5eb0: 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74 73 20 2d  block of tests -
5ec0: 20 77 61 6c 2d 31 35 2e 2a 20 2d 20 66 6f 63 75   wal-15.* - focu
5ed0: 73 20 6f 6e 20 74 65 73 74 69 6e 67 20 74 68 65  s on testing the
5ee0: 20 0a 23 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   .# implementati
5ef0: 6f 6e 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65  on of the sqlite
5f00: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
5f10: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 23 0a  () interface..#.
5f20: 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73 74  forcedelete test
5f30: 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a  .db test.db-wal.
5f40: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
5f50: 64 62 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  db.do_test wal-1
5f60: 35 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  5.1 {.  execsql 
5f70: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
5f80: 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20  o_vacuum = 0;.  
5f90: 20 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69    PRAGMA page_si
5fa0: 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20 50  ze = 1024;.    P
5fb0: 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  RAGMA journal_mo
5fc0: 64 65 20 3d 20 57 41 4c 3b 0a 20 20 7d 0a 20 20  de = WAL;.  }.  
5fd0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52  execsql {.    CR
5fe0: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
5ff0: 20 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   b);.    INSERT 
6000: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31  INTO t1 VALUES(1
6010: 2c 20 32 29 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a  , 2);.  }.} {}..
6020: 23 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 65  # Test that an e
6030: 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
6040: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
6050: 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 72 65 63   name is not rec
6060: 6f 67 6e 69 7a 65 64 0a 23 0a 64 6f 5f 74 65 73  ognized.#.do_tes
6070: 74 20 77 61 6c 2d 31 35 2e 32 2e 31 20 7b 0a 20  t wal-15.2.1 {. 
6080: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
6090: 63 6b 70 6f 69 6e 74 20 64 62 20 61 75 78 0a 7d  ckpoint db aux.}
60a0: 20 7b 53 51 4c 49 54 45 5f 45 52 52 4f 52 7d 0a   {SQLITE_ERROR}.
60b0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 32  do_test wal-15.2
60c0: 2e 32 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .2 {.  sqlite3_e
60d0: 72 72 63 6f 64 65 20 64 62 0a 7d 20 7b 53 51 4c  rrcode db.} {SQL
60e0: 49 54 45 5f 45 52 52 4f 52 7d 0a 64 6f 5f 74 65  ITE_ERROR}.do_te
60f0: 73 74 20 77 61 6c 2d 31 35 2e 32 2e 33 20 7b 0a  st wal-15.2.3 {.
6100: 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
6110: 20 64 62 0a 7d 20 7b 75 6e 6b 6e 6f 77 6e 20 64   db.} {unknown d
6120: 61 74 61 62 61 73 65 3a 20 61 75 78 7d 0a 0a 23  atabase: aux}..#
6130: 20 54 65 73 74 20 74 68 61 74 20 61 6e 20 65 72   Test that an er
6140: 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
6150: 69 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  if an attempt is
6160: 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
6170: 69 6e 74 0a 23 20 69 66 20 61 20 74 72 61 6e 73  int.# if a trans
6180: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
6190: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
61a0: 23 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  #.do_test wal-15
61b0: 2e 33 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c  .3.1 {.  execsql
61c0: 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20   {.    BEGIN;.  
61d0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
61e0: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a 20   VALUES(3, 4);. 
61f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c   }.  sqlite3_wal
6200: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 6d  _checkpoint db m
6210: 61 69 6e 0a 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f  ain.} {SQLITE_LO
6220: 43 4b 45 44 7d 0a 64 6f 5f 74 65 73 74 20 77 61  CKED}.do_test wa
6230: 6c 2d 31 35 2e 33 2e 32 20 7b 0a 20 20 73 71 6c  l-15.3.2 {.  sql
6240: 69 74 65 33 5f 65 72 72 63 6f 64 65 20 64 62 0a  ite3_errcode db.
6250: 7d 20 7b 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  } {SQLITE_LOCKED
6260: 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35  }.do_test wal-15
6270: 2e 33 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33  .3.3 {.  sqlite3
6280: 5f 65 72 72 6d 73 67 20 64 62 0a 7d 20 7b 64 61  _errmsg db.} {da
6290: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
62a0: 6c 6f 63 6b 65 64 7d 0a 0a 23 20 45 61 72 6c 69  locked}..# Earli
62b0: 65 72 20 76 65 72 73 69 6f 6e 73 20 72 65 74 75  er versions retu
62c0: 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20 69 73  rned an error is
62d0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
62e0: 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 0a 23   db cannot be .#
62f0: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 62 65   checkpointed be
6300: 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 73 20 68  cause of locks h
6310: 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 63  eld by another c
6320: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 68 65 63 6b  onnection. Check
6330: 20 74 68 61 74 0a 23 20 74 68 69 73 20 69 73 20   that.# this is 
6340: 6e 6f 20 6c 6f 6e 67 65 72 20 74 68 65 20 63 61  no longer the ca
6350: 73 65 2e 0a 23 0a 73 71 6c 69 74 65 33 20 64 62  se..#.sqlite3 db
6360: 32 20 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73  2 test.db.do_tes
6370: 74 20 77 61 6c 2d 31 35 2e 34 2e 31 20 7b 0a 20  t wal-15.4.1 {. 
6380: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 42   execsql {.    B
6390: 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54  EGIN;.    SELECT
63a0: 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 7d 20   * FROM t1;.  } 
63b0: 64 62 32 0a 7d 20 7b 31 20 32 7d 0a 64 6f 5f 74  db2.} {1 2}.do_t
63c0: 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e 32 20 7b  est wal-15.4.2 {
63d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d  .  execsql { COM
63e0: 4d 49 54 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  MIT }.  sqlite3_
63f0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64  wal_checkpoint d
6400: 62 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a  b.} {SQLITE_OK}.
6410: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34  do_test wal-15.4
6420: 2e 33 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65  .3 {.  sqlite3_e
6430: 72 72 6d 73 67 20 64 62 0a 7d 20 7b 6e 6f 74 20  rrmsg db.} {not 
6440: 61 6e 20 65 72 72 6f 72 7d 0a 0a 23 20 41 66 74  an error}..# Aft
6450: 65 72 20 5b 64 62 32 5d 20 64 72 6f 70 73 20 69  er [db2] drops i
6460: 74 73 20 6c 6f 63 6b 2c 20 5b 64 62 5d 20 6d 61  ts lock, [db] ma
6470: 79 20 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65  y checkpoint the
6480: 20 64 62 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 77   db..#.do_test w
6490: 61 6c 2d 31 35 2e 34 2e 34 20 7b 0a 20 20 65 78  al-15.4.4 {.  ex
64a0: 65 63 73 71 6c 20 7b 20 43 4f 4d 4d 49 54 20 7d  ecsql { COMMIT }
64b0: 20 64 62 32 0a 20 20 73 71 6c 69 74 65 33 5f 77   db2.  sqlite3_w
64c0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
64d0: 0a 7d 20 7b 53 51 4c 49 54 45 5f 4f 4b 7d 0a 64  .} {SQLITE_OK}.d
64e0: 6f 5f 74 65 73 74 20 77 61 6c 2d 31 35 2e 34 2e  o_test wal-15.4.
64f0: 35 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 65 72  5 {.  sqlite3_er
6500: 72 6d 73 67 20 64 62 0a 7d 20 7b 6e 6f 74 20 61  rmsg db.} {not a
6510: 6e 20 65 72 72 6f 72 7d 0a 64 6f 5f 74 65 73 74  n error}.do_test
6520: 20 77 61 6c 2d 31 35 2e 34 2e 36 20 7b 0a 20 20   wal-15.4.6 {.  
6530: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
6540: 62 0a 7d 20 5b 65 78 70 72 20 31 30 32 34 2a 32  b.} [expr 1024*2
6550: 5d 0a 0a 63 61 74 63 68 20 7b 20 64 62 32 20 63  ]..catch { db2 c
6560: 6c 6f 73 65 20 7d 0a 63 61 74 63 68 20 7b 20 64  lose }.catch { d
6570: 62 20 63 6c 6f 73 65 20 7d 0a 0a 23 2d 2d 2d 2d  b close }..#----
6580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65c0: 2d 2d 2d 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c  -----.# The foll
65d0: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74  owing block of t
65e0: 65 73 74 73 20 2d 20 77 61 6c 2d 31 36 2e 2a 20  ests - wal-16.* 
65f0: 2d 20 74 65 73 74 20 74 68 61 74 20 69 66 20 61  - test that if a
6600: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72   NULL pointer or
6610: 0a 23 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  .# an empty stri
6620: 6e 67 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ng is passed as 
6630: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6640: 65 6e 74 20 6f 66 20 74 68 65 20 77 61 6c 5f 63  ent of the wal_c
6650: 68 65 63 6b 70 6f 69 6e 74 28 29 0a 23 20 41 50  heckpoint().# AP
6660: 49 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  I, an attempt is
6670: 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f   made to checkpo
6680: 69 6e 74 20 61 6c 6c 20 61 74 74 61 63 68 65 64  int all attached
6690: 20 64 61 74 61 62 61 73 65 73 2e 0a 23 0a 66 6f   databases..#.fo
66a0: 72 65 61 63 68 20 7b 74 6e 20 63 6b 70 74 5f 63  reach {tn ckpt_c
66b0: 6d 64 20 63 6b 70 74 5f 72 65 73 20 63 6b 70 74  md ckpt_res ckpt
66c0: 5f 6d 61 69 6e 20 63 6b 70 74 5f 61 75 78 7d 20  _main ckpt_aux} 
66d0: 7b 0a 20 20 31 20 7b 73 71 6c 69 74 65 33 5f 77  {.  1 {sqlite3_w
66e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
66f0: 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  }              S
6700: 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20 31  QLITE_OK     1 1
6710: 0a 20 20 32 20 7b 73 71 6c 69 74 65 33 5f 77 61  .  2 {sqlite3_wa
6720: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  l_checkpoint db 
6730: 22 22 7d 20 20 20 20 20 20 20 20 20 20 20 53 51  ""}           SQ
6740: 4c 49 54 45 5f 4f 4b 20 20 20 20 20 31 20 31 0a  LITE_OK     1 1.
6750: 20 20 33 20 7b 64 62 20 65 76 61 6c 20 22 50 52    3 {db eval "PR
6760: 41 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f  AGMA wal_checkpo
6770: 69 6e 74 22 7d 20 20 20 20 20 20 20 20 7b 30 20  int"}        {0 
6780: 31 30 20 31 30 7d 20 20 20 20 20 31 20 31 0a 0a  10 10}     1 1..
6790: 20 20 34 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c    4 {sqlite3_wal
67a0: 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 6d  _checkpoint db m
67b0: 61 69 6e 7d 20 20 20 20 20 20 20 20 20 53 51 4c  ain}         SQL
67c0: 49 54 45 5f 4f 4b 20 20 20 20 20 31 20 30 0a 20  ITE_OK     1 0. 
67d0: 20 35 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f   5 {sqlite3_wal_
67e0: 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 61 75  checkpoint db au
67f0: 78 7d 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  x}          SQLI
6800: 54 45 5f 4f 4b 20 20 20 20 20 30 20 31 0a 20 20  TE_OK     0 1.  
6810: 36 20 7b 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  6 {sqlite3_wal_c
6820: 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 74 65 6d  heckpoint db tem
6830: 70 7d 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  p}         SQLIT
6840: 45 5f 4f 4b 20 20 20 20 20 30 20 30 0a 20 20 37  E_OK     0 0.  7
6850: 20 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d   {db eval "PRAGM
6860: 41 20 6d 61 69 6e 2e 77 61 6c 5f 63 68 65 63 6b  A main.wal_check
6870: 70 6f 69 6e 74 22 7d 20 20 20 7b 30 20 31 30 20  point"}   {0 10 
6880: 31 30 7d 20 20 20 20 20 31 20 30 0a 20 20 38 20  10}     1 0.  8 
6890: 7b 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41  {db eval "PRAGMA
68a0: 20 61 75 78 2e 77 61 6c 5f 63 68 65 63 6b 70 6f   aux.wal_checkpo
68b0: 69 6e 74 22 7d 20 20 20 20 7b 30 20 31 33 20 31  int"}    {0 13 1
68c0: 33 7d 20 20 20 20 20 30 20 31 0a 20 20 39 20 7b  3}     0 1.  9 {
68d0: 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20  db eval "PRAGMA 
68e0: 74 65 6d 70 2e 77 61 6c 5f 63 68 65 63 6b 70 6f  temp.wal_checkpo
68f0: 69 6e 74 22 7d 20 20 20 7b 30 20 2d 31 20 2d 31  int"}   {0 -1 -1
6900: 7d 20 20 20 20 20 30 20 30 0a 7d 20 7b 0a 20 20  }     0 0.} {.  
6910: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24  do_test wal-16.$
6920: 74 6e 2e 31 20 7b 0a 20 20 20 20 66 6f 72 63 65  tn.1 {.    force
6930: 64 65 6c 65 74 65 20 74 65 73 74 32 2e 64 62 20  delete test2.db 
6940: 74 65 73 74 32 2e 64 62 2d 77 61 6c 20 74 65 73  test2.db-wal tes
6950: 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20  t2.db-journal.  
6960: 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65    forcedelete te
6970: 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61  st.db test.db-wa
6980: 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61  l test.db-journa
6990: 6c 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 20 64  l..    sqlite3 d
69a0: 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 65 78  b test.db.    ex
69b0: 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 41 54  ecsql {.      AT
69c0: 54 41 43 48 20 27 74 65 73 74 32 2e 64 62 27 20  TACH 'test2.db' 
69d0: 41 53 20 61 75 78 3b 0a 20 20 20 20 20 20 50 52  AS aux;.      PR
69e0: 41 47 4d 41 20 6d 61 69 6e 2e 61 75 74 6f 5f 76  AGMA main.auto_v
69f0: 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20  acuum = 0;.     
6a00: 20 50 52 41 47 4d 41 20 61 75 78 2e 61 75 74 6f   PRAGMA aux.auto
6a10: 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 20  _vacuum = 0;.   
6a20: 20 20 20 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a     PRAGMA main.j
6a30: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
6a40: 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  L;.      PRAGMA 
6a50: 61 75 78 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  aux.journal_mode
6a60: 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20 20 50 52   = WAL;.      PR
6a70: 41 47 4d 41 20 6d 61 69 6e 2e 73 79 6e 63 68 72  AGMA main.synchr
6a80: 6f 6e 6f 75 73 20 3d 20 4e 4f 52 4d 41 4c 3b 0a  onous = NORMAL;.
6a90: 20 20 20 20 20 20 50 52 41 47 4d 41 20 61 75 78        PRAGMA aux
6aa0: 2e 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4e  .synchronous = N
6ab0: 4f 52 4d 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  ORMAL;.    }.  }
6ac0: 20 7b 77 61 6c 20 77 61 6c 7d 0a 0a 20 20 64 6f   {wal wal}..  do
6ad0: 5f 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e  _test wal-16.$tn
6ae0: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
6af0: 20 7b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20   {.      CREATE 
6b00: 54 41 42 4c 45 20 6d 61 69 6e 2e 74 31 28 61 2c  TABLE main.t1(a,
6b10: 20 62 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28   b, PRIMARY KEY(
6b20: 61 2c 20 62 29 29 3b 0a 20 20 20 20 20 20 43 52  a, b));.      CR
6b30: 45 41 54 45 20 54 41 42 4c 45 20 61 75 78 2e 74  EATE TABLE aux.t
6b40: 32 28 61 2c 20 62 2c 20 50 52 49 4d 41 52 59 20  2(a, b, PRIMARY 
6b50: 4b 45 59 28 61 2c 20 62 29 29 3b 0a 0a 20 20 20  KEY(a, b));..   
6b60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
6b70: 32 20 56 41 4c 55 45 53 28 31 2c 20 72 61 6e 64  2 VALUES(1, rand
6b80: 6f 6d 62 6c 6f 62 28 31 30 30 30 29 29 3b 0a 20  omblob(1000));. 
6b90: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
6ba0: 20 74 32 20 56 41 4c 55 45 53 28 32 2c 20 72 61   t2 VALUES(2, ra
6bb0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 30 29 29 3b  ndomblob(1000));
6bc0: 0a 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e  .      INSERT IN
6bd0: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
6be0: 52 4f 4d 20 74 32 3b 0a 20 20 20 20 7d 0a 20 20  ROM t2;.    }.  
6bf0: 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  .    list [file 
6c00: 73 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66  size test.db] [f
6c10: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
6c20: 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20  -wal].  } [list 
6c30: 5b 65 78 70 72 20 31 2a 31 30 32 34 5d 20 5b 77  [expr 1*1024] [w
6c40: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 30 20  al_file_size 10 
6c50: 31 30 32 34 5d 5d 0a 20 20 64 6f 5f 74 65 73 74  1024]].  do_test
6c60: 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 33 20 7b 0a   wal-16.$tn.3 {.
6c70: 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73      list [file s
6c80: 69 7a 65 20 74 65 73 74 32 2e 64 62 5d 20 5b 66  ize test2.db] [f
6c90: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64  ile size test2.d
6ca0: 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74  b-wal].  } [list
6cb0: 20 5b 65 78 70 72 20 31 2a 31 30 32 34 5d 20 5b   [expr 1*1024] [
6cc0: 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 33  wal_file_size 13
6cd0: 20 31 30 32 34 5d 5d 0a 20 20 0a 20 20 64 6f 5f   1024]].  .  do_
6ce0: 74 65 73 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e  test wal-16.$tn.
6cf0: 34 20 5b 6c 69 73 74 20 65 76 61 6c 20 24 63 6b  4 [list eval $ck
6d00: 70 74 5f 63 6d 64 5d 20 24 63 6b 70 74 5f 72 65  pt_cmd] $ckpt_re
6d10: 73 0a 20 20 0a 20 20 64 6f 5f 74 65 73 74 20 77  s.  .  do_test w
6d20: 61 6c 2d 31 36 2e 24 74 6e 2e 35 20 7b 0a 20 20  al-16.$tn.5 {.  
6d30: 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69 7a    list [file siz
6d40: 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65  e test.db] [file
6d50: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61   size test.db-wa
6d60: 6c 5d 0a 20 20 7d 20 5b 6c 69 73 74 20 5b 65 78  l].  } [list [ex
6d70: 70 72 20 28 24 63 6b 70 74 5f 6d 61 69 6e 20 3f  pr ($ckpt_main ?
6d80: 20 37 20 3a 20 31 29 2a 31 30 32 34 5d 20 5b 77   7 : 1)*1024] [w
6d90: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 30 20  al_file_size 10 
6da0: 31 30 32 34 5d 5d 0a 0a 20 20 64 6f 5f 74 65 73  1024]]..  do_tes
6db0: 74 20 77 61 6c 2d 31 36 2e 24 74 6e 2e 36 20 7b  t wal-16.$tn.6 {
6dc0: 0a 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20  .    list [file 
6dd0: 73 69 7a 65 20 74 65 73 74 32 2e 64 62 5d 20 5b  size test2.db] [
6de0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e  file size test2.
6df0: 64 62 2d 77 61 6c 5d 0a 20 20 7d 20 5b 6c 69 73  db-wal].  } [lis
6e00: 74 20 5b 65 78 70 72 20 28 24 63 6b 70 74 5f 61  t [expr ($ckpt_a
6e10: 75 78 20 3f 20 37 20 3a 20 31 29 2a 31 30 32 34  ux ? 7 : 1)*1024
6e20: 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65  ] [wal_file_size
6e30: 20 31 33 20 31 30 32 34 5d 5d 0a 0a 20 20 63 61   13 1024]]..  ca
6e40: 74 63 68 20 7b 20 64 62 20 63 6c 6f 73 65 20 7d  tch { db close }
6e50: 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..#-----------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
6ea0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
6eb0: 65 73 74 73 20 2d 20 77 61 6c 2d 31 37 2e 2a 20  ests - wal-17.* 
6ec0: 2d 20 61 74 74 65 6d 70 74 20 74 6f 20 76 65 72  - attempt to ver
6ed0: 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f 72  ify that the cor
6ee0: 72 65 63 74 0a 23 20 6e 75 6d 62 65 72 20 6f 66  rect.# number of
6ef0: 20 22 70 61 64 64 69 6e 67 22 20 66 72 61 6d 65   "padding" frame
6f00: 73 20 61 72 65 20 61 70 70 65 6e 64 65 64 20 74  s are appended t
6f10: 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77  o the log file w
6f20: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
6f30: 6e 0a 23 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  n.# is committed
6f40: 20 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d   in synchronous=
6f50: 46 55 4c 4c 20 6d 6f 64 65 2e 0a 23 20 0a 23 20  FULL mode..# .# 
6f60: 44 6f 20 74 68 69 73 20 62 79 20 63 72 65 61 74  Do this by creat
6f70: 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 74  ing a database t
6f80: 68 61 74 20 75 73 65 73 20 35 31 32 20 62 79 74  hat uses 512 byt
6f90: 65 20 70 61 67 65 73 2e 20 54 68 65 6e 20 77 72  e pages. Then wr
6fa0: 69 74 69 6e 67 0a 23 20 61 20 74 72 61 6e 73 61  iting.# a transa
6fb0: 63 74 69 6f 6e 20 74 68 61 74 20 6d 6f 64 69 66  ction that modif
6fc0: 69 65 73 20 31 37 31 20 70 61 67 65 73 2e 20 49  ies 171 pages. I
6fd0: 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4e 4f  n synchronous=NO
6fe0: 52 4d 41 4c 20 6d 6f 64 65 2c 20 74 68 69 73 0a  RMAL mode, this.
6ff0: 23 20 70 72 6f 64 75 63 65 73 20 61 20 6c 6f 67  # produces a log
7000: 20 66 69 6c 65 20 6f 66 3a 0a 23 0a 23 20 20 20   file of:.#.#   
7010: 33 32 20 2b 20 28 32 34 2b 35 31 32 29 2a 31 37  32 + (24+512)*17
7020: 31 20 3d 20 39 30 33 31 32 20 62 79 74 65 73 2e  1 = 90312 bytes.
7030: 0a 23 0a 23 20 53 6c 69 67 68 74 6c 79 20 6c 61  .#.# Slightly la
7040: 72 67 65 72 20 74 68 61 6e 20 31 31 2a 38 31 39  rger than 11*819
7050: 32 20 3d 20 39 30 31 31 32 20 62 79 74 65 73 2e  2 = 90112 bytes.
7060: 0a 23 0a 23 20 52 75 6e 20 74 68 65 20 74 65 73  .#.# Run the tes
7070: 74 20 75 73 69 6e 67 20 76 61 72 69 6f 75 73 20  t using various 
7080: 64 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72  different sector
7090: 2d 73 69 7a 65 73 2e 20 49 6e 20 65 61 63 68 20  -sizes. In each 
70a0: 63 61 73 65 2c 20 74 68 65 0a 23 20 57 41 4c 20  case, the.# WAL 
70b0: 63 6f 64 65 20 73 68 6f 75 6c 64 20 77 72 69 74  code should writ
70c0: 65 20 74 68 65 20 39 30 33 30 30 20 62 79 74 65  e the 90300 byte
70d0: 73 20 6f 66 20 6c 6f 67 20 66 69 6c 65 20 63 6f  s of log file co
70e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 0a 23 20  ntaining the .# 
70f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
7100: 6e 20 61 70 70 65 6e 64 20 61 73 20 6d 61 79 20  n append as may 
7110: 66 72 61 6d 65 73 20 61 73 20 61 72 65 20 72 65  frames as are re
7120: 71 75 69 72 65 64 20 74 6f 20 65 78 74 65 6e 64  quired to extend
7130: 20 74 68 65 0a 23 20 6c 6f 67 20 66 69 6c 65 20   the.# log file 
7140: 73 6f 20 74 68 61 74 20 6e 6f 20 70 61 72 74 20  so that no part 
7150: 6f 66 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  of the next tran
7160: 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
7170: 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 23 20 61  written into.# a
7180: 20 64 69 73 6b 2d 73 65 63 74 6f 72 20 75 73 65   disk-sector use
7190: 64 20 62 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  d by transaction
71a0: 20 6a 75 73 74 20 63 6f 6d 6d 69 74 74 65 64 2e   just committed.
71b0: 0a 23 0a 73 65 74 20 6f 6c 64 5f 70 65 6e 64 69  .#.set old_pendi
71c0: 6e 67 5f 62 79 74 65 20 5b 73 71 6c 69 74 65 33  ng_byte [sqlite3
71d0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f 70 65  _test_control_pe
71e0: 6e 64 69 6e 67 5f 62 79 74 65 20 30 78 31 30 30  nding_byte 0x100
71f0: 30 30 30 30 30 5d 0a 63 61 74 63 68 20 7b 20 64  00000].catch { d
7200: 62 20 63 6c 6f 73 65 20 7d 0a 66 6f 72 65 61 63  b close }.foreac
7210: 68 20 7b 74 6e 20 73 65 63 74 6f 72 73 69 7a 65  h {tn sectorsize
7220: 20 6c 6f 67 73 69 7a 65 7d 20 22 0a 20 20 31 20   logsize} ".  1 
7230: 20 20 31 32 38 20 20 5b 77 61 6c 5f 66 69 6c 65    128  [wal_file
7240: 5f 73 69 7a 65 20 31 37 32 20 35 31 32 5d 0a 20  _size 172 512]. 
7250: 20 32 20 20 20 32 35 36 20 20 5b 77 61 6c 5f 66   2   256  [wal_f
7260: 69 6c 65 5f 73 69 7a 65 20 31 37 32 20 35 31 32  ile_size 172 512
7270: 5d 0a 20 20 33 20 20 20 35 31 32 20 20 5b 77 61  ].  3   512  [wa
7280: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 37 32 20  l_file_size 172 
7290: 35 31 32 5d 20 0a 20 20 34 20 20 31 30 32 34 20  512] .  4  1024 
72a0: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
72b0: 31 37 32 20 35 31 32 5d 0a 20 20 35 20 20 32 30  172 512].  5  20
72c0: 34 38 20 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69  48  [wal_file_si
72d0: 7a 65 20 31 37 32 20 35 31 32 5d 0a 20 20 36 20  ze 172 512].  6 
72e0: 20 34 30 39 36 20 20 5b 77 61 6c 5f 66 69 6c 65   4096  [wal_file
72f0: 5f 73 69 7a 65 20 31 37 36 20 35 31 32 5d 0a 20  _size 176 512]. 
7300: 20 37 20 20 38 31 39 32 20 20 5b 77 61 6c 5f 66   7  8192  [wal_f
7310: 69 6c 65 5f 73 69 7a 65 20 31 38 34 20 35 31 32  ile_size 184 512
7320: 5d 0a 22 20 7b 0a 20 20 66 6f 72 63 65 64 65 6c  ]." {.  forcedel
7330: 65 74 65 20 74 65 73 74 2e 64 62 20 74 65 73 74  ete test.db test
7340: 2e 64 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d  .db-wal test.db-
7350: 6a 6f 75 72 6e 61 6c 0a 20 20 73 71 6c 69 74 65  journal.  sqlite
7360: 33 5f 73 69 6d 75 6c 61 74 65 5f 64 65 76 69 63  3_simulate_devic
7370: 65 20 2d 73 65 63 74 6f 72 73 69 7a 65 20 24 73  e -sectorsize $s
7380: 65 63 74 6f 72 73 69 7a 65 0a 20 20 73 71 6c 69  ectorsize.  sqli
7390: 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 20 2d  te3 db test.db -
73a0: 76 66 73 20 64 65 76 73 79 6d 0a 0a 20 20 64 6f  vfs devsym..  do
73b0: 5f 74 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e  _test wal-17.$tn
73c0: 2e 31 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .1 {.    execsql
73d0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
73e0: 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b  auto_vacuum = 0;
73f0: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 70 61  .      PRAGMA pa
7400: 67 65 5f 73 69 7a 65 20 3d 20 35 31 32 3b 0a 20  ge_size = 512;. 
7410: 20 20 20 20 20 50 52 41 47 4d 41 20 63 61 63 68       PRAGMA cach
7420: 65 5f 73 69 7a 65 20 3d 20 2d 32 30 30 30 3b 0a  e_size = -2000;.
7430: 20 20 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75        PRAGMA jou
7440: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
7450: 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20 73 79  .      PRAGMA sy
7460: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c 4c  nchronous = FULL
7470: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63  ;.    }.    exec
7480: 73 71 6c 20 7b 0a 20 20 20 20 20 20 42 45 47 49  sql {.      BEGI
7490: 4e 3b 0a 20 20 20 20 20 20 43 52 45 41 54 45 20  N;.      CREATE 
74a0: 54 41 42 4c 45 20 74 28 78 29 3b 0a 20 20 20 20  TABLE t(x);.    
74b0: 7d 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69  }.    for {set i
74c0: 20 30 7d 20 7b 24 69 3c 31 36 36 7d 20 7b 69 6e   0} {$i<166} {in
74d0: 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 65 78  cr i} {.      ex
74e0: 65 63 73 71 6c 20 7b 20 49 4e 53 45 52 54 20 49  ecsql { INSERT I
74f0: 4e 54 4f 20 74 20 56 41 4c 55 45 53 28 72 61 6e  NTO t VALUES(ran
7500: 64 6f 6d 62 6c 6f 62 28 34 30 30 29 29 20 7d 0a  domblob(400)) }.
7510: 20 20 20 20 7d 0a 20 20 20 20 65 78 65 63 73 71      }.    execsq
7520: 6c 20 43 4f 4d 4d 49 54 0a 0a 20 20 20 20 66 69  l COMMIT..    fi
7530: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
7540: 77 61 6c 0a 20 20 7d 20 24 6c 6f 67 73 69 7a 65  wal.  } $logsize
7550: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  ..  do_test wal-
7560: 31 37 2e 24 74 6e 2e 32 20 7b 0a 20 20 20 20 66  17.$tn.2 {.    f
7570: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
7580: 0a 20 20 7d 20 35 31 32 0a 0a 20 20 64 6f 5f 74  .  } 512..  do_t
7590: 65 73 74 20 77 61 6c 2d 31 37 2e 24 74 6e 2e 33  est wal-17.$tn.3
75a0: 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a   {.    db close.
75b0: 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65      file size te
75c0: 73 74 2e 64 62 0a 20 20 7d 20 5b 65 78 70 72 20  st.db.  } [expr 
75d0: 35 31 32 2a 31 37 31 5d 0a 7d 0a 73 71 6c 69 74  512*171].}.sqlit
75e0: 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 5f  e3_test_control_
75f0: 70 65 6e 64 69 6e 67 5f 62 79 74 65 20 24 6f 6c  pending_byte $ol
7600: 64 5f 70 65 6e 64 69 6e 67 5f 62 79 74 65 0a 0a  d_pending_byte..
7610: 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  #---------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 54 68 69  ----------.# Thi
7660: 73 20 74 65 73 74 20 2d 20 77 61 6c 2d 31 38 2e  s test - wal-18.
7670: 2a 20 2d 20 76 65 72 69 66 69 65 73 20 61 20 63  * - verifies a c
7680: 6f 75 70 6c 65 20 6f 66 20 73 70 65 63 69 66 69  ouple of specifi
7690: 63 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  c conditions tha
76a0: 74 0a 23 20 6d 61 79 20 62 65 20 65 6e 63 6f 75  t.# may be encou
76b0: 6e 74 65 72 65 64 20 77 68 69 6c 65 20 72 65 63  ntered while rec
76c0: 6f 76 65 72 69 6e 67 20 61 20 6c 6f 67 20 66 69  overing a log fi
76d0: 6c 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 63  le are handled c
76e0: 6f 72 72 65 63 74 6c 79 3a 0a 23 0a 23 20 20 20  orrectly:.#.#   
76f0: 77 61 6c 2d 31 38 2e 31 2e 2a 20 57 68 65 6e 20  wal-18.1.* When 
7700: 74 68 65 20 66 69 72 73 74 20 33 32 2d 62 69 74  the first 32-bit
7710: 73 20 6f 66 20 61 20 66 72 61 6d 65 20 63 68 65  s of a frame che
7720: 63 6b 73 75 6d 20 69 73 20 63 6f 72 72 65 63 74  cksum is correct
7730: 20 62 75 74 20 0a 23 20 20 20 20 20 20 20 20 20   but .#         
7740: 20 20 20 20 20 74 68 65 20 73 65 63 6f 6e 64 20       the second 
7750: 33 32 2d 62 69 74 73 20 61 72 65 20 66 61 6c 73  32-bits are fals
7760: 65 2c 20 61 6e 64 0a 23 0a 23 20 20 20 77 61 6c  e, and.#.#   wal
7770: 2d 31 38 2e 32 2e 2a 20 57 68 65 6e 20 74 68 65  -18.2.* When the
7780: 20 70 61 67 65 2d 73 69 7a 65 20 66 69 65 6c 64   page-size field
7790: 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
77a0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 6c  the start of a l
77b0: 6f 67 0a 23 20 20 20 20 20 20 20 20 20 20 20 20  og.#            
77c0: 20 20 66 69 6c 65 20 69 73 20 61 20 70 6f 77 65    file is a powe
77d0: 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
77e0: 68 61 6e 20 31 36 33 38 34 20 6f 72 20 73 6d 61  han 16384 or sma
77f0: 6c 6c 65 72 20 74 68 61 6e 20 35 31 32 2e 0a 23  ller than 512..#
7800: 0a 66 6f 72 63 65 64 65 6c 65 74 65 20 74 65 73  .forcedelete tes
7810: 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77 61 6c  t.db test.db-wal
7820: 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e 61 6c   test.db-journal
7830: 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e  .do_test wal-18.
7840: 30 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 64 62  0 {.  sqlite3 db
7850: 20 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73   test.db.  execs
7860: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
7870: 70 61 67 65 5f 73 69 7a 65 20 3d 20 31 30 32 34  page_size = 1024
7880: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  ;.    PRAGMA aut
7890: 6f 5f 76 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20  o_vacuum = 0;.  
78a0: 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c    PRAGMA journal
78b0: 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20  _mode = WAL;.   
78c0: 20 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e   PRAGMA synchron
78d0: 6f 75 73 20 3d 20 4f 46 46 3b 0a 0a 20 20 20 20  ous = OFF;..    
78e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
78f0: 61 2c 20 62 2c 20 55 4e 49 51 55 45 28 61 2c 20  a, b, UNIQUE(a, 
7900: 62 29 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20  b));.    INSERT 
7910: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 30  INTO t1 VALUES(0
7920: 2c 20 30 29 3b 0a 20 20 20 20 50 52 41 47 4d 41  , 0);.    PRAGMA
7930: 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 3b   wal_checkpoint;
7940: 0a 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
7950: 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c 20 32  O t1 VALUES(1, 2
7960: 29 3b 20 20 20 20 20 20 20 20 20 20 2d 2d 20 66  );          -- f
7970: 72 61 6d 65 73 20 31 20 61 6e 64 20 32 0a 20 20  rames 1 and 2.  
7980: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
7990: 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 20 20   VALUES(3, 4);  
79a0: 20 20 20 20 20 20 20 20 2d 2d 20 66 72 61 6d 65          -- frame
79b0: 73 20 33 20 61 6e 64 20 34 0a 20 20 20 20 49 4e  s 3 and 4.    IN
79c0: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c  SERT INTO t1 VAL
79d0: 55 45 53 28 35 2c 20 36 29 3b 20 20 20 20 20 20  UES(5, 6);      
79e0: 20 20 20 20 2d 2d 20 66 72 61 6d 65 73 20 35 20      -- frames 5 
79f0: 61 6e 64 20 36 0a 20 20 7d 0a 0a 20 20 66 6f 72  and 6.  }..  for
7a00: 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20 74  cecopy test.db t
7a10: 65 73 74 58 2e 64 62 0a 20 20 66 6f 72 63 65 63  estX.db.  forcec
7a20: 6f 70 79 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  opy test.db-wal 
7a30: 74 65 73 74 58 2e 64 62 2d 77 61 6c 0a 20 20 64  testX.db-wal.  d
7a40: 62 20 63 6c 6f 73 65 0a 20 20 6c 69 73 74 20 5b  b close.  list [
7a50: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 58 2e  file size testX.
7a60: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
7a70: 65 73 74 58 2e 64 62 2d 77 61 6c 5d 0a 7d 20 5b  estX.db-wal].} [
7a80: 6c 69 73 74 20 5b 65 78 70 72 20 33 2a 31 30 32  list [expr 3*102
7a90: 34 5d 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a  4] [wal_file_siz
7aa0: 65 20 36 20 31 30 32 34 5d 5d 0a 0a 75 6e 73 65  e 6 1024]]..unse
7ab0: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6e 46  t -nocomplain nF
7ac0: 72 61 6d 65 20 72 65 73 75 6c 74 0a 66 6f 72 65  rame result.fore
7ad0: 61 63 68 20 7b 6e 46 72 61 6d 65 20 72 65 73 75  ach {nFrame resu
7ae0: 6c 74 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 30  lt} {.         0
7af0: 20 20 20 20 20 20 7b 30 20 30 7d 0a 20 20 20 20        {0 0}.    
7b00: 20 20 20 20 20 31 20 20 20 20 20 20 7b 30 20 30       1      {0 0
7b10: 7d 0a 20 20 20 20 20 20 20 20 20 32 20 20 20 20  }.         2    
7b20: 20 20 7b 30 20 30 20 31 20 32 7d 0a 20 20 20 20    {0 0 1 2}.    
7b30: 20 20 20 20 20 33 20 20 20 20 20 20 7b 30 20 30       3      {0 0
7b40: 20 31 20 32 7d 0a 20 20 20 20 20 20 20 20 20 34   1 2}.         4
7b50: 20 20 20 20 20 20 7b 30 20 30 20 31 20 32 20 33        {0 0 1 2 3
7b60: 20 34 7d 0a 20 20 20 20 20 20 20 20 20 35 20 20   4}.         5  
7b70: 20 20 20 20 7b 30 20 30 20 31 20 32 20 33 20 34      {0 0 1 2 3 4
7b80: 7d 0a 20 20 20 20 20 20 20 20 20 36 20 20 20 20  }.         6    
7b90: 20 20 7b 30 20 30 20 31 20 32 20 33 20 34 20 35    {0 0 1 2 3 4 5
7ba0: 20 36 7d 0a 7d 20 7b 0a 20 20 64 6f 5f 74 65 73   6}.} {.  do_tes
7bb0: 74 20 77 61 6c 2d 31 38 2e 31 2e 24 6e 46 72 61  t wal-18.1.$nFra
7bc0: 6d 65 20 7b 0a 20 20 20 20 66 6f 72 63 65 63 6f  me {.    forceco
7bd0: 70 79 20 74 65 73 74 58 2e 64 62 20 74 65 73 74  py testX.db test
7be0: 2e 64 62 0a 20 20 20 20 66 6f 72 63 65 63 6f 70  .db.    forcecop
7bf0: 79 20 74 65 73 74 58 2e 64 62 2d 77 61 6c 20 74  y testX.db-wal t
7c00: 65 73 74 2e 64 62 2d 77 61 6c 0a 0a 20 20 20 20  est.db-wal..    
7c10: 68 65 78 69 6f 5f 77 72 69 74 65 20 74 65 73 74  hexio_write test
7c20: 2e 64 62 2d 77 61 6c 20 5b 65 78 70 72 20 32 34  .db-wal [expr 24
7c30: 20 2b 20 24 6e 46 72 61 6d 65 2a 28 32 34 2b 31   + $nFrame*(24+1
7c40: 30 32 34 29 20 2b 20 32 30 5d 20 30 30 30 30 30  024) + 20] 00000
7c50: 30 30 30 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  000..    sqlite3
7c60: 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20   db test.db.    
7c70: 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20 20  execsql { .     
7c80: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
7c90: 31 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  1;.      PRAGMA 
7ca0: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 3b  integrity_check;
7cb0: 20 0a 20 20 20 20 7d 0a 20 20 7d 20 5b 63 6f 6e   .    }.  } [con
7cc0: 63 61 74 20 24 72 65 73 75 6c 74 20 6f 6b 5d 0a  cat $result ok].
7cd0: 20 20 64 62 20 63 6c 6f 73 65 0a 7d 20 0a 0a 70    db close.} ..p
7ce0: 72 6f 63 20 72 61 6e 64 6f 6d 62 6c 6f 62 20 7b  roc randomblob {
7cf0: 70 67 73 7a 7d 20 7b 0a 20 20 73 71 6c 69 74 65  pgsz} {.  sqlite
7d00: 33 20 72 62 64 62 20 3a 6d 65 6d 6f 72 79 3a 0a  3 rbdb :memory:.
7d10: 20 20 73 65 74 20 62 6c 6f 62 20 5b 72 62 64 62    set blob [rbdb
7d20: 20 6f 6e 65 20 7b 53 45 4c 45 43 54 20 72 61 6e   one {SELECT ran
7d30: 64 6f 6d 62 6c 6f 62 28 24 70 67 73 7a 29 7d 5d  domblob($pgsz)}]
7d40: 0a 20 20 72 62 64 62 20 63 6c 6f 73 65 0a 20 20  .  rbdb close.  
7d50: 73 65 74 20 62 6c 6f 62 0a 7d 0a 0a 70 72 6f 63  set blob.}..proc
7d60: 20 6c 6f 67 63 6b 73 75 6d 20 7b 63 6b 76 31 20   logcksum {ckv1 
7d70: 63 6b 76 32 20 62 6c 6f 62 7d 20 7b 0a 20 20 75  ckv2 blob} {.  u
7d80: 70 76 61 72 20 24 63 6b 76 31 20 63 31 0a 20 20  pvar $ckv1 c1.  
7d90: 75 70 76 61 72 20 24 63 6b 76 32 20 63 32 0a 0a  upvar $ckv2 c2..
7da0: 20 20 23 20 53 69 6e 63 65 20 74 68 65 20 6d 61    # Since the ma
7db0: 67 69 63 20 6e 75 6d 62 65 72 20 61 74 20 74 68  gic number at th
7dc0: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 2d  e start of the -
7dd0: 77 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 20  wal file header 
7de0: 69 73 0a 20 20 23 20 39 33 31 30 37 31 36 31 38  is.  # 931071618
7df0: 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
7e00: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
7e10: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
7e20: 65 20 72 65 61 64 20 61 73 0a 20 20 23 20 6c 69  e read as.  # li
7e30: 74 74 6c 65 2d 65 6e 64 69 61 6e 2e 0a 20 20 23  ttle-endian..  #
7e40: 20 0a 20 20 73 65 74 20 73 63 61 6e 70 61 74 74   .  set scanpatt
7e50: 65 72 6e 20 69 2a 0a 0a 20 20 62 69 6e 61 72 79  ern i*..  binary
7e60: 20 73 63 61 6e 20 24 62 6c 6f 62 20 24 73 63 61   scan $blob $sca
7e70: 6e 70 61 74 74 65 72 6e 20 76 61 6c 75 65 73 0a  npattern values.
7e80: 20 20 66 6f 72 65 61 63 68 20 7b 76 31 20 76 32    foreach {v1 v2
7e90: 7d 20 24 76 61 6c 75 65 73 20 7b 0a 20 20 20 20  } $values {.    
7ea0: 73 65 74 20 63 31 20 5b 65 78 70 72 20 7b 28 24  set c1 [expr {($
7eb0: 63 31 20 2b 20 24 76 31 20 2b 20 24 63 32 29 26  c1 + $v1 + $c2)&
7ec0: 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20 20  0xFFFFFFFF}].   
7ed0: 20 73 65 74 20 63 32 20 5b 65 78 70 72 20 7b 28   set c2 [expr {(
7ee0: 24 63 32 20 2b 20 24 76 32 20 2b 20 24 63 31 29  $c2 + $v2 + $c1)
7ef0: 26 30 78 46 46 46 46 46 46 46 46 7d 5d 0a 20 20  &0xFFFFFFFF}].  
7f00: 7d 0a 7d 0a 0a 66 6f 72 63 65 63 6f 70 79 20 74  }.}..forcecopy t
7f10: 65 73 74 2e 64 62 20 74 65 73 74 58 2e 64 62 0a  est.db testX.db.
7f20: 66 6f 72 65 61 63 68 20 7b 74 6e 20 70 67 73 7a  foreach {tn pgsz
7f30: 20 77 6f 72 6b 73 7d 20 7b 20 0a 20 20 31 20 20   works} { .  1  
7f40: 20 20 31 32 38 20 20 20 20 30 0a 20 20 32 20 20    128    0.  2  
7f50: 20 20 32 35 36 20 20 20 20 30 0a 20 20 33 20 20    256    0.  3  
7f60: 20 20 35 31 32 20 20 20 20 31 0a 20 20 34 20 20    512    1.  4  
7f70: 20 31 30 32 34 20 20 20 20 31 0a 20 20 35 20 20   1024    1.  5  
7f80: 20 32 30 34 38 20 20 20 20 31 0a 20 20 36 20 20   2048    1.  6  
7f90: 20 34 30 39 36 20 20 20 20 31 0a 20 20 37 20 20   4096    1.  7  
7fa0: 20 38 31 39 32 20 20 20 20 31 0a 20 20 38 20 20   8192    1.  8  
7fb0: 31 36 33 38 34 20 20 20 20 31 0a 20 20 39 20 20  16384    1.  9  
7fc0: 33 32 37 36 38 20 20 20 20 31 0a 20 31 30 20 20  32768    1. 10  
7fd0: 36 35 35 33 36 20 20 20 20 31 0a 20 31 31 20 31  65536    1. 11 1
7fe0: 33 31 30 37 32 20 20 20 20 30 0a 20 31 31 20 20  31072    0. 11  
7ff0: 20 31 30 31 36 20 20 20 20 30 0a 7d 20 7b 0a 0a   1016    0.} {..
8000: 20 20 69 66 20 7b 24 3a 3a 53 51 4c 49 54 45 5f    if {$::SQLITE_
8010: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 3c 20  MAX_PAGE_SIZE < 
8020: 24 70 67 73 7a 7d 20 7b 0a 20 20 20 20 73 65 74  $pgsz} {.    set
8030: 20 77 6f 72 6b 73 20 30 0a 20 20 7d 0a 0a 20 20   works 0.  }..  
8040: 66 6f 72 20 7b 73 65 74 20 70 67 20 31 7d 20 7b  for {set pg 1} {
8050: 24 70 67 20 3c 3d 20 33 7d 20 7b 69 6e 63 72 20  $pg <= 3} {incr 
8060: 70 67 7d 20 7b 0a 20 20 20 20 66 6f 72 63 65 63  pg} {.    forcec
8070: 6f 70 79 20 74 65 73 74 58 2e 64 62 20 74 65 73  opy testX.db tes
8080: 74 2e 64 62 0a 20 20 20 20 66 6f 72 63 65 64 65  t.db.    forcede
8090: 6c 65 74 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  lete test.db-wal
80a0: 0a 20 20 0a 20 20 20 20 23 20 43 68 65 63 6b 20  .  .    # Check 
80b0: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
80c0: 65 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  e now exists and
80d0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 72   consists of thr
80e0: 65 65 20 70 61 67 65 73 2e 20 41 6e 64 0a 20 20  ee pages. And.  
80f0: 20 20 23 20 74 68 61 74 20 74 68 65 72 65 20 69    # that there i
8100: 73 20 6e 6f 20 61 73 73 6f 63 69 61 74 65 64 20  s no associated 
8110: 77 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 23 0a  wal file..    #.
8120: 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d      do_test wal-
8130: 31 38 2e 32 2e 24 74 6e 2e 24 70 67 2e 31 20 7b  18.2.$tn.$pg.1 {
8140: 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65 73   file exists tes
8150: 74 2e 64 62 2d 77 61 6c 20 7d 20 30 0a 20 20 20  t.db-wal } 0.   
8160: 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e   do_test wal-18.
8170: 32 2e 24 74 6e 2e 24 70 67 2e 32 20 7b 20 66 69  2.$tn.$pg.2 { fi
8180: 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e 64  le exists test.d
8190: 62 20 7d 20 31 0a 20 20 20 20 64 6f 5f 74 65 73  b } 1.    do_tes
81a0: 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e 2e 24  t wal-18.2.$tn.$
81b0: 70 67 2e 33 20 7b 20 66 69 6c 65 20 73 69 7a 65  pg.3 { file size
81c0: 20 74 65 73 74 2e 64 62 20 7d 20 5b 65 78 70 72   test.db } [expr
81d0: 20 31 30 32 34 2a 33 5d 0a 20 20 0a 20 20 20 20   1024*3].  .    
81e0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31 38 2e 32  do_test wal-18.2
81f0: 2e 24 74 6e 2e 24 70 67 2e 34 20 7b 0a 0a 20 20  .$tn.$pg.4 {..  
8200: 20 20 20 20 23 20 43 72 65 61 74 65 20 61 20 77      # Create a w
8210: 61 6c 20 66 69 6c 65 20 74 68 61 74 20 63 6f 6e  al file that con
8220: 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66  tains a single f
8230: 72 61 6d 65 20 28 64 61 74 61 62 61 73 65 20 70  rame (database p
8240: 61 67 65 0a 20 20 20 20 20 20 23 20 6e 75 6d 62  age.      # numb
8250: 65 72 20 24 70 67 29 20 77 69 74 68 20 74 68 65  er $pg) with the
8260: 20 63 6f 6d 6d 69 74 20 66 6c 61 67 20 73 65 74   commit flag set
8270: 2e 20 54 68 65 20 66 72 61 6d 65 20 63 68 65 63  . The frame chec
8280: 6b 73 75 6d 20 69 73 0a 20 20 20 20 20 20 23 20  ksum is.      # 
8290: 63 6f 72 72 65 63 74 2c 20 62 75 74 20 74 68 65  correct, but the
82a0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
82b0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 61   database page a
82c0: 72 65 20 63 6f 72 72 75 70 74 2e 0a 20 20 20 20  re corrupt..    
82d0: 20 20 23 0a 20 20 20 20 20 20 23 20 54 68 65 20    #.      # The 
82e0: 70 61 67 65 2d 73 69 7a 65 20 69 6e 20 74 68 65  page-size in the
82f0: 20 6c 6f 67 20 66 69 6c 65 20 68 65 61 64 65 72   log file header
8300: 20 69 73 20 73 65 74 20 74 6f 20 24 70 67 73 7a   is set to $pgsz
8310: 2e 20 49 66 20 74 68 65 0a 20 20 20 20 20 20 23  . If the.      #
8320: 20 57 41 4c 20 63 6f 64 65 20 63 6f 6e 73 69 64   WAL code consid
8330: 65 72 73 20 24 70 67 73 7a 20 74 6f 20 62 65 20  ers $pgsz to be 
8340: 61 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  a valid SQLite d
8350: 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
8360: 65 2d 73 69 7a 65 2c 0a 20 20 20 20 20 20 23 20  e-size,.      # 
8370: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
8380: 6c 20 62 65 20 63 6f 72 72 75 70 74 20 28 62 65  l be corrupt (be
8390: 63 61 75 73 65 20 74 68 65 20 67 61 72 62 61 67  cause the garbag
83a0: 65 20 66 72 61 6d 65 20 63 6f 6e 74 65 6e 74 73  e frame contents
83b0: 0a 20 20 20 20 20 20 23 20 77 69 6c 6c 20 62 65  .      # will be
83c0: 20 74 72 65 61 74 65 64 20 61 73 20 76 61 6c 69   treated as vali
83d0: 64 20 63 6f 6e 74 65 6e 74 29 2e 20 49 66 20 24  d content). If $
83e0: 70 67 73 7a 20 69 73 20 69 6e 76 61 6c 69 64 20  pgsz is invalid 
83f0: 28 74 6f 6f 20 73 6d 61 6c 6c 0a 20 20 20 20 20  (too small.     
8400: 20 23 20 6f 72 20 74 6f 6f 20 6c 61 72 67 65 29   # or too large)
8410: 2c 20 74 68 65 20 64 62 20 77 69 6c 6c 20 6e 6f  , the db will no
8420: 74 20 62 65 20 63 6f 72 72 75 70 74 20 61 73 20  t be corrupt as 
8430: 74 68 65 20 6c 6f 67 20 66 69 6c 65 20 77 69 6c  the log file wil
8440: 6c 0a 20 20 20 20 20 20 23 20 62 65 20 69 67 6e  l.      # be ign
8450: 6f 72 65 64 2e 0a 20 20 20 20 20 20 23 0a 20 20  ored..      #.  
8460: 20 20 20 20 73 65 74 20 77 61 6c 68 64 72 20 5b      set walhdr [
8470: 62 69 6e 61 72 79 20 66 6f 72 6d 61 74 20 49 49  binary format II
8480: 49 49 49 49 20 39 33 31 30 37 31 36 31 38 20 33  IIII 931071618 3
8490: 30 30 37 30 30 30 20 24 70 67 73 7a 20 31 32 33  007000 $pgsz 123
84a0: 34 20 32 32 20 32 33 5d 0a 20 20 20 20 20 20 73  4 22 23].      s
84b0: 65 74 20 66 72 61 6d 65 62 6f 64 79 20 5b 72 61  et framebody [ra
84c0: 6e 64 6f 6d 62 6c 6f 62 20 24 70 67 73 7a 5d 0a  ndomblob $pgsz].
84d0: 20 20 20 20 20 20 73 65 74 20 66 72 61 6d 65 68        set frameh
84e0: 64 72 20 20 5b 62 69 6e 61 72 79 20 66 6f 72 6d  dr  [binary form
84f0: 61 74 20 49 49 49 49 20 24 70 67 20 35 20 32 32  at IIII $pg 5 22
8500: 20 32 33 5d 0a 20 20 20 20 20 20 73 65 74 20 63   23].      set c
8510: 31 20 30 0a 20 20 20 20 20 20 73 65 74 20 63 32  1 0.      set c2
8520: 20 30 0a 20 20 20 20 20 20 6c 6f 67 63 6b 73 75   0.      logcksu
8530: 6d 20 63 31 20 63 32 20 24 77 61 6c 68 64 72 0a  m c1 c2 $walhdr.
8540: 0a 20 20 20 20 20 20 61 70 70 65 6e 64 20 77 61  .      append wa
8550: 6c 68 64 72 20 5b 62 69 6e 61 72 79 20 66 6f 72  lhdr [binary for
8560: 6d 61 74 20 49 49 20 24 63 31 20 24 63 32 5d 0a  mat II $c1 $c2].
8570: 20 20 20 20 20 20 6c 6f 67 63 6b 73 75 6d 20 63        logcksum c
8580: 31 20 63 32 20 5b 73 74 72 69 6e 67 20 72 61 6e  1 c2 [string ran
8590: 67 65 20 24 66 72 61 6d 65 68 64 72 20 30 20 37  ge $framehdr 0 7
85a0: 5d 0a 20 20 20 20 20 20 6c 6f 67 63 6b 73 75 6d  ].      logcksum
85b0: 20 63 31 20 63 32 20 24 66 72 61 6d 65 62 6f 64   c1 c2 $framebod
85c0: 79 0a 20 20 20 20 20 20 73 65 74 20 66 72 61 6d  y.      set fram
85d0: 65 68 64 72 20 5b 62 69 6e 61 72 79 20 66 6f 72  ehdr [binary for
85e0: 6d 61 74 20 49 49 49 49 49 49 20 24 70 67 20 35  mat IIIIII $pg 5
85f0: 20 32 32 20 32 33 20 24 63 31 20 24 63 32 5d 0a   22 23 $c1 $c2].
8600: 0a 20 20 20 20 20 20 73 65 74 20 66 64 20 5b 6f  .      set fd [o
8610: 70 65 6e 20 74 65 73 74 2e 64 62 2d 77 61 6c 20  pen test.db-wal 
8620: 77 5d 0a 20 20 20 20 20 20 66 63 6f 6e 66 69 67  w].      fconfig
8630: 75 72 65 20 24 66 64 20 2d 65 6e 63 6f 64 69 6e  ure $fd -encodin
8640: 67 20 62 69 6e 61 72 79 20 2d 74 72 61 6e 73 6c  g binary -transl
8650: 61 74 69 6f 6e 20 62 69 6e 61 72 79 0a 20 20 20  ation binary.   
8660: 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69     puts -nonewli
8670: 6e 65 20 24 66 64 20 24 77 61 6c 68 64 72 0a 20  ne $fd $walhdr. 
8680: 20 20 20 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77       puts -nonew
8690: 6c 69 6e 65 20 24 66 64 20 24 66 72 61 6d 65 68  line $fd $frameh
86a0: 64 72 0a 20 20 20 20 20 20 70 75 74 73 20 2d 6e  dr.      puts -n
86b0: 6f 6e 65 77 6c 69 6e 65 20 24 66 64 20 24 66 72  onewline $fd $fr
86c0: 61 6d 65 62 6f 64 79 0a 20 20 20 20 20 20 63 6c  amebody.      cl
86d0: 6f 73 65 20 24 66 64 0a 20 20 0a 20 20 20 20 20  ose $fd.  .     
86e0: 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e   file size test.
86f0: 64 62 2d 77 61 6c 0a 20 20 20 20 7d 20 5b 77 61  db-wal.    } [wa
8700: 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 31 20 24 70  l_file_size 1 $p
8710: 67 73 7a 5d 0a 20 20 0a 20 20 20 20 64 6f 5f 74  gsz].  .    do_t
8720: 65 73 74 20 77 61 6c 2d 31 38 2e 32 2e 24 74 6e  est wal-18.2.$tn
8730: 2e 24 70 67 2e 35 20 7b 0a 20 20 20 20 20 20 73  .$pg.5 {.      s
8740: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
8750: 62 0a 20 20 20 20 20 20 73 65 74 20 72 63 20 5b  b.      set rc [
8760: 63 61 74 63 68 20 7b 20 64 62 20 6f 6e 65 20 7b  catch { db one {
8770: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
8780: 5f 63 68 65 63 6b 7d 20 7d 20 6d 73 67 5d 0a 20  _check} } msg]. 
8790: 20 20 20 20 20 65 78 70 72 20 7b 20 24 72 63 21       expr { $rc!
87a0: 3d 30 20 7c 7c 20 24 6d 73 67 21 3d 22 6f 6b 22  =0 || $msg!="ok"
87b0: 20 7d 0a 20 20 20 20 7d 20 24 77 6f 72 6b 73 0a   }.    } $works.
87c0: 20 20 0a 20 20 20 20 64 62 20 63 6c 6f 73 65 0a    .    db close.
87d0: 20 20 7d 0a 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d    }.}..#--------
87e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8820: 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  -.# The followin
8830: 67 20 74 65 73 74 20 2d 20 77 61 6c 2d 31 39 2e  g test - wal-19.
8840: 2a 20 2d 20 66 69 78 65 73 20 61 20 62 75 67 20  * - fixes a bug 
8850: 74 68 61 74 20 77 61 73 20 70 72 65 73 65 6e 74  that was present
8860: 20 64 75 72 69 6e 67 0a 23 20 64 65 76 65 6c 6f   during.# develo
8870: 70 6d 65 6e 74 2e 0a 23 0a 23 20 57 68 65 6e 20  pment..#.# When 
8880: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
8890: 63 74 69 6f 6e 20 69 6e 20 57 41 4c 20 6d 6f 64  ction in WAL mod
88a0: 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 69 74 20  e is closed, it 
88b0: 61 74 74 65 6d 70 74 73 20 61 6e 0a 23 20 45 58  attempts an.# EX
88c0: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
88d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
88e0: 65 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69  e. If the lock i
88f0: 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 0a  s obtained, the.
8900: 23 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6b 6e 6f  # connection kno
8910: 77 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  ws that it is th
8920: 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f  e last connectio
8930: 6e 20 74 6f 20 64 69 73 63 6f 6e 6e 65 63 74 20  n to disconnect 
8940: 66 72 6f 6d 0a 23 20 74 68 65 20 64 61 74 61 62  from.# the datab
8950: 61 73 65 2c 20 73 6f 20 69 74 20 72 75 6e 73 20  ase, so it runs 
8960: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 70 65  a checkpoint ope
8970: 72 61 74 69 6f 6e 2e 20 54 68 65 20 62 75 67 20  ration. The bug 
8980: 77 61 73 20 74 68 61 74 0a 23 20 74 68 65 20 63  was that.# the c
8990: 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 6e 6f  onnection was no
89a0: 74 20 75 70 64 61 74 69 6e 67 20 69 74 73 20 70  t updating its p
89b0: 72 69 76 61 74 65 20 63 6f 70 79 20 6f 66 20 74  rivate copy of t
89c0: 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 0a 23 20  he wal-index .# 
89d0: 68 65 61 64 65 72 20 62 65 66 6f 72 65 20 64 6f  header before do
89e0: 69 6e 67 20 73 6f 2c 20 6d 65 61 6e 69 6e 67 20  ing so, meaning 
89f0: 74 68 61 74 20 69 74 20 63 6f 75 6c 64 20 63 68  that it could ch
8a00: 65 63 6b 70 6f 69 6e 74 20 61 6e 20 6f 6c 64 0a  eckpoint an old.
8a10: 23 20 73 6e 61 70 73 68 6f 74 2e 0a 23 0a 64 6f  # snapshot..#.do
8a20: 5f 74 65 73 74 20 77 61 6c 2d 31 39 2e 31 20 7b  _test wal-19.1 {
8a30: 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20 74  .  forcedelete t
8a40: 65 73 74 2e 64 62 20 74 65 73 74 2e 64 62 2d 77  est.db test.db-w
8a50: 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f 75 72 6e  al test.db-journ
8a60: 61 6c 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  al.  sqlite3 db 
8a70: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
8a80: 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20  3 db2 test.db.  
8a90: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
8aa0: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
8ab0: 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 43 52 45  e = WAL;.    CRE
8ac0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20  ATE TABLE t1(a, 
8ad0: 62 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  b);.    INSERT I
8ae0: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 2c  NTO t1 VALUES(1,
8af0: 20 32 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20   2);.    INSERT 
8b00: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 33  INTO t1 VALUES(3
8b10: 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 65 78 65 63  , 4);.  }.  exec
8b20: 73 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46  sql { SELECT * F
8b30: 52 4f 4d 20 74 31 20 7d 20 64 62 32 0a 7d 20 7b  ROM t1 } db2.} {
8b40: 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73 74  1 2 3 4}.do_test
8b50: 20 77 61 6c 2d 31 39 2e 32 20 7b 0a 20 20 65 78   wal-19.2 {.  ex
8b60: 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45  ecsql {.    INSE
8b70: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
8b80: 53 28 35 2c 20 36 29 3b 0a 20 20 20 20 53 45 4c  S(5, 6);.    SEL
8b90: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20  ECT * FROM t1;. 
8ba0: 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20   }.} {1 2 3 4 5 
8bb0: 36 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 31  6}.do_test wal-1
8bc0: 39 2e 33 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65  9.3 {.  db close
8bd0: 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 66  .  db2 close.  f
8be0: 69 6c 65 20 65 78 69 73 74 73 20 74 65 73 74 2e  ile exists test.
8bf0: 64 62 2d 77 61 6c 0a 7d 20 7b 30 7d 0a 64 6f 5f  db-wal.} {0}.do_
8c00: 74 65 73 74 20 77 61 6c 2d 31 39 2e 34 20 7b 0a  test wal-19.4 {.
8c10: 20 20 23 20 57 68 65 6e 20 74 68 65 20 62 75 67    # When the bug
8c20: 20 77 61 73 20 70 72 65 73 65 6e 74 2c 20 74 68   was present, th
8c30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20  e following was 
8c40: 72 65 74 75 72 6e 69 6e 67 20 7b 31 20 32 20 33  returning {1 2 3
8c50: 20 34 7d 20 6f 6e 6c 79 2c 0a 20 20 23 20 61 73   4} only,.  # as
8c60: 20 5b 64 62 32 5d 20 68 61 64 20 61 6e 20 6f 75   [db2] had an ou
8c70: 74 2d 6f 66 2d 64 61 74 65 20 63 6f 70 79 20 6f  t-of-date copy o
8c80: 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20  f the wal-index 
8c90: 68 65 61 64 65 72 20 77 68 65 6e 20 69 74 20 77  header when it w
8ca0: 61 73 0a 20 20 23 20 63 6c 6f 73 65 64 2e 0a 20  as.  # closed.. 
8cb0: 20 23 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20   #.  sqlite3 db 
8cc0: 74 65 73 74 2e 64 62 0a 20 20 65 78 65 63 73 71  test.db.  execsq
8cd0: 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  l { SELECT * FRO
8ce0: 4d 20 74 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20  M t1 }.} {1 2 3 
8cf0: 34 20 35 20 36 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  4 5 6}..#-------
8d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d40: 2d 2d 0a 23 20 54 68 69 73 20 74 65 73 74 20 2d  --.# This test -
8d50: 20 77 61 6c 2d 32 30 2e 2a 20 2d 20 75 73 65 73   wal-20.* - uses
8d60: 20 74 77 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73   two connections
8d70: 2e 20 4f 6e 65 20 69 6e 20 74 68 69 73 20 70 72  . One in this pr
8d80: 6f 63 65 73 73 20 61 6e 64 0a 23 20 74 68 65 20  ocess and.# the 
8d90: 6f 74 68 65 72 20 69 6e 20 61 6e 20 65 78 74 65  other in an exte
8da0: 72 6e 61 6c 20 70 72 6f 63 65 73 73 2e 20 54 68  rnal process. Th
8db0: 65 20 70 72 6f 63 65 64 75 72 65 20 69 73 3a 0a  e procedure is:.
8dc0: 23 0a 23 20 20 20 31 2e 20 55 73 69 6e 67 20 63  #.#   1. Using c
8dd0: 6f 6e 6e 65 63 74 69 6f 6e 20 31 2c 20 63 72 65  onnection 1, cre
8de0: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
8df0: 20 73 63 68 65 6d 61 2e 0a 23 0a 23 20 20 20 32   schema..#.#   2
8e00: 2e 20 55 73 69 6e 67 20 63 6f 6e 6e 65 63 74 69  . Using connecti
8e10: 6f 6e 20 32 20 28 69 6e 20 61 6e 20 65 78 74 65  on 2 (in an exte
8e20: 72 6e 61 6c 20 70 72 6f 63 65 73 73 29 2c 20 61  rnal process), a
8e30: 64 64 20 73 6f 20 6d 75 63 68 0a 23 20 20 20 20  dd so much.#    
8e40: 20 20 64 61 74 61 20 74 6f 20 74 68 65 20 64 61    data to the da
8e50: 74 61 62 61 73 65 20 77 69 74 68 6f 75 74 20 63  tabase without c
8e60: 68 65 63 6b 70 6f 69 6e 74 69 6e 67 20 74 68 61  heckpointing tha
8e70: 74 20 61 20 77 61 6c 2d 69 6e 64 65 78 20 0a 23  t a wal-index .#
8e80: 20 20 20 20 20 20 6c 61 72 67 65 72 20 74 68 61        larger tha
8e90: 6e 20 36 34 4b 42 20 69 73 20 72 65 71 75 69 72  n 64KB is requir
8ea0: 65 64 2e 0a 23 0a 23 20 20 20 33 2e 20 55 73 69  ed..#.#   3. Usi
8eb0: 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 31 2c  ng connection 1,
8ec0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 74 68 65 20   checkpoint the 
8ed0: 64 61 74 61 62 61 73 65 2e 20 4d 61 6b 65 20 73  database. Make s
8ee0: 75 72 65 20 61 6c 6c 0a 23 20 20 20 20 20 20 74  ure all.#      t
8ef0: 68 65 20 64 61 74 61 20 69 73 20 70 72 65 73 65  he data is prese
8f00: 6e 74 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  nt and the datab
8f10: 61 73 65 20 69 73 20 6e 6f 74 20 63 6f 72 72 75  ase is not corru
8f20: 70 74 2e 0a 23 0a 23 20 41 74 20 6f 6e 65 20 70  pt..#.# At one p
8f30: 6f 69 6e 74 2c 20 53 51 4c 69 74 65 20 77 61 73  oint, SQLite was
8f40: 20 66 61 69 6c 69 6e 67 20 74 6f 20 67 72 6f 77   failing to grow
8f50: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6f 66 20   the mapping of 
8f60: 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 0a 23 20  the wal-index.# 
8f70: 66 69 6c 65 20 69 6e 20 73 74 65 70 20 33 20 61  file in step 3 a
8f80: 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  nd the checkpoin
8f90: 74 20 77 61 73 20 63 6f 72 72 75 70 74 69 6e 67  t was corrupting
8fa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8fb0: 6c 65 2e 0a 23 0a 69 66 20 7b 5b 70 65 72 6d 75  le..#.if {[permu
8fc0: 74 61 74 69 6f 6e 5d 21 3d 22 75 6e 69 78 2d 65  tation]!="unix-e
8fd0: 78 63 6c 22 7d 20 7b 0a 20 20 64 6f 5f 74 65 73  xcl"} {.  do_tes
8fe0: 74 20 77 61 6c 2d 32 30 2e 31 20 7b 0a 20 20 20  t wal-20.1 {.   
8ff0: 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65   catch {db close
9000: 7d 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74  }.    forcedelet
9010: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
9020: 62 2d 77 61 6c 20 74 65 73 74 2e 64 62 2d 6a 6f  b-wal test.db-jo
9030: 75 72 6e 61 6c 0a 20 20 20 20 73 71 6c 69 74 65  urnal.    sqlite
9040: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
9050: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20   execsql {.     
9060: 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f   PRAGMA journal_
9070: 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20  mode = WAL;.    
9080: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
9090: 31 28 78 29 3b 0a 20 20 20 20 20 20 49 4e 53 45  1(x);.      INSE
90a0: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
90b0: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30  S(randomblob(900
90c0: 29 29 3b 0a 20 20 20 20 20 20 53 45 4c 45 43 54  ));.      SELECT
90d0: 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 74   count(*) FROM t
90e0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 77 61  1;.    }.  } {wa
90f0: 6c 20 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77  l 1}.  do_test w
9100: 61 6c 2d 32 30 2e 32 20 7b 0a 20 20 20 20 73 65  al-20.2 {.    se
9110: 74 20 3a 3a 62 75 64 64 79 20 5b 6c 61 75 6e 63  t ::buddy [launc
9120: 68 5f 74 65 73 74 66 69 78 74 75 72 65 5d 0a 20  h_testfixture]. 
9130: 20 20 20 74 65 73 74 66 69 78 74 75 72 65 20 24     testfixture $
9140: 3a 3a 62 75 64 64 79 20 7b 0a 20 20 20 20 20 20  ::buddy {.      
9150: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
9160: 64 62 0a 20 20 20 20 20 20 64 62 20 74 72 61 6e  db.      db tran
9170: 73 61 63 74 69 6f 6e 20 7b 20 64 62 20 65 76 61  saction { db eva
9180: 6c 20 7b 0a 20 20 20 20 20 20 20 20 50 52 41 47  l {.        PRAG
9190: 4d 41 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  MA wal_autocheck
91a0: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20  point = 0;.     
91b0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
91c0: 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62  1 SELECT randomb
91d0: 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31  lob(900) FROM t1
91e0: 3b 20 20 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a  ;       /* 2 */.
91f0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
9200: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
9210: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
9220: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9230: 34 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53  4 */.        INS
9240: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
9250: 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30  CT randomblob(90
9260: 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20  0) FROM t1;     
9270: 20 20 2f 2a 20 38 20 2a 2f 0a 20 20 20 20 20 20    /* 8 */.      
9280: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9290: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
92a0: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
92b0: 20 20 20 20 20 20 20 2f 2a 20 31 36 20 2a 2f 0a         /* 16 */.
92c0: 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20 49          INSERT I
92d0: 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61  NTO t1 SELECT ra
92e0: 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46 52  ndomblob(900) FR
92f0: 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a 20  OM t1;       /* 
9300: 33 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e  32 */.        IN
9310: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
9320: 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39  ECT randomblob(9
9330: 30 30 29 20 46 52 4f 4d 20 74 31 3b 20 20 20 20  00) FROM t1;    
9340: 20 20 20 2f 2a 20 36 34 20 2a 2f 0a 20 20 20 20     /* 64 */.    
9350: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9360: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9370: 62 6c 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74  blob(900) FROM t
9380: 31 3b 20 20 20 20 20 20 20 2f 2a 20 31 32 38 20  1;       /* 128 
9390: 2a 2f 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52  */.        INSER
93a0: 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54  T INTO t1 SELECT
93b0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29   randomblob(900)
93c0: 20 46 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20   FROM t1;       
93d0: 2f 2a 20 32 35 36 20 2a 2f 0a 20 20 20 20 20 20  /* 256 */.      
93e0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
93f0: 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c   SELECT randombl
9400: 6f 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(900) FROM t1;
9410: 20 20 20 20 20 20 20 2f 2a 20 35 31 32 20 2a 2f         /* 512 */
9420: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
9430: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9440: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9450: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9460: 20 31 30 32 34 20 2a 2f 0a 20 20 20 20 20 20 20   1024 */.       
9470: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9480: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9490: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
94a0: 20 20 20 20 20 20 2f 2a 20 32 30 34 38 20 2a 2f        /* 2048 */
94b0: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
94c0: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
94d0: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
94e0: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
94f0: 20 34 30 39 36 20 2a 2f 0a 20 20 20 20 20 20 20   4096 */.       
9500: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
9510: 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f  SELECT randomblo
9520: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(900) FROM t1; 
9530: 20 20 20 20 20 20 2f 2a 20 38 31 39 32 20 2a 2f        /* 8192 */
9540: 0a 20 20 20 20 20 20 20 20 49 4e 53 45 52 54 20  .        INSERT 
9550: 49 4e 54 4f 20 74 31 20 53 45 4c 45 43 54 20 72  INTO t1 SELECT r
9560: 61 6e 64 6f 6d 62 6c 6f 62 28 39 30 30 29 20 46  andomblob(900) F
9570: 52 4f 4d 20 74 31 3b 20 20 20 20 20 20 20 2f 2a  ROM t1;       /*
9580: 20 31 36 33 38 34 20 2a 2f 0a 20 20 20 20 20 20   16384 */.      
9590: 7d 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 30  } }.    }.  } {0
95a0: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  }.  do_test wal-
95b0: 32 30 2e 33 20 7b 0a 20 20 20 20 63 6c 6f 73 65  20.3 {.    close
95c0: 20 24 3a 3a 62 75 64 64 79 0a 20 20 20 20 65 78   $::buddy.    ex
95d0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
95e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
95f0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45      execsql { SE
9600: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
9610: 4f 4d 20 74 31 20 7d 0a 20 20 7d 20 7b 31 36 33  OM t1 }.  } {163
9620: 38 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 77 61  84}.  do_test wa
9630: 6c 2d 32 30 2e 34 20 7b 0a 20 20 20 20 64 62 20  l-20.4 {.    db 
9640: 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65  close.    sqlite
9650: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20  3 db test.db.   
9660: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
9670: 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
9680: 74 31 20 7d 0a 20 20 7d 20 7b 31 36 33 38 34 7d  t1 }.  } {16384}
9690: 0a 20 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  .  integrity_che
96a0: 63 6b 20 77 61 6c 2d 32 30 2e 35 0a 7d 0a 0a 63  ck wal-20.5.}..c
96b0: 61 74 63 68 20 7b 20 64 62 32 20 63 6c 6f 73 65  atch { db2 close
96c0: 20 7d 0a 63 61 74 63 68 20 7b 20 64 62 20 63 6c   }.catch { db cl
96d0: 6f 73 65 20 7d 0a 0a 64 6f 5f 74 65 73 74 20 77  ose }..do_test w
96e0: 61 6c 2d 32 31 2e 31 20 7b 0a 20 20 66 61 75 6c  al-21.1 {.  faul
96f0: 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64 5f  tsim_delete_and_
9700: 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71 6c  reopen.  execsql
9710: 20 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 6a   { .    PRAGMA j
9720: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41  ournal_mode = WA
9730: 4c 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  L;.    CREATE TA
9740: 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20  BLE t1(a, b);.  
9750: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9760: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
9770: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9780: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
9790: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
97a0: 74 31 20 56 41 4c 55 45 53 28 35 2c 20 36 29 3b  t1 VALUES(5, 6);
97b0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
97c0: 20 74 31 20 56 41 4c 55 45 53 28 37 2c 20 38 29   t1 VALUES(7, 8)
97d0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
97e0: 4f 20 74 31 20 56 41 4c 55 45 53 28 39 2c 20 31  O t1 VALUES(9, 1
97f0: 30 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  0);.    INSERT I
9800: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 31 31  NTO t1 VALUES(11
9810: 2c 20 31 32 29 3b 0a 20 20 7d 0a 7d 20 7b 77 61  , 12);.  }.} {wa
9820: 6c 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  l}.do_test wal-2
9830: 31 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.2 {.  execsql 
9840: 7b 20 0a 20 20 20 20 50 52 41 47 4d 41 20 63 61  { .    PRAGMA ca
9850: 63 68 65 5f 73 69 7a 65 20 3d 20 31 30 3b 0a 20  che_size = 10;. 
9860: 20 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68     PRAGMA wal_ch
9870: 65 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 42 45  eckpoint;.    BE
9880: 47 49 4e 3b 0a 20 20 20 20 20 20 53 41 56 45 50  GIN;.      SAVEP
9890: 4f 49 4e 54 20 73 3b 0a 20 20 20 20 20 20 20 20  OINT s;.        
98a0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53  INSERT INTO t1 S
98b0: 45 4c 45 43 54 20 72 61 6e 64 6f 6d 62 6c 6f 62  ELECT randomblob
98c0: 28 39 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f  (900), randomblo
98d0: 62 28 39 30 30 29 20 46 52 4f 4d 20 74 31 3b 0a  b(900) FROM t1;.
98e0: 20 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b 20 54        ROLLBACK T
98f0: 4f 20 73 3b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  O s;.    COMMIT;
9900: 0a 20 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b  .  }.  execsql {
9910: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
9920: 31 20 7d 0a 7d 20 7b 31 20 32 20 33 20 34 20 35  1 }.} {1 2 3 4 5
9930: 20 36 20 37 20 38 20 39 20 31 30 20 31 31 20 31   6 7 8 9 10 11 1
9940: 32 7d 0a 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32  2}.do_test wal-2
9950: 31 2e 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  1.3 {.  execsql 
9960: 7b 20 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  { PRAGMA integri
9970: 74 79 5f 63 68 65 63 6b 20 7d 0a 7d 20 7b 6f 6b  ty_check }.} {ok
9980: 7d 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..#------------
9990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
99d0: 54 65 73 74 20 72 65 61 64 69 6e 67 20 61 6e 64  Test reading and
99e0: 20 77 72 69 74 69 6e 67 20 6f 66 20 64 61 74 61   writing of data
99f0: 62 61 73 65 73 20 77 69 74 68 20 64 69 66 66 65  bases with diffe
9a00: 72 65 6e 74 20 70 61 67 65 2d 73 69 7a 65 73 2e  rent page-sizes.
9a10: 0a 23 0a 69 6e 63 72 20 3a 3a 64 6f 5f 6e 6f 74  .#.incr ::do_not
9a20: 5f 75 73 65 5f 63 6f 64 65 63 0a 66 6f 72 65 61  _use_codec.forea
9a30: 63 68 20 70 67 73 7a 20 7b 35 31 32 20 31 30 32  ch pgsz {512 102
9a40: 34 20 32 30 34 38 20 34 30 39 36 20 38 31 39 32  4 2048 4096 8192
9a50: 20 31 36 33 38 34 20 33 32 37 36 38 20 36 35 35   16384 32768 655
9a60: 33 36 7d 20 7b 0a 20 20 64 6f 5f 6d 75 6c 74 69  36} {.  do_multi
9a70: 63 6c 69 65 6e 74 5f 74 65 73 74 20 74 6e 20 5b  client_test tn [
9a80: 73 74 72 69 6e 67 20 6d 61 70 20 5b 6c 69 73 74  string map [list
9a90: 20 25 50 47 53 5a 25 20 24 70 67 73 7a 5d 20 7b   %PGSZ% $pgsz] {
9aa0: 0a 20 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c  .    do_test wal
9ab0: 2d 32 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 31  -22.%PGSZ%.$tn.1
9ac0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 31 20 7b 0a   {.      sql1 {.
9ad0: 20 20 20 20 20 20 20 20 50 52 41 47 4d 41 20 6d          PRAGMA m
9ae0: 61 69 6e 2e 70 61 67 65 5f 73 69 7a 65 20 3d 20  ain.page_size = 
9af0: 25 50 47 53 5a 25 3b 0a 20 20 20 20 20 20 20 20  %PGSZ%;.        
9b00: 50 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75  PRAGMA auto_vacu
9b10: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  um = 0;.        
9b20: 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d  PRAGMA journal_m
9b30: 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20 20 20 20  ode = WAL;.     
9b40: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
9b50: 74 31 28 78 20 55 4e 49 51 55 45 29 3b 0a 20 20  t1(x UNIQUE);.  
9b60: 20 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54        INSERT INT
9b70: 4f 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64  O t1 SELECT rand
9b80: 6f 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20  omblob(800);.   
9b90: 20 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f       INSERT INTO
9ba0: 20 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f   t1 SELECT rando
9bb0: 6d 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20  mblob(800);.    
9bc0: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
9bd0: 74 31 20 53 45 4c 45 43 54 20 72 61 6e 64 6f 6d  t1 SELECT random
9be0: 62 6c 6f 62 28 38 30 30 29 3b 0a 20 20 20 20 20  blob(800);.     
9bf0: 20 7d 0a 20 20 20 20 7d 20 7b 77 61 6c 7d 0a 20   }.    } {wal}. 
9c00: 20 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32     do_test wal-2
9c10: 32 2e 25 50 47 53 5a 25 2e 24 74 6e 2e 32 20 7b  2.%PGSZ%.$tn.2 {
9c20: 20 73 71 6c 32 20 7b 20 50 52 41 47 4d 41 20 69   sql2 { PRAGMA i
9c30: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 7d  ntegrity_check }
9c40: 20 7d 20 7b 6f 6b 7d 0a 20 20 20 20 64 6f 5f 74   } {ok}.    do_t
9c50: 65 73 74 20 77 61 6c 2d 32 32 2e 25 50 47 53 5a  est wal-22.%PGSZ
9c60: 25 2e 24 74 6e 2e 33 20 7b 0a 20 20 20 20 20 20  %.$tn.3 {.      
9c70: 73 71 6c 31 20 7b 50 52 41 47 4d 41 20 77 61 6c  sql1 {PRAGMA wal
9c80: 5f 63 68 65 63 6b 70 6f 69 6e 74 7d 0a 20 20 20  _checkpoint}.   
9c90: 20 20 20 65 78 70 72 20 7b 5b 66 69 6c 65 20 73     expr {[file s
9ca0: 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 25 20 25  ize test.db] % %
9cb0: 50 47 53 5a 25 7d 0a 20 20 20 20 7d 20 7b 30 7d  PGSZ%}.    } {0}
9cc0: 0a 20 20 7d 5d 0a 7d 0a 69 6e 63 72 20 3a 3a 64  .  }].}.incr ::d
9cd0: 6f 5f 6e 6f 74 5f 75 73 65 5f 63 6f 64 65 63 20  o_not_use_codec 
9ce0: 2d 31 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -1..#-----------
9cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
9d30: 20 54 65 73 74 20 74 68 61 74 20 77 68 65 6e 20   Test that when 
9d40: 31 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  1 or more pages 
9d50: 61 72 65 20 72 65 63 6f 76 65 72 65 64 20 66 72  are recovered fr
9d60: 6f 6d 20 61 20 57 41 4c 20 66 69 6c 65 2c 20 0a  om a WAL file, .
9d70: 23 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  # sqlite3_log() 
9d80: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65  is invoked to re
9d90: 70 6f 72 74 20 74 68 69 73 20 74 6f 20 74 68 65  port this to the
9da0: 20 75 73 65 72 2e 0a 23 0a 69 66 63 61 70 61 62   user..#.ifcapab
9db0: 6c 65 20 63 75 72 64 69 72 20 7b 0a 20 20 73 65  le curdir {.  se
9dc0: 74 20 77 61 6c 66 69 6c 65 20 5b 66 69 6c 65 20  t walfile [file 
9dd0: 6e 61 74 69 76 65 6e 61 6d 65 20 5b 66 69 6c 65  nativename [file
9de0: 20 6a 6f 69 6e 20 5b 67 65 74 5f 70 77 64 5d 20   join [get_pwd] 
9df0: 74 65 73 74 2e 64 62 2d 77 61 6c 5d 5d 0a 7d 20  test.db-wal]].} 
9e00: 65 6c 73 65 20 7b 0a 20 20 73 65 74 20 77 61 6c  else {.  set wal
9e10: 66 69 6c 65 20 74 65 73 74 2e 64 62 2d 77 61 6c  file test.db-wal
9e20: 0a 7d 0a 63 61 74 63 68 20 7b 64 62 20 63 6c 6f  .}.catch {db clo
9e30: 73 65 7d 0a 66 6f 72 63 65 64 65 6c 65 74 65 20  se}.forcedelete 
9e40: 74 65 73 74 2e 64 62 0a 64 6f 5f 74 65 73 74 20  test.db.do_test 
9e50: 77 61 6c 2d 32 33 2e 31 20 7b 0a 20 20 66 61 75  wal-23.1 {.  fau
9e60: 6c 74 73 69 6d 5f 64 65 6c 65 74 65 5f 61 6e 64  ltsim_delete_and
9e70: 5f 72 65 6f 70 65 6e 0a 20 20 65 78 65 63 73 71  _reopen.  execsq
9e80: 6c 20 7b 0a 20 20 20 20 43 52 45 41 54 45 20 54  l {.    CREATE T
9e90: 41 42 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20  ABLE t1(a, b);. 
9ea0: 20 20 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61     PRAGMA journa
9eb0: 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b 0a 20 20  l_mode = WAL;.  
9ec0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
9ed0: 20 56 41 4c 55 45 53 28 31 2c 20 32 29 3b 0a 20   VALUES(1, 2);. 
9ee0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74     INSERT INTO t
9ef0: 31 20 56 41 4c 55 45 53 28 33 2c 20 34 29 3b 0a  1 VALUES(3, 4);.
9f00: 20 20 7d 0a 20 20 66 61 75 6c 74 73 69 6d 5f 73    }.  faultsim_s
9f10: 61 76 65 5f 61 6e 64 5f 63 6c 6f 73 65 0a 0a 20  ave_and_close.. 
9f20: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
9f30: 6e 0a 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33  n.  test_sqlite3
9f40: 5f 6c 6f 67 20 5b 6c 69 73 74 20 6c 61 70 70 65  _log [list lappe
9f50: 6e 64 20 3a 3a 6c 6f 67 5d 0a 20 20 73 65 74 20  nd ::log].  set 
9f60: 3a 3a 6c 6f 67 20 5b 6c 69 73 74 5d 0a 20 20 73  ::log [list].  s
9f70: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
9f80: 62 0a 20 20 65 78 65 63 73 71 6c 20 7b 20 53 45  b.  execsql { SE
9f90: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d  LECT * FROM t1 }
9fa0: 0a 7d 20 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f  .} {1 2 3 4}.do_
9fb0: 74 65 73 74 20 77 61 6c 2d 32 33 2e 32 20 7b 20  test wal-23.2 { 
9fc0: 73 65 74 20 3a 3a 6c 6f 67 20 7d 20 7b 7d 0a 0a  set ::log } {}..
9fd0: 64 6f 5f 74 65 73 74 20 77 61 6c 2d 32 33 2e 33  do_test wal-23.3
9fe0: 20 7b 0a 20 20 64 62 20 63 6c 6f 73 65 0a 20 20   {.  db close.  
9ff0: 73 65 74 20 3a 3a 6c 6f 67 20 5b 6c 69 73 74 5d  set ::log [list]
a000: 0a 20 20 66 61 75 6c 74 73 69 6d 5f 72 65 73 74  .  faultsim_rest
a010: 6f 72 65 5f 61 6e 64 5f 72 65 6f 70 65 6e 0a 20  ore_and_reopen. 
a020: 20 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43   execsql { SELEC
a030: 54 20 2a 20 46 52 4f 4d 20 74 31 20 7d 0a 7d 20  T * FROM t1 }.} 
a040: 7b 31 20 32 20 33 20 34 7d 0a 64 6f 5f 74 65 73  {1 2 3 4}.do_tes
a050: 74 20 77 61 6c 2d 32 33 2e 34 20 7b 20 0a 20 20  t wal-23.4 { .  
a060: 73 65 74 20 3a 3a 6c 6f 67 20 0a 7d 20 5b 6c 69  set ::log .} [li
a070: 73 74 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  st SQLITE_NOTICE
a080: 5f 52 45 43 4f 56 45 52 5f 57 41 4c 20 5c 0a 20  _RECOVER_WAL \. 
a090: 20 20 20 22 72 65 63 6f 76 65 72 65 64 20 32 20     "recovered 2 
a0a0: 66 72 61 6d 65 73 20 66 72 6f 6d 20 57 41 4c 20  frames from WAL 
a0b0: 66 69 6c 65 20 24 77 61 6c 66 69 6c 65 22 5d 0a  file $walfile"].
a0c0: 0a 0a 69 66 63 61 70 61 62 6c 65 20 61 75 74 6f  ..ifcapable auto
a0d0: 76 61 63 75 75 6d 20 7b 0a 20 20 23 20 54 68 69  vacuum {.  # Thi
a0e0: 73 20 62 6c 6f 63 6b 20 74 65 73 74 73 20 74 68  s block tests th
a0f0: 61 74 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  at if the size o
a100: 66 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20  f a database is 
a110: 72 65 64 75 63 65 64 20 62 79 20 61 20 0a 20 20  reduced by a .  
a120: 23 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 62  # transaction (b
a130: 65 63 61 75 73 65 20 6f 66 20 61 6e 20 69 6e 63  ecause of an inc
a140: 72 65 6d 65 6e 74 61 6c 20 6f 72 20 61 75 74 6f  remental or auto
a150: 2d 76 61 63 75 75 6d 29 2c 20 74 68 61 74 20 6e  -vacuum), that n
a160: 6f 0a 20 20 23 20 64 61 74 61 20 69 73 20 77 72  o.  # data is wr
a170: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 57 41 4c  itten to the WAL
a180: 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 74 72   file for the tr
a190: 75 6e 63 61 74 65 64 20 70 61 67 65 73 20 61 73  uncated pages as
a1a0: 20 70 61 72 74 0a 20 20 23 20 6f 66 20 74 68 65   part.  # of the
a1b0: 20 63 6f 6d 6d 69 74 2e 20 65 2e 67 2e 20 69 66   commit. e.g. if
a1c0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72   a transaction r
a1d0: 65 64 75 63 65 73 20 74 68 65 20 73 69 7a 65 20  educes the size 
a1e0: 6f 66 20 61 20 64 61 74 61 62 61 73 65 0a 20 20  of a database.  
a1f0: 23 20 74 6f 20 4e 20 70 61 67 65 73 2c 20 64 61  # to N pages, da
a200: 74 61 20 66 6f 72 20 70 61 67 65 20 4e 2b 31 20  ta for page N+1 
a210: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72  should not be wr
a220: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 57 41 4c  itten to the WAL
a230: 20 66 69 6c 65 20 0a 20 20 23 20 77 68 65 6e 20   file .  # when 
a240: 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74  committing the t
a250: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 74 20 6f  ransaction. At o
a260: 6e 65 20 70 6f 69 6e 74 20 73 75 63 68 20 64 61  ne point such da
a270: 74 61 20 77 61 73 20 62 65 69 6e 67 20 0a 20 20  ta was being .  
a280: 23 20 77 72 69 74 74 65 6e 2e 0a 20 20 23 0a 20  # written..  #. 
a290: 20 63 61 74 63 68 20 7b 64 62 20 63 6c 6f 73 65   catch {db close
a2a0: 7d 0a 20 20 66 6f 72 63 65 64 65 6c 65 74 65 20  }.  forcedelete 
a2b0: 74 65 73 74 2e 64 62 0a 20 20 73 71 6c 69 74 65  test.db.  sqlite
a2c0: 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20 64  3 db test.db.  d
a2d0: 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 32  o_execsql_test 2
a2e0: 34 2e 31 20 7b 0a 20 20 20 20 50 52 41 47 4d 41  4.1 {.    PRAGMA
a2f0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 32   auto_vacuum = 2
a300: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 6a 6f 75  ;.    PRAGMA jou
a310: 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57 41 4c 3b  rnal_mode = WAL;
a320: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
a330: 5f 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20  _size = 1024;.  
a340: 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
a350: 31 28 78 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  1(x);.    INSERT
a360: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
a370: 72 61 6e 64 6f 6d 62 6c 6f 62 28 35 30 30 30 29  randomblob(5000)
a380: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
a390: 54 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46  TO t1 SELECT * F
a3a0: 52 4f 4d 20 74 31 3b 0a 20 20 20 20 49 4e 53 45  ROM t1;.    INSE
a3b0: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
a3c0: 54 20 2a 20 46 52 4f 4d 20 74 31 3b 0a 20 20 20  T * FROM t1;.   
a3d0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
a3e0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
a3f0: 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ;.    INSERT INT
a400: 4f 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52  O t1 SELECT * FR
a410: 4f 4d 20 74 31 3b 0a 20 20 7d 20 7b 77 61 6c 7d  OM t1;.  } {wal}
a420: 0a 20 20 64 6f 5f 74 65 73 74 20 32 34 2e 32 20  .  do_test 24.2 
a430: 7b 20 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b  { .    execsql {
a440: 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20 46 52  .      DELETE FR
a450: 4f 4d 20 74 31 3b 0a 20 20 20 20 20 20 50 52 41  OM t1;.      PRA
a460: 47 4d 41 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  GMA wal_checkpoi
a470: 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  nt;.    }.    db
a480: 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74   close.    sqlit
a490: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
a4a0: 20 20 66 69 6c 65 20 65 78 69 73 74 73 20 74 65    file exists te
a4b0: 73 74 2e 64 62 2d 77 61 6c 0a 20 20 7d 20 30 0a  st.db-wal.  } 0.
a4c0: 20 20 64 6f 5f 74 65 73 74 20 32 34 2e 33 20 7b    do_test 24.3 {
a4d0: 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74  .    file size t
a4e0: 65 73 74 2e 64 62 0a 20 20 7d 20 5b 65 78 70 72  est.db.  } [expr
a4f0: 20 38 34 20 2a 20 31 30 32 34 5d 0a 20 20 64 6f   84 * 1024].  do
a500: 5f 74 65 73 74 20 32 34 2e 34 20 7b 0a 20 20 20  _test 24.4 {.   
a510: 20 65 78 65 63 73 71 6c 20 7b 20 0a 20 20 20 20   execsql { .    
a520: 20 20 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73    PRAGMA cache_s
a530: 69 7a 65 20 3d 20 32 30 30 3b 0a 20 20 20 20 20  ize = 200;.     
a540: 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e   PRAGMA incremen
a550: 74 61 6c 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20  tal_vacuum;.    
a560: 20 20 50 52 41 47 4d 41 20 77 61 6c 5f 63 68 65    PRAGMA wal_che
a570: 63 6b 70 6f 69 6e 74 3b 0a 20 20 20 20 7d 0a 20  ckpoint;.    }. 
a580: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
a590: 74 2e 64 62 0a 20 20 7d 20 5b 65 78 70 72 20 33  t.db.  } [expr 3
a5a0: 20 2a 20 31 30 32 34 5d 0a 0a 20 20 23 20 57 41   * 1024]..  # WA
a5b0: 4c 20 66 69 6c 65 20 6e 6f 77 20 63 6f 6e 74 61  L file now conta
a5c0: 69 6e 73 20 61 20 73 69 6e 67 6c 65 20 66 72 61  ins a single fra
a5d0: 6d 65 20 2d 20 74 68 65 20 6e 65 77 20 72 6f 6f  me - the new roo
a5e0: 74 20 70 61 67 65 20 66 6f 72 20 74 61 62 6c 65  t page for table
a5f0: 20 74 31 2e 0a 20 20 23 20 49 74 20 77 6f 75 6c   t1..  # It woul
a600: 64 20 62 65 20 74 77 6f 20 66 72 61 6d 65 73 20  d be two frames 
a610: 28 74 68 65 20 6e 65 77 20 72 6f 6f 74 20 70 61  (the new root pa
a620: 67 65 20 61 6e 64 20 61 20 70 61 64 64 69 6e 67  ge and a padding
a630: 20 66 72 61 6d 65 29 20 69 66 20 74 68 65 0a 20   frame) if the. 
a640: 20 23 20 5a 45 52 4f 5f 44 41 4d 41 47 45 20 66   # ZERO_DAMAGE f
a650: 6c 61 67 20 77 65 72 65 20 6e 6f 74 20 73 65 74  lag were not set
a660: 2e 0a 20 20 64 6f 5f 74 65 73 74 20 32 34 2e 35  ..  do_test 24.5
a670: 20 7b 0a 20 20 20 20 66 69 6c 65 20 73 69 7a 65   {.    file size
a680: 20 74 65 73 74 2e 64 62 2d 77 61 6c 0a 20 20 7d   test.db-wal.  }
a690: 20 5b 77 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20   [wal_file_size 
a6a0: 31 20 31 30 32 34 5d 0a 7d 0a 0a 64 62 20 63 6c  1 1024].}..db cl
a6b0: 6f 73 65 0a 73 71 6c 69 74 65 33 5f 73 68 75 74  ose.sqlite3_shut
a6c0: 64 6f 77 6e 0a 74 65 73 74 5f 73 71 6c 69 74 65  down.test_sqlite
a6d0: 33 5f 6c 6f 67 0a 73 71 6c 69 74 65 33 5f 69 6e  3_log.sqlite3_in
a6e0: 69 74 69 61 6c 69 7a 65 0a 0a 23 20 4d 61 6b 65  itialize..# Make
a6f0: 20 73 75 72 65 20 50 52 41 47 4d 41 20 6a 6f 75   sure PRAGMA jou
a700: 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c 20 77 6f  rnal_mode=WAL wo
a710: 72 6b 73 20 77 69 74 68 20 41 54 54 41 43 48 45  rks with ATTACHE
a720: 44 20 64 61 74 61 62 61 73 65 73 20 69 6e 0a 23  D databases in.#
a730: 20 61 6c 6c 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64   all journal mod
a740: 65 73 2e 0a 23 0a 66 6f 72 65 61 63 68 20 6d 6f  es..#.foreach mo
a750: 64 65 20 7b 4f 46 46 20 4d 45 4d 4f 52 59 20 50  de {OFF MEMORY P
a760: 45 52 53 49 53 54 20 44 45 4c 45 54 45 20 54 52  ERSIST DELETE TR
a770: 55 4e 43 41 54 45 20 57 41 4c 7d 20 7b 0a 20 20  UNCATE WAL} {.  
a780: 64 65 6c 65 74 65 5f 66 69 6c 65 20 74 65 73 74  delete_file test
a790: 2e 64 62 20 74 65 73 74 32 2e 64 62 0a 20 20 73  .db test2.db.  s
a7a0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
a7b0: 62 0a 20 20 64 6f 5f 74 65 73 74 20 77 61 6c 2d  b.  do_test wal-
a7c0: 32 35 2e 24 6d 6f 64 65 20 7b 0a 20 20 20 20 64  25.$mode {.    d
a7d0: 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41 20 6a  b eval "PRAGMA j
a7e0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 24 6d 6f 64  ournal_mode=$mod
a7f0: 65 22 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b  e".    db eval {
a800: 41 54 54 41 43 48 20 27 74 65 73 74 32 2e 64 62  ATTACH 'test2.db
a810: 27 20 41 53 20 74 32 3b 20 50 52 41 47 4d 41 20  ' AS t2; PRAGMA 
a820: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 57 41 4c  journal_mode=WAL
a830: 3b 7d 0a 20 20 7d 20 7b 77 61 6c 7d 0a 20 20 64  ;}.  } {wal}.  d
a840: 62 20 63 6c 6f 73 65 0a 7d 0a 0a 74 65 73 74 5f  b close.}..test_
a850: 72 65 73 74 6f 72 65 5f 63 6f 6e 66 69 67 5f 70  restore_config_p
a860: 61 67 65 63 61 63 68 65 0a 66 69 6e 69 73 68 5f  agecache.finish_
a870: 74 65 73 74 0a                                   test.