/ Hex Artifact Content
Login

Artifact aa048abee196c16c9ba308465494009057b79f9b:


0000: 23 20 32 30 30 35 20 46 65 62 72 75 61 72 79 20  # 2005 February 
0010: 31 35 0a 23 0a 23 20 54 68 65 20 61 75 74 68 6f  15.#.# 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 20 54 68 69 73 20  ********.# This 
0170: 66 69 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  file implements 
0180: 72 65 67 72 65 73 73 69 6f 6e 20 74 65 73 74 73  regression tests
0190: 20 66 6f 72 20 53 51 4c 69 74 65 20 6c 69 62 72   for SQLite libr
01a0: 61 72 79 2e 20 20 54 68 65 0a 23 20 66 6f 63 75  ary.  The.# focu
01b0: 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 69  s of this file i
01c0: 73 20 74 65 73 74 69 6e 67 20 74 68 65 20 56 41  s testing the VA
01d0: 43 55 55 4d 20 73 74 61 74 65 6d 65 6e 74 2e 0a  CUUM statement..
01e0: 23 0a 23 20 24 49 64 3a 20 76 61 63 75 75 6d 32  #.# $Id: vacuum2
01f0: 2e 74 65 73 74 2c 76 20 31 2e 31 30 20 32 30 30  .test,v 1.10 200
0200: 39 2f 30 32 2f 31 38 20 32 30 3a 33 31 3a 31 38  9/02/18 20:31:18
0210: 20 64 72 68 20 45 78 70 20 24 0a 0a 73 65 74 20   drh Exp $..set 
0220: 74 65 73 74 64 69 72 20 5b 66 69 6c 65 20 64 69  testdir [file di
0230: 72 6e 61 6d 65 20 24 61 72 67 76 30 5d 0a 73 6f  rname $argv0].so
0240: 75 72 63 65 20 24 74 65 73 74 64 69 72 2f 74 65  urce $testdir/te
0250: 73 74 65 72 2e 74 63 6c 0a 73 65 74 20 74 65 73  ster.tcl.set tes
0260: 74 70 72 65 66 69 78 20 76 61 63 75 75 6d 32 0a  tprefix vacuum2.
0270: 0a 23 20 44 6f 20 6e 6f 74 20 75 73 65 20 61 20  .# Do not use a 
0280: 63 6f 64 65 63 20 66 6f 72 20 74 65 73 74 73 20  codec for tests 
0290: 69 6e 20 74 68 69 73 20 66 69 6c 65 2c 20 61 73  in this file, as
02a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
02b0: 6c 65 20 69 73 0a 23 20 6d 61 6e 69 70 75 6c 61  le is.# manipula
02c0: 74 65 64 20 64 69 72 65 63 74 6c 79 20 75 73 69  ted directly usi
02d0: 6e 67 20 74 63 6c 20 73 63 72 69 70 74 73 20 28  ng tcl scripts (
02e0: 75 73 69 6e 67 20 74 68 65 20 5b 68 65 78 69 6f  using the [hexio
02f0: 5f 77 72 69 74 65 5d 20 63 6f 6d 6d 61 6e 64 29  _write] command)
0300: 2e 0a 23 0a 64 6f 5f 6e 6f 74 5f 75 73 65 5f 63  ..#.do_not_use_c
0310: 6f 64 65 63 0a 0a 23 20 49 66 20 74 68 65 20 56  odec..# If the V
0320: 41 43 55 55 4d 20 73 74 61 74 65 6d 65 6e 74 20  ACUUM statement 
0330: 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74  is disabled in t
0340: 68 65 20 63 75 72 72 65 6e 74 20 62 75 69 6c 64  he current build
0350: 2c 20 73 6b 69 70 20 61 6c 6c 0a 23 20 74 68 65  , skip all.# the
0360: 20 74 65 73 74 73 20 69 6e 20 74 68 69 73 20 66   tests in this f
0370: 69 6c 65 2e 0a 23 0a 69 66 63 61 70 61 62 6c 65  ile..#.ifcapable
0380: 20 7b 21 76 61 63 75 75 6d 7c 7c 21 61 75 74 6f   {!vacuum||!auto
0390: 69 6e 63 7d 20 7b 0a 20 20 66 69 6e 69 73 68 5f  inc} {.  finish_
03a0: 74 65 73 74 0a 20 20 72 65 74 75 72 6e 0a 7d 0a  test.  return.}.
03b0: 69 66 20 24 41 55 54 4f 56 41 43 55 55 4d 20 7b  if $AUTOVACUUM {
03c0: 0a 20 20 66 69 6e 69 73 68 5f 74 65 73 74 0a 20  .  finish_test. 
03d0: 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 54 69 63   return.}..# Tic
03e0: 6b 65 74 20 23 31 31 32 31 20 2d 20 6d 61 6b 65  ket #1121 - make
03f0: 20 73 75 72 65 20 76 61 63 75 75 6d 20 77 6f 72   sure vacuum wor
0400: 6b 73 20 69 66 20 61 6c 6c 20 61 75 74 6f 69 6e  ks if all autoin
0410: 63 72 65 6d 65 6e 74 20 74 61 62 6c 65 73 0a 23  crement tables.#
0420: 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74   have been delet
0430: 65 64 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 61  ed..#.do_test va
0440: 63 75 75 6d 32 2d 31 2e 31 20 7b 0a 20 20 65 78  cuum2-1.1 {.  ex
0450: 65 63 73 71 6c 20 7b 0a 20 20 20 20 43 52 45 41  ecsql {.    CREA
0460: 54 45 20 54 41 42 4c 45 20 74 31 28 78 20 49 4e  TE TABLE t1(x IN
0470: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0480: 59 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 2c  Y AUTOINCREMENT,
0490: 20 79 29 3b 0a 20 20 20 20 44 52 4f 50 20 54 41   y);.    DROP TA
04a0: 42 4c 45 20 74 31 3b 0a 20 20 20 20 56 41 43 55  BLE t1;.    VACU
04b0: 55 4d 3b 0a 20 20 7d 0a 7d 20 7b 7d 0a 0a 23 20  UM;.  }.} {}..# 
04c0: 54 69 63 6b 65 74 20 23 32 35 31 38 2e 20 20 4d  Ticket #2518.  M
04d0: 61 6b 65 20 73 75 72 65 20 76 61 63 75 75 6d 20  ake sure vacuum 
04e0: 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 63  increments the c
04f0: 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 0a 23 20  hange counter.# 
0500: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
0510: 68 65 61 64 65 72 2e 0a 23 0a 64 6f 5f 74 65 73  header..#.do_tes
0520: 74 20 76 61 63 75 75 6d 32 2d 32 2e 31 20 7b 0a  t vacuum2-2.1 {.
0530: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
0540: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
0550: 78 29 3b 0a 20 20 20 20 43 52 45 41 54 45 20 54  x);.    CREATE T
0560: 41 42 4c 45 20 74 32 28 79 29 3b 0a 20 20 20 20  ABLE t2(y);.    
0570: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56  INSERT INTO t1 V
0580: 41 4c 55 45 53 28 31 29 3b 0a 20 20 7d 0a 20 20  ALUES(1);.  }.  
0590: 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 20 5b 68  hexio_get_int [h
05a0: 65 78 69 6f 5f 72 65 61 64 20 74 65 73 74 2e 64  exio_read test.d
05b0: 62 20 32 34 20 34 5d 0a 7d 20 5b 65 78 70 72 20  b 24 4].} [expr 
05c0: 7b 5b 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 20  {[hexio_get_int 
05d0: 5b 68 65 78 69 6f 5f 72 65 61 64 20 74 65 73 74  [hexio_read test
05e0: 2e 64 62 20 32 34 20 34 5d 5d 2b 33 7d 5d 0a 64  .db 24 4]]+3}].d
05f0: 6f 5f 74 65 73 74 20 76 61 63 75 75 6d 32 2d 32  o_test vacuum2-2
0600: 2e 31 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .1 {.  execsql {
0610: 0a 20 20 20 20 56 41 43 55 55 4d 0a 20 20 7d 0a  .    VACUUM.  }.
0620: 20 20 68 65 78 69 6f 5f 67 65 74 5f 69 6e 74 20    hexio_get_int 
0630: 5b 68 65 78 69 6f 5f 72 65 61 64 20 74 65 73 74  [hexio_read test
0640: 2e 64 62 20 32 34 20 34 5d 0a 7d 20 5b 65 78 70  .db 24 4].} [exp
0650: 72 20 7b 5b 68 65 78 69 6f 5f 67 65 74 5f 69 6e  r {[hexio_get_in
0660: 74 20 5b 68 65 78 69 6f 5f 72 65 61 64 20 74 65  t [hexio_read te
0670: 73 74 2e 64 62 20 32 34 20 34 5d 5d 2b 31 7d 5d  st.db 24 4]]+1}]
0680: 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ..##############
0690: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
06c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
06d0: 20 56 65 72 69 66 79 20 74 68 61 74 20 77 65 20   Verify that we 
06e0: 63 61 6e 20 75 73 65 20 74 68 65 20 61 75 74 6f  can use the auto
06f0: 5f 76 61 63 75 75 6d 20 70 72 61 67 6d 61 20 74  _vacuum pragma t
0700: 6f 20 72 65 71 75 65 73 74 20 61 20 6e 65 77 0a  o request a new.
0710: 23 20 61 75 74 6f 76 61 63 75 75 6d 20 73 65 74  # autovacuum set
0720: 74 69 6e 67 2c 20 64 6f 20 61 20 56 41 43 55 55  ting, do a VACUU
0730: 4d 2c 20 61 6e 64 20 74 68 65 20 6e 65 77 20 73  M, and the new s
0740: 65 74 74 69 6e 67 20 74 61 6b 65 73 20 65 66 66  etting takes eff
0750: 65 63 74 2e 0a 23 20 4d 61 6b 65 20 73 75 72 65  ect..# Make sure
0760: 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 63 6f   this happens co
0770: 72 72 65 63 74 6c 79 20 65 76 65 6e 20 69 66 20  rrectly even if 
0780: 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74 69 70  there are multip
0790: 6c 65 20 6f 70 65 6e 0a 23 20 63 6f 6e 6e 65 63  le open.# connec
07a0: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
07b0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
07c0: 0a 23 0a 73 71 6c 69 74 65 33 20 64 62 32 20 74  .#.sqlite3 db2 t
07d0: 65 73 74 2e 64 62 0a 73 65 74 20 70 61 67 65 53  est.db.set pageS
07e0: 69 7a 65 20 5b 64 62 20 65 76 61 6c 20 7b 70 72  ize [db eval {pr
07f0: 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 7d 5d  agma page_size}]
0800: 0a 0a 23 20 57 65 20 61 72 65 20 63 75 72 72 65  ..# We are curre
0810: 6e 74 6c 79 20 6e 6f 74 20 61 75 74 6f 76 61 63  ntly not autovac
0820: 75 75 6d 69 6e 67 20 73 6f 20 74 68 65 20 64 61  uuming so the da
0830: 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65  tabase should be
0840: 20 33 20 70 61 67 65 73 0a 23 20 69 6e 20 73 69   3 pages.# in si
0850: 7a 65 2e 20 20 31 20 70 61 67 65 20 66 6f 72 20  ze.  1 page for 
0860: 65 61 63 68 20 6f 66 20 73 71 6c 69 74 65 5f 6d  each of sqlite_m
0870: 61 73 74 65 72 2c 20 74 31 2c 20 61 6e 64 20 74  aster, t1, and t
0880: 32 2e 0a 23 0a 64 6f 5f 74 65 73 74 20 76 61 63  2..#.do_test vac
0890: 75 75 6d 32 2d 33 2e 31 20 7b 0a 20 20 65 78 65  uum2-3.1 {.  exe
08a0: 63 73 71 6c 20 7b 0a 20 20 20 20 49 4e 53 45 52  csql {.    INSER
08b0: 54 20 49 4e 54 4f 20 74 31 20 56 41 4c 55 45 53  T INTO t1 VALUES
08c0: 28 27 68 65 6c 6c 6f 27 29 3b 0a 20 20 20 20 49  ('hello');.    I
08d0: 4e 53 45 52 54 20 49 4e 54 4f 20 74 32 20 56 41  NSERT INTO t2 VA
08e0: 4c 55 45 53 28 27 6f 75 74 20 74 68 65 72 65 27  LUES('out there'
08f0: 29 3b 0a 20 20 7d 0a 20 20 65 78 70 72 20 7b 5b  );.  }.  expr {[
0900: 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e 64  file size test.d
0910: 62 5d 2f 24 70 61 67 65 53 69 7a 65 7d 0a 7d 20  b]/$pageSize}.} 
0920: 7b 33 7d 0a 73 65 74 20 63 6b 73 75 6d 20 5b 63  {3}.set cksum [c
0930: 6b 73 75 6d 5d 0a 64 6f 5f 74 65 73 74 20 76 61  ksum].do_test va
0940: 63 75 75 6d 32 2d 33 2e 32 20 7b 0a 20 20 63 6b  cuum2-3.2 {.  ck
0950: 73 75 6d 20 64 62 32 0a 7d 20 24 63 6b 73 75 6d  sum db2.} $cksum
0960: 0a 0a 23 20 43 6f 6e 76 65 72 74 20 74 68 65 20  ..# Convert the 
0970: 64 61 74 61 62 61 73 65 20 74 6f 20 61 6e 20 61  database to an a
0980: 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61 74 61  utovacuumed data
0990: 62 61 73 65 2e 0a 69 66 63 61 70 61 62 6c 65 20  base..ifcapable 
09a0: 61 75 74 6f 76 61 63 75 75 6d 20 7b 0a 20 20 64  autovacuum {.  d
09b0: 6f 5f 74 65 73 74 20 76 61 63 75 75 6d 32 2d 33  o_test vacuum2-3
09c0: 2e 33 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c  .3 {.    execsql
09d0: 20 7b 0a 20 20 20 20 20 20 50 52 41 47 4d 41 20   {.      PRAGMA 
09e0: 61 75 74 6f 5f 76 61 63 75 75 6d 3d 46 55 4c 4c  auto_vacuum=FULL
09f0: 3b 0a 20 20 20 20 20 20 56 41 43 55 55 4d 3b 0a  ;.      VACUUM;.
0a00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 20 7b      }.    expr {
0a10: 5b 66 69 6c 65 20 73 69 7a 65 20 74 65 73 74 2e  [file size test.
0a20: 64 62 5d 2f 24 70 61 67 65 53 69 7a 65 7d 0a 20  db]/$pageSize}. 
0a30: 20 7d 20 7b 34 7d 0a 7d 0a 64 6f 5f 74 65 73 74   } {4}.}.do_test
0a40: 20 76 61 63 75 75 6d 32 2d 33 2e 34 20 7b 0a 20   vacuum2-3.4 {. 
0a50: 20 63 6b 73 75 6d 20 64 62 32 0a 7d 20 24 63 6b   cksum db2.} $ck
0a60: 73 75 6d 0a 64 6f 5f 74 65 73 74 20 76 61 63 75  sum.do_test vacu
0a70: 75 6d 32 2d 33 2e 35 20 7b 0a 20 20 63 6b 73 75  um2-3.5 {.  cksu
0a80: 6d 0a 7d 20 24 63 6b 73 75 6d 0a 64 6f 5f 74 65  m.} $cksum.do_te
0a90: 73 74 20 76 61 63 75 75 6d 32 2d 33 2e 36 20 7b  st vacuum2-3.6 {
0aa0: 0a 20 20 65 78 65 63 73 71 6c 20 7b 50 52 41 47  .  execsql {PRAG
0ab0: 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  MA integrity_che
0ac0: 63 6b 7d 20 64 62 32 0a 7d 20 7b 6f 6b 7d 0a 64  ck} db2.} {ok}.d
0ad0: 6f 5f 74 65 73 74 20 76 61 63 75 75 6d 32 2d 33  o_test vacuum2-3
0ae0: 2e 37 20 7b 0a 20 20 65 78 65 63 73 71 6c 20 7b  .7 {.  execsql {
0af0: 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
0b00: 5f 63 68 65 63 6b 7d 20 64 62 0a 7d 20 7b 6f 6b  _check} db.} {ok
0b10: 7d 0a 0a 23 20 43 6f 6e 76 65 72 74 20 74 68 65  }..# Convert the
0b20: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
0b30: 6f 20 61 20 6e 6f 6e 2d 61 75 74 6f 76 61 63 75  o a non-autovacu
0b40: 75 6d 65 64 20 64 61 74 61 62 61 73 65 2e 0a 64  umed database..d
0b50: 6f 5f 74 65 73 74 20 76 61 63 75 75 6d 32 2d 33  o_test vacuum2-3
0b60: 2e 31 33 20 7b 0a 20 20 65 78 65 63 73 71 6c 20  .13 {.  execsql 
0b70: 7b 0a 20 20 20 20 50 52 41 47 4d 41 20 61 75 74  {.    PRAGMA aut
0b80: 6f 5f 76 61 63 75 75 6d 3d 4e 4f 4e 45 3b 0a 20  o_vacuum=NONE;. 
0b90: 20 20 20 56 41 43 55 55 4d 3b 0a 20 20 7d 0a 20     VACUUM;.  }. 
0ba0: 20 65 78 70 72 20 7b 5b 66 69 6c 65 20 73 69 7a   expr {[file siz
0bb0: 65 20 74 65 73 74 2e 64 62 5d 2f 24 70 61 67 65  e test.db]/$page
0bc0: 53 69 7a 65 7d 0a 7d 20 7b 33 7d 0a 64 6f 5f 74  Size}.} {3}.do_t
0bd0: 65 73 74 20 76 61 63 75 75 6d 32 2d 33 2e 31 34  est vacuum2-3.14
0be0: 20 7b 0a 20 20 63 6b 73 75 6d 20 64 62 32 0a 7d   {.  cksum db2.}
0bf0: 20 24 63 6b 73 75 6d 0a 64 6f 5f 74 65 73 74 20   $cksum.do_test 
0c00: 76 61 63 75 75 6d 32 2d 33 2e 31 35 20 7b 0a 20  vacuum2-3.15 {. 
0c10: 20 63 6b 73 75 6d 0a 7d 20 24 63 6b 73 75 6d 0a   cksum.} $cksum.
0c20: 64 6f 5f 74 65 73 74 20 76 61 63 75 75 6d 32 2d  do_test vacuum2-
0c30: 33 2e 31 36 20 7b 0a 20 20 65 78 65 63 73 71 6c  3.16 {.  execsql
0c40: 20 7b 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69   {PRAGMA integri
0c50: 74 79 5f 63 68 65 63 6b 7d 20 64 62 32 0a 7d 20  ty_check} db2.} 
0c60: 7b 6f 6b 7d 0a 64 6f 5f 74 65 73 74 20 76 61 63  {ok}.do_test vac
0c70: 75 75 6d 32 2d 33 2e 31 37 20 7b 0a 20 20 65 78  uum2-3.17 {.  ex
0c80: 65 63 73 71 6c 20 7b 50 52 41 47 4d 41 20 69 6e  ecsql {PRAGMA in
0c90: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 7d 20 64  tegrity_check} d
0ca0: 62 0a 7d 20 7b 6f 6b 7d 0a 0a 64 62 32 20 63 6c  b.} {ok}..db2 cl
0cb0: 6f 73 65 0a 0a 69 66 63 61 70 61 62 6c 65 20 61  ose..ifcapable a
0cc0: 75 74 6f 76 61 63 75 75 6d 20 7b 0a 20 20 64 6f  utovacuum {.  do
0cd0: 5f 74 65 73 74 20 76 61 63 75 75 6d 32 2d 34 2e  _test vacuum2-4.
0ce0: 31 20 7b 0a 20 20 20 20 64 62 20 63 6c 6f 73 65  1 {.    db close
0cf0: 0a 20 20 20 20 66 6f 72 63 65 64 65 6c 65 74 65  .    forcedelete
0d00: 20 74 65 73 74 2e 64 62 0a 20 20 20 20 73 71 6c   test.db.    sql
0d10: 69 74 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a  ite3 db test.db.
0d20: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
0d30: 20 20 20 20 70 72 61 67 6d 61 20 61 75 74 6f 5f      pragma auto_
0d40: 76 61 63 75 75 6d 3d 31 3b 0a 20 20 20 20 20 20  vacuum=1;.      
0d50: 63 72 65 61 74 65 20 74 61 62 6c 65 20 74 28 61  create table t(a
0d60: 2c 20 62 29 3b 0a 20 20 20 20 20 20 69 6e 73 65  , b);.      inse
0d70: 72 74 20 69 6e 74 6f 20 74 20 76 61 6c 75 65 73  rt into t values
0d80: 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20 69 6e  (1, 2);.      in
0d90: 73 65 72 74 20 69 6e 74 6f 20 74 20 76 61 6c 75  sert into t valu
0da0: 65 73 28 31 2c 20 32 29 3b 0a 20 20 20 20 20 20  es(1, 2);.      
0db0: 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75  pragma auto_vacu
0dc0: 75 6d 3d 30 3b 0a 20 20 20 20 20 20 76 61 63 75  um=0;.      vacu
0dd0: 75 6d 3b 0a 20 20 20 20 20 20 70 72 61 67 6d 61  um;.      pragma
0de0: 20 61 75 74 6f 5f 76 61 63 75 75 6d 3b 0a 20 20   auto_vacuum;.  
0df0: 20 20 7d 0a 20 20 7d 20 7b 30 7d 0a 20 20 64 6f    }.  } {0}.  do
0e00: 5f 74 65 73 74 20 76 61 63 75 75 6d 32 2d 34 2e  _test vacuum2-4.
0e10: 32 20 7b 0a 20 20 20 20 65 78 65 63 73 71 6c 20  2 {.    execsql 
0e20: 7b 0a 20 20 20 20 20 20 70 72 61 67 6d 61 20 61  {.      pragma a
0e30: 75 74 6f 5f 76 61 63 75 75 6d 3d 31 3b 0a 20 20  uto_vacuum=1;.  
0e40: 20 20 20 20 76 61 63 75 75 6d 3b 0a 20 20 20 20      vacuum;.    
0e50: 20 20 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61    pragma auto_va
0e60: 63 75 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  cuum;.    }.  } 
0e70: 7b 31 7d 0a 20 20 64 6f 5f 74 65 73 74 20 76 61  {1}.  do_test va
0e80: 63 75 75 6d 32 2d 34 2e 33 20 7b 0a 20 20 20 20  cuum2-4.3 {.    
0e90: 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20 20 20  execsql {.      
0ea0: 70 72 61 67 6d 61 20 69 6e 74 65 67 72 69 74 79  pragma integrity
0eb0: 5f 63 68 65 63 6b 0a 20 20 20 20 7d 0a 20 20 7d  _check.    }.  }
0ec0: 20 7b 6f 6b 7d 0a 20 20 64 6f 5f 74 65 73 74 20   {ok}.  do_test 
0ed0: 76 61 63 75 75 6d 32 2d 34 2e 34 20 7b 0a 20 20  vacuum2-4.4 {.  
0ee0: 20 20 64 62 20 63 6c 6f 73 65 0a 20 20 20 20 73    db close.    s
0ef0: 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e 64  qlite3 db test.d
0f00: 62 0a 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a  b.    execsql {.
0f10: 20 20 20 20 20 20 70 72 61 67 6d 61 20 61 75 74        pragma aut
0f20: 6f 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 7d 0a  o_vacuum;.    }.
0f30: 20 20 7d 20 7b 31 7d 0a 20 20 64 6f 5f 74 65 73    } {1}.  do_tes
0f40: 74 20 76 61 63 75 75 6d 32 2d 34 2e 35 20 7b 20  t vacuum2-4.5 { 
0f50: 20 23 20 54 69 63 6b 65 74 20 23 33 36 36 33 0a   # Ticket #3663.
0f60: 20 20 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20      execsql {.  
0f70: 20 20 20 20 70 72 61 67 6d 61 20 61 75 74 6f 5f      pragma auto_
0f80: 76 61 63 75 75 6d 3d 32 3b 0a 20 20 20 20 20 20  vacuum=2;.      
0f90: 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 70 72  vacuum;.      pr
0fa0: 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d  agma auto_vacuum
0fb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 32 7d 0a  ;.    }.  } {2}.
0fc0: 20 20 64 6f 5f 74 65 73 74 20 76 61 63 75 75 6d    do_test vacuum
0fd0: 32 2d 34 2e 36 20 7b 0a 20 20 20 20 65 78 65 63  2-4.6 {.    exec
0fe0: 73 71 6c 20 7b 0a 20 20 20 20 20 20 70 72 61 67  sql {.      prag
0ff0: 6d 61 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65  ma integrity_che
1000: 63 6b 0a 20 20 20 20 7d 0a 20 20 7d 20 7b 6f 6b  ck.    }.  } {ok
1010: 7d 0a 20 20 64 6f 5f 74 65 73 74 20 76 61 63 75  }.  do_test vacu
1020: 75 6d 32 2d 34 2e 37 20 7b 0a 20 20 20 20 64 62  um2-4.7 {.    db
1030: 20 63 6c 6f 73 65 0a 20 20 20 20 73 71 6c 69 74   close.    sqlit
1040: 65 33 20 64 62 20 74 65 73 74 2e 64 62 0a 20 20  e3 db test.db.  
1050: 20 20 65 78 65 63 73 71 6c 20 7b 0a 20 20 20 20    execsql {.    
1060: 20 20 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61    pragma auto_va
1070: 63 75 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  cuum;.    }.  } 
1080: 7b 32 7d 0a 7d 0a 0a 0a 23 2d 2d 2d 2d 2d 2d 2d  {2}.}...#-------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d0: 2d 2d 0a 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  --.# The followi
10e0: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 74 65 73 74  ng block of test
10f0: 73 20 76 65 72 69 66 79 20 74 68 65 20 62 65 68  s verify the beh
1100: 61 76 69 6f 75 72 20 6f 66 20 74 68 65 20 6c 69  aviour of the li
1110: 62 72 61 72 79 20 77 68 65 6e 0a 23 20 61 20 64  brary when.# a d
1120: 61 74 61 62 61 73 65 20 69 73 20 56 41 43 55 55  atabase is VACUU
1130: 4d 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61  Med when there a
1140: 72 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 75  re one or more u
1150: 6e 66 69 6e 61 6c 69 7a 65 64 20 53 51 4c 20 0a  nfinalized SQL .
1160: 23 20 73 74 61 74 65 6d 65 6e 74 73 20 72 65 61  # statements rea
1170: 64 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  ding the same da
1180: 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1190: 20 73 61 6d 65 20 64 62 20 68 61 6e 64 6c 65 2e   same db handle.
11a0: 0a 23 0a 64 62 20 63 6c 6f 73 65 0a 66 6f 72 63  .#.db close.forc
11b0: 65 64 65 6c 65 74 65 20 74 65 73 74 2e 64 62 0a  edelete test.db.
11c0: 73 71 6c 69 74 65 33 20 64 62 20 74 65 73 74 2e  sqlite3 db test.
11d0: 64 62 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74 65  db.do_execsql_te
11e0: 73 74 20 76 61 63 75 75 6d 32 2d 35 2e 31 20 7b  st vacuum2-5.1 {
11f0: 0a 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  .  CREATE TABLE 
1200: 74 31 28 61 20 50 52 49 4d 41 52 59 20 4b 45 59  t1(a PRIMARY KEY
1210: 2c 20 62 20 55 4e 49 51 55 45 29 3b 0a 20 20 49  , b UNIQUE);.  I
1220: 4e 53 45 52 54 20 49 4e 54 4f 20 74 31 20 56 41  NSERT INTO t1 VA
1230: 4c 55 45 53 28 31 2c 20 72 61 6e 64 6f 6d 62 6c  LUES(1, randombl
1240: 6f 62 28 35 30 30 29 29 3b 0a 20 20 49 4e 53 45  ob(500));.  INSE
1250: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
1260: 54 20 61 2b 31 2c 20 72 61 6e 64 6f 6d 62 6c 6f  T a+1, randomblo
1270: 62 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(500) FROM t1; 
1280: 20 20 20 20 20 2d 2d 20 32 0a 20 20 49 4e 53 45       -- 2.  INSE
1290: 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45 43  RT INTO t1 SELEC
12a0: 54 20 61 2b 32 2c 20 72 61 6e 64 6f 6d 62 6c 6f  T a+2, randomblo
12b0: 62 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b 20  b(500) FROM t1; 
12c0: 20 20 20 20 20 2d 2d 20 34 20 0a 20 20 49 4e 53       -- 4 .  INS
12d0: 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c 45  ERT INTO t1 SELE
12e0: 43 54 20 61 2b 34 2c 20 72 61 6e 64 6f 6d 62 6c  CT a+4, randombl
12f0: 6f 62 28 35 30 30 29 20 46 52 4f 4d 20 74 31 3b  ob(500) FROM t1;
1300: 20 20 20 20 20 20 2d 2d 20 38 20 0a 20 20 49 4e        -- 8 .  IN
1310: 53 45 52 54 20 49 4e 54 4f 20 74 31 20 53 45 4c  SERT INTO t1 SEL
1320: 45 43 54 20 61 2b 38 2c 20 72 61 6e 64 6f 6d 62  ECT a+8, randomb
1330: 6c 6f 62 28 35 30 30 29 20 46 52 4f 4d 20 74 31  lob(500) FROM t1
1340: 3b 20 20 20 20 20 20 2d 2d 20 31 36 20 0a 7d 20  ;      -- 16 .} 
1350: 7b 7d 0a 0a 64 6f 5f 74 65 73 74 20 76 61 63 75  {}..do_test vacu
1360: 75 6d 32 2d 35 2e 32 20 7b 0a 20 20 6c 69 73 74  um2-5.2 {.  list
1370: 20 5b 63 61 74 63 68 20 7b 0a 20 20 20 20 64 62   [catch {.    db
1380: 20 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 61 2c   eval {SELECT a,
1390: 20 62 20 46 52 4f 4d 20 74 31 7d 20 7b 20 69 66   b FROM t1} { if
13a0: 20 7b 24 61 20 3d 3d 20 38 7d 20 7b 20 65 78 65   {$a == 8} { exe
13b0: 63 73 71 6c 20 56 41 43 55 55 4d 20 7d 20 7d 0a  csql VACUUM } }.
13c0: 20 20 7d 20 6d 73 67 5d 20 24 6d 73 67 0a 7d 20    } msg] $msg.} 
13d0: 7b 31 20 7b 63 61 6e 6e 6f 74 20 56 41 43 55 55  {1 {cannot VACUU
13e0: 4d 20 2d 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  M - SQL statemen
13f0: 74 73 20 69 6e 20 70 72 6f 67 72 65 73 73 7d 7d  ts in progress}}
1400: 0a 0a 64 6f 5f 74 65 73 74 20 76 61 63 75 75 6d  ..do_test vacuum
1410: 32 2d 35 2e 33 20 7b 0a 20 20 6c 69 73 74 20 5b  2-5.3 {.  list [
1420: 63 61 74 63 68 20 7b 0a 20 20 20 20 64 62 20 65  catch {.    db e
1430: 76 61 6c 20 7b 53 45 4c 45 43 54 20 31 2c 20 32  val {SELECT 1, 2
1440: 2c 20 33 7d 20 7b 20 65 78 65 63 73 71 6c 20 56  , 3} { execsql V
1450: 41 43 55 55 4d 20 7d 0a 20 20 7d 20 6d 73 67 5d  ACUUM }.  } msg]
1460: 20 24 6d 73 67 0a 7d 20 7b 31 20 7b 63 61 6e 6e   $msg.} {1 {cann
1470: 6f 74 20 56 41 43 55 55 4d 20 2d 20 53 51 4c 20  ot VACUUM - SQL 
1480: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 70 72  statements in pr
1490: 6f 67 72 65 73 73 7d 7d 0a 0a 64 6f 5f 74 65 73  ogress}}..do_tes
14a0: 74 20 76 61 63 75 75 6d 32 2d 35 2e 34 20 7b 0a  t vacuum2-5.4 {.
14b0: 20 20 73 65 74 20 72 65 73 20 22 22 0a 20 20 73    set res "".  s
14c0: 65 74 20 72 65 73 32 20 22 22 0a 20 20 64 62 20  et res2 "".  db 
14d0: 65 76 61 6c 20 7b 53 45 4c 45 43 54 20 61 2c 20  eval {SELECT a, 
14e0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
14f0: 61 3c 3d 31 30 7d 20 7b 0a 20 20 20 20 69 66 20  a<=10} {.    if 
1500: 7b 24 61 3d 3d 36 7d 20 7b 20 73 65 74 20 72 65  {$a==6} { set re
1510: 73 20 5b 63 61 74 63 68 73 71 6c 20 56 41 43 55  s [catchsql VACU
1520: 55 4d 5d 20 7d 0a 20 20 20 20 6c 61 70 70 65 6e  UM] }.    lappen
1530: 64 20 72 65 73 32 20 24 61 0a 20 20 7d 0a 20 20  d res2 $a.  }.  
1540: 6c 61 70 70 65 6e 64 20 72 65 73 32 20 24 72 65  lappend res2 $re
1550: 73 0a 7d 20 7b 31 20 32 20 33 20 34 20 35 20 36  s.} {1 2 3 4 5 6
1560: 20 37 20 38 20 39 20 31 30 20 7b 31 20 7b 63 61   7 8 9 10 {1 {ca
1570: 6e 6e 6f 74 20 56 41 43 55 55 4d 20 2d 20 53 51  nnot VACUUM - SQ
1580: 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  L statements in 
1590: 70 72 6f 67 72 65 73 73 7d 7d 7d 0a 0a 23 2d 2d  progress}}}..#--
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 43 68 65 63 6b 20  -------.# Check 
15f0: 74 68 61 74 20 69 66 20 74 68 65 20 64 65 66 69  that if the defi
1600: 6e 69 74 69 6f 6e 20 6f 66 20 61 20 63 6f 6c 6c  nition of a coll
1610: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69  ation sequence i
1620: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 0a 23 20  s changed and.# 
1630: 56 41 43 55 55 4d 20 72 75 6e 2c 20 72 65 63 6f  VACUUM run, reco
1640: 72 64 73 20 61 72 65 20 73 74 6f 72 65 20 69 6e  rds are store in
1650: 20 74 68 65 20 28 6e 65 77 29 20 63 6f 72 72 65   the (new) corre
1660: 63 74 20 6f 72 64 65 72 20 66 6f 6c 6c 6f 77 69  ct order followi
1670: 6e 67 20 74 68 65 0a 23 20 56 41 43 55 55 4d 2e  ng the.# VACUUM.
1680: 20 45 76 65 6e 20 69 66 20 74 68 65 20 6d 6f 64   Even if the mod
1690: 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
16a0: 69 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 61  is attached to a
16b0: 20 50 4b 20 6f 66 20 61 20 57 49 54 48 4f 55 54   PK of a WITHOUT
16c0: 0a 23 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 0a  .# ROWID table..
16d0: 0a 70 72 6f 63 20 63 6d 70 20 7b 6c 68 73 20 72  .proc cmp {lhs r
16e0: 68 73 7d 20 7b 20 73 74 72 69 6e 67 20 63 6f 6d  hs} { string com
16f0: 70 61 72 65 20 24 6c 68 73 20 24 72 68 73 20 7d  pare $lhs $rhs }
1700: 0a 64 62 20 63 6f 6c 6c 61 74 65 20 63 6d 70 20  .db collate cmp 
1710: 63 6d 70 0a 64 6f 5f 65 78 65 63 73 71 6c 5f 74  cmp.do_execsql_t
1720: 65 73 74 20 36 2e 30 20 7b 0a 20 20 43 52 45 41  est 6.0 {.  CREA
1730: 54 45 20 54 41 42 4c 45 20 74 36 28 78 20 50 52  TE TABLE t6(x PR
1740: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
1750: 45 20 63 6d 70 2c 20 79 29 20 57 49 54 48 4f 55  E cmp, y) WITHOU
1760: 54 20 52 4f 57 49 44 3b 0a 20 20 43 52 45 41 54  T ROWID;.  CREAT
1770: 45 20 49 4e 44 45 58 20 74 36 79 20 4f 4e 20 74  E INDEX t6y ON t
1780: 36 28 79 29 3b 0a 20 20 49 4e 53 45 52 54 20 49  6(y);.  INSERT I
1790: 4e 54 4f 20 74 36 20 56 41 4c 55 45 53 28 27 69  NTO t6 VALUES('i
17a0: 27 2c 20 27 6f 6e 65 27 29 3b 0a 20 20 49 4e 53  ', 'one');.  INS
17b0: 45 52 54 20 49 4e 54 4f 20 74 36 20 56 41 4c 55  ERT INTO t6 VALU
17c0: 45 53 28 27 69 69 27 2c 20 27 6f 6e 65 27 29 3b  ES('ii', 'one');
17d0: 0a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  .  INSERT INTO t
17e0: 36 20 56 41 4c 55 45 53 28 27 69 69 69 27 2c 20  6 VALUES('iii', 
17f0: 27 6f 6e 65 27 29 3b 0a 7d 0a 69 6e 74 65 67 72  'one');.}.integr
1800: 69 74 79 5f 63 68 65 63 6b 20 36 2e 31 0a 70 72  ity_check 6.1.pr
1810: 6f 63 20 63 6d 70 20 7b 6c 68 73 20 72 68 73 7d  oc cmp {lhs rhs}
1820: 20 7b 20 73 74 72 69 6e 67 20 63 6f 6d 70 61 72   { string compar
1830: 65 20 24 72 68 73 20 24 6c 68 73 20 7d 0a 64 6f  e $rhs $lhs }.do
1840: 5f 65 78 65 63 73 71 6c 5f 74 65 73 74 20 36 2e  _execsql_test 6.
1850: 32 20 56 41 43 55 55 4d 0a 69 6e 74 65 67 72 69  2 VACUUM.integri
1860: 74 79 5f 63 68 65 63 6b 20 36 2e 33 0a 0a 66 69  ty_check 6.3..fi
1870: 6e 69 73 68 5f 74 65 73 74 0a                    nish_test.