/ Hex Artifact Content
Login

Artifact 7072d6adb03bb452b055cdc288d88b1432aed5ef:


0000: 23 20 32 30 30 37 20 4d 61 79 20 30 34 0a 23 0a  # 2007 May 04.#.
0010: 23 20 54 68 65 20 61 75 74 68 6f 72 20 64 69 73  # The author dis
0020: 63 6c 61 69 6d 73 20 63 6f 70 79 72 69 67 68 74  claims copyright
0030: 20 74 6f 20 74 68 69 73 20 73 6f 75 72 63 65 20   to this source 
0040: 63 6f 64 65 2e 20 20 49 6e 20 70 6c 61 63 65 20  code.  In place 
0050: 6f 66 0a 23 20 61 20 6c 65 67 61 6c 20 6e 6f 74  of.# a legal not
0060: 69 63 65 2c 20 68 65 72 65 20 69 73 20 61 20 62  ice, here is a b
0070: 6c 65 73 73 69 6e 67 3a 0a 23 0a 23 20 20 20 20  lessing:.#.#    
0080: 4d 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20  May you do good 
0090: 61 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 23 20  and not evil..# 
00a0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00b0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00c0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00d0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 23 20 20  give others..#  
00e0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
00f0: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0100: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0110: 6f 75 20 67 69 76 65 2e 0a 23 0a 23 2a 2a 2a 2a  ou 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 0a 23 20 54 68 69 73 20 66 69 6c 65 20  ***.# This file 
0170: 69 6d 70 6c 65 6d 65 6e 74 73 20 72 65 67 72 65  implements regre
0180: 73 73 69 6f 6e 20 74 65 73 74 73 20 66 6f 72 20  ssion tests for 
0190: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01a0: 20 54 68 65 0a 23 20 66 6f 63 75 73 20 6f 66 20   The.# focus of 
01b0: 74 68 69 73 20 66 69 6c 65 20 69 73 20 74 65 73  this file is tes
01c0: 74 69 6e 67 20 74 68 65 20 69 6e 63 72 65 6d 65  ting the increme
01d0: 6e 74 61 6c 20 76 61 63 75 75 6d 20 66 65 61 74  ntal vacuum feat
01e0: 75 72 65 2e 0a 23 0a 23 20 24 49 64 3a 20 69 6e  ure..#.# $Id: in
01f0: 63 72 76 61 63 75 75 6d 32 2e 74 65 73 74 2c 76  crvacuum2.test,v
0200: 20 31 2e 36 20 32 30 30 39 2f 30 37 2f 32 35 20   1.6 2009/07/25 
0210: 31 33 3a 34 32 3a 35 30 20 64 61 6e 69 65 6c 6b  13:42:50 danielk
0220: 31 39 37 37 20 45 78 70 20 24 0a 0a 73 65 74 20  1977 Exp $..set 
0230: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0240: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0250: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0260: 73 74 65 72 2e 74 63 6c 0a 73 6f 75 72 63 65 20  ster.tcl.source 
0270: 24 74 65 73 74 64 69 72 2f 77 61 6c 5f 63 6f 6d  $testdir/wal_com
0280: 6d 6f 6e 2e 74 63 6c 0a 0a 23 20 49 66 20 74 68  mon.tcl..# If th
0290: 69 73 20 62 75 69 6c 64 20 6f 66 20 74 68 65 20  is build of the 
02a0: 6c 69 62 72 61 72 79 20 64 6f 65 73 20 6e 6f 74  library does not
02b0: 20 73 75 70 70 6f 72 74 20 61 75 74 6f 2d 76 61   support auto-va
02c0: 63 75 75 6d 2c 20 6f 6d 69 74 20 74 68 69 73 0a  cuum, omit this.
02d0: 23 20 77 68 6f 6c 65 20 66 69 6c 65 2e 0a 69 66  # whole file..if
02e0: 63 61 70 61 62 6c 65 20 7b 21 61 75 74 6f 76 61  capable {!autova
02f0: 63 75 75 6d 20 7c 7c 20 21 70 72 61 67 6d 61 7d  cuum || !pragma}
0300: 20 7b 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74   {.  finish_test
0310: 0a 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 73 65 74  .  return.}..set
0320: 20 74 65 73 74 70 72 65 66 69 78 20 69 6e 63 72   testprefix incr
0330: 76 61 63 75 75 6d 32 0a 0a 23 20 43 72 65 61 74  vacuum2..# Creat
0340: 65 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 20  e a database in 
0350: 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
0360: 75 6d 20 6d 6f 64 65 20 74 68 61 74 20 68 61 73  um mode that has
0370: 20 6d 61 6e 79 0a 23 20 70 61 67 65 73 20 6f 6e   many.# pages on
0380: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 23   the freelist..#
0390: 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 61 63  .do_test incrvac
03a0: 75 75 6d 32 2d 31 2e 31 20 7b 0a 20 20 65 78 65  uum2-1.1 {.  exe
03b0: 63 73 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d  csql {.    PRAGM
03c0: 41 20 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34  A page_size=1024
03d0: 3b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  ;.    PRAGMA aut
03e0: 6f 5f 76 61 63 75 75 6d 3d 69 6e 63 72 65 6d 65  o_vacuum=increme
03f0: 6e 74 61 6c 3b 0a 20 20 20 20 43 52 45 41 54 45  ntal;.    CREATE
0400: 20 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20   TABLE t1(x);.  
0410: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0420: 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c 6f 62   VALUES(zeroblob
0430: 28 33 30 30 30 30 29 29 3b 0a 20 20 20 20 44 45  (30000));.    DE
0440: 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20 20  LETE FROM t1;.  
0450: 7d 0a 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65  }.  file size te
0460: 73 74 2e 64 62 0a 7d 20 7b 33 32 37 36 38 7d 0a  st.db.} {32768}.
0470: 0a 23 20 56 61 63 75 75 6d 20 6f 66 66 20 61 20  .# Vacuum off a 
0480: 73 69 6e 67 6c 65 20 70 61 67 65 2e 0a 23 0a 64  single page..#.d
0490: 6f 5f 74 65 73 74 20 69 6e 63 72 76 61 63 75 75  o_test incrvacuu
04a0: 6d 32 2d 31 2e 32 20 7b 0a 20 20 65 78 65 63 73  m2-1.2 {.  execs
04b0: 71 6c 20 7b 0a 20 20 20 20 50 52 41 47 4d 41 20  ql {.    PRAGMA 
04c0: 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75  incremental_vacu
04d0: 75 6d 28 31 29 3b 0a 20 20 7d 0a 20 20 66 69 6c  um(1);.  }.  fil
04e0: 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d  e size test.db.}
04f0: 20 7b 33 31 37 34 34 7d 0a 0a 23 20 56 61 63 75   {31744}..# Vacu
0500: 75 6d 20 6f 66 66 20 66 69 76 65 20 70 61 67 65  um off five page
0510: 73 0a 23 0a 64 6f 5f 74 65 73 74 20 69 6e 63 72  s.#.do_test incr
0520: 76 61 63 75 75 6d 32 2d 31 2e 33 20 7b 0a 20 20  vacuum2-1.3 {.  
0530: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 50 52  execsql {.    PR
0540: 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74 61 6c  AGMA incremental
0550: 5f 76 61 63 75 75 6d 28 35 29 3b 0a 20 20 7d 0a  _vacuum(5);.  }.
0560: 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74    file size test
0570: 2e 64 62 0a 7d 20 7b 32 36 36 32 34 7d 0a 0a 23  .db.} {26624}..#
0580: 20 56 61 63 75 75 6d 20 6f 66 66 20 61 6c 6c 20   Vacuum off all 
0590: 74 68 65 20 72 65 73 74 0a 23 0a 64 6f 5f 74 65  the rest.#.do_te
05a0: 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32 2d 31  st incrvacuum2-1
05b0: 2e 34 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .4 {.  execsql {
05c0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72  .    PRAGMA incr
05d0: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 31  emental_vacuum(1
05e0: 30 30 30 29 3b 0a 20 20 7d 0a 20 20 66 69 6c 65  000);.  }.  file
05f0: 20 73 69 7a 65 20 74 65 73 74 2e 64 62 0a 7d 20   size test.db.} 
0600: 7b 33 30 37 32 7d 0a 0a 23 20 4d 61 6b 65 20 73  {3072}..# Make s
0610: 75 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  ure incremental 
0620: 76 61 63 75 75 6d 20 77 6f 72 6b 73 20 6f 6e 20  vacuum works on 
0630: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
0640: 65 73 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65 20  es..#.ifcapable 
0650: 61 74 74 61 63 68 20 7b 0a 20 20 64 6f 5f 74 65  attach {.  do_te
0660: 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32 2d 32  st incrvacuum2-2
0670: 2e 31 20 7b 0a 20 20 20 20 66 6f 72 63 65 64 65  .1 {.    forcede
0680: 6c 65 74 65 20 74 65 73 74 32 2e 64 62 20 74 65  lete test2.db te
0690: 73 74 32 2e 64 62 2d 6a 6f 75 72 6e 61 6c 0a 20  st2.db-journal. 
06a0: 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20     execsql {.   
06b0: 20 20 20 41 54 54 41 43 48 20 44 41 54 41 42 41     ATTACH DATABA
06c0: 53 45 20 27 74 65 73 74 32 2e 64 62 27 20 41 53  SE 'test2.db' AS
06d0: 20 61 75 78 3b 0a 20 20 20 20 20 20 50 52 41 47   aux;.      PRAG
06e0: 4d 41 20 61 75 78 2e 61 75 74 6f 5f 76 61 63 75  MA aux.auto_vacu
06f0: 75 6d 3d 69 6e 63 72 65 6d 65 6e 74 61 6c 3b 0a  um=incremental;.
0700: 20 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42        CREATE TAB
0710: 4c 45 20 61 75 78 2e 74 32 28 78 29 3b 0a 20 20  LE aux.t2(x);.  
0720: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
0730: 74 32 20 56 41 4c 55 45 53 28 7a 65 72 6f 62 6c  t2 VALUES(zerobl
0740: 6f 62 28 33 30 30 30 30 29 29 3b 0a 20 20 20 20  ob(30000));.    
0750: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31    INSERT INTO t1
0760: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0770: 32 3b 0a 20 20 20 20 20 20 44 45 4c 45 54 45 20  2;.      DELETE 
0780: 46 52 4f 4d 20 74 32 3b 0a 20 20 20 20 20 20 44  FROM t2;.      D
0790: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20  ELETE FROM t1;. 
07a0: 20 20 20 7d 0a 20 20 20 20 6c 69 73 74 20 5b 66     }.    list [f
07b0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
07c0: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
07d0: 74 32 2e 64 62 5d 0a 20 20 7d 20 7b 33 32 37 36  t2.db].  } {3276
07e0: 38 20 33 32 37 36 38 7d 0a 20 20 64 6f 5f 74 65  8 32768}.  do_te
07f0: 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32 2d 32  st incrvacuum2-2
0800: 2e 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .2 {.    execsql
0810: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
0820: 61 75 78 2e 69 6e 63 72 65 6d 65 6e 74 61 6c 5f  aux.incremental_
0830: 76 61 63 75 75 6d 28 31 29 0a 20 20 20 20 7d 0a  vacuum(1).    }.
0840: 20 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73      list [file s
0850: 69 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69  ize test.db] [fi
0860: 6c 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64 62  le size test2.db
0870: 5d 0a 20 20 7d 20 7b 33 32 37 36 38 20 33 31 37  ].  } {32768 317
0880: 34 34 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e  44}.  do_test in
0890: 63 72 76 61 63 75 75 6d 32 2d 32 2e 33 20 7b 0a  crvacuum2-2.3 {.
08a0: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
08b0: 20 20 20 20 50 52 41 47 4d 41 20 61 75 78 2e 69      PRAGMA aux.i
08c0: 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75  ncremental_vacuu
08d0: 6d 28 35 29 0a 20 20 20 20 7d 0a 20 20 20 20 6c  m(5).    }.    l
08e0: 69 73 74 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  ist [file size t
08f0: 65 73 74 2e 64 62 5d 20 5b 66 69 6c 65 20 73 69  est.db] [file si
0900: 7a 65 20 74 65 73 74 32 2e 64 62 5d 0a 20 20 7d  ze test2.db].  }
0910: 20 7b 33 32 37 36 38 20 32 36 36 32 34 7d 0a 20   {32768 26624}. 
0920: 20 64 6f 5f 74 65 73 74 20 69 6e 63 72 76 61 63   do_test incrvac
0930: 75 75 6d 32 2d 32 2e 34 20 7b 0a 20 20 20 20 65  uum2-2.4 {.    e
0940: 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20 50  xecsql {.      P
0950: 52 41 47 4d 41 20 6d 61 69 6e 2e 69 6e 63 72 65  RAGMA main.incre
0960: 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 35 29  mental_vacuum(5)
0970: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69 73 74 20  .    }.    list 
0980: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
0990: 64 62 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74  db] [file size t
09a0: 65 73 74 32 2e 64 62 5d 0a 20 20 7d 20 7b 32 37  est2.db].  } {27
09b0: 36 34 38 20 32 36 36 32 34 7d 0a 20 20 64 6f 5f  648 26624}.  do_
09c0: 74 65 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32  test incrvacuum2
09d0: 2d 32 2e 35 20 7b 0a 20 20 20 20 65 78 65 63 73  -2.5 {.    execs
09e0: 71 6c 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d  ql {.      PRAGM
09f0: 41 20 61 75 78 2e 69 6e 63 72 65 6d 65 6e 74 61  A aux.incrementa
0a00: 6c 5f 76 61 63 75 75 6d 0a 20 20 20 20 7d 0a 20  l_vacuum.    }. 
0a10: 20 20 20 6c 69 73 74 20 5b 66 69 6c 65 20 73 69     list [file si
0a20: 7a 65 20 74 65 73 74 2e 64 62 5d 20 5b 66 69 6c  ze test.db] [fil
0a30: 65 20 73 69 7a 65 20 74 65 73 74 32 2e 64 62 5d  e size test2.db]
0a40: 0a 20 20 7d 20 7b 32 37 36 34 38 20 33 30 37 32  .  } {27648 3072
0a50: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 69 6e 63 72  }.  do_test incr
0a60: 76 61 63 75 75 6d 32 2d 32 2e 36 20 7b 0a 20 20  vacuum2-2.6 {.  
0a70: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0a80: 20 20 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65    PRAGMA increme
0a90: 6e 74 61 6c 5f 76 61 63 75 75 6d 28 31 29 0a 20  ntal_vacuum(1). 
0aa0: 20 20 20 7d 0a 20 20 20 20 6c 69 73 74 20 5b 66     }.    list [f
0ab0: 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64 62  ile size test.db
0ac0: 5d 20 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73  ] [file size tes
0ad0: 74 32 2e 64 62 5d 0a 20 20 7d 20 7b 32 36 36 32  t2.db].  } {2662
0ae0: 34 20 33 30 37 32 7d 0a 7d 0a 0a 64 6f 5f 74 65  4 3072}.}..do_te
0af0: 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32 2d 33  st incrvacuum2-3
0b00: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
0b10: 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74 6f  .    PRAGMA auto
0b20: 5f 76 61 63 75 75 6d 20 3d 20 27 66 75 6c 6c 27  _vacuum = 'full'
0b30: 3b 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20  ;.    BEGIN;.   
0b40: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 61 62   CREATE TABLE ab
0b50: 63 28 61 29 3b 0a 20 20 20 20 49 4e 53 45 52 54  c(a);.    INSERT
0b60: 20 49 4e 54 4f 20 61 62 63 20 56 41 4c 55 45 53   INTO abc VALUES
0b70: 28 72 61 6e 64 73 74 72 28 31 35 30 30 2c 31 35  (randstr(1500,15
0b80: 30 30 29 29 3b 0a 20 20 20 20 43 4f 4d 4d 49 54  00));.    COMMIT
0b90: 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 64 6f 5f 74 65  ;.  }.} {}.do_te
0ba0: 73 74 20 69 6e 63 72 76 61 63 75 75 6d 32 2d 33  st incrvacuum2-3
0bb0: 2e 32 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .2 {.  execsql {
0bc0: 0a 20 20 20 20 42 45 47 49 4e 3b 0a 20 20 20 20  .    BEGIN;.    
0bd0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 61 62 63 3b  DELETE FROM abc;
0be0: 0a 20 20 20 20 50 52 41 47 4d 41 20 69 6e 63 72  .    PRAGMA incr
0bf0: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 3b 0a  emental_vacuum;.
0c00: 20 20 20 20 43 4f 4d 4d 49 54 3b 0a 20 20 7d 0a      COMMIT;.  }.
0c10: 7d 20 7b 7d 0a 0a 69 6e 74 65 67 72 69 74 79 5f  } {}..integrity_
0c20: 63 68 65 63 6b 20 69 6e 63 72 76 61 63 75 75 6d  check incrvacuum
0c30: 32 2d 33 2e 33 0a 0a 69 66 63 61 70 61 62 6c 65  2-3.3..ifcapable
0c40: 20 77 61 6c 20 7b 0a 20 20 23 20 41 74 20 6f 6e   wal {.  # At on
0c50: 65 20 70 6f 69 6e 74 2c 20 77 68 65 6e 20 61 20  e point, when a 
0c60: 73 70 65 63 69 66 69 63 20 70 61 67 65 20 77 61  specific page wa
0c70: 73 20 62 65 69 6e 67 20 65 78 74 72 61 63 74 65  s being extracte
0c80: 64 20 66 72 6f 6d 20 74 68 65 20 62 2d 74 72 65  d from the b-tre
0c90: 65 0a 20 20 23 20 66 72 65 65 2d 6c 69 73 74 20  e.  # free-list 
0ca0: 28 65 2e 67 2e 20 64 75 72 69 6e 67 20 61 6e 20  (e.g. during an 
0cb0: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
0cc0: 75 6d 29 2c 20 61 6c 6c 20 74 72 75 6e 6b 20 70  um), all trunk p
0cd0: 61 67 65 73 20 74 68 61 74 0a 20 20 23 20 6f 63  ages that.  # oc
0ce0: 63 75 72 72 65 64 20 62 65 66 6f 72 65 20 74 68  curred before th
0cf0: 65 20 73 70 65 63 69 66 69 63 20 70 61 67 65 20  e specific page 
0d00: 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
0d10: 20 74 72 75 6e 6b 20 77 65 72 65 20 62 65 69 6e   trunk were bein
0d20: 67 0a 20 20 23 20 77 72 69 74 74 65 6e 20 74 6f  g.  # written to
0d30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
0d40: 77 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  wal file. This i
0d50: 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e  s not necessary.
0d60: 20 4f 6e 6c 79 20 74 68 65 20 0a 20 20 23 20 65   Only the .  # e
0d70: 78 74 72 61 63 74 65 64 20 70 61 67 65 20 61 6e  xtracted page an
0d80: 64 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  d the page that 
0d90: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
0da0: 6e 74 65 72 20 74 6f 20 69 74 20 6e 65 65 64 20  nter to it need 
0db0: 74 6f 0a 20 20 23 20 62 65 20 6a 6f 75 72 6e 61  to.  # be journa
0dc0: 6c 6c 65 64 2e 0a 20 20 23 0a 20 20 23 20 54 68  lled..  #.  # Th
0dd0: 69 73 20 70 72 6f 62 6c 65 6d 20 77 61 73 20 66  is problem was f
0de0: 69 78 65 64 20 62 79 20 5b 64 30 33 64 36 33 64  ixed by [d03d63d
0df0: 37 37 65 5d 20 28 6a 75 73 74 20 62 65 66 6f 72  77e] (just befor
0e00: 65 20 33 2e 37 2e 36 20 72 65 6c 65 61 73 65 29  e 3.7.6 release)
0e10: 2e 0a 20 20 23 0a 20 20 23 20 54 68 69 73 20 74  ..  #.  # This t
0e20: 65 73 74 20 63 61 73 65 20 62 75 69 6c 64 73 20  est case builds 
0e30: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  a database conta
0e40: 69 6e 69 6e 67 20 6d 61 6e 79 20 66 72 65 65 20  ining many free 
0e50: 70 61 67 65 73 2e 20 54 68 65 6e 20 72 75 6e 73  pages. Then runs
0e60: 0a 20 20 23 20 22 50 52 41 47 4d 41 20 69 6e 63  .  # "PRAGMA inc
0e70: 72 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28  remental_vacuum(
0e80: 31 29 22 20 75 6e 74 69 6c 20 74 68 65 20 64 62  1)" until the db
0e90: 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 66   contains zero f
0ea0: 72 65 65 20 70 61 67 65 73 2e 0a 20 20 23 20 45  ree pages..  # E
0eb0: 61 63 68 20 22 50 52 41 47 4d 41 20 69 6e 63 72  ach "PRAGMA incr
0ec0: 65 6d 65 6e 74 61 6c 5f 76 61 63 75 75 6d 28 31  emental_vacuum(1
0ed0: 29 22 20 73 68 6f 75 6c 64 20 6d 6f 64 69 66 79  )" should modify
0ee0: 20 61 74 20 6d 6f 73 74 20 34 20 70 61 67 65 73   at most 4 pages
0ef0: 2e 20 54 68 65 0a 20 20 23 20 77 6f 72 73 74 20  . The.  # worst 
0f00: 63 61 73 65 20 69 73 20 77 68 65 6e 20 61 20 74  case is when a t
0f10: 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 6d  runk page is rem
0f20: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 65 6e  oved from the en
0f30: 64 20 6f 66 20 74 68 65 20 64 62 20 66 69 6c 65  d of the db file
0f40: 2e 0a 20 20 23 20 49 6e 20 74 68 69 73 20 63 61  ..  # In this ca
0f50: 73 65 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  se pages written
0f60: 20 61 72 65 3a 0a 20 20 23 0a 20 20 23 20 20 20   are:.  #.  #   
0f70: 31 2e 20 54 68 65 20 70 72 65 76 69 6f 75 73 20  1. The previous 
0f80: 74 72 75 6e 6b 20 70 61 67 65 20 28 74 68 61 74  trunk page (that
0f90: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
0fa0: 74 65 72 20 74 6f 20 74 68 65 20 72 65 63 79 63  ter to the recyc
0fb0: 6c 65 64 0a 20 20 23 20 20 20 20 20 20 74 72 75  led.  #      tru
0fc0: 6e 6b 20 70 61 67 65 29 2c 20 61 6e 64 0a 20 20  nk page), and.  
0fd0: 23 20 20 20 32 2e 20 54 68 65 20 6c 65 61 66 20  #   2. The leaf 
0fe0: 70 61 67 65 20 74 72 61 6e 73 66 6f 72 6d 65 64  page transformed
0ff0: 20 69 6e 74 6f 20 61 20 74 72 75 6e 6b 20 70 61   into a trunk pa
1000: 67 65 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68  ge to replace th
1010: 65 20 72 65 63 79 63 6c 65 64 0a 20 20 23 20 20  e recycled.  #  
1020: 20 20 20 20 70 61 67 65 2c 20 61 6e 64 0a 20 20      page, and.  
1030: 23 20 20 20 33 2e 20 54 68 65 20 74 72 75 6e 6b  #   3. The trunk
1040: 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61   page that conta
1050: 69 6e 65 64 20 61 20 70 6f 69 6e 74 65 72 20 74  ined a pointer t
1060: 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  o the leaf page 
1070: 75 73 65 64 20 0a 20 20 23 20 20 20 20 20 20 69  used .  #      i
1080: 6e 20 28 32 29 2c 20 61 6e 64 0a 20 20 23 20 20  n (2), and.  #  
1090: 20 34 2e 20 50 61 67 65 20 31 2e 20 50 61 67 65   4. Page 1. Page
10a0: 20 31 20 69 73 20 61 6c 77 61 79 73 20 75 70 64   1 is always upd
10b0: 61 74 65 64 2c 20 65 76 65 6e 20 69 6e 20 57 41  ated, even in WA
10c0: 4c 20 6d 6f 64 65 2c 20 73 69 6e 63 65 20 69 74  L mode, since it
10d0: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 23 20 20 20   contains.  #   
10e0: 20 20 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f     the "number o
10f0: 66 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  f free-list page
1100: 73 22 20 66 69 65 6c 64 2e 0a 20 20 23 0a 20 20  s" field..  #.  
1110: 64 62 20 63 6c 6f 73 65 0a 20 20 66 6f 72 63 65  db close.  force
1120: 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a 20  delete test.db. 
1130: 20 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74   sqlite3 db test
1140: 2e 64 62 0a 0a 20 20 64 6f 5f 65 78 65 63 73 71  .db..  do_execsq
1150: 6c 5f 74 65 73 74 20 34 2e 31 20 7b 0a 20 20 20  l_test 4.1 {.   
1160: 20 50 52 41 47 4d 41 20 70 61 67 65 5f 73 69 7a   PRAGMA page_siz
1170: 65 20 3d 20 35 31 32 3b 0a 20 20 20 20 50 52 41  e = 512;.    PRA
1180: 47 4d 41 20 61 75 74 6f 5f 76 61 63 75 75 6d 20  GMA auto_vacuum 
1190: 3d 20 32 3b 0a 20 20 20 20 43 52 45 41 54 45 20  = 2;.    CREATE 
11a0: 54 41 42 4c 45 20 74 31 28 78 29 3b 0a 20 20 20  TABLE t1(x);.   
11b0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20   INSERT INTO t1 
11c0: 56 41 4c 55 45 53 28 72 61 6e 64 6f 6d 62 6c 6f  VALUES(randomblo
11d0: 62 28 34 30 30 29 29 3b 0a 20 20 20 20 49 4e 53  b(400));.    INS
11e0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
11f0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20  CT * FROM t1;   
1200: 20 20 20 20 20 20 20 20 20 2d 2d 20 20 20 20 32           --    2
1210: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1220: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
1230: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  M t1;           
1240: 20 2d 2d 20 20 20 20 34 0a 20 20 20 20 49 4e 53   --    4.    INS
1250: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1260: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20  CT * FROM t1;   
1270: 20 20 20 20 20 20 20 20 20 2d 2d 20 20 20 20 38           --    8
1280: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1290: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
12a0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  M t1;           
12b0: 20 2d 2d 20 20 20 31 36 0a 20 20 20 20 49 4e 53   --   16.    INS
12c0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12d0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20  CT * FROM t1;   
12e0: 20 20 20 20 20 20 20 20 20 2d 2d 20 20 20 33 32           --   32
12f0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1300: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
1310: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  M t1;           
1320: 20 2d 2d 20 20 31 32 38 0a 20 20 20 20 49 4e 53   --  128.    INS
1330: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1340: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20  CT * FROM t1;   
1350: 20 20 20 20 20 20 20 20 20 2d 2d 20 20 32 35 36           --  256
1360: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1370: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
1380: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  M t1;           
1390: 20 2d 2d 20 20 35 31 32 0a 20 20 20 20 49 4e 53   --  512.    INS
13a0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
13b0: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20  CT * FROM t1;   
13c0: 20 20 20 20 20 20 20 20 20 2d 2d 20 31 30 32 34           -- 1024
13d0: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
13e0: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
13f0: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  M t1;           
1400: 20 2d 2d 20 32 30 34 38 0a 20 20 20 20 49 4e 53   -- 2048.    INS
1410: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
1420: 43 54 20 2a 20 46 52 4f 4d 20 74 31 3b 20 20 20  CT * FROM t1;   
1430: 20 20 20 20 20 20 20 20 20 2d 2d 20 34 30 39 36           -- 4096
1440: 0a 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  .    INSERT INTO
1450: 20 74 31 20 53 45 4c 45 43 54 20 2a 20 46 52 4f   t1 SELECT * FRO
1460: 4d 20 74 31 3b 20 20 20 20 20 20 20 20 20 20 20  M t1;           
1470: 20 2d 2d 20 38 31 39 32 0a 20 20 20 20 44 45 4c   -- 8192.    DEL
1480: 45 54 45 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ETE FROM t1 WHER
1490: 45 20 6f 69 64 3e 35 31 32 3b 0a 20 20 20 20 44  E oid>512;.    D
14a0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 31 3b 0a 20  ELETE FROM t1;. 
14b0: 20 7d 0a 0a 20 20 64 6f 5f 74 65 73 74 20 34 2e   }..  do_test 4.
14c0: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
14d0: 7b 20 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20  { .      PRAGMA 
14e0: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 3d 20 57  journal_mode = W
14f0: 41 4c 3b 0a 20 20 20 20 20 20 50 52 41 47 4d 41  AL;.      PRAGMA
1500: 20 69 6e 63 72 65 6d 65 6e 74 61 6c 5f 76 61 63   incremental_vac
1510: 75 75 6d 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  uum(1);.    }.  
1520: 7d 20 7b 77 61 6c 7d 0a 20 20 64 6f 5f 74 65 73  } {wal}.  do_tes
1530: 74 20 34 2e 32 2e 31 20 7b 0a 20 20 20 20 65 78  t 4.2.1 {.    ex
1540: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
1550: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
1560: 20 20 20 20 66 69 6c 65 20 73 69 7a 65 20 74 65      file size te
1570: 73 74 2e 64 62 2d 77 61 6c 0a 20 20 7d 20 5b 77  st.db-wal.  } [w
1580: 61 6c 5f 66 69 6c 65 5f 73 69 7a 65 20 5b 77 61  al_file_size [wa
1590: 6c 5f 66 72 61 6d 65 73 20 64 62 20 32 20 31 5d  l_frames db 2 1]
15a0: 20 35 31 32 5d 0a 0a 20 20 64 6f 5f 74 65 73 74   512]..  do_test
15b0: 20 34 2e 33 20 7b 0a 20 20 20 20 64 62 20 63 6c   4.3 {.    db cl
15c0: 6f 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 20  ose.    sqlite3 
15d0: 64 62 20 74 65 73 74 2e 64 62 0a 20 20 20 20 73  db test.db.    s
15e0: 65 74 20 6d 61 78 73 7a 20 30 0a 20 20 20 20 77  et maxsz 0.    w
15f0: 68 69 6c 65 20 7b 5b 66 69 6c 65 20 73 69 7a 65  hile {[file size
1600: 20 74 65 73 74 2e 64 62 5d 20 3e 20 5b 65 78 70   test.db] > [exp
1610: 72 20 35 31 32 2a 33 5d 7d 20 7b 0a 20 20 20 20  r 512*3]} {.    
1620: 20 20 65 78 65 63 73 71 6c 20 7b 20 50 52 41 47    execsql { PRAG
1630: 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  MA journal_mode 
1640: 3d 20 57 41 4c 20 7d 0a 20 20 20 20 20 20 65 78  = WAL }.      ex
1650: 65 63 73 71 6c 20 7b 20 50 52 41 47 4d 41 20 77  ecsql { PRAGMA w
1660: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 7d 0a  al_checkpoint }.
1670: 20 20 20 20 20 20 65 78 65 63 73 71 6c 20 7b 20        execsql { 
1680: 50 52 41 47 4d 41 20 69 6e 63 72 65 6d 65 6e 74  PRAGMA increment
1690: 61 6c 5f 76 61 63 75 75 6d 28 31 29 20 7d 0a 20  al_vacuum(1) }. 
16a0: 20 20 20 20 20 73 65 74 20 6e 65 77 73 7a 20 5b       set newsz [
16b0: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
16c0: 62 2d 77 61 6c 5d 0a 20 20 20 20 20 20 69 66 20  b-wal].      if 
16d0: 7b 24 6e 65 77 73 7a 3e 24 6d 61 78 73 7a 7d 20  {$newsz>$maxsz} 
16e0: 7b 73 65 74 20 6d 61 78 73 7a 20 24 6e 65 77 73  {set maxsz $news
16f0: 7a 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  z}.    }.    set
1700: 20 6d 61 78 73 7a 20 0a 20 20 7d 20 5b 77 61 6c   maxsz .  } [wal
1710: 5f 66 69 6c 65 5f 73 69 7a 65 20 5b 77 61 6c 5f  _file_size [wal_
1720: 66 72 61 6d 65 73 20 64 62 20 33 20 31 5d 20 35  frames db 3 1] 5
1730: 31 32 5d 0a 7d 0a 0a 66 69 6e 69 73 68 5f 74 65  12].}..finish_te
1740: 73 74 0a                                         st.