/ Hex Artifact Content
Login

Artifact 2e4ad7684a13389a44a840499cd47173a8d05f22f082d7d083eece433a7a64eb:


0000: 23 20 32 30 30 35 20 4e 6f 76 65 6d 62 65 72 20  # 2005 November 
0010: 33 30 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  30.#.# 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 23 20 54 68 69  ********.#.# Thi
0170: 73 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  s file contains 
0180: 74 65 73 74 20 63 61 73 65 73 20 66 6f 63 75 73  test cases focus
0190: 65 64 20 6f 6e 20 74 68 65 20 74 77 6f 20 6d 65  ed on the two me
01a0: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
01b0: 41 50 49 73 2c 20 0a 23 20 73 71 6c 69 74 65 33  APIs, .# sqlite3
01c0: 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
01d0: 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 72  () and sqlite3_r
01e0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 2e  elease_memory().
01f0: 0a 23 0a 23 20 50 72 69 6f 72 20 74 6f 20 76 65  .#.# Prior to ve
0200: 72 73 69 6f 6e 20 33 2e 36 2e 32 2c 20 63 61 6c  rsion 3.6.2, cal
0210: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 72 65 6c  ling sqlite3_rel
0220: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 6f 72  ease_memory() or
0230: 20 65 78 63 65 65 64 69 6e 67 0a 23 20 74 68 65   exceeding.# the
0240: 20 63 6f 6e 66 69 67 75 72 65 64 20 73 6f 66 74   configured soft
0250: 20 68 65 61 70 20 6c 69 6d 69 74 20 63 6f 75 6c   heap limit coul
0260: 64 20 63 61 75 73 65 20 73 71 6c 69 74 65 20 74  d cause sqlite t
0270: 6f 20 75 70 67 72 61 64 65 20 64 61 74 61 62 61  o upgrade databa
0280: 73 65 20 0a 23 20 6c 6f 63 6b 73 20 61 6e 64 20  se .# locks and 
0290: 66 6c 75 73 68 20 64 69 72 74 79 20 70 61 67 65  flush dirty page
02a0: 73 20 74 6f 20 74 68 65 20 66 69 6c 65 20 73 79  s to the file sy
02b0: 73 74 65 6d 2e 20 41 73 20 6f 66 20 33 2e 36 2e  stem. As of 3.6.
02c0: 32 2c 20 74 68 69 73 20 69 73 0a 23 20 6e 6f 20  2, this is.# no 
02d0: 6c 6f 6e 67 65 72 20 74 68 65 20 63 61 73 65 2e  longer the case.
02e0: 20 49 6e 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   In version 3.6.
02f0: 32 2c 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  2, sqlite3_relea
0300: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 6f 6e 6c 79  se_memory() only
0310: 0a 23 20 72 65 63 6c 61 69 6d 73 20 63 6c 65 61  .# reclaims clea
0320: 6e 20 70 61 67 65 73 2e 20 54 68 69 73 20 74 65  n pages. This te
0330: 73 74 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  st file has been
0340: 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
0350: 6e 67 6c 79 2e 0a 23 0a 23 20 24 49 64 3a 20 6d  ngly..#.# $Id: m
0360: 61 6c 6c 6f 63 35 2e 74 65 73 74 2c 76 20 31 2e  alloc5.test,v 1.
0370: 32 32 20 32 30 30 39 2f 30 34 2f 31 31 20 31 39  22 2009/04/11 19
0380: 3a 30 39 3a 35 34 20 64 72 68 20 45 78 70 20 24  :09:54 drh Exp $
0390: 0a 0a 73 65 74 20 74 65 73 74 64 69 72 20 5b 66  ..set testdir [f
03a0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 61 72 67  ile dirname $arg
03b0: 76 30 5d 0a 73 6f 75 72 63 65 20 24 74 65 73 74  v0].source $test
03c0: 64 69 72 2f 74 65 73 74 65 72 2e 74 63 6c 0a 73  dir/tester.tcl.s
03d0: 6f 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 6d  ource $testdir/m
03e0: 61 6c 6c 6f 63 5f 63 6f 6d 6d 6f 6e 2e 74 63 6c  alloc_common.tcl
03f0: 0a 64 62 20 63 6c 6f 73 65 0a 0a 23 20 4f 6e 6c  .db close..# Onl
0400: 79 20 72 75 6e 20 74 68 65 73 65 20 74 65 73 74  y run these test
0410: 73 20 69 66 20 6d 65 6d 6f 72 79 20 64 65 62 75  s if memory debu
0420: 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20  gging is turned 
0430: 6f 6e 2e 0a 23 0a 69 66 20 7b 21 24 4d 45 4d 44  on..#.if {!$MEMD
0440: 45 42 55 47 7d 20 7b 0a 20 20 20 70 75 74 73 20  EBUG} {.   puts 
0450: 22 53 6b 69 70 70 69 6e 67 20 6d 61 6c 6c 6f 63  "Skipping malloc
0460: 35 20 74 65 73 74 73 3a 20 6e 6f 74 20 63 6f 6d  5 tests: not com
0470: 70 69 6c 65 64 20 77 69 74 68 20 2d 44 53 51 4c  piled with -DSQL
0480: 49 54 45 5f 4d 45 4d 44 45 42 55 47 2e 2e 2e 22  ITE_MEMDEBUG..."
0490: 0a 20 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  .   finish_test.
04a0: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 53     return.}..# S
04b0: 6b 69 70 20 74 68 65 73 65 20 74 65 73 74 73 20  kip these tests 
04c0: 69 66 20 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d  if OMIT_MEMORY_M
04d0: 41 4e 41 47 45 4d 45 4e 54 20 77 61 73 20 64 65  ANAGEMENT was de
04e0: 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
04f0: 20 74 69 6d 65 2e 0a 69 66 63 61 70 61 62 6c 65   time..ifcapable
0500: 20 21 6d 65 6d 6f 72 79 6d 61 6e 61 67 65 20 7b   !memorymanage {
0510: 0a 20 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a  .   finish_test.
0520: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 54     return.}..# T
0530: 68 65 20 73 69 7a 65 73 20 6f 66 20 6d 65 6d 6f  he sizes of memo
0540: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 66  ry allocations f
0550: 72 6f 6d 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f  rom system mallo
0560: 63 28 29 20 6d 69 67 68 74 20 76 61 72 79 2c 0a  c() might vary,.
0570: 23 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  # depending on t
0580: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0590: 74 6f 72 20 61 6c 67 6f 72 69 74 68 6d 73 20 75  tor algorithms u
05a0: 73 65 64 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  sed.  The follow
05b0: 69 6e 67 0a 23 20 72 6f 75 74 69 6e 65 20 69 73  ing.# routine is
05c0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 73 75 70   designed to sup
05d0: 70 6f 72 74 20 61 6e 73 77 65 72 73 20 74 68 61  port answers tha
05e0: 74 20 66 61 6c 6c 20 77 69 74 68 69 6e 20 61 20  t fall within a 
05f0: 72 61 6e 67 65 0a 23 20 6f 66 20 76 61 6c 75 65  range.# of value
0600: 73 20 77 68 69 6c 65 20 61 6c 73 6f 20 73 75 70  s while also sup
0610: 70 6c 79 69 6e 67 20 65 61 73 79 2d 74 6f 2d 75  plying easy-to-u
0620: 6e 64 65 72 73 74 61 6e 64 20 22 65 78 70 65 63  nderstand "expec
0630: 74 65 64 22 20 76 61 6c 75 65 73 0a 23 20 77 68  ted" values.# wh
0640: 65 6e 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2e  en errors occur.
0650: 0a 23 0a 70 72 6f 63 20 76 61 6c 75 65 5f 69 6e  .#.proc value_in
0660: 5f 72 61 6e 67 65 20 7b 74 61 72 67 65 74 20 78  _range {target x
0670: 20 61 72 67 73 7d 20 7b 0a 20 20 73 65 74 20 76   args} {.  set v
0680: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
0690: 5d 0a 20 20 69 66 20 7b 24 76 21 3d 22 22 7d 20  ].  if {$v!=""} 
06a0: 7b 0a 20 20 20 20 69 66 20 7b 24 76 3c 24 74 61  {.    if {$v<$ta
06b0: 72 67 65 74 2a 24 78 7d 20 7b 72 65 74 75 72 6e  rget*$x} {return
06c0: 20 24 76 7d 0a 20 20 20 20 69 66 20 7b 24 76 3e   $v}.    if {$v>
06d0: 24 74 61 72 67 65 74 2f 24 78 7d 20 7b 72 65 74  $target/$x} {ret
06e0: 75 72 6e 20 24 76 7d 0a 20 20 7d 0a 20 20 72 65  urn $v}.  }.  re
06f0: 74 75 72 6e 20 22 6e 75 6d 62 65 72 20 62 65 74  turn "number bet
0700: 77 65 65 6e 20 5b 65 78 70 72 20 7b 69 6e 74 28  ween [expr {int(
0710: 24 74 61 72 67 65 74 2a 24 78 29 7d 5d 20 61 6e  $target*$x)}] an
0720: 64 20 5b 65 78 70 72 20 7b 69 6e 74 28 24 74 61  d [expr {int($ta
0730: 72 67 65 74 2f 24 78 29 7d 5d 22 0a 7d 0a 73 65  rget/$x)}]".}.se
0740: 74 20 6d 72 61 6e 67 65 20 30 2e 39 38 20 20 20  t mrange 0.98   
0750: 3b 23 20 20 70 6c 75 73 20 6f 72 20 6d 69 6e 75  ;#  plus or minu
0760: 73 20 32 25 0a 0a 74 65 73 74 5f 73 65 74 5f 63  s 2%..test_set_c
0770: 6f 6e 66 69 67 5f 70 61 67 65 63 61 63 68 65 20  onfig_pagecache 
0780: 30 20 31 30 30 0a 0a 73 71 6c 69 74 65 33 5f 73  0 100..sqlite3_s
0790: 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 30  oft_heap_limit 0
07a0: 0a 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74  .sqlite3 db test
07b0: 2e 64 62 0a 23 20 64 62 20 65 76 61 6c 20 7b 50  .db.# db eval {P
07c0: 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65  RAGMA cache_size
07d0: 3d 31 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 61 6c  =1}..do_test mal
07e0: 6c 6f 63 35 2d 31 2e 31 20 7b 0a 20 20 23 20 53  loc5-1.1 {.  # S
07f0: 69 6d 70 6c 65 73 74 20 70 6f 73 73 69 62 6c 65  implest possible
0800: 20 74 65 73 74 2e 20 43 61 6c 6c 20 73 71 6c 69   test. Call sqli
0810: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
0820: 72 79 20 77 68 65 6e 20 74 68 65 72 65 20 69 73  ry when there is
0830: 20 65 78 61 63 74 6c 79 0a 20 20 23 20 6f 6e 65   exactly.  # one
0840: 20 75 6e 75 73 65 64 20 70 61 67 65 20 69 6e 20   unused page in 
0850: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 72 20 63  a single pager c
0860: 61 63 68 65 2e 20 54 68 65 20 70 61 67 65 20 63  ache. The page c
0870: 61 6e 6e 6f 74 20 62 65 20 66 72 65 65 64 2c 20  annot be freed, 
0880: 61 73 0a 20 20 23 20 69 74 20 69 73 20 64 69 72  as.  # it is dir
0890: 74 79 2e 20 53 6f 20 73 71 6c 69 74 65 33 5f 72  ty. So sqlite3_r
08a0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
08b0: 72 65 74 75 72 6e 73 20 30 2e 0a 20 20 23 0a 20  returns 0..  #. 
08c0: 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50   execsql {.    P
08d0: 52 41 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75  RAGMA auto_vacuu
08e0: 6d 3d 4f 46 46 3b 0a 20 20 20 20 42 45 47 49 4e  m=OFF;.    BEGIN
08f0: 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41 42  ;.    CREATE TAB
0900: 4c 45 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b  LE abc(a, b, c);
0910: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 72  .  }.  sqlite3_r
0920: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 0a 7d 20  elease_memory.} 
0930: 7b 30 7d 0a 0a 64 6f 5f 74 65 73 74 20 6d 61 6c  {0}..do_test mal
0940: 6c 6f 63 35 2d 31 2e 32 20 7b 0a 20 20 23 20 54  loc5-1.2 {.  # T
0950: 65 73 74 20 74 68 61 74 20 74 68 65 20 74 72 61  est that the tra
0960: 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64  nsaction started
0970: 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 74 65   in the above te
0980: 73 74 20 69 73 20 73 74 69 6c 6c 20 61 63 74 69  st is still acti
0990: 76 65 2e 0a 20 20 23 20 54 68 65 20 6c 6f 63 6b  ve..  # The lock
09a0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
09b0: 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74   file should not
09c0: 20 68 61 76 65 20 62 65 65 6e 20 75 70 67 72 61   have been upgra
09d0: 64 65 64 20 28 74 68 69 73 20 77 61 73 0a 20 20  ded (this was.  
09e0: 23 20 6e 6f 74 20 74 68 65 20 63 61 73 65 20 62  # not the case b
09f0: 65 66 6f 72 65 20 76 65 72 73 69 6f 6e 20 33 2e  efore version 3.
0a00: 36 2e 32 29 2e 0a 20 20 23 0a 20 20 73 71 6c 69  6.2)..  #.  sqli
0a10: 74 65 33 20 64 62 32 20 74 65 73 74 2e 64 62 0a  te3 db2 test.db.
0a20: 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d    execsql {PRAGM
0a30: 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 32 3b 20  A cache_size=2; 
0a40: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73 71  SELECT * FROM sq
0a50: 6c 69 74 65 5f 6d 61 73 74 65 72 20 7d 20 64 62  lite_master } db
0a60: 32 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20 6d  2.} {}.do_test m
0a70: 61 6c 6c 6f 63 35 2d 31 2e 33 20 7b 0a 20 20 23  alloc5-1.3 {.  #
0a80: 20 43 61 6c 6c 20 5b 73 71 6c 69 74 65 33 5f 72   Call [sqlite3_r
0a90: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 5d 20 77  elease_memory] w
0aa0: 68 65 6e 20 74 68 65 72 65 20 69 73 20 65 78 61  hen there is exa
0ab0: 63 74 6c 79 20 6f 6e 65 20 75 6e 75 73 65 64 20  ctly one unused 
0ac0: 70 61 67 65 20 0a 20 20 23 20 69 6e 20 74 68 65  page .  # in the
0ad0: 20 63 61 63 68 65 20 62 65 6c 6f 6e 67 69 6e 67   cache belonging
0ae0: 20 74 6f 20 64 62 32 2e 0a 20 20 23 0a 20 20 73   to db2..  #.  s
0af0: 65 74 20 3a 3a 70 67 61 6c 6c 6f 63 20 5b 73 71  et ::pgalloc [sq
0b00: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
0b10: 6d 6f 72 79 5d 0a 20 20 76 61 6c 75 65 5f 69 6e  mory].  value_in
0b20: 5f 72 61 6e 67 65 20 31 32 38 38 20 30 2e 37 35  _range 1288 0.75
0b30: 0a 7d 20 5b 76 61 6c 75 65 5f 69 6e 5f 72 61 6e  .} [value_in_ran
0b40: 67 65 20 31 32 38 38 20 30 2e 37 35 5d 0a 0a 64  ge 1288 0.75]..d
0b50: 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 35 2d 31  o_test malloc5-1
0b60: 2e 34 20 7b 0a 20 20 23 20 43 6f 6d 6d 69 74 20  .4 {.  # Commit 
0b70: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
0b80: 61 6e 64 20 6f 70 65 6e 20 61 20 6e 65 77 20 6f  and open a new o
0b90: 6e 65 2e 20 52 65 61 64 20 31 20 70 61 67 65 20  ne. Read 1 page 
0ba0: 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 2e 0a  into the cache..
0bb0: 20 20 23 20 42 65 63 61 75 73 65 20 74 68 65 20    # Because the 
0bc0: 70 61 67 65 20 69 73 20 6e 6f 74 20 64 69 72 74  page is not dirt
0bd0: 79 2c 20 69 74 20 69 73 20 65 6c 69 67 69 62 6c  y, it is eligibl
0be0: 65 20 66 6f 72 20 63 6f 6c 6c 65 63 74 69 6f 6e  e for collection
0bf0: 20 65 76 65 6e 0a 20 20 23 20 62 65 66 6f 72 65   even.  # before
0c00: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0c10: 20 69 73 20 63 6f 6e 63 6c 75 64 65 64 2e 0a 20   is concluded.. 
0c20: 20 23 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   #.  execsql {. 
0c30: 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 42     COMMIT;.    B
0c40: 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54  EGIN;.    SELECT
0c50: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d   * FROM abc;.  }
0c60: 0a 20 20 76 61 6c 75 65 5f 69 6e 5f 72 61 6e 67  .  value_in_rang
0c70: 65 20 24 3a 3a 70 67 61 6c 6c 6f 63 20 24 3a 3a  e $::pgalloc $::
0c80: 6d 72 61 6e 67 65 20 5b 73 71 6c 69 74 65 33 5f  mrange [sqlite3_
0c90: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 5d 0a  release_memory].
0ca0: 7d 20 5b 76 61 6c 75 65 5f 69 6e 5f 72 61 6e 67  } [value_in_rang
0cb0: 65 20 24 3a 3a 70 67 61 6c 6c 6f 63 20 24 3a 3a  e $::pgalloc $::
0cc0: 6d 72 61 6e 67 65 5d 0a 0a 64 6f 5f 74 65 73 74  mrange]..do_test
0cd0: 20 6d 61 6c 6c 6f 63 35 2d 31 2e 35 20 7b 0a 20   malloc5-1.5 {. 
0ce0: 20 23 20 43 6f 6e 63 6c 75 64 65 20 74 68 65 20   # Conclude the 
0cf0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
0d00: 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ed in the previo
0d10: 75 73 20 5b 64 6f 5f 74 65 73 74 5d 20 62 6c 6f  us [do_test] blo
0d20: 63 6b 2e 20 54 68 69 73 0a 20 20 23 20 63 61 75  ck. This.  # cau
0d30: 73 65 73 20 61 6e 6f 74 68 65 72 20 70 61 67 65  ses another page
0d40: 20 28 70 61 67 65 20 31 29 20 74 6f 20 62 65 63   (page 1) to bec
0d50: 6f 6d 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  ome eligible for
0d60: 20 72 65 63 79 63 6c 69 6e 67 2e 0a 20 20 23 0a   recycling..  #.
0d70: 20 20 65 78 65 63 73 71 6c 20 7b 20 43 4f 4d 4d    execsql { COMM
0d80: 49 54 20 7d 0a 20 20 76 61 6c 75 65 5f 69 6e 5f  IT }.  value_in_
0d90: 72 61 6e 67 65 20 24 3a 3a 70 67 61 6c 6c 6f 63  range $::pgalloc
0da0: 20 24 3a 3a 6d 72 61 6e 67 65 20 5b 73 71 6c 69   $::mrange [sqli
0db0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
0dc0: 72 79 5d 0a 7d 20 5b 76 61 6c 75 65 5f 69 6e 5f  ry].} [value_in_
0dd0: 72 61 6e 67 65 20 24 3a 3a 70 67 61 6c 6c 6f 63  range $::pgalloc
0de0: 20 24 3a 3a 6d 72 61 6e 67 65 5d 0a 0a 64 6f 5f   $::mrange]..do_
0df0: 74 65 73 74 20 6d 61 6c 6c 6f 63 35 2d 31 2e 36  test malloc5-1.6
0e00: 20 7b 0a 20 20 23 20 4d 61 6e 69 70 75 6c 61 74   {.  # Manipulat
0e10: 65 20 74 68 65 20 63 61 63 68 65 20 73 6f 20 74  e the cache so t
0e20: 68 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  hat it contains 
0e30: 74 77 6f 20 75 6e 75 73 65 64 20 70 61 67 65 73  two unused pages
0e40: 2e 20 4f 6e 65 20 72 65 71 75 69 72 65 73 20 0a  . One requires .
0e50: 20 20 23 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79    # a journal-sy
0e60: 6e 63 20 74 6f 20 66 72 65 65 2c 20 74 68 65 20  nc to free, the 
0e70: 6f 74 68 65 72 20 64 6f 65 73 20 6e 6f 74 2e 0a  other does not..
0e80: 20 20 64 62 32 20 63 6c 6f 73 65 0a 20 20 65 78    db2 close.  ex
0e90: 65 63 73 71 6c 20 7b 0a 20 20 20 20 42 45 47 49  ecsql {.    BEGI
0ea0: 4e 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54 41  N;.    CREATE TA
0eb0: 42 4c 45 20 64 65 66 28 64 2c 20 65 2c 20 66 29  BLE def(d, e, f)
0ec0: 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46  ;.    SELECT * F
0ed0: 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a 20 20 76  ROM abc;.  }.  v
0ee0: 61 6c 75 65 5f 69 6e 5f 72 61 6e 67 65 20 24 3a  alue_in_range $:
0ef0: 3a 70 67 61 6c 6c 6f 63 20 24 3a 3a 6d 72 61 6e  :pgalloc $::mran
0f00: 67 65 20 5b 73 71 6c 69 74 65 33 5f 72 65 6c 65  ge [sqlite3_rele
0f10: 61 73 65 5f 6d 65 6d 6f 72 79 20 35 30 30 5d 0a  ase_memory 500].
0f20: 7d 20 5b 76 61 6c 75 65 5f 69 6e 5f 72 61 6e 67  } [value_in_rang
0f30: 65 20 24 3a 3a 70 67 61 6c 6c 6f 63 20 24 3a 3a  e $::pgalloc $::
0f40: 6d 72 61 6e 67 65 5d 0a 64 6f 5f 74 65 73 74 20  mrange].do_test 
0f50: 6d 61 6c 6c 6f 63 35 2d 31 2e 37 20 7b 0a 20 20  malloc5-1.7 {.  
0f60: 23 20 44 61 74 61 62 61 73 65 20 73 68 6f 75 6c  # Database shoul
0f70: 64 20 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20  d not be locked 
0f80: 74 68 69 73 20 74 69 6d 65 2e 20 0a 20 20 73 71  this time. .  sq
0f90: 6c 69 74 65 33 20 64 62 32 20 74 65 73 74 2e 64  lite3 db2 test.d
0fa0: 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b 20 53  b.  catchsql { S
0fb0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63  ELECT * FROM abc
0fc0: 20 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 7d 7d 0a   } db2.} {0 {}}.
0fd0: 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 35 2d  do_test malloc5-
0fe0: 31 2e 38 20 7b 0a 20 20 23 20 54 72 79 20 74 6f  1.8 {.  # Try to
0ff0: 20 72 65 6c 65 61 73 65 20 61 6e 6f 74 68 65 72   release another
1000: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
1010: 2e 20 54 68 69 73 20 77 69 6c 6c 20 66 61 69 6c  . This will fail
1020: 20 61 73 20 74 68 65 20 6f 6e 6c 79 0a 20 20 23   as the only.  #
1030: 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79   pages currently
1040: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 72   in the cache ar
1050: 65 20 64 69 72 74 79 20 28 70 61 67 65 20 33 29  e dirty (page 3)
1060: 20 6f 72 20 70 69 6e 6e 65 64 20 28 70 61 67 65   or pinned (page
1070: 20 31 29 2e 0a 20 20 64 62 32 20 63 6c 6f 73 65   1)..  db2 close
1080: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  .  sqlite3_relea
1090: 73 65 5f 6d 65 6d 6f 72 79 20 35 30 30 0a 7d 20  se_memory 500.} 
10a0: 30 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  0.do_test malloc
10b0: 35 2d 31 2e 38 20 7b 0a 20 20 23 20 44 61 74 61  5-1.8 {.  # Data
10c0: 62 61 73 65 20 69 73 20 73 74 69 6c 6c 20 6e 6f  base is still no
10d0: 74 20 6c 6f 63 6b 65 64 2e 0a 20 20 23 0a 20 20  t locked..  #.  
10e0: 73 71 6c 69 74 65 33 20 64 62 32 20 74 65 73 74  sqlite3 db2 test
10f0: 2e 64 62 0a 20 20 63 61 74 63 68 73 71 6c 20 7b  .db.  catchsql {
1100: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
1110: 62 63 20 7d 20 64 62 32 0a 7d 20 7b 30 20 7b 7d  bc } db2.} {0 {}
1120: 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  }.do_test malloc
1130: 35 2d 31 2e 39 20 7b 0a 20 20 65 78 65 63 73 71  5-1.9 {.  execsq
1140: 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b 0a  l {.    COMMIT;.
1150: 20 20 7d 0a 7d 20 7b 7d 0a 0a 64 6f 5f 74 65 73    }.} {}..do_tes
1160: 74 20 6d 61 6c 6c 6f 63 35 2d 32 2e 31 20 7b 0a  t malloc5-2.1 {.
1170: 20 20 23 20 50 75 74 20 73 6f 6d 65 20 64 61 74    # Put some dat
1180: 61 20 69 6e 20 74 61 62 6c 65 73 20 61 62 63 20  a in tables abc 
1190: 61 6e 64 20 64 65 66 2e 20 42 6f 74 68 20 74 61  and def. Both ta
11a0: 62 6c 65 73 20 61 72 65 20 73 74 69 6c 6c 20 77  bles are still w
11b0: 68 6f 6c 6c 79 20 0a 20 20 23 20 63 6f 6e 74 61  holly .  # conta
11c0: 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 69  ined within thei
11d0: 72 20 72 6f 6f 74 20 70 61 67 65 73 2e 0a 20 20  r root pages..  
11e0: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e  execsql {.    IN
11f0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 56 41  SERT INTO abc VA
1200: 4c 55 45 53 28 31 2c 20 32 2c 20 33 29 3b 0a 20  LUES(1, 2, 3);. 
1210: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
1220: 62 63 20 56 41 4c 55 45 53 28 34 2c 20 35 2c 20  bc VALUES(4, 5, 
1230: 36 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  6);.    INSERT I
1240: 4e 54 4f 20 64 65 66 20 56 41 4c 55 45 53 28 37  NTO def VALUES(7
1250: 2c 20 38 2c 20 39 29 3b 0a 20 20 20 20 49 4e 53  , 8, 9);.    INS
1260: 45 52 54 20 49 4e 54 4f 20 64 65 66 20 56 41 4c  ERT INTO def VAL
1270: 55 45 53 28 31 30 2c 31 31 2c 31 32 29 3b 0a 20  UES(10,11,12);. 
1280: 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65 73 74 20   }.} {}.do_test 
1290: 6d 61 6c 6c 6f 63 35 2d 32 2e 32 20 7b 0a 20 20  malloc5-2.2 {.  
12a0: 23 20 4c 6f 61 64 20 74 68 65 20 72 6f 6f 74 2d  # Load the root-
12b0: 70 61 67 65 20 66 6f 72 20 74 61 62 6c 65 20 64  page for table d
12c0: 65 66 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ef into the cach
12d0: 65 2e 20 54 68 65 6e 20 71 75 65 72 79 20 74 61  e. Then query ta
12e0: 62 6c 65 20 61 62 63 2e 20 0a 20 20 23 20 48 61  ble abc. .  # Ha
12f0: 6c 66 77 61 79 20 74 68 72 6f 75 67 68 20 74 68  lfway through th
1300: 65 20 71 75 65 72 79 20 63 61 6c 6c 20 73 71 6c  e query call sql
1310: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
1320: 6f 72 79 28 29 2e 20 54 68 65 20 67 6f 61 6c 20  ory(). The goal 
1330: 6f 66 20 74 68 69 73 0a 20 20 23 20 74 65 73 74  of this.  # test
1340: 20 69 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65   is to make sure
1350: 20 77 65 20 64 6f 6e 27 74 20 66 72 65 65 20 70   we don't free p
1360: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e  ages that are in
1370: 20 75 73 65 20 28 73 70 65 63 69 66 69 63 61 6c   use (specifical
1380: 6c 79 2c 20 0a 20 20 23 20 74 68 65 20 72 6f 6f  ly, .  # the roo
1390: 74 20 6f 66 20 74 61 62 6c 65 20 61 62 63 29 2e  t of table abc).
13a0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  .  sqlite3_relea
13b0: 73 65 5f 6d 65 6d 6f 72 79 0a 20 20 73 65 74 20  se_memory.  set 
13c0: 6e 52 65 6c 65 61 73 65 20 30 0a 20 20 65 78 65  nRelease 0.  exe
13d0: 63 73 71 6c 20 7b 20 0a 20 20 20 20 42 45 47 49  csql { .    BEGI
13e0: 4e 3b 0a 20 20 20 20 53 45 4c 45 43 54 20 2a 20  N;.    SELECT * 
13f0: 46 52 4f 4d 20 64 65 66 3b 0a 20 20 7d 0a 20 20  FROM def;.  }.  
1400: 73 65 74 20 64 61 74 61 20 5b 6c 69 73 74 5d 0a  set data [list].
1410: 20 20 64 62 20 65 76 61 6c 20 7b 53 45 4c 45 43    db eval {SELEC
1420: 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d 20 7b 0a  T * FROM abc} {.
1430: 20 20 20 20 69 6e 63 72 20 6e 52 65 6c 65 61 73      incr nReleas
1440: 65 20 5b 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  e [sqlite3_relea
1450: 73 65 5f 6d 65 6d 6f 72 79 5d 0a 20 20 20 20 6c  se_memory].    l
1460: 61 70 70 65 6e 64 20 64 61 74 61 20 24 61 20 24  append data $a $
1470: 62 20 24 63 0a 20 20 7d 0a 20 20 65 78 65 63 73  b $c.  }.  execs
1480: 71 6c 20 7b 0a 20 20 20 20 43 4f 4d 4d 49 54 3b  ql {.    COMMIT;
1490: 0a 20 20 7d 0a 20 20 76 61 6c 75 65 5f 69 6e 5f  .  }.  value_in_
14a0: 72 61 6e 67 65 20 24 3a 3a 70 67 61 6c 6c 6f 63  range $::pgalloc
14b0: 20 24 3a 3a 6d 72 61 6e 67 65 20 24 6e 52 65 6c   $::mrange $nRel
14c0: 65 61 73 65 0a 7d 20 5b 76 61 6c 75 65 5f 69 6e  ease.} [value_in
14d0: 5f 72 61 6e 67 65 20 24 3a 3a 70 67 61 6c 6c 6f  _range $::pgallo
14e0: 63 20 24 3a 3a 6d 72 61 6e 67 65 5d 0a 64 6f 5f  c $::mrange].do_
14f0: 74 65 73 74 20 6d 61 6c 6c 6f 63 35 2d 32 2e 32  test malloc5-2.2
1500: 2e 31 20 7b 0a 20 20 73 65 74 20 64 61 74 61 0a  .1 {.  set data.
1510: 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36 7d 0a  } {1 2 3 4 5 6}.
1520: 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 35  .do_test malloc5
1530: 2d 33 2e 31 20 7b 0a 20 20 23 20 53 69 6d 70 6c  -3.1 {.  # Simpl
1540: 65 20 74 65 73 74 20 74 6f 20 73 68 6f 77 20 74  e test to show t
1550: 68 61 74 20 69 66 20 74 77 6f 20 70 61 67 65 72  hat if two pager
1560: 73 20 61 72 65 20 6f 70 65 6e 65 64 20 66 72 6f  s are opened fro
1570: 6d 20 77 69 74 68 69 6e 20 74 68 69 73 0a 20 20  m within this.  
1580: 23 20 74 68 72 65 61 64 2c 20 6d 65 6d 6f 72 79  # thread, memory
1590: 20 69 73 20 66 72 65 65 64 20 66 72 6f 6d 20 62   is freed from b
15a0: 6f 74 68 20 77 68 65 6e 20 73 71 6c 69 74 65 33  oth when sqlite3
15b0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
15c0: 29 20 69 73 0a 20 20 23 20 63 61 6c 6c 65 64 2e  ) is.  # called.
15d0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
15e0: 20 42 45 47 49 4e 3b 0a 20 20 20 20 53 45 4c 45   BEGIN;.    SELE
15f0: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20  CT * FROM abc;. 
1600: 20 7d 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20   }.  execsql {. 
1610: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1620: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 0a   sqlite_master;.
1630: 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20 53      BEGIN;.    S
1640: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 64 65 66  ELECT * FROM def
1650: 3b 0a 20 20 7d 20 64 62 32 0a 20 20 76 61 6c 75  ;.  } db2.  valu
1660: 65 5f 69 6e 5f 72 61 6e 67 65 20 5b 65 78 70 72  e_in_range [expr
1670: 20 24 3a 3a 70 67 61 6c 6c 6f 63 2a 32 5d 20 30   $::pgalloc*2] 0
1680: 2e 39 39 20 5b 73 71 6c 69 74 65 33 5f 72 65 6c  .99 [sqlite3_rel
1690: 65 61 73 65 5f 6d 65 6d 6f 72 79 5d 0a 7d 20 5b  ease_memory].} [
16a0: 76 61 6c 75 65 5f 69 6e 5f 72 61 6e 67 65 20 5b  value_in_range [
16b0: 65 78 70 72 20 24 3a 3a 70 67 61 6c 6c 6f 63 20  expr $::pgalloc 
16c0: 2a 20 32 5d 20 30 2e 39 39 5d 0a 64 6f 5f 74 65  * 2] 0.99].do_te
16d0: 73 74 20 6d 61 6c 6c 6f 63 35 2d 33 2e 32 20 7b  st malloc5-3.2 {
16e0: 0a 20 20 63 6f 6e 63 61 74 20 5c 0a 20 20 20 20  .  concat \.    
16f0: 5b 65 78 65 63 73 71 6c 20 7b 53 45 4c 45 43 54  [execsql {SELECT
1700: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 20 43 4f 4d   * FROM abc; COM
1710: 4d 49 54 7d 5d 20 5c 0a 20 20 20 20 5b 65 78 65  MIT}] \.    [exe
1720: 63 73 71 6c 20 7b 53 45 4c 45 43 54 20 2a 20 46  csql {SELECT * F
1730: 52 4f 4d 20 64 65 66 3b 20 43 4f 4d 4d 49 54 7d  ROM def; COMMIT}
1740: 20 64 62 32 5d 0a 7d 20 7b 31 20 32 20 33 20 34   db2].} {1 2 3 4
1750: 20 35 20 36 20 37 20 38 20 39 20 31 30 20 31 31   5 6 7 8 9 10 11
1760: 20 31 32 7d 0a 0a 64 62 32 20 63 6c 6f 73 65 0a   12}..db2 close.
1770: 70 75 74 73 20 22 48 69 67 68 77 61 74 65 72 20  puts "Highwater 
1780: 6d 61 72 6b 3a 20 5b 73 71 6c 69 74 65 33 5f 6d  mark: [sqlite3_m
1790: 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 5d  emory_highwater]
17a0: 22 0a 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  "..# The followi
17b0: 6e 67 20 74 77 6f 20 74 65 73 74 20 63 61 73 65  ng two test case
17c0: 73 20 65 61 63 68 20 65 78 65 63 75 74 65 20 61  s each execute a
17d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
17e0: 77 68 69 63 68 20 0a 23 20 31 30 30 30 30 20 72  which .# 10000 r
17f0: 6f 77 73 20 61 72 65 20 69 6e 73 65 72 74 65 64  ows are inserted
1800: 20 69 6e 74 6f 20 74 61 62 6c 65 20 61 62 63 2e   into table abc.
1810: 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74 20   The first test 
1820: 63 61 73 65 20 69 73 20 75 73 65 64 0a 23 20 74  case is used.# t
1830: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 6d 6f  o ensure that mo
1840: 72 65 20 74 68 61 6e 20 31 4d 42 20 6f 66 20 64  re than 1MB of d
1850: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 69 73  ynamic memory is
1860: 20 75 73 65 64 20 74 6f 20 70 65 72 66 6f 72 6d   used to perform
1870: 0a 23 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  .# the transacti
1880: 6f 6e 2e 20 0a 23 0a 23 20 54 68 65 20 73 65 63  on. .#.# The sec
1890: 6f 6e 64 20 74 65 73 74 20 63 61 73 65 20 73 65  ond test case se
18a0: 74 73 20 74 68 65 20 22 73 6f 66 74 2d 68 65 61  ts the "soft-hea
18b0: 70 2d 6c 69 6d 69 74 22 20 74 6f 20 31 30 30 2c  p-limit" to 100,
18c0: 30 30 30 20 62 79 74 65 73 20 28 30 2e 31 20 4d  000 bytes (0.1 M
18d0: 42 29 0a 23 20 61 6e 64 20 74 65 73 74 73 20 74  B).# and tests t
18e0: 6f 20 73 65 65 20 74 68 61 74 20 74 68 69 73 20  o see that this 
18f0: 6c 69 6d 69 74 20 69 73 20 6e 6f 74 20 65 78 63  limit is not exc
1900: 65 65 64 65 64 20 61 74 20 61 6e 79 20 70 6f 69  eeded at any poi
1910: 6e 74 20 64 75 72 69 6e 67 20 0a 23 20 74 72 61  nt during .# tra
1920: 6e 73 61 63 74 69 6f 6e 20 65 78 65 63 75 74 69  nsaction executi
1930: 6f 6e 2e 0a 23 0a 23 20 42 65 66 6f 72 65 20 65  on..#.# Before e
1940: 78 65 63 75 74 69 6e 67 20 6d 61 6c 6c 6f 63 35  xecuting malloc5
1950: 2d 34 2e 2a 20 77 65 20 73 61 76 65 20 74 68 65  -4.* we save the
1960: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 63 75   value of the cu
1970: 72 72 65 6e 74 20 73 6f 66 74 20 68 65 61 70 20  rrent soft heap 
1980: 0a 23 20 6c 69 6d 69 74 20 69 6e 20 76 61 72 69  .# limit in vari
1990: 61 62 6c 65 20 3a 3a 73 6f 66 74 5f 6c 69 6d 69  able ::soft_limi
19a0: 74 2e 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  t. The original 
19b0: 76 61 6c 75 65 20 69 73 20 72 65 73 74 6f 72 65  value is restore
19c0: 64 20 61 66 74 65 72 20 0a 23 20 72 75 6e 6e 69  d after .# runni
19d0: 6e 67 20 74 68 65 20 74 65 73 74 73 2e 0a 23 0a  ng the tests..#.
19e0: 73 65 74 20 3a 3a 73 6f 66 74 5f 6c 69 6d 69 74  set ::soft_limit
19f0: 20 5b 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68   [sqlite3_soft_h
1a00: 65 61 70 5f 6c 69 6d 69 74 20 2d 31 5d 0a 65 78  eap_limit -1].ex
1a10: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63 61  ecsql {PRAGMA ca
1a20: 63 68 65 5f 73 69 7a 65 3d 32 30 30 30 7d 0a 64  che_size=2000}.d
1a30: 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 35 2d 34  o_test malloc5-4
1a40: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
1a50: 42 45 47 49 4e 3b 7d 0a 20 20 65 78 65 63 73 71  BEGIN;}.  execsq
1a60: 6c 20 7b 44 45 4c 45 54 45 20 46 52 4f 4d 20 61  l {DELETE FROM a
1a70: 62 63 3b 7d 0a 20 20 66 6f 72 20 7b 73 65 74 20  bc;}.  for {set 
1a80: 69 20 30 7d 20 7b 24 69 20 3c 20 31 30 30 30 30  i 0} {$i < 10000
1a90: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20  } {incr i} {.   
1aa0: 20 65 78 65 63 73 71 6c 20 22 49 4e 53 45 52 54   execsql "INSERT
1ab0: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
1ac0: 28 24 69 2c 20 24 69 2c 20 27 5b 73 74 72 69 6e  ($i, $i, '[strin
1ad0: 67 20 72 65 70 65 61 74 20 58 20 31 30 30 5d 27  g repeat X 100]'
1ae0: 29 3b 22 0a 20 20 7d 0a 20 20 65 78 65 63 73 71  );".  }.  execsq
1af0: 6c 20 7b 43 4f 4d 4d 49 54 3b 7d 0a 20 20 64 62  l {COMMIT;}.  db
1b00: 20 63 61 63 68 65 20 66 6c 75 73 68 0a 20 20 73   cache flush.  s
1b10: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
1b20: 65 6d 6f 72 79 0a 20 20 73 71 6c 69 74 65 33 5f  emory.  sqlite3_
1b30: 6d 65 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72  memory_highwater
1b40: 20 31 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45   1.  execsql {SE
1b50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d  LECT * FROM abc}
1b60: 0a 20 20 73 65 74 20 6e 4d 61 78 42 79 74 65 73  .  set nMaxBytes
1b70: 20 5b 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79   [sqlite3_memory
1b80: 5f 68 69 67 68 77 61 74 65 72 20 31 5d 0a 20 20  _highwater 1].  
1b90: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
1ba0: 22 20 28 48 69 67 68 77 61 74 65 72 20 6d 61 72  " (Highwater mar
1bb0: 6b 3a 20 24 6e 4d 61 78 42 79 74 65 73 29 20 22  k: $nMaxBytes) "
1bc0: 0a 20 20 65 78 70 72 20 24 6e 4d 61 78 42 79 74  .  expr $nMaxByt
1bd0: 65 73 20 3e 20 31 30 30 30 30 30 30 0a 7d 20 7b  es > 1000000.} {
1be0: 31 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f  1}.do_test mallo
1bf0: 63 35 2d 34 2e 32 20 7b 0a 20 20 64 62 20 65 76  c5-4.2 {.  db ev
1c00: 61 6c 20 7b 50 52 41 47 4d 41 20 63 61 63 68 65  al {PRAGMA cache
1c10: 5f 73 69 7a 65 3d 31 7d 0a 20 20 64 62 20 63 61  _size=1}.  db ca
1c20: 63 68 65 20 66 6c 75 73 68 0a 20 20 73 71 6c 69  che flush.  sqli
1c30: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
1c40: 72 79 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66  ry.  sqlite3_sof
1c50: 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 32 30 30  t_heap_limit 200
1c60: 30 30 30 0a 20 20 73 71 6c 69 74 65 33 5f 6d 65  000.  sqlite3_me
1c70: 6d 6f 72 79 5f 68 69 67 68 77 61 74 65 72 20 31  mory_highwater 1
1c80: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
1c90: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d 0a 20  CT * FROM abc}. 
1ca0: 20 73 65 74 20 6e 4d 61 78 42 79 74 65 73 20 5b   set nMaxBytes [
1cb0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 68  sqlite3_memory_h
1cc0: 69 67 68 77 61 74 65 72 20 31 5d 0a 20 20 70 75  ighwater 1].  pu
1cd0: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 22 20  ts -nonewline " 
1ce0: 28 48 69 67 68 77 61 74 65 72 20 6d 61 72 6b 3a  (Highwater mark:
1cf0: 20 24 6e 4d 61 78 42 79 74 65 73 29 20 22 0a 20   $nMaxBytes) ". 
1d00: 20 65 78 70 72 20 24 6e 4d 61 78 42 79 74 65 73   expr $nMaxBytes
1d10: 20 3c 3d 20 32 31 30 30 30 30 0a 7d 20 7b 31 7d   <= 210000.} {1}
1d20: 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 35  .do_test malloc5
1d30: 2d 34 2e 33 20 7b 0a 20 20 23 20 43 68 65 63 6b  -4.3 {.  # Check
1d40: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
1d50: 74 20 6f 66 20 74 61 62 6c 65 20 61 62 63 20 69  t of table abc i
1d60: 73 20 61 74 20 6c 65 61 73 74 20 72 6f 75 67 68  s at least rough
1d70: 6c 79 20 61 73 20 65 78 70 65 63 74 65 64 2e 0a  ly as expected..
1d80: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1d90: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 2c  SELECT count(*),
1da0: 20 73 75 6d 28 61 29 2c 20 73 75 6d 28 62 29 20   sum(a), sum(b) 
1db0: 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a 7d 20  FROM abc;.  }.} 
1dc0: 5b 6c 69 73 74 20 31 30 30 30 30 20 5b 65 78 70  [list 10000 [exp
1dd0: 72 20 69 6e 74 28 31 30 30 30 30 2e 30 20 2a 20  r int(10000.0 * 
1de0: 34 39 39 39 2e 35 29 5d 20 5b 65 78 70 72 20 69  4999.5)] [expr i
1df0: 6e 74 28 31 30 30 30 30 2e 30 20 2a 20 34 39 39  nt(10000.0 * 499
1e00: 39 2e 35 29 5d 5d 0a 0a 23 20 52 65 73 74 6f 72  9.5)]]..# Restor
1e10: 65 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20  e the soft heap 
1e20: 6c 69 6d 69 74 2e 0a 73 71 6c 69 74 65 33 5f 73  limit..sqlite3_s
1e30: 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 24  oft_heap_limit $
1e40: 3a 3a 73 6f 66 74 5f 6c 69 6d 69 74 0a 0a 23 20  ::soft_limit..# 
1e50: 54 65 73 74 20 74 68 61 74 20 74 68 65 72 65 20  Test that there 
1e60: 61 72 65 20 6e 6f 20 70 72 6f 62 6c 65 6d 73 20  are no problems 
1e70: 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
1e80: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 77  release_memory w
1e90: 68 65 6e 0a 23 20 74 68 65 72 65 20 61 72 65 20  hen.# there are 
1ea0: 6f 70 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  open in-memory d
1eb0: 61 74 61 62 61 73 65 73 2e 0a 23 0a 23 20 41 74  atabases..#.# At
1ec0: 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 65 73 65   one point these
1ed0: 20 74 65 73 74 73 20 77 6f 75 6c 64 20 63 61 75   tests would cau
1ee0: 73 65 20 61 20 73 65 67 2d 66 61 75 6c 74 2e 0a  se a seg-fault..
1ef0: 23 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  #.do_test malloc
1f00: 35 2d 35 2e 31 20 7b 0a 20 20 64 62 20 63 6c 6f  5-5.1 {.  db clo
1f10: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 64 62 20  se.  sqlite3 db 
1f20: 3a 6d 65 6d 6f 72 79 3a 0a 20 20 65 78 65 63 73  :memory:.  execs
1f30: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
1f40: 20 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45      CREATE TABLE
1f50: 20 61 62 63 28 61 2c 20 62 2c 20 63 29 3b 0a 20   abc(a, b, c);. 
1f60: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
1f70: 62 63 20 56 41 4c 55 45 53 28 27 61 62 63 64 65  bc VALUES('abcde
1f80: 66 67 68 69 27 2c 20 31 32 33 34 35 36 37 38 39  fghi', 123456789
1f90: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 49 4e  0, NULL);.    IN
1fa0: 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45  SERT INTO abc SE
1fb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b  LECT * FROM abc;
1fc0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1fd0: 20 61 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52   abc SELECT * FR
1fe0: 4f 4d 20 61 62 63 3b 0a 20 20 20 20 49 4e 53 45  OM abc;.    INSE
1ff0: 52 54 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45  RT INTO abc SELE
2000: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20  CT * FROM abc;. 
2010: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
2020: 62 63 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  bc SELECT * FROM
2030: 20 61 62 63 3b 0a 20 20 20 20 49 4e 53 45 52 54   abc;.    INSERT
2040: 20 49 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54   INTO abc SELECT
2050: 20 2a 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20   * FROM abc;.   
2060: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
2070: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61   SELECT * FROM a
2080: 62 63 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49  bc;.    INSERT I
2090: 4e 54 4f 20 61 62 63 20 53 45 4c 45 43 54 20 2a  NTO abc SELECT *
20a0: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 7d 0a 20   FROM abc;.  }. 
20b0: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
20c0: 5f 6d 65 6d 6f 72 79 0a 7d 20 30 0a 64 6f 5f 74  _memory.} 0.do_t
20d0: 65 73 74 20 6d 61 6c 6c 6f 63 35 2d 35 2e 32 20  est malloc5-5.2 
20e0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  {.  sqlite3_soft
20f0: 5f 68 65 61 70 5f 6c 69 6d 69 74 20 35 30 30 30  _heap_limit 5000
2100: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2110: 20 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 50 52 41   COMMIT;.    PRA
2120: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 20 3d  GMA temp_store =
2130: 20 6d 65 6d 6f 72 79 3b 0a 20 20 20 20 53 45 4c   memory;.    SEL
2140: 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 20 4f  ECT * FROM abc O
2150: 52 44 45 52 20 42 59 20 61 3b 0a 20 20 7d 0a 20  RDER BY a;.  }. 
2160: 20 65 78 70 72 20 31 0a 7d 20 7b 31 7d 0a 73 71   expr 1.} {1}.sq
2170: 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f  lite3_soft_heap_
2180: 6c 69 6d 69 74 20 24 3a 3a 73 6f 66 74 5f 6c 69  limit $::soft_li
2190: 6d 69 74 0a 0a 23 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  mit..#----------
21a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
21e0: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
21f0: 74 65 73 74 20 63 61 73 65 73 20 28 6d 61 6c 6c  test cases (mall
2200: 6f 63 35 2d 36 2e 2a 29 20 74 65 73 74 20 74 68  oc5-6.*) test th
2210: 65 20 6e 65 77 20 67 6c 6f 62 61 6c 20 4c 52 55  e new global LRU
2220: 20 6c 69 73 74 0a 23 20 75 73 65 64 20 74 6f 20   list.# used to 
2230: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70 61  determine the pa
2240: 67 65 73 20 74 6f 20 72 65 63 79 63 6c 65 20 77  ges to recycle w
2250: 68 65 6e 20 73 71 6c 69 74 65 33 5f 72 65 6c 65  hen sqlite3_rele
2260: 61 73 65 5f 6d 65 6d 6f 72 79 20 69 73 0a 23 20  ase_memory is.# 
2270: 63 61 6c 6c 65 64 20 61 6e 64 20 74 68 65 72 65  called and there
2280: 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   is more than on
2290: 65 20 70 61 67 65 72 20 6f 70 65 6e 2e 0a 23 0a  e pager open..#.
22a0: 70 72 6f 63 20 6e 50 61 67 65 20 7b 64 62 7d 20  proc nPage {db} 
22b0: 7b 0a 20 20 73 65 74 20 62 74 20 5b 62 74 72 65  {.  set bt [btre
22c0: 65 5f 66 72 6f 6d 5f 64 62 20 24 64 62 5d 0a 20  e_from_db $db]. 
22d0: 20 61 72 72 61 79 20 73 65 74 20 73 74 61 74 73   array set stats
22e0: 20 5b 62 74 72 65 65 5f 70 61 67 65 72 5f 73 74   [btree_pager_st
22f0: 61 74 73 20 24 62 74 5d 0a 20 20 73 65 74 20 73  ats $bt].  set s
2300: 74 61 74 73 28 70 61 67 65 29 0a 7d 0a 64 62 20  tats(page).}.db 
2310: 63 6c 6f 73 65 0a 66 6f 72 63 65 64 65 6c 65 74  close.forcedelet
2320: 65 20 74 65 73 74 2e 64 62 20 74 65 73 74 2e 64  e test.db test.d
2330: 62 2d 6a 6f 75 72 6e 61 6c 20 74 65 73 74 32 2e  b-journal test2.
2340: 64 62 20 74 65 73 74 32 2e 64 62 2d 6a 6f 75 72  db test2.db-jour
2350: 6e 61 6c 0a 0a 23 20 54 68 69 73 20 62 6c 6f 63  nal..# This bloc
2360: 6b 20 6f 66 20 74 65 73 74 2d 63 61 73 65 73 20  k of test-cases 
2370: 28 6d 61 6c 6c 6f 63 35 2d 36 2e 31 2e 2a 29 20  (malloc5-6.1.*) 
2380: 70 72 65 70 61 72 65 73 20 74 77 6f 20 64 61 74  prepares two dat
2390: 61 62 61 73 65 20 66 69 6c 65 73 0a 23 20 66 6f  abase files.# fo
23a0: 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
23b0: 20 74 65 73 74 73 2e 0a 64 6f 5f 74 65 73 74 20   tests..do_test 
23c0: 6d 61 6c 6c 6f 63 35 2d 36 2e 31 2e 31 20 7b 0a  malloc5-6.1.1 {.
23d0: 20 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73    sqlite3 db tes
23e0: 74 2e 64 62 0a 20 20 65 78 65 63 73 71 6c 20 7b  t.db.  execsql {
23f0: 0a 20 20 20 20 50 52 41 47 4d 41 20 70 61 67 65  .    PRAGMA page
2400: 5f 73 69 7a 65 3d 31 30 32 34 3b 0a 20 20 20 20  _size=1024;.    
2410: 50 52 41 47 4d 41 20 64 65 66 61 75 6c 74 5f 63  PRAGMA default_c
2420: 61 63 68 65 5f 73 69 7a 65 3d 32 3b 0a 20 20 7d  ache_size=2;.  }
2430: 0a 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20  .  execsql {.   
2440: 20 50 52 41 47 4d 41 20 74 65 6d 70 5f 73 74 6f   PRAGMA temp_sto
2450: 72 65 20 3d 20 6d 65 6d 6f 72 79 3b 0a 20 20 20  re = memory;.   
2460: 20 42 45 47 49 4e 3b 0a 20 20 20 20 43 52 45 41   BEGIN;.    CREA
2470: 54 45 20 54 41 42 4c 45 20 61 62 63 28 61 20 50  TE TABLE abc(a P
2480: 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 63  RIMARY KEY, b, c
2490: 29 3b 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e  );.    INSERT IN
24a0: 54 4f 20 61 62 63 20 56 41 4c 55 45 53 28 72 61  TO abc VALUES(ra
24b0: 6e 64 73 74 72 28 35 30 2c 35 30 29 2c 20 72 61  ndstr(50,50), ra
24c0: 6e 64 73 74 72 28 37 35 2c 37 35 29 2c 20 72 61  ndstr(75,75), ra
24d0: 6e 64 73 74 72 28 31 30 30 2c 31 30 30 29 29 3b  ndstr(100,100));
24e0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
24f0: 20 61 62 63 20 0a 20 20 20 20 20 20 20 20 53 45   abc .        SE
2500: 4c 45 43 54 20 72 61 6e 64 73 74 72 28 35 30 2c  LECT randstr(50,
2510: 35 30 29 2c 20 72 61 6e 64 73 74 72 28 37 35 2c  50), randstr(75,
2520: 37 35 29 2c 20 72 61 6e 64 73 74 72 28 31 30 30  75), randstr(100
2530: 2c 31 30 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a  ,100) FROM abc;.
2540: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2550: 61 62 63 20 0a 20 20 20 20 20 20 20 20 53 45 4c  abc .        SEL
2560: 45 43 54 20 72 61 6e 64 73 74 72 28 35 30 2c 35  ECT randstr(50,5
2570: 30 29 2c 20 72 61 6e 64 73 74 72 28 37 35 2c 37  0), randstr(75,7
2580: 35 29 2c 20 72 61 6e 64 73 74 72 28 31 30 30 2c  5), randstr(100,
2590: 31 30 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20  100) FROM abc;. 
25a0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61     INSERT INTO a
25b0: 62 63 20 0a 20 20 20 20 20 20 20 20 53 45 4c 45  bc .        SELE
25c0: 43 54 20 72 61 6e 64 73 74 72 28 35 30 2c 35 30  CT randstr(50,50
25d0: 29 2c 20 72 61 6e 64 73 74 72 28 37 35 2c 37 35  ), randstr(75,75
25e0: 29 2c 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31  ), randstr(100,1
25f0: 30 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20  00) FROM abc;.  
2600: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62    INSERT INTO ab
2610: 63 20 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43  c .        SELEC
2620: 54 20 72 61 6e 64 73 74 72 28 35 30 2c 35 30 29  T randstr(50,50)
2630: 2c 20 72 61 6e 64 73 74 72 28 37 35 2c 37 35 29  , randstr(75,75)
2640: 2c 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30  , randstr(100,10
2650: 30 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20  0) FROM abc;.   
2660: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63   INSERT INTO abc
2670: 20 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54   .        SELECT
2680: 20 72 61 6e 64 73 74 72 28 35 30 2c 35 30 29 2c   randstr(50,50),
2690: 20 72 61 6e 64 73 74 72 28 37 35 2c 37 35 29 2c   randstr(75,75),
26a0: 20 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30   randstr(100,100
26b0: 29 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20  ) FROM abc;.    
26c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 62 63 20  INSERT INTO abc 
26d0: 0a 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  .        SELECT 
26e0: 72 61 6e 64 73 74 72 28 35 30 2c 35 30 29 2c 20  randstr(50,50), 
26f0: 72 61 6e 64 73 74 72 28 37 35 2c 37 35 29 2c 20  randstr(75,75), 
2700: 72 61 6e 64 73 74 72 28 31 30 30 2c 31 30 30 29  randstr(100,100)
2710: 20 46 52 4f 4d 20 61 62 63 3b 0a 20 20 20 20 43   FROM abc;.    C
2720: 4f 4d 4d 49 54 3b 0a 20 20 7d 20 0a 20 20 66 6f  OMMIT;.  } .  fo
2730: 72 63 65 63 6f 70 79 20 74 65 73 74 2e 64 62 20  rcecopy test.db 
2740: 74 65 73 74 32 2e 64 62 0a 20 20 73 71 6c 69 74  test2.db.  sqlit
2750: 65 33 20 64 62 32 20 74 65 73 74 32 2e 64 62 0a  e3 db2 test2.db.
2760: 20 20 64 62 32 20 65 76 61 6c 20 7b 50 52 41 47    db2 eval {PRAG
2770: 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 3d 32 7d  MA cache_size=2}
2780: 0a 20 20 6c 69 73 74 20 5c 0a 20 20 20 20 5b 65  .  list \.    [e
2790: 78 70 72 20 28 5b 66 69 6c 65 20 73 69 7a 65 20  xpr ([file size 
27a0: 74 65 73 74 2e 64 62 5d 2f 31 30 32 34 29 3e 32  test.db]/1024)>2
27b0: 30 5d 20 5b 65 78 70 72 20 28 5b 66 69 6c 65 20  0] [expr ([file 
27c0: 73 69 7a 65 20 74 65 73 74 32 2e 64 62 5d 2f 31  size test2.db]/1
27d0: 30 32 34 29 3e 32 30 5d 0a 7d 20 7b 31 20 31 7d  024)>20].} {1 1}
27e0: 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 35  .do_test malloc5
27f0: 2d 36 2e 31 2e 32 20 7b 0a 20 20 6c 69 73 74 20  -6.1.2 {.  list 
2800: 5b 65 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41  [execsql {PRAGMA
2810: 20 63 61 63 68 65 5f 73 69 7a 65 7d 5d 20 5b 65   cache_size}] [e
2820: 78 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 63  xecsql {PRAGMA c
2830: 61 63 68 65 5f 73 69 7a 65 7d 20 64 62 32 5d 0a  ache_size} db2].
2840: 7d 20 7b 32 20 32 7d 0a 0a 64 6f 5f 74 65 73 74  } {2 2}..do_test
2850: 20 6d 61 6c 6c 6f 63 35 2d 36 2e 32 2e 31 20 7b   malloc5-6.2.1 {
2860: 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45 4c 45  .  execsql {SELE
2870: 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d 20 64  CT * FROM abc} d
2880: 62 32 0a 20 20 65 78 65 63 73 71 6c 20 7b 53 45  b2.  execsql {SE
2890: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 61 62 63 7d  LECT * FROM abc}
28a0: 20 64 62 0a 20 20 65 78 70 72 20 5b 6e 50 61 67   db.  expr [nPag
28b0: 65 20 64 62 5d 20 2b 20 5b 6e 50 61 67 65 20 64  e db] + [nPage d
28c0: 62 32 5d 0a 7d 20 7b 34 7d 0a 0a 64 6f 5f 74 65  b2].} {4}..do_te
28d0: 73 74 20 6d 61 6c 6c 6f 63 35 2d 36 2e 32 2e 32  st malloc5-6.2.2
28e0: 20 7b 0a 20 20 23 20 49 66 20 77 65 20 6e 6f 77   {.  # If we now
28f0: 20 74 72 79 20 74 6f 20 72 65 63 6c 61 69 6d 20   try to reclaim 
2900: 73 6f 6d 65 20 6d 65 6d 6f 72 79 2c 20 69 74 20  some memory, it 
2910: 73 68 6f 75 6c 64 20 63 6f 6d 65 20 66 72 6f 6d  should come from
2920: 20 74 68 65 20 64 62 32 20 63 61 63 68 65 2e 0a   the db2 cache..
2930: 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73    sqlite3_releas
2940: 65 5f 6d 65 6d 6f 72 79 20 33 30 30 30 0a 20 20  e_memory 3000.  
2950: 65 78 70 72 20 5b 6e 50 61 67 65 20 64 62 5d 20  expr [nPage db] 
2960: 2b 20 5b 6e 50 61 67 65 20 64 62 32 5d 0a 7d 20  + [nPage db2].} 
2970: 7b 31 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c  {1}.do_test mall
2980: 6f 63 35 2d 36 2e 32 2e 33 20 7b 0a 20 20 23 20  oc5-6.2.3 {.  # 
2990: 41 63 63 65 73 73 20 74 68 65 20 64 62 32 20 63  Access the db2 c
29a0: 61 63 68 65 20 61 67 61 69 6e 2c 20 73 6f 20 74  ache again, so t
29b0: 68 61 74 20 61 6c 6c 20 74 68 65 20 64 62 32 20  hat all the db2 
29c0: 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
29d0: 75 73 65 64 0a 20 20 23 20 6d 6f 72 65 20 72 65  used.  # more re
29e0: 63 65 6e 74 6c 79 20 74 68 61 6e 20 61 6c 6c 20  cently than all 
29f0: 74 68 65 20 64 62 20 70 61 67 65 73 2e 20 54 68  the db pages. Th
2a00: 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6c 61 69  en try to reclai
2a10: 6d 20 33 30 30 30 20 62 79 74 65 73 2e 0a 20 20  m 3000 bytes..  
2a20: 23 20 54 68 69 73 20 74 69 6d 65 2c 20 33 20 70  # This time, 3 p
2a30: 61 67 65 73 20 73 68 6f 75 6c 64 20 62 65 20 70  ages should be p
2a40: 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 20 64  ulled from the d
2a50: 62 20 63 61 63 68 65 2e 0a 20 20 65 78 65 63 73  b cache..  execs
2a60: 71 6c 20 7b 20 53 45 4c 45 43 54 20 2a 20 46 52  ql { SELECT * FR
2a70: 4f 4d 20 61 62 63 20 7d 20 64 62 32 0a 20 20 73  OM abc } db2.  s
2a80: 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
2a90: 65 6d 6f 72 79 20 33 30 30 30 0a 20 20 65 78 70  emory 3000.  exp
2aa0: 72 20 5b 6e 50 61 67 65 20 64 62 5d 20 2b 20 5b  r [nPage db] + [
2ab0: 6e 50 61 67 65 20 64 62 32 5d 0a 7d 20 7b 30 7d  nPage db2].} {0}
2ac0: 0a 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  ..do_test malloc
2ad0: 35 2d 36 2e 33 2e 31 20 7b 0a 20 20 23 20 4e 6f  5-6.3.1 {.  # No
2ae0: 77 20 6f 70 65 6e 20 61 20 74 72 61 6e 73 61 63  w open a transac
2af0: 74 69 6f 6e 20 61 6e 64 20 75 70 64 61 74 65 20  tion and update 
2b00: 32 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  2 pages in the d
2b10: 62 32 20 63 61 63 68 65 2e 20 54 68 65 6e 0a 20  b2 cache. Then. 
2b20: 20 23 20 64 6f 20 61 20 53 45 4c 45 43 54 20 6f   # do a SELECT o
2b30: 6e 20 74 68 65 20 64 62 20 63 61 63 68 65 20 73  n the db cache s
2b40: 6f 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 64  o that all the d
2b50: 62 20 70 61 67 65 73 20 61 72 65 20 6d 6f 72 65  b pages are more
2b60: 20 72 65 63 65 6e 74 6c 79 0a 20 20 23 20 75 73   recently.  # us
2b70: 65 64 20 74 68 61 6e 20 74 68 65 20 64 62 32 20  ed than the db2 
2b80: 70 61 67 65 73 2e 20 57 68 65 6e 20 77 65 20 74  pages. When we t
2b90: 72 79 20 74 6f 20 66 72 65 65 20 6d 65 6d 6f 72  ry to free memor
2ba0: 79 2c 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  y, SQLite should
2bb0: 0a 20 20 23 20 66 72 65 65 20 74 68 65 20 6e 6f  .  # free the no
2bc0: 6e 2d 64 69 72 74 79 20 64 62 32 20 70 61 67 65  n-dirty db2 page
2bd0: 73 2c 20 74 68 65 6e 20 74 68 65 20 64 62 20 70  s, then the db p
2be0: 61 67 65 73 2c 20 74 68 65 6e 20 66 69 6e 61 6c  ages, then final
2bf0: 6c 79 20 75 73 65 0a 20 20 23 20 73 79 6e 63 28  ly use.  # sync(
2c00: 29 20 74 6f 20 66 72 65 65 20 75 70 20 74 68 65  ) to free up the
2c10: 20 64 69 72 74 79 20 64 62 32 20 70 61 67 65 73   dirty db2 pages
2c20: 2e 20 54 68 65 20 6f 6e 6c 79 20 70 61 67 65 20  . The only page 
2c30: 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 0a 20  that cannot be. 
2c40: 20 23 20 66 72 65 65 64 20 69 73 20 70 61 67 65   # freed is page
2c50: 31 20 6f 66 20 64 62 32 2e 20 42 65 63 61 75 73  1 of db2. Becaus
2c60: 65 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f 70  e there is an op
2c70: 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  en transaction, 
2c80: 74 68 65 0a 20 20 23 20 62 74 72 65 65 20 6c 61  the.  # btree la
2c90: 79 65 72 20 68 6f 6c 64 73 20 61 20 72 65 66 65  yer holds a refe
2ca0: 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
2cb0: 69 6e 20 74 68 65 20 64 62 32 20 63 61 63 68 65  in the db2 cache
2cc0: 2e 0a 20 20 23 0a 20 20 23 20 55 50 44 41 54 45  ..  #.  # UPDATE
2cd0: 3a 20 4e 6f 20 6c 6f 6e 67 65 72 2e 20 41 73 20  : No longer. As 
2ce0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
2cf0: 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
2d00: 61 20 73 79 6e 63 28 29 0a 20 20 65 78 65 63 73  a sync().  execs
2d10: 71 6c 20 7b 0a 20 20 20 20 42 45 47 49 4e 3b 0a  ql {.    BEGIN;.
2d20: 20 20 20 20 55 50 44 41 54 45 20 61 62 63 20 53      UPDATE abc S
2d30: 45 54 20 63 20 3d 20 72 61 6e 64 73 74 72 28 31  ET c = randstr(1
2d40: 30 30 2c 31 30 30 29 20 0a 20 20 20 20 57 48 45  00,100) .    WHE
2d50: 52 45 20 72 6f 77 69 64 20 3d 20 31 20 4f 52 20  RE rowid = 1 OR 
2d60: 72 6f 77 69 64 20 3d 20 28 53 45 4c 45 43 54 20  rowid = (SELECT 
2d70: 6d 61 78 28 72 6f 77 69 64 29 20 46 52 4f 4d 20  max(rowid) FROM 
2d80: 61 62 63 29 3b 0a 20 20 7d 20 64 62 32 0a 20 20  abc);.  } db2.  
2d90: 65 78 65 63 73 71 6c 20 7b 20 53 45 4c 45 43 54  execsql { SELECT
2da0: 20 2a 20 46 52 4f 4d 20 61 62 63 20 7d 20 64 62   * FROM abc } db
2db0: 0a 20 20 65 78 70 72 20 5b 6e 50 61 67 65 20 64  .  expr [nPage d
2dc0: 62 5d 20 2b 20 5b 6e 50 61 67 65 20 64 62 32 5d  b] + [nPage db2]
2dd0: 0a 7d 20 7b 34 7d 0a 64 6f 5f 74 65 73 74 20 6d  .} {4}.do_test m
2de0: 61 6c 6c 6f 63 35 2d 36 2e 33 2e 32 20 7b 0a 20  alloc5-6.3.2 {. 
2df0: 20 23 20 54 72 79 20 74 6f 20 72 65 6c 65 61 73   # Try to releas
2e00: 65 20 37 37 30 30 20 62 79 74 65 73 2e 20 54 68  e 7700 bytes. Th
2e10: 69 73 20 73 68 6f 75 6c 64 20 72 65 6c 65 61 73  is should releas
2e20: 65 20 61 6c 6c 20 74 68 65 20 0a 20 20 23 20 6e  e all the .  # n
2e30: 6f 6e 2d 64 69 72 74 79 20 70 61 67 65 73 20 68  on-dirty pages h
2e40: 65 6c 64 20 62 79 20 64 62 32 2e 0a 20 20 73 71  eld by db2..  sq
2e50: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
2e60: 6d 6f 72 79 20 5b 65 78 70 72 20 37 2a 31 31 33  mory [expr 7*113
2e70: 32 5d 0a 20 20 6c 69 73 74 20 5b 6e 50 61 67 65  2].  list [nPage
2e80: 20 64 62 5d 20 5b 6e 50 61 67 65 20 64 62 32 5d   db] [nPage db2]
2e90: 0a 7d 20 7b 30 20 33 7d 0a 64 6f 5f 74 65 73 74  .} {0 3}.do_test
2ea0: 20 6d 61 6c 6c 6f 63 35 2d 36 2e 33 2e 33 20 7b   malloc5-6.3.3 {
2eb0: 0a 20 20 23 20 54 72 79 20 74 6f 20 72 65 6c 65  .  # Try to rele
2ec0: 61 73 65 20 61 6e 6f 74 68 65 72 20 31 30 30 30  ase another 1000
2ed0: 20 62 79 74 65 73 2e 20 54 68 69 73 20 73 68 6f   bytes. This sho
2ee0: 75 6c 64 20 63 6f 6d 65 20 66 72 6f 6d 74 20 74  uld come fromt t
2ef0: 68 65 20 64 62 0a 20 20 23 20 63 61 63 68 65 2c  he db.  # cache,
2f00: 20 73 69 6e 63 65 20 61 6c 6c 20 74 68 72 65 65   since all three
2f10: 20 70 61 67 65 73 20 68 65 6c 64 20 62 79 20 64   pages held by d
2f20: 62 32 20 61 72 65 20 65 69 74 68 65 72 20 69 6e  b2 are either in
2f30: 2d 75 73 65 20 6f 72 20 64 69 72 79 2e 0a 20 20  -use or diry..  
2f40: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
2f50: 6d 65 6d 6f 72 79 20 31 30 30 30 0a 20 20 6c 69  memory 1000.  li
2f60: 73 74 20 5b 6e 50 61 67 65 20 64 62 5d 20 5b 6e  st [nPage db] [n
2f70: 50 61 67 65 20 64 62 32 5d 0a 7d 20 7b 30 20 33  Page db2].} {0 3
2f80: 7d 0a 64 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63  }.do_test malloc
2f90: 35 2d 36 2e 33 2e 34 20 7b 0a 20 20 23 20 4e 6f  5-6.3.4 {.  # No
2fa0: 77 20 72 65 6c 65 61 73 65 20 39 39 30 30 20 6d  w release 9900 m
2fb0: 6f 72 65 20 28 61 62 6f 75 74 20 39 20 70 61 67  ore (about 9 pag
2fc0: 65 73 20 77 6f 72 74 68 29 2e 20 54 68 69 73 20  es worth). This 
2fd0: 73 68 6f 75 6c 64 20 65 78 70 75 6e 67 65 0a 20  should expunge. 
2fe0: 20 23 20 74 68 65 20 72 65 73 74 20 6f 66 20 74   # the rest of t
2ff0: 68 65 20 64 62 20 63 61 63 68 65 2e 20 42 75 74  he db cache. But
3000: 20 74 68 65 20 64 62 32 20 63 61 63 68 65 20 72   the db2 cache r
3010: 65 6d 61 69 6e 73 20 69 6e 74 61 63 74 2c 20 62  emains intact, b
3020: 65 63 61 75 73 65 0a 20 20 23 20 53 51 4c 69 74  ecause.  # SQLit
3030: 65 20 74 72 69 65 73 20 74 6f 20 61 76 6f 69 64  e tries to avoid
3040: 20 63 61 6c 6c 69 6e 67 20 73 79 6e 63 28 29 2e   calling sync().
3050: 0a 20 20 69 66 20 7b 24 3a 3a 74 63 6c 5f 70 6c  .  if {$::tcl_pl
3060: 61 74 66 6f 72 6d 28 77 6f 72 64 53 69 7a 65 29  atform(wordSize)
3070: 3d 3d 38 7d 20 7b 0a 20 20 20 20 73 71 6c 69 74  ==8} {.    sqlit
3080: 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  e3_release_memor
3090: 79 20 31 30 35 30 30 0a 20 20 7d 20 65 6c 73 65  y 10500.  } else
30a0: 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72   {.    sqlite3_r
30b0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 39 39  elease_memory 99
30c0: 30 30 0a 20 20 7d 0a 20 20 6c 69 73 74 20 5b 6e  00.  }.  list [n
30d0: 50 61 67 65 20 64 62 5d 20 5b 6e 50 61 67 65 20  Page db] [nPage 
30e0: 64 62 32 5d 0a 7d 20 7b 30 20 33 7d 0a 64 6f 5f  db2].} {0 3}.do_
30f0: 74 65 73 74 20 6d 61 6c 6c 6f 63 35 2d 36 2e 33  test malloc5-6.3
3100: 2e 35 20 7b 0a 20 20 23 20 42 75 74 20 69 66 20  .5 {.  # But if 
3110: 77 65 20 61 72 65 20 72 65 61 6c 6c 79 20 69 6e  we are really in
3120: 73 69 73 74 65 6e 74 2c 20 53 51 4c 69 74 65 20  sistent, SQLite 
3130: 77 69 6c 6c 20 63 6f 6e 73 65 6e 74 20 74 6f 20  will consent to 
3140: 63 61 6c 6c 20 73 79 6e 63 28 29 0a 20 20 23 20  call sync().  # 
3150: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  if there is no o
3160: 74 68 65 72 20 6f 70 74 69 6f 6e 2e 20 55 50 44  ther option. UPD
3170: 41 54 45 3a 20 41 73 20 6f 66 20 33 2e 36 2e 32  ATE: As of 3.6.2
3180: 2c 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f  , SQLite will no
3190: 74 0a 20 20 23 20 63 61 6c 6c 20 73 79 6e 63 28  t.  # call sync(
31a0: 29 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72  ) in this scenar
31b0: 69 6f 2e 20 53 6f 20 6e 6f 20 66 75 72 74 68 65  io. So no furthe
31c0: 72 20 6d 65 6d 6f 72 79 20 63 61 6e 20 62 65 20  r memory can be 
31d0: 72 65 63 6c 61 69 6d 65 64 2e 0a 20 20 73 71 6c  reclaimed..  sql
31e0: 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
31f0: 6f 72 79 20 31 30 30 30 0a 20 20 6c 69 73 74 20  ory 1000.  list 
3200: 5b 6e 50 61 67 65 20 64 62 5d 20 5b 6e 50 61 67  [nPage db] [nPag
3210: 65 20 64 62 32 5d 0a 7d 20 7b 30 20 33 7d 0a 64  e db2].} {0 3}.d
3220: 6f 5f 74 65 73 74 20 6d 61 6c 6c 6f 63 35 2d 36  o_test malloc5-6
3230: 2e 33 2e 36 20 7b 0a 20 20 23 20 54 68 65 20 72  .3.6 {.  # The r
3240: 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 20 28  eferenced page (
3250: 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 62  page 1 of the db
3260: 32 20 63 61 63 68 65 29 20 77 69 6c 6c 20 6e 6f  2 cache) will no
3270: 74 20 62 65 20 66 72 65 65 64 20 6e 6f 0a 20 20  t be freed no.  
3280: 23 20 6d 61 74 74 65 72 20 68 6f 77 20 6d 75 63  # matter how muc
3290: 68 20 6d 65 6d 6f 72 79 20 77 65 20 61 73 6b 20  h memory we ask 
32a0: 66 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72  for:.  sqlite3_r
32b0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 33 31  elease_memory 31
32c0: 34 35 39 0a 20 20 6c 69 73 74 20 5b 6e 50 61 67  459.  list [nPag
32d0: 65 20 64 62 5d 20 5b 6e 50 61 67 65 20 64 62 32  e db] [nPage db2
32e0: 5d 0a 7d 20 7b 30 20 33 7d 0a 0a 64 62 32 20 63  ].} {0 3}..db2 c
32f0: 6c 6f 73 65 0a 0a 73 71 6c 69 74 65 33 5f 73 6f  lose..sqlite3_so
3300: 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 24 3a  ft_heap_limit $:
3310: 3a 73 6f 66 74 5f 6c 69 6d 69 74 0a 74 65 73 74  :soft_limit.test
3320: 5f 72 65 73 74 6f 72 65 5f 63 6f 6e 66 69 67 5f  _restore_config_
3330: 70 61 67 65 63 61 63 68 65 0a 66 69 6e 69 73 68  pagecache.finish
3340: 5f 74 65 73 74 0a 63 61 74 63 68 20 7b 64 62 20  _test.catch {db 
3350: 63 6c 6f 73 65 7d 0a                             close}.