/ Hex Artifact Content
Login

Artifact 248af31e73c98df23476a22bdb815524c9dc3ba8:


0000: 23 20 32 30 31 34 20 44 65 63 65 6d 62 65 72 20  # 2014 December 
0010: 30 34 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  04.#.# The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 23 20 61 20 6c 65 67 61  lace of.# a lega
0060: 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20 69  l notice, here i
0070: 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 23 0a  s a blessing:.#.
0080: 23 20 20 20 20 4d 61 79 20 79 6f 75 20 64 6f 20  #    May you do 
0090: 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20 65 76 69  good and not evi
00a0: 6c 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20  l..#    May you 
00b0: 66 69 6e 64 20 66 6f 72 67 69 76 65 6e 65 73 73  find forgiveness
00c0: 20 66 6f 72 20 79 6f 75 72 73 65 6c 66 20 61 6e   for yourself an
00d0: 64 20 66 6f 72 67 69 76 65 20 6f 74 68 65 72 73  d forgive others
00e0: 2e 0a 23 20 20 20 20 4d 61 79 20 79 6f 75 20 73  ..#    May you s
00f0: 68 61 72 65 20 66 72 65 65 6c 79 2c 20 6e 65 76  hare freely, nev
0100: 65 72 20 74 61 6b 69 6e 67 20 6d 6f 72 65 20 74  er taking more t
0110: 68 61 6e 20 79 6f 75 20 67 69 76 65 2e 0a 23 0a  han you give..#.
0120: 23 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 2a 2a 2a 0a 23 0a 0a 73 65 74 20  ********.#..set 
0170: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0180: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0190: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
01a0: 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20  ster.tcl.source 
01b0: 24 74 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d  $testdir/wal_com
01c0: 6d 6f 6e 2e 74 63 6c 0a 73 65 74 20 74 65 73 74  mon.tcl.set test
01d0: 70 72 65 66 69 78 20 65 5f 77 61 6c 61 75 74 6f  prefix e_walauto
01e0: 0a 0a 23 20 44 6f 20 6e 6f 74 20 72 75 6e 20 74  ..# Do not run t
01f0: 68 69 73 20 74 65 73 74 20 6f 6e 20 4f 70 65 6e  his test on Open
0200: 42 53 44 2c 20 61 73 20 69 74 20 64 65 70 65 6e  BSD, as it depen
0210: 64 73 20 6f 6e 20 72 65 61 64 28 29 20 61 6e 64  ds on read() and
0220: 20 6d 6d 61 70 20 62 6f 74 68 0a 23 20 61 63 63   mmap both.# acc
0230: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0240: 63 6f 68 65 72 65 6e 74 20 76 69 65 77 20 6f 66  coherent view of
0250: 20 74 68 65 20 22 74 65 73 74 2e 64 62 2d 73 68   the "test.db-sh
0260: 6d 22 20 66 69 6c 65 2e 20 54 68 69 73 20 64 6f  m" file. This do
0270: 65 73 6e 27 74 0a 23 20 77 6f 72 6b 20 6f 6e 20  esn't.# work on 
0280: 4f 70 65 6e 42 53 44 2e 0a 23 0a 69 66 20 7b 24  OpenBSD..#.if {$
0290: 74 63 6c 5f 70 6c 61 74 66 6f 72 6d 28 6f 73 29  tcl_platform(os)
02a0: 20 3d 3d 20 22 4f 70 65 6e 42 53 44 22 7d 20 7b   == "OpenBSD"} {
02b0: 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20  .  finish_test. 
02c0: 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 54 68 69   return.}..# Thi
02d0: 73 20 6d 6f 64 75 6c 65 20 75 73 65 73 20 68 61  s module uses ha
02e0: 72 64 2d 63 6f 64 65 64 20 6f 66 66 73 65 74 73  rd-coded offsets
02f0: 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 77 6f   which do not wo
0300: 72 6b 20 69 66 20 74 68 65 20 72 65 73 65 72 76  rk if the reserv
0310: 65 64 5f 62 79 74 65 73 0a 23 20 76 61 6c 75 65  ed_bytes.# value
0320: 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 0a 69 66 20   is nonzero..if 
0330: 7b 5b 6e 6f 6e 7a 65 72 6f 5f 72 65 73 65 72 76  {[nonzero_reserv
0340: 65 64 5f 62 79 74 65 73 5d 7d 20 7b 66 69 6e 69  ed_bytes]} {fini
0350: 73 68 5f 74 65 73 74 3b 20 72 65 74 75 72 6e 3b  sh_test; return;
0360: 7d 0a 0a 0a 70 72 6f 63 20 72 65 61 64 5f 6e 62  }...proc read_nb
0370: 61 63 6b 66 69 6c 6c 20 7b 7d 20 7b 0a 20 20 73  ackfill {} {.  s
0380: 65 65 6b 20 24 3a 3a 73 68 6d 66 64 20 39 36 0a  eek $::shmfd 96.
0390: 20 20 62 69 6e 61 72 79 20 73 63 61 6e 20 5b 72    binary scan [r
03a0: 65 61 64 20 24 3a 3a 73 68 6d 66 64 20 34 5d 20  ead $::shmfd 4] 
03b0: 6e 20 6e 42 61 63 6b 66 69 6c 6c 0a 20 20 73 65  n nBackfill.  se
03c0: 74 20 6e 42 61 63 6b 66 69 6c 6c 0a 7d 0a 70 72  t nBackfill.}.pr
03d0: 6f 63 20 72 65 61 64 5f 6d 78 66 72 61 6d 65 20  oc read_mxframe 
03e0: 7b 7d 20 7b 0a 20 20 73 65 65 6b 20 24 3a 3a 73  {} {.  seek $::s
03f0: 68 6d 66 64 20 31 36 0a 20 20 62 69 6e 61 72 79  hmfd 16.  binary
0400: 20 73 63 61 6e 20 5b 72 65 61 64 20 24 3a 3a 73   scan [read $::s
0410: 68 6d 66 64 20 34 5d 20 6e 20 6d 78 46 72 61 6d  hmfd 4] n mxFram
0420: 65 0a 20 20 73 65 74 20 6d 78 46 72 61 6d 65 0a  e.  set mxFrame.
0430: 7d 0a 0a 23 20 41 73 73 75 6d 69 6e 67 20 74 68  }..# Assuming th
0440: 61 74 20 74 68 65 20 6d 61 69 6e 20 64 62 20 66  at the main db f
0450: 6f 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  or database hand
0460: 6c 65 0a 23 0a 70 72 6f 63 20 64 6f 5f 61 75 74  le.#.proc do_aut
0470: 6f 63 6f 6d 6d 69 74 5f 74 68 72 65 73 68 6f 6c  ocommit_threshol
0480: 64 5f 74 65 73 74 20 7b 74 6e 20 76 61 6c 75 65  d_test {tn value
0490: 7d 20 7b 0a 0a 20 20 73 65 74 20 6e 42 61 63 6b  } {..  set nBack
04a0: 66 69 6c 6c 53 61 76 65 64 20 5b 72 65 61 64 5f  fillSaved [read_
04b0: 6e 62 61 63 6b 66 69 6c 6c 5d 0a 20 20 77 68 69  nbackfill].  whi
04c0: 6c 65 20 7b 31 7d 20 7b 0a 20 20 20 20 64 62 20  le {1} {.    db 
04d0: 65 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  eval { INSERT IN
04e0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
04f0: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c 20 72 61  domblob(100), ra
0500: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 20 7d  ndomblob(100)) }
0510: 0a 20 20 20 20 69 66 20 7b 5b 72 65 61 64 5f 6d  .    if {[read_m
0520: 78 66 72 61 6d 65 5d 20 3e 3d 20 24 76 61 6c 75  xframe] >= $valu
0530: 65 7d 20 62 72 65 61 6b 0a 20 20 7d 0a 20 20 0a  e} break.  }.  .
0540: 20 20 73 65 74 20 6e 42 61 63 6b 66 69 6c 6c 4e    set nBackfillN
0550: 65 77 20 5b 72 65 61 64 5f 6e 62 61 63 6b 66 69  ew [read_nbackfi
0560: 6c 6c 5d 0a 20 20 75 70 6c 65 76 65 6c 20 5b 6c  ll].  uplevel [l
0570: 69 73 74 20 64 6f 5f 74 65 73 74 20 24 74 6e 20  ist do_test $tn 
0580: 22 65 78 70 72 20 24 6e 42 61 63 6b 66 69 6c 6c  "expr $nBackfill
0590: 4e 65 77 20 3e 20 24 6e 42 61 63 6b 66 69 6c 6c  New > $nBackfill
05a0: 53 61 76 65 64 22 20 31 5d 0a 7d 0a 0a 23 20 45  Saved" 1].}..# E
05b0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30  VIDENCE-OF: R-30
05c0: 31 33 35 2d 30 36 34 33 39 20 54 68 65 20 77 61  135-06439 The wa
05d0: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
05e0: 20 70 72 61 67 6d 61 20 63 61 6e 20 62 65 20 75   pragma can be u
05f0: 73 65 64 0a 23 20 74 6f 20 69 6e 76 6f 6b 65 20  sed.# to invoke 
0600: 74 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 66  this interface f
0610: 72 6f 6d 20 53 51 4c 2e 0a 23 0a 23 20 20 20 41  rom SQL..#.#   A
0620: 6c 6c 20 74 65 73 74 73 20 69 6e 20 74 68 69 73  ll tests in this
0630: 20 66 69 6c 65 20 61 72 65 20 72 75 6e 20 74 77   file are run tw
0640: 69 63 65 20 2d 20 6f 6e 63 65 20 75 73 69 6e 67  ice - once using
0650: 20 74 68 65 0a 23 20 20 20 73 71 6c 69 74 65 33   the.#   sqlite3
0660: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
0670: 69 6e 74 28 29 20 41 50 49 2c 20 61 6e 64 20 6f  int() API, and o
0680: 6e 63 65 20 75 73 69 6e 67 20 22 50 52 41 47 4d  nce using "PRAGM
0690: 41 0a 23 20 20 20 77 61 6c 5f 61 75 74 6f 63 68  A.#   wal_autoch
06a0: 65 63 6b 70 6f 69 6e 74 22 2e 0a 23 0a 66 6f 72  eckpoint"..#.for
06b0: 65 61 63 68 20 7b 74 6e 20 63 6f 64 65 7d 20 7b  each {tn code} {
06c0: 0a 20 20 31 20 7b 0a 20 20 20 20 70 72 6f 63 20  .  1 {.    proc 
06d0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 7b  autocheckpoint {
06e0: 64 62 20 76 61 6c 75 65 7d 20 7b 0a 20 20 20 20  db value} {.    
06f0: 20 20 75 70 6c 65 76 65 6c 20 5b 6c 69 73 74 20    uplevel [list 
0700: 24 64 62 20 65 76 61 6c 20 22 50 52 41 47 4d 41  $db eval "PRAGMA
0710: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
0720: 69 6e 74 20 3d 20 24 76 61 6c 75 65 22 5d 0a 20  int = $value"]. 
0730: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 32 20 7b 0a     }.  }..  2 {.
0740: 20 20 20 20 70 72 6f 63 20 61 75 74 6f 63 68 65      proc autoche
0750: 63 6b 70 6f 69 6e 74 20 7b 64 62 20 76 61 6c 75  ckpoint {db valu
0760: 65 7d 20 7b 0a 20 20 20 20 20 20 75 70 6c 65 76  e} {.      uplev
0770: 65 6c 20 5b 6c 69 73 74 20 73 71 6c 69 74 65 33  el [list sqlite3
0780: 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f  _wal_autocheckpo
0790: 69 6e 74 20 24 64 62 20 24 76 61 6c 75 65 5d 0a  int $db $value].
07a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 24 76 61        return $va
07b0: 6c 75 65 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20  lue.    }.  }.} 
07c0: 7b 0a 0a 20 20 65 76 61 6c 20 24 63 6f 64 65 0a  {..  eval $code.
07d0: 0a 20 20 72 65 73 65 74 5f 64 62 0a 20 20 65 78  .  reset_db.  ex
07e0: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 61  ecsql { PRAGMA a
07f0: 75 74 6f 5f 76 61 63 75 75 6d 20 3d 20 30 20 7d  uto_vacuum = 0 }
0800: 0a 20 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  .  do_execsql_te
0810: 73 74 20 31 2e 24 74 6e 2e 30 20 7b 20 50 52 41  st 1.$tn.0 { PRA
0820: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
0830: 20 3d 20 57 41 4c 20 7d 20 7b 77 61 6c 7d 0a 20   = WAL } {wal}. 
0840: 20 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65 73 74   do_execsql_test
0850: 20 31 2e 24 74 6e 2e 31 20 7b 20 43 52 45 41 54   1.$tn.1 { CREAT
0860: 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62 29  E TABLE t1(a, b)
0870: 20 7d 0a 20 20 73 65 74 20 73 68 6d 66 64 20 5b   }.  set shmfd [
0880: 6f 70 65 6e 20 22 74 65 73 74 2e 64 62 2d 73 68  open "test.db-sh
0890: 6d 22 20 72 62 5d 0a 0a 20 20 23 20 45 56 49 44  m" rb]..  # EVID
08a0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 31 35 33 31  ENCE-OF: R-41531
08b0: 2d 35 31 30 38 33 20 45 76 65 72 79 20 6e 65 77  -51083 Every new
08c0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
08d0: 74 69 6f 6e 20 64 65 66 61 75 6c 74 73 20 74 6f  tion defaults to
08e0: 0a 20 20 23 20 68 61 76 69 6e 67 20 74 68 65 20  .  # having the 
08f0: 61 75 74 6f 2d 63 68 65 63 6b 70 6f 69 6e 74 20  auto-checkpoint 
0900: 65 6e 61 62 6c 65 64 20 77 69 74 68 20 61 20 74  enabled with a t
0910: 68 72 65 73 68 6f 6c 64 20 6f 66 20 31 30 30 30  hreshold of 1000
0920: 20 6f 72 0a 20 20 23 20 53 51 4c 49 54 45 5f 44   or.  # SQLITE_D
0930: 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55 54 4f 43  EFAULT_WAL_AUTOC
0940: 48 45 43 4b 50 4f 49 4e 54 20 70 61 67 65 73 2e  HECKPOINT pages.
0950: 0a 20 20 23 0a 20 20 64 6f 5f 61 75 74 6f 63 6f  .  #.  do_autoco
0960: 6d 6d 69 74 5f 74 68 72 65 73 68 6f 6c 64 5f 74  mmit_threshold_t
0970: 65 73 74 20 31 2e 24 74 6e 2e 32 20 31 30 30 30  est 1.$tn.2 1000
0980: 0a 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53  .  db eval { INS
0990: 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55  ERT INTO t1 VALU
09a0: 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ES(randomblob(10
09b0: 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31  0), randomblob(1
09c0: 30 30 29 29 20 7d 0a 20 20 64 6f 5f 61 75 74 6f  00)) }.  do_auto
09d0: 63 6f 6d 6d 69 74 5f 74 68 72 65 73 68 6f 6c 64  commit_threshold
09e0: 5f 74 65 73 74 20 31 2e 24 74 6e 2e 33 20 31 30  _test 1.$tn.3 10
09f0: 30 30 0a 0a 20 20 23 20 45 56 49 44 45 4e 43 45  00..  # EVIDENCE
0a00: 2d 4f 46 3a 20 52 2d 33 38 31 32 38 2d 33 34 31  -OF: R-38128-341
0a10: 30 32 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77  02 The sqlite3_w
0a20: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
0a30: 74 28 44 2c 4e 29 20 69 73 20 61 0a 20 20 23 20  t(D,N) is a.  # 
0a40: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
0a50: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
0a60: 29 20 74 68 61 74 20 63 61 75 73 65 73 20 61 6e  ) that causes an
0a70: 79 20 64 61 74 61 62 61 73 65 20 6f 6e 20 64 61  y database on da
0a80: 74 61 62 61 73 65 0a 20 20 23 20 63 6f 6e 6e 65  tabase.  # conne
0a90: 63 74 69 6f 6e 20 44 20 74 6f 20 61 75 74 6f 6d  ction D to autom
0aa0: 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f  atically checkpo
0ab0: 69 6e 74 20 61 66 74 65 72 20 63 6f 6d 6d 69 74  int after commit
0ac0: 74 69 6e 67 20 61 0a 20 20 23 20 74 72 61 6e 73  ting a.  # trans
0ad0: 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  action if there 
0ae0: 61 72 65 20 4e 20 6f 72 20 6d 6f 72 65 20 66 72  are N or more fr
0af0: 61 6d 65 73 20 69 6e 20 74 68 65 20 77 72 69 74  ames in the writ
0b00: 65 2d 61 68 65 61 64 20 6c 6f 67 20 66 69 6c 65  e-ahead log file
0b10: 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74 20  ..  #.  do_test 
0b20: 31 2e 24 74 6e 2e 34 20 7b 0a 20 20 20 20 64 62  1.$tn.4 {.    db
0b30: 20 65 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49   eval { INSERT I
0b40: 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61  NTO t1 VALUES(ra
0b50: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c 20 72  ndomblob(100), r
0b60: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 20  andomblob(100)) 
0b70: 7d 0a 20 20 20 20 61 75 74 6f 63 68 65 63 6b 70  }.    autocheckp
0b80: 6f 69 6e 74 20 64 62 20 31 30 30 0a 20 20 7d 20  oint db 100.  } 
0b90: 7b 31 30 30 7d 0a 20 20 64 6f 5f 61 75 74 6f 63  {100}.  do_autoc
0ba0: 6f 6d 6d 69 74 5f 74 68 72 65 73 68 6f 6c 64 5f  ommit_threshold_
0bb0: 74 65 73 74 20 31 2e 24 74 6e 2e 35 20 31 30 30  test 1.$tn.5 100
0bc0: 0a 0a 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74  ..  do_test 1.$t
0bd0: 6e 2e 36 20 7b 0a 20 20 20 20 64 62 20 65 76 61  n.6 {.    db eva
0be0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
0bf0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
0c00: 62 6c 6f 62 28 31 30 30 29 2c 20 72 61 6e 64 6f  blob(100), rando
0c10: 6d 62 6c 6f 62 28 31 30 30 29 29 20 7d 0a 20 20  mblob(100)) }.  
0c20: 20 20 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74    autocheckpoint
0c30: 20 64 62 20 35 30 30 0a 20 20 7d 20 7b 35 30 30   db 500.  } {500
0c40: 7d 0a 20 20 64 6f 5f 61 75 74 6f 63 6f 6d 6d 69  }.  do_autocommi
0c50: 74 5f 74 68 72 65 73 68 6f 6c 64 5f 74 65 73 74  t_threshold_test
0c60: 20 31 2e 24 74 6e 2e 37 20 35 30 30 0a 0a 20 20   1.$tn.7 500..  
0c70: 23 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  # EVIDENCE-OF: R
0c80: 2d 32 36 39 39 33 2d 34 33 35 34 30 20 50 61 73  -26993-43540 Pas
0c90: 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e  sing zero or a n
0ca0: 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73  egative value as
0cb0: 20 74 68 65 0a 20 20 23 20 6e 46 72 61 6d 65 20   the.  # nFrame 
0cc0: 70 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c  parameter disabl
0cd0: 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65  es automatic che
0ce0: 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c  ckpoints entirel
0cf0: 79 2e 0a 20 20 23 0a 20 20 64 6f 5f 74 65 73 74  y..  #.  do_test
0d00: 20 31 2e 24 74 6e 2e 37 20 7b 0a 20 20 20 20 61   1.$tn.7 {.    a
0d10: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  utocheckpoint db
0d20: 20 30 20 20 20 20 3b 23 20 53 65 74 20 74 6f 20   0    ;# Set to 
0d30: 7a 65 72 6f 0a 20 20 20 20 66 6f 72 20 7b 73 65  zero.    for {se
0d40: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30  t i 0} {$i < 100
0d50: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
0d60: 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49       db eval { I
0d70: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0d80: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
0d90: 31 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  100), randomblob
0da0: 28 31 30 30 29 29 20 7d 0a 20 20 20 20 7d 0a 20  (100)) }.    }. 
0db0: 20 20 20 65 78 70 72 20 7b 5b 66 69 6c 65 20 73     expr {[file s
0dc0: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
0dd0: 20 3e 20 28 35 20 2a 20 31 30 32 34 20 2a 20 31   > (5 * 1024 * 1
0de0: 30 32 34 29 7d 0a 20 20 7d 20 31 0a 20 20 64 6f  024)}.  } 1.  do
0df0: 5f 74 65 73 74 20 31 2e 24 74 6e 2e 38 20 7b 0a  _test 1.$tn.8 {.
0e00: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
0e10: 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64 62  checkpoint_v2 db
0e20: 20 74 72 75 6e 63 61 74 65 0a 20 20 20 20 66 69   truncate.    fi
0e30: 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 2d  le size test.db-
0e40: 77 61 6c 0a 20 20 7d 20 30 0a 20 20 64 6f 5f 74  wal.  } 0.  do_t
0e50: 65 73 74 20 31 2e 24 74 6e 2e 39 20 7b 0a 20 20  est 1.$tn.9 {.  
0e60: 20 20 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74    autocheckpoint
0e70: 20 64 62 20 2d 34 20 20 20 20 3b 23 20 53 65 74   db -4    ;# Set
0e80: 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 76   to a negative v
0e90: 61 6c 75 65 0a 20 20 20 20 66 6f 72 20 7b 73 65  alue.    for {se
0ea0: 74 20 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30  t i 0} {$i < 100
0eb0: 30 30 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  00} {incr i} {. 
0ec0: 20 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49       db eval { I
0ed0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
0ee0: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
0ef0: 31 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  100), randomblob
0f00: 28 31 30 30 29 29 20 7d 0a 20 20 20 20 7d 0a 20  (100)) }.    }. 
0f10: 20 20 20 65 78 70 72 20 7b 5b 66 69 6c 65 20 73     expr {[file s
0f20: 69 7a 65 20 74 65 73 74 2e 64 62 2d 77 61 6c 5d  ize test.db-wal]
0f30: 20 3e 20 28 35 20 2a 20 31 30 32 34 20 2a 20 31   > (5 * 1024 * 1
0f40: 30 32 34 29 7d 0a 20 20 7d 20 31 0a 0a 20 20 23  024)}.  } 1..  #
0f50: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
0f60: 31 30 32 30 33 2d 34 32 36 38 38 20 54 68 65 20  10203-42688 The 
0f70: 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
0f80: 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
0f90: 74 69 6f 6e 0a 20 20 23 20 72 65 70 6c 61 63 65  tion.  # replace
0fa0: 73 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63  s any existing c
0fb0: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
0fc0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
0fd0: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 0a 20 20 23  _wal_hook()..  #
0fe0: 0a 20 20 73 65 74 20 3a 3a 77 61 6c 5f 68 6f 6f  .  set ::wal_hoo
0ff0: 6b 5f 63 61 6c 6c 62 61 63 6b 20 30 0a 20 20 70  k_callback 0.  p
1000: 72 6f 63 20 77 61 6c 5f 68 6f 6f 6b 5f 63 61 6c  roc wal_hook_cal
1010: 6c 62 61 63 6b 20 7b 61 72 67 73 7d 20 7b 20 69  lback {args} { i
1020: 6e 63 72 20 3a 3a 77 61 6c 5f 68 6f 6f 6b 5f 63  ncr ::wal_hook_c
1030: 61 6c 6c 62 61 63 6b 20 3b 20 72 65 74 75 72 6e  allback ; return
1040: 20 30 20 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31   0 }.  do_test 1
1050: 2e 24 74 6e 2e 31 30 2e 31 20 7b 0a 20 20 20 20  .$tn.10.1 {.    
1060: 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 77 61 6c 5f  db wal_hook wal_
1070: 68 6f 6f 6b 5f 63 61 6c 6c 62 61 63 6b 0a 20 20  hook_callback.  
1080: 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45    db eval { INSE
1090: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
10a0: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  S(randomblob(100
10b0: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
10c0: 30 29 29 20 7d 0a 20 20 20 20 64 62 20 65 76 61  0)) }.    db eva
10d0: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
10e0: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
10f0: 62 6c 6f 62 28 31 30 30 29 2c 20 72 61 6e 64 6f  blob(100), rando
1100: 6d 62 6c 6f 62 28 31 30 30 29 29 20 7d 0a 20 20  mblob(100)) }.  
1110: 20 20 73 65 74 20 3a 3a 77 61 6c 5f 68 6f 6f 6b    set ::wal_hook
1120: 5f 63 61 6c 6c 62 61 63 6b 0a 20 20 7d 20 32 0a  _callback.  } 2.
1130: 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e    do_test 1.$tn.
1140: 31 30 2e 32 20 7b 0a 20 20 20 20 61 75 74 6f 63  10.2 {.    autoc
1150: 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 31 30 30  heckpoint db 100
1160: 0a 20 20 20 20 64 62 20 65 76 61 6c 20 7b 20 49  .    db eval { I
1170: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1180: 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28  LUES(randomblob(
1190: 31 30 30 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62  100), randomblob
11a0: 28 31 30 30 29 29 20 7d 0a 20 20 20 20 64 62 20  (100)) }.    db 
11b0: 65 76 61 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e  eval { INSERT IN
11c0: 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72 61 6e  TO t1 VALUES(ran
11d0: 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c 20 72 61  domblob(100), ra
11e0: 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29 20 7d  ndomblob(100)) }
11f0: 0a 20 20 20 20 73 65 74 20 3a 3a 77 61 6c 5f 68  .    set ::wal_h
1200: 6f 6f 6b 5f 63 61 6c 6c 62 61 63 6b 0a 20 20 7d  ook_callback.  }
1210: 20 32 0a 0a 20 20 23 20 45 56 49 44 45 4e 43 45   2..  # EVIDENCE
1220: 2d 4f 46 3a 20 52 2d 31 37 34 39 37 2d 34 33 34  -OF: R-17497-434
1230: 37 34 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67  74 Likewise, reg
1240: 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62  istering a callb
1250: 61 63 6b 20 75 73 69 6e 67 0a 20 20 23 20 73 71  ack using.  # sq
1260: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
1270: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
1280: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
1290: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 20 20 23  nt mechanism.  #
12a0: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74   configured by t
12b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20  his function..  
12c0: 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e 31 31  do_test 1.$tn.11
12d0: 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .1 {.    sqlite3
12e0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
12f0: 76 32 20 64 62 20 74 72 75 6e 63 61 74 65 0a 20  v2 db truncate. 
1300: 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73     file size tes
1310: 74 2e 64 62 2d 77 61 6c 0a 20 20 7d 20 30 0a 20  t.db-wal.  } 0. 
1320: 20 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e 31   do_test 1.$tn.1
1330: 31 2e 32 20 7b 0a 20 20 20 20 61 75 74 6f 63 68  1.2 {.    autoch
1340: 65 63 6b 70 6f 69 6e 74 20 64 62 20 31 30 30 20  eckpoint db 100 
1350: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
1360: 30 7d 20 7b 24 69 20 3c 20 31 30 30 30 7d 20 7b  0} {$i < 1000} {
1370: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
1380: 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52 54  db eval { INSERT
1390: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
13a0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c  randomblob(100),
13b0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
13c0: 29 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 78  ) }.    }.    ex
13d0: 70 72 20 7b 5b 66 69 6c 65 20 73 69 7a 65 20 74  pr {[file size t
13e0: 65 73 74 2e 64 62 2d 77 61 6c 5d 20 3c 20 28 31  est.db-wal] < (1
13f0: 20 2a 20 31 30 32 34 20 2a 20 31 30 32 34 29 7d   * 1024 * 1024)}
1400: 0a 20 20 7d 20 31 0a 20 20 64 6f 5f 74 65 73 74  .  } 1.  do_test
1410: 20 31 2e 24 74 6e 2e 31 31 2e 33 20 7b 0a 20 20   1.$tn.11.3 {.  
1420: 20 20 64 62 20 77 61 6c 5f 68 6f 6f 6b 20 77 61    db wal_hook wa
1430: 6c 5f 68 6f 6f 6b 5f 63 61 6c 6c 62 61 63 6b 0a  l_hook_callback.
1440: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20 30      for {set i 0
1450: 7d 20 7b 24 69 20 3c 20 31 30 30 30 7d 20 7b 69  } {$i < 1000} {i
1460: 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20 64  ncr i} {.      d
1470: 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52 54 20  b eval { INSERT 
1480: 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28 72  INTO t1 VALUES(r
1490: 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c 20  andomblob(100), 
14a0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 29  randomblob(100))
14b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 78 70   }.    }.    exp
14c0: 72 20 7b 5b 66 69 6c 65 20 73 69 7a 65 20 74 65  r {[file size te
14d0: 73 74 2e 64 62 2d 77 61 6c 5d 20 3c 20 28 31 20  st.db-wal] < (1 
14e0: 2a 20 31 30 32 34 20 2a 20 31 30 32 34 29 7d 0a  * 1024 * 1024)}.
14f0: 20 20 7d 20 30 0a 0a 20 20 23 20 45 56 49 44 45    } 0..  # EVIDE
1500: 4e 43 45 2d 4f 46 3a 20 52 2d 33 33 30 38 30 2d  NCE-OF: R-33080-
1510: 35 39 31 39 33 20 43 68 65 63 6b 70 6f 69 6e 74  59193 Checkpoint
1520: 73 20 69 6e 69 74 69 61 74 65 64 20 62 79 20 74  s initiated by t
1530: 68 69 73 20 6d 65 63 68 61 6e 69 73 6d 20 0a 20  his mechanism . 
1540: 20 23 20 61 72 65 20 50 41 53 53 49 56 45 2e 0a   # are PASSIVE..
1550: 20 20 23 0a 20 20 73 65 74 20 3a 3a 62 75 73 79    #.  set ::busy
1560: 5f 63 61 6c 6c 62 61 63 6b 5f 63 6f 75 6e 74 20  _callback_count 
1570: 30 0a 20 20 70 72 6f 63 20 62 75 73 79 5f 63 61  0.  proc busy_ca
1580: 6c 6c 62 61 63 6b 20 7b 61 72 67 73 7d 20 7b 0a  llback {args} {.
1590: 20 20 20 20 69 6e 63 72 20 3a 3a 62 75 73 79 5f      incr ::busy_
15a0: 63 61 6c 6c 62 61 63 6b 5f 63 6f 75 6e 74 0a 20  callback_count. 
15b0: 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20 7d 0a     return 0.  }.
15c0: 20 20 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e    do_test 1.$tn.
15d0: 31 32 2e 31 20 7b 0a 20 20 20 20 73 71 6c 69 74  12.1 {.    sqlit
15e0: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
15f0: 74 5f 76 32 20 64 62 20 74 72 75 6e 63 61 74 65  t_v2 db truncate
1600: 0a 20 20 20 20 61 75 74 6f 63 68 65 63 6b 70 6f  .    autocheckpo
1610: 69 6e 74 20 64 62 20 31 30 30 20 0a 20 20 20 20  int db 100 .    
1620: 64 62 20 62 75 73 79 20 62 75 73 79 5f 63 61 6c  db busy busy_cal
1630: 6c 62 61 63 6b 0a 20 20 20 20 64 62 20 65 76 61  lback.    db eva
1640: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
1650: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
1660: 62 6c 6f 62 28 31 30 30 29 2c 20 72 61 6e 64 6f  blob(100), rando
1670: 6d 62 6c 6f 62 28 31 30 30 29 29 20 7d 0a 20 20  mblob(100)) }.  
1680: 20 20 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45    db eval { INSE
1690: 52 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45  RT INTO t1 VALUE
16a0: 53 28 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30  S(randomblob(100
16b0: 29 2c 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30  ), randomblob(10
16c0: 30 29 29 20 7d 0a 20 20 7d 20 7b 7d 0a 20 20 64  0)) }.  } {}.  d
16d0: 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e 31 32 2e  o_test 1.$tn.12.
16e0: 32 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20  2 {.    sqlite3 
16f0: 64 62 32 20 74 65 73 74 2e 64 62 0a 20 20 20 20  db2 test.db.    
1700: 64 62 32 20 65 76 61 6c 20 7b 20 42 45 47 49 4e  db2 eval { BEGIN
1710: 3b 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ; SELECT * FROM 
1720: 74 31 20 4c 49 4d 49 54 20 31 30 3b 20 7d 0a 20  t1 LIMIT 10; }. 
1730: 20 20 20 72 65 61 64 5f 6e 62 61 63 6b 66 69 6c     read_nbackfil
1740: 6c 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f 5f 74  l.  } {0}.  do_t
1750: 65 73 74 20 31 2e 24 74 6e 2e 31 32 2e 33 20 7b  est 1.$tn.12.3 {
1760: 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 20 69 20  .    for {set i 
1770: 30 7d 20 7b 24 69 20 3c 20 31 30 30 30 7d 20 7b  0} {$i < 1000} {
1780: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
1790: 64 62 20 65 76 61 6c 20 7b 20 49 4e 53 45 52 54  db eval { INSERT
17a0: 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53 28   INTO t1 VALUES(
17b0: 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29 2c  randomblob(100),
17c0: 20 72 61 6e 64 6f 6d 62 6c 6f 62 28 31 30 30 29   randomblob(100)
17d0: 29 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ) }.    }.    re
17e0: 61 64 5f 6e 62 61 63 6b 66 69 6c 6c 0a 20 20 7d  ad_nbackfill.  }
17f0: 20 7b 32 7d 0a 20 20 64 6f 5f 74 65 73 74 20 31   {2}.  do_test 1
1800: 2e 24 74 6e 2e 31 32 2e 34 20 7b 0a 20 20 20 20  .$tn.12.4 {.    
1810: 73 65 74 20 3a 3a 62 75 73 79 5f 63 61 6c 6c 62  set ::busy_callb
1820: 61 63 6b 5f 63 6f 75 6e 74 0a 20 20 7d 20 7b 30  ack_count.  } {0
1830: 7d 0a 20 20 64 62 32 20 63 6c 6f 73 65 0a 0a 20  }.  db2 close.. 
1840: 20 64 6f 5f 74 65 73 74 20 31 2e 24 74 6e 2e 31   do_test 1.$tn.1
1850: 32 2e 35 20 7b 0a 20 20 20 20 64 62 20 65 76 61  2.5 {.    db eva
1860: 6c 20 7b 20 49 4e 53 45 52 54 20 49 4e 54 4f 20  l { INSERT INTO 
1870: 74 31 20 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d  t1 VALUES(random
1880: 62 6c 6f 62 28 31 30 30 29 2c 20 72 61 6e 64 6f  blob(100), rando
1890: 6d 62 6c 6f 62 28 31 30 30 29 29 20 7d 0a 20 20  mblob(100)) }.  
18a0: 20 20 72 65 61 64 5f 6e 62 61 63 6b 66 69 6c 6c    read_nbackfill
18b0: 0a 20 20 7d 20 7b 31 35 35 39 7d 0a 0a 20 20 64  .  } {1559}..  d
18c0: 62 20 63 6c 6f 73 65 0a 20 20 63 6c 6f 73 65 20  b close.  close 
18d0: 24 73 68 6d 66 64 0a 7d 0a 0a 66 69 6e 69 73 68  $shmfd.}..finish
18e0: 5f 74 65 73 74 0a                                _test.