/ Hex Artifact Content
Login

Artifact 14ac3073203fa021e01ffe33db56968ad79a8344:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
01b0: 64 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  d..**.** Most of
01c0: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69   the code in thi
01d0: 73 20 66 69 6c 65 20 6d 61 79 20 62 65 20 6f 6d  s file may be om
01e0: 69 74 74 65 64 20 62 79 20 64 65 66 69 6e 69 6e  itted by definin
01f0: 67 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  g the.** SQLITE_
0200: 4f 4d 49 54 5f 56 41 43 55 55 4d 20 6d 61 63 72  OMIT_VACUUM macr
0210: 6f 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 61  o..**.** $Id: va
0220: 63 75 75 6d 2e 63 2c 76 20 31 2e 36 20 32 30 30  cuum.c,v 1.6 200
0230: 33 2f 30 34 2f 32 35 20 31 35 3a 33 37 3a 35 38  3/04/25 15:37:58
0240: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0250: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0260: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
0270: 73 2e 68 22 0a 0a 23 64 65 66 69 6e 65 20 53 51  s.h"..#define SQ
0280: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
0290: 20 31 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75   1../*.** A stru
02a0: 63 74 75 72 65 20 66 6f 72 20 68 6f 6c 64 69 6e  cture for holdin
02b0: 67 20 61 20 64 79 6e 61 6d 69 63 20 73 74 72 69  g a dynamic stri
02c0: 6e 67 20 2d 20 61 20 73 74 72 69 6e 67 20 74 68  ng - a string th
02d0: 61 74 20 63 61 6e 20 67 72 6f 77 0a 2a 2a 20 77  at can grow.** w
02e0: 69 74 68 6f 75 74 20 62 6f 75 6e 64 2e 20 0a 2a  ithout bound. .*
02f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
0300: 20 64 79 6e 53 74 72 20 64 79 6e 53 74 72 3b 0a   dynStr dynStr;.
0310: 73 74 72 75 63 74 20 64 79 6e 53 74 72 20 7b 0a  struct dynStr {.
0320: 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
0330: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65    /* Text of the
0340: 20 73 74 72 69 6e 67 20 69 6e 20 73 70 61 63 65   string in space
0350: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
0360: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 2a 2f  qliteMalloc() */
0370: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
0380: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
0390: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
03a0: 74 6f 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  to z[] */.  int 
03b0: 6e 55 73 65 64 3b 20 20 20 20 20 20 2f 2a 20 4e  nUsed;      /* N
03c0: 65 78 74 20 75 6e 75 73 65 64 20 73 6c 6f 74 20  ext unused slot 
03d0: 69 6e 20 7a 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  in z[] */.};../*
03e0: 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20  .** A structure 
03f0: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 76  that holds the v
0400: 61 63 75 75 6d 20 63 6f 6e 74 65 78 74 0a 2a 2f  acuum context.*/
0410: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
0420: 76 61 63 75 75 6d 53 74 72 75 63 74 20 76 61 63  vacuumStruct vac
0430: 75 75 6d 53 74 72 75 63 74 3b 0a 73 74 72 75 63  uumStruct;.struc
0440: 74 20 76 61 63 75 75 6d 53 74 72 75 63 74 20 7b  t vacuumStruct {
0450: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 4f 6c 64  .  sqlite *dbOld
0460: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69  ;       /* Origi
0470: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  nal database */.
0480: 20 20 73 71 6c 69 74 65 20 2a 64 62 4e 65 77 3b    sqlite *dbNew;
0490: 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 64 61         /* New da
04a0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 61 72 73  tabase */.  Pars
04b0: 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
04c0: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
04d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
04e0: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 20  t char *zTable; 
04f0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74 61   /* Name of a ta
0500: 62 6c 65 20 62 65 69 6e 67 20 63 6f 70 69 65 64  ble being copied
0510: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
0520: 20 2a 7a 50 72 61 67 6d 61 3b 20 2f 2a 20 50 72   *zPragma; /* Pr
0530: 61 67 6d 61 20 74 6f 20 65 78 65 63 75 74 65 20  agma to execute 
0540: 77 69 74 68 20 72 65 73 75 6c 74 73 20 2a 2f 0a  with results */.
0550: 20 20 64 79 6e 53 74 72 20 73 31 2c 20 73 32 3b    dynStr s1, s2;
0560: 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 64 79         /* Two dy
0570: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 2a 2f  namic strings */
0580: 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .};..#ifdef SQLI
0590: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f  TE_OMIT_VACUUM./
05a0: 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65 78 74  *.** Append text
05b0: 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 20 73 74   to a dynamic st
05c0: 72 69 6e 67 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ring.*/.static v
05d0: 6f 69 64 20 61 70 70 65 6e 64 54 65 78 74 28 64  oid appendText(d
05e0: 79 6e 53 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20  ynStr *p, const 
05f0: 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74  char *zText, int
0600: 20 6e 54 65 78 74 29 7b 0a 20 20 69 66 28 20 6e   nText){.  if( n
0610: 54 65 78 74 3c 30 20 29 20 6e 54 65 78 74 20 3d  Text<0 ) nText =
0620: 20 73 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a   strlen(zText);.
0630: 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 7c 7c    if( p->z==0 ||
0640: 20 70 2d 3e 6e 55 73 65 64 20 2b 20 6e 54 65 78   p->nUsed + nTex
0650: 74 20 2b 20 31 20 3e 3d 20 70 2d 3e 6e 41 6c 6c  t + 1 >= p->nAll
0660: 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  oc ){.    char *
0670: 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c  zNew;.    p->nAl
0680: 6c 6f 63 20 3d 20 70 2d 3e 6e 55 73 65 64 20 2b  loc = p->nUsed +
0690: 20 6e 54 65 78 74 20 2b 20 31 30 30 30 3b 0a 20   nText + 1000;. 
06a0: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
06b0: 52 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d  Realloc(p->z, p-
06c0: 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
06d0: 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( zNew==0 ){.   
06e0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d     sqliteFree(p-
06f0: 3e 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  >z);.      memse
0700: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
0710: 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  p));.      retur
0720: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
0730: 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20 20  z = zNew;.  }.  
0740: 6d 65 6d 63 70 79 28 26 70 2d 3e 7a 5b 70 2d 3e  memcpy(&p->z[p->
0750: 6e 55 73 65 64 5d 2c 20 7a 54 65 78 74 2c 20 6e  nUsed], zText, n
0760: 54 65 78 74 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55  Text+1);.  p->nU
0770: 73 65 64 20 2b 3d 20 6e 54 65 78 74 3b 0a 7d 0a  sed += nText;.}.
0780: 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
0790: 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 20  xt to a dynamic 
07a0: 73 74 72 69 6e 67 2c 20 68 61 76 69 6e 67 20 66  string, having f
07b0: 69 72 73 74 20 70 75 74 20 74 68 65 20 74 65 78  irst put the tex
07c0: 74 20 69 6e 20 71 75 6f 74 65 73 2e 0a 2a 2f 0a  t in quotes..*/.
07d0: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 65  static void appe
07e0: 6e 64 51 75 6f 74 65 64 28 64 79 6e 53 74 72 20  ndQuoted(dynStr 
07f0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
0800: 7a 54 65 78 74 29 7b 0a 20 20 69 6e 74 20 69 2c  zText){.  int i,
0810: 20 6a 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74   j;.  appendText
0820: 28 70 2c 20 22 27 22 2c 20 31 29 3b 0a 20 20 66  (p, "'", 1);.  f
0830: 6f 72 28 69 3d 6a 3d 30 3b 20 7a 54 65 78 74 5b  or(i=j=0; zText[
0840: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
0850: 28 20 7a 54 65 78 74 5b 69 5d 3d 3d 27 5c 27 27  ( zText[i]=='\''
0860: 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   ){.      append
0870: 54 65 78 74 28 70 2c 20 26 7a 54 65 78 74 5b 6a  Text(p, &zText[j
0880: 5d 2c 20 69 2d 6a 2b 31 29 3b 0a 20 20 20 20 20  ], i-j+1);.     
0890: 20 6a 20 3d 20 69 20 2b 20 31 3b 0a 20 20 20 20   j = i + 1;.    
08a0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20    appendText(p, 
08b0: 22 27 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20  "'", 1);.    }. 
08c0: 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a   }.  if( j<i ){.
08d0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 70      appendText(p
08e0: 2c 20 26 7a 54 65 78 74 5b 6a 5d 2c 20 69 2d 6a  , &zText[j], i-j
08f0: 29 3b 0a 20 20 7d 0a 20 20 61 70 70 65 6e 64 54  );.  }.  appendT
0900: 65 78 74 28 70 2c 20 22 27 22 2c 20 31 29 3b 0a  ext(p, "'", 1);.
0910: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  }../*.** Execute
0920: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 66 20 53   statements of S
0930: 51 4c 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  QL.  If an error
0940: 20 6f 63 63 75 72 73 2c 20 77 72 69 74 65 20 74   occurs, write t
0950: 68 65 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73  he error.** mess
0960: 61 67 65 20 69 6e 74 6f 20 70 50 61 72 73 65 2d  age into pParse-
0970: 3e 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74  >zErrMsg and ret
0980: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f  urn non-zero..*/
0990: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
09a0: 73 71 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  sql(Parse *pPars
09b0: 65 2c 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 63  e, sqlite *db, c
09c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29  onst char *zSql)
09d0: 7b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  { .  int rc;.  c
09e0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
09f0: 3b 0a 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22  ;..  /* printf("
0a00: 2a 2a 2a 2a 2a 20 65 78 65 63 75 74 69 6e 67 20  ***** executing 
0a10: 2a 2a 2a 2a 2a 5c 6e 25 73 5c 6e 22 2c 20 7a 53  *****\n%s\n", zS
0a20: 71 6c 29 3b 20 2a 2f 0a 20 20 72 63 20 3d 20 73  ql); */.  rc = s
0a30: 71 6c 69 74 65 5f 65 78 65 63 28 64 62 2c 20 7a  qlite_exec(db, z
0a40: 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
0a50: 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Msg);.  if( rc )
0a60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f  {.    sqliteErro
0a70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
0a80: 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
0a90: 20 73 71 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28   sqlite_freemem(
0aa0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
0ab0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
0ac0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
0ad0: 73 65 63 6f 6e 64 20 73 74 61 67 65 20 63 61 6c  second stage cal
0ae0: 6c 62 61 63 6b 2e 20 20 45 61 63 68 20 69 6e 76  lback.  Each inv
0af0: 6f 63 61 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ocation contains
0b00: 20 61 6c 6c 20 74 68 65 0a 2a 2a 20 64 61 74 61   all the.** data
0b10: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 6f   for a single ro
0b20: 77 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61  w of a single ta
0b30: 62 6c 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ble in the origi
0b40: 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 54  nal database.  T
0b50: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
0b60: 75 73 74 20 77 72 69 74 65 20 74 68 61 74 20 69  ust write that i
0b70: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
0b80: 74 68 65 20 6e 65 77 20 64 61 74 61 62 61 73 65  the new database
0b90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0ba0: 76 61 63 75 75 6d 43 61 6c 6c 62 61 63 6b 32 28  vacuumCallback2(
0bb0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
0bc0: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
0bd0: 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65  v, char **NotUse
0be0: 64 29 7b 0a 20 20 76 61 63 75 75 6d 53 74 72 75  d){.  vacuumStru
0bf0: 63 74 20 2a 70 20 3d 20 28 76 61 63 75 75 6d 53  ct *p = (vacuumS
0c00: 74 72 75 63 74 2a 29 70 41 72 67 3b 0a 20 20 69  truct*)pArg;.  i
0c10: 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
0c20: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
0c30: 22 28 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  "(";.  int i;.. 
0c40: 20 70 2d 3e 73 32 2e 6e 55 73 65 64 20 3d 20 30   p->s2.nUsed = 0
0c50: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
0c60: 70 2d 3e 73 32 2c 20 22 49 4e 53 45 52 54 20 49  p->s2, "INSERT I
0c70: 4e 54 4f 20 22 2c 20 2d 31 29 3b 0a 20 20 61 70  NTO ", -1);.  ap
0c80: 70 65 6e 64 51 75 6f 74 65 64 28 26 70 2d 3e 73  pendQuoted(&p->s
0c90: 32 2c 20 70 2d 3e 7a 54 61 62 6c 65 29 3b 0a 20  2, p->zTable);. 
0ca0: 20 61 70 70 65 6e 64 54 65 78 74 28 26 70 2d 3e   appendText(&p->
0cb0: 73 32 2c 20 22 20 56 41 4c 55 45 53 22 2c 20 2d  s2, " VALUES", -
0cc0: 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  1);.  for(i=0; i
0cd0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
0ce0: 20 61 70 70 65 6e 64 54 65 78 74 28 26 70 2d 3e   appendText(&p->
0cf0: 73 32 2c 20 7a 53 65 70 2c 20 31 29 3b 0a 20 20  s2, zSep, 1);.  
0d00: 20 20 7a 53 65 70 20 3d 20 22 2c 22 3b 0a 20 20    zSep = ",";.  
0d10: 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30    if( argv[i]==0
0d20: 20 29 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   ){.      append
0d30: 54 65 78 74 28 26 70 2d 3e 73 32 2c 20 22 4e 55  Text(&p->s2, "NU
0d40: 4c 4c 22 2c 20 34 29 3b 0a 20 20 20 20 7d 65 6c  LL", 4);.    }el
0d50: 73 65 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  se{.      append
0d60: 51 75 6f 74 65 64 28 26 70 2d 3e 73 32 2c 20 61  Quoted(&p->s2, a
0d70: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  rgv[i]);.    }. 
0d80: 20 7d 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28   }.  appendText(
0d90: 26 70 2d 3e 73 32 2c 22 29 22 2c 20 31 29 3b 0a  &p->s2,")", 1);.
0da0: 20 20 72 63 20 3d 20 65 78 65 63 73 71 6c 28 70    rc = execsql(p
0db0: 2d 3e 70 50 61 72 73 65 2c 20 70 2d 3e 64 62 4e  ->pParse, p->dbN
0dc0: 65 77 2c 20 70 2d 3e 73 32 2e 7a 29 3b 0a 20 20  ew, p->s2.z);.  
0dd0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
0de0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
0df0: 66 69 72 73 74 20 73 74 61 67 65 20 63 61 6c 6c  first stage call
0e00: 62 61 63 6b 2e 20 20 45 61 63 68 20 69 6e 76 6f  back.  Each invo
0e10: 63 61 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  cation contains 
0e20: 74 68 72 65 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  three.** argumen
0e30: 74 73 20 77 68 65 72 65 20 61 72 65 20 74 61 6b  ts where are tak
0e40: 65 6e 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49  en from the SQLI
0e50: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
0e60: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  of the original.
0e70: 2a 2a 20 64 61 74 61 62 61 73 65 3a 20 20 28 31  ** database:  (1
0e80: 29 20 74 68 65 20 65 6e 74 72 79 20 74 79 70 65  ) the entry type
0e90: 2c 20 28 32 29 20 74 68 65 20 65 6e 74 72 79 20  , (2) the entry 
0ea0: 6e 61 6d 65 2c 20 61 6e 64 20 28 33 29 20 74 68  name, and (3) th
0eb0: 65 20 53 51 4c 20 66 6f 72 0a 2a 2a 20 74 68 65  e SQL for.** the
0ec0: 20 65 6e 74 72 79 2e 20 20 49 6e 20 61 6c 6c 20   entry.  In all 
0ed0: 63 61 73 65 73 2c 20 65 78 65 63 75 74 65 20 74  cases, execute t
0ee0: 68 65 20 53 51 4c 20 6f 66 20 74 68 65 20 74 68  he SQL of the th
0ef0: 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ird argument..**
0f00: 20 46 6f 72 20 74 61 62 6c 65 73 2c 20 72 75 6e   For tables, run
0f10: 20 61 20 71 75 65 72 79 20 74 6f 20 73 65 6c 65   a query to sele
0f20: 63 74 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 69  ct all entries i
0f30: 6e 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  n that table and
0f40: 20 0a 2a 2a 20 74 72 61 6e 73 66 65 72 20 74 68   .** transfer th
0f50: 65 6d 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  em to the second
0f60: 2d 73 74 61 67 65 20 63 61 6c 6c 62 61 63 6b 2e  -stage callback.
0f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
0f80: 61 63 75 75 6d 43 61 6c 6c 62 61 63 6b 31 28 76  acuumCallback1(v
0f90: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 61  oid *pArg, int a
0fa0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
0fb0: 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64  , char **NotUsed
0fc0: 29 7b 0a 20 20 76 61 63 75 75 6d 53 74 72 75 63  ){.  vacuumStruc
0fd0: 74 20 2a 70 20 3d 20 28 76 61 63 75 75 6d 53 74  t *p = (vacuumSt
0fe0: 72 75 63 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e  ruct*)pArg;.  in
0ff0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t rc = 0;.  asse
1000: 72 74 28 20 61 72 67 63 3d 3d 33 20 29 3b 0a 20  rt( argc==3 );. 
1010: 20 61 73 73 65 72 74 28 20 61 72 67 76 5b 30 5d   assert( argv[0]
1020: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
1030: 20 61 72 67 76 5b 31 5d 21 3d 30 20 29 3b 0a 20   argv[1]!=0 );. 
1040: 20 61 73 73 65 72 74 28 20 61 72 67 76 5b 32 5d   assert( argv[2]
1050: 21 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 65 78  !=0 );.  rc = ex
1060: 65 63 73 71 6c 28 70 2d 3e 70 50 61 72 73 65 2c  ecsql(p->pParse,
1070: 20 70 2d 3e 64 62 4e 65 77 2c 20 61 72 67 76 5b   p->dbNew, argv[
1080: 32 5d 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  2]);.  if( rc==S
1090: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 74 72 63  QLITE_OK && strc
10a0: 6d 70 28 61 72 67 76 5b 30 5d 2c 22 74 61 62 6c  mp(argv[0],"tabl
10b0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  e")==0 ){.    ch
10c0: 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
10d0: 0a 20 20 20 20 70 2d 3e 73 31 2e 6e 55 73 65 64  .    p->s1.nUsed
10e0: 20 3d 20 30 3b 0a 20 20 20 20 61 70 70 65 6e 64   = 0;.    append
10f0: 54 65 78 74 28 26 70 2d 3e 73 31 2c 20 22 53 45  Text(&p->s1, "SE
1100: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20 2d  LECT * FROM ", -
1110: 31 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 51 75  1);.    appendQu
1120: 6f 74 65 64 28 26 70 2d 3e 73 31 2c 20 61 72 67  oted(&p->s1, arg
1130: 76 5b 31 5d 29 3b 0a 20 20 20 20 70 2d 3e 7a 54  v[1]);.    p->zT
1140: 61 62 6c 65 20 3d 20 61 72 67 76 5b 31 5d 3b 0a  able = argv[1];.
1150: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f      rc = sqlite_
1160: 65 78 65 63 28 70 2d 3e 64 62 4f 6c 64 2c 20 70  exec(p->dbOld, p
1170: 2d 3e 73 31 2e 7a 2c 20 76 61 63 75 75 6d 43 61  ->s1.z, vacuumCa
1180: 6c 6c 62 61 63 6b 32 2c 20 70 2c 20 26 7a 45 72  llback2, p, &zEr
1190: 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72  rMsg);.    if( r
11a0: 63 20 26 26 20 70 2d 3e 70 50 61 72 73 65 2d 3e  c && p->pParse->
11b0: 7a 45 72 72 4d 73 67 3d 3d 30 20 29 7b 0a 20 20  zErrMsg==0 ){.  
11c0: 20 20 20 20 73 71 6c 69 74 65 45 72 72 6f 72 4d      sqliteErrorM
11d0: 73 67 28 70 2d 3e 70 50 61 72 73 65 2c 20 22 25  sg(p->pParse, "%
11e0: 73 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  s", zErrMsg);.  
11f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1200: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
1210: 69 73 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 75  is callback is u
1220: 73 65 64 20 74 6f 20 74 72 61 6e 73 66 65 72 20  sed to transfer 
1230: 50 52 41 47 4d 41 20 73 65 74 74 69 6e 67 73 20  PRAGMA settings 
1240: 66 72 6f 6d 20 6f 6e 65 20 64 61 74 61 62 61 73  from one databas
1250: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6f 74 68 65  e.** to the othe
1260: 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69 6e  r.  The value in
1270: 20 61 72 67 76 5b 30 5d 20 73 68 6f 75 6c 64 20   argv[0] should 
1280: 62 65 20 70 61 73 73 65 64 20 74 6f 20 61 20 70  be passed to a p
1290: 72 61 67 6d 61 0a 2a 2a 20 69 64 65 6e 74 69 66  ragma.** identif
12a0: 69 65 64 20 62 79 20 28 28 76 61 63 75 75 6d 53  ied by ((vacuumS
12b0: 74 72 75 63 74 2a 29 70 41 72 67 29 2d 3e 7a 50  truct*)pArg)->zP
12c0: 72 61 67 6d 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  ragma..*/.static
12d0: 20 69 6e 74 20 76 61 63 75 75 6d 43 61 6c 6c 62   int vacuumCallb
12e0: 61 63 6b 33 28 76 6f 69 64 20 2a 70 41 72 67 2c  ack3(void *pArg,
12f0: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
1300: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
1310: 6f 74 55 73 65 64 29 7b 0a 20 20 76 61 63 75 75  otUsed){.  vacuu
1320: 6d 53 74 72 75 63 74 20 2a 70 20 3d 20 28 76 61  mStruct *p = (va
1330: 63 75 75 6d 53 74 72 75 63 74 2a 29 70 41 72 67  cuumStruct*)pArg
1340: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
1350: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
1360: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 72 67 63  ;.  assert( argc
1370: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
1380: 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 3b 0a 20   argv[0]!=0 );. 
1390: 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28   assert( strlen(
13a0: 70 2d 3e 7a 50 72 61 67 6d 61 29 3c 31 30 30 20  p->zPragma)<100 
13b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 72  );.  assert( str
13c0: 6c 65 6e 28 61 72 67 76 5b 30 5d 29 3c 33 30 20  len(argv[0])<30 
13d0: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  );.  sprintf(zBu
13e0: 66 2c 22 50 52 41 47 4d 41 20 25 73 3d 25 73 3b  f,"PRAGMA %s=%s;
13f0: 22 2c 20 70 2d 3e 7a 50 72 61 67 6d 61 2c 20 61  ", p->zPragma, a
1400: 72 67 76 5b 30 5d 29 3b 0a 20 20 72 63 20 3d 20  rgv[0]);.  rc = 
1410: 65 78 65 63 73 71 6c 28 70 2d 3e 70 50 61 72 73  execsql(p->pPars
1420: 65 2c 20 70 2d 3e 64 62 4e 65 77 2c 20 7a 42 75  e, p->dbNew, zBu
1430: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
1440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1450: 74 65 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65  te a random name
1460: 20 6f 66 20 32 30 20 63 68 61 72 61 63 74 65 72   of 20 character
1470: 20 69 6e 20 6c 65 6e 67 74 68 2e 0a 2a 2f 0a 73   in length..*/.s
1480: 74 61 74 69 63 20 76 6f 69 64 20 72 61 6e 64 6f  tatic void rando
1490: 6d 4e 61 6d 65 28 63 68 61 72 20 2a 7a 42 75 66  mName(char *zBuf
14a0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
14b0: 74 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  t char zChars[] 
14c0: 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
14d0: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
14e0: 7a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  z".    "01234567
14f0: 38 39 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  89";.  int i;.  
1500: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 3b 20 69  for(i=0; i<20; i
1510: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d  ++){.    int n =
1520: 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79 74   sqliteRandomByt
1530: 65 28 29 20 25 20 28 73 69 7a 65 6f 66 28 7a 43  e() % (sizeof(zC
1540: 68 61 72 73 29 2d 31 29 3b 0a 20 20 20 20 7a 42  hars)-1);.    zB
1550: 75 66 5b 69 5d 20 3d 20 7a 43 68 61 72 73 5b 6e  uf[i] = zChars[n
1560: 5d 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  ];.  }.}.#endif.
1570: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73  ./*.** The non-s
1580: 74 61 6e 64 61 72 64 20 56 41 43 55 55 4d 20 63  tandard VACUUM c
1590: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
15a0: 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 64  o clean up the d
15b0: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c  atabase,.** coll
15c0: 61 70 73 65 20 66 72 65 65 20 73 70 61 63 65 2c  apse free space,
15d0: 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f 64   etc.  It is mod
15e0: 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  elled after the 
15f0: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a  VACUUM command.*
1600: 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e  * in PostgreSQL.
1610: 0a 2a 2a 0a 2a 2a 20 49 6e 20 76 65 72 73 69 6f  .**.** In versio
1620: 6e 20 31 2e 30 2e 78 20 6f 66 20 53 51 4c 69 74  n 1.0.x of SQLit
1630: 65 2c 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f  e, the VACUUM co
1640: 6d 6d 61 6e 64 20 77 6f 75 6c 64 20 63 61 6c 6c  mmand would call
1650: 0a 2a 2a 20 67 64 62 6d 5f 72 65 6f 72 67 61 6e  .** gdbm_reorgan
1660: 69 7a 65 28 29 20 6f 6e 20 61 6c 6c 20 74 68 65  ize() on all the
1670: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73   database tables
1680: 2e 20 20 42 75 74 20 62 65 67 69 6e 6e 69 6e 67  .  But beginning
1690: 0a 2a 2a 20 77 69 74 68 20 32 2e 30 2e 30 2c 20  .** with 2.0.0, 
16a0: 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
16b0: 20 75 73 65 73 20 47 44 42 4d 20 73 6f 20 74 68   uses GDBM so th
16c0: 69 73 20 63 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a  is command has.*
16d0: 2a 20 62 65 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70  * become a no-op
16e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16f0: 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70 50  Vacuum(Parse *pP
1700: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 61  arse, Token *pTa
1710: 62 6c 65 4e 61 6d 65 29 7b 0a 23 69 66 64 65 66  bleName){.#ifdef
1720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
1730: 55 55 4d 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  UUM.  const char
1740: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a   *zFilename;  /*
1750: 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1760: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
1770: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69  ile */.  int nFi
1780: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1790: 20 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63 68   /* number of ch
17a0: 61 72 61 63 74 65 72 73 20 20 69 6e 20 7a 46 69  aracters  in zFi
17b0: 6c 65 6e 61 6d 65 5b 5d 20 2a 2f 0a 20 20 63 68  lename[] */.  ch
17c0: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 30 3b 20 20  ar *zTemp = 0;  
17d0: 20 20 20 20 20 20 2f 2a 20 61 20 74 65 6d 70 6f        /* a tempo
17e0: 72 61 72 79 20 66 69 6c 65 20 69 6e 20 73 61 6d  rary file in sam
17f0: 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 20 7a  e directory as z
1800: 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 73 71  Filename */.  sq
1810: 6c 69 74 65 20 2a 64 62 4e 65 77 20 3d 20 30 3b  lite *dbNew = 0;
1820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
1830: 20 76 61 63 75 75 6d 65 64 20 64 61 74 61 62 61   vacuumed databa
1840: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a  se */.  sqlite *
1850: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
1860: 2f 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  /* The original 
1870: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
1880: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1890: 3b 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ;     /* Return 
18a0: 63 6f 64 65 20 66 72 6f 6d 20 73 65 72 76 69 63  code from servic
18b0: 65 20 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20  e routines */.  
18c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
18d0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
18e0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61  counter */.  cha
18f0: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
1900: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65       /* Error me
1910: 73 73 61 67 65 73 20 73 74 6f 72 65 64 20 68 65  ssages stored he
1920: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 73 61 66 65  re */.  int safe
1930: 74 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ty = 0;         
1940: 2f 2a 20 54 52 55 45 20 69 66 20 73 61 66 65 74  /* TRUE if safet
1950: 79 20 69 73 20 6f 66 66 20 2a 2f 0a 20 20 76 61  y is off */.  va
1960: 63 75 75 6d 53 74 72 75 63 74 20 73 56 61 63 3b  cuumStruct sVac;
1970: 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61        /* Informa
1980: 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 63  tion passed to c
1990: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 0a 20 20 2f  allbacks */..  /
19a0: 2a 20 54 68 65 73 65 20 61 72 65 20 61 6c 6c 20  * These are all 
19b0: 6f 66 20 74 68 65 20 70 72 61 67 6d 61 73 20 74  of the pragmas t
19c0: 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 74  hat need to be t
19d0: 72 61 6e 73 66 65 72 72 65 64 20 6f 76 65 72 0a  ransferred over.
19e0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e 65 77 20    ** to the new 
19f0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74  database */.  st
1a00: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
1a10: 2a 7a 50 72 61 67 6d 61 5b 5d 20 3d 20 7b 0a 20  *zPragma[] = {. 
1a20: 20 20 20 20 22 64 65 66 61 75 6c 74 5f 73 79 6e      "default_syn
1a30: 63 68 72 6f 6e 6f 75 73 22 2c 0a 20 20 20 20 20  chronous",.     
1a40: 22 64 65 66 61 75 6c 74 5f 63 61 63 68 65 5f 73  "default_cache_s
1a50: 69 7a 65 22 2c 0a 20 20 20 20 20 2f 2a 20 22 64  ize",.     /* "d
1a60: 65 66 61 75 6c 74 5f 74 65 6d 70 5f 73 74 6f 72  efault_temp_stor
1a70: 65 22 2c 20 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 2f  e", */.  };..  /
1a80: 2a 20 49 6e 69 74 69 61 6c 20 65 72 72 6f 72 20  * Initial error 
1a90: 63 68 65 63 6b 73 0a 20 20 2a 2f 0a 20 20 69 66  checks.  */.  if
1aa0: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
1ab0: 6e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  n ){.    return;
1ac0: 0a 20 20 7d 0a 20 20 64 62 20 3d 20 70 50 61 72  .  }.  db = pPar
1ad0: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
1ae0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
1af0: 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20 20  _InTrans ){.    
1b00: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
1b10: 50 61 72 73 65 2c 20 22 63 61 6e 6e 6f 74 20 56  Parse, "cannot V
1b20: 41 43 55 55 4d 20 66 72 6f 6d 20 77 69 74 68 69  ACUUM from withi
1b30: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22  n a transaction"
1b40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1b50: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 73 56 61   }.  memset(&sVa
1b60: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 56 61  c, 0, sizeof(sVa
1b70: 63 29 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  c));..  /* Get t
1b80: 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1b90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ba0: 20 66 69 6c 65 20 61 6e 64 20 63 72 65 61 74 65   file and create
1bb0: 20 74 77 6f 0a 20 20 2a 2a 20 74 65 6d 70 6f 72   two.  ** tempor
1bc0: 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  ary filenames in
1bd0: 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
1be0: 6f 72 79 20 61 73 20 74 68 65 20 6f 72 69 67 69  ory as the origi
1bf0: 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  nal file..  */. 
1c00: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
1c10: 69 74 65 42 74 72 65 65 47 65 74 46 69 6c 65 6e  iteBtreeGetFilen
1c20: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
1c30: 42 74 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65  Bt);.  if( zFile
1c40: 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  name==0 ){.    /
1c50: 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70  * This only happ
1c60: 65 6e 73 20 77 69 74 68 20 74 68 65 20 69 6e 2d  ens with the in-
1c70: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1c80: 20 20 56 41 43 55 55 4d 20 69 73 20 61 20 6e 6f    VACUUM is a no
1c90: 2d 6f 70 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  -op.    ** there
1ca0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e  , so just return
1cb0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
1cc0: 20 20 7d 0a 20 20 6e 46 69 6c 65 6e 61 6d 65 20    }.  nFilename 
1cd0: 3d 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  = strlen(zFilena
1ce0: 6d 65 29 3b 0a 20 20 7a 54 65 6d 70 20 3d 20 73  me);.  zTemp = s
1cf0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 46 69  qliteMalloc( nFi
1d00: 6c 65 6e 61 6d 65 2b 31 30 30 20 29 3b 0a 20 20  lename+100 );.  
1d10: 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 20 72  if( zTemp==0 ) r
1d20: 65 74 75 72 6e 3b 0a 20 20 73 74 72 63 70 79 28  eturn;.  strcpy(
1d30: 7a 54 65 6d 70 2c 20 7a 46 69 6c 65 6e 61 6d 65  zTemp, zFilename
1d40: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1d50: 31 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 54  10; i++){.    zT
1d60: 65 6d 70 5b 6e 46 69 6c 65 6e 61 6d 65 5d 20 3d  emp[nFilename] =
1d70: 20 27 2d 27 3b 0a 20 20 20 20 72 61 6e 64 6f 6d   '-';.    random
1d80: 4e 61 6d 65 28 26 7a 54 65 6d 70 5b 6e 46 69 6c  Name(&zTemp[nFil
1d90: 65 6e 61 6d 65 2b 31 5d 29 3b 0a 20 20 20 20 69  ename+1]);.    i
1da0: 66 28 20 21 73 71 6c 69 74 65 4f 73 46 69 6c 65  f( !sqliteOsFile
1db0: 45 78 69 73 74 73 28 7a 54 65 6d 70 29 20 29 20  Exists(zTemp) ) 
1dc0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
1dd0: 20 69 3e 3d 31 30 20 29 7b 0a 20 20 20 20 73 71   i>=10 ){.    sq
1de0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
1df0: 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1e00: 63 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  create a tempora
1e10: 72 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ry database file
1e20: 20 22 0a 20 20 20 20 20 20 20 22 69 6e 20 74 68   ".       "in th
1e30: 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
1e40: 20 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   as the original
1e50: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
1e60: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63   goto end_of_vac
1e70: 75 75 6d 3b 0a 20 20 7d 0a 0a 20 20 0a 20 20 64  uum;.  }..  .  d
1e80: 62 4e 65 77 20 3d 20 73 71 6c 69 74 65 5f 6f 70  bNew = sqlite_op
1e90: 65 6e 28 7a 54 65 6d 70 2c 20 30 2c 20 26 7a 45  en(zTemp, 0, &zE
1ea0: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 64 62  rrMsg);.  if( db
1eb0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  New==0 ){.    sq
1ec0: 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61  liteErrorMsg(pPa
1ed0: 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  rse, "unable to 
1ee0: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
1ef0: 20 64 61 74 61 62 61 73 65 20 61 74 20 25 73 20   database at %s 
1f00: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 20 7a 54  - %s",.       zT
1f10: 65 6d 70 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  emp, zErrMsg);. 
1f20: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76     goto end_of_v
1f30: 61 63 75 75 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  acuum;.  }.  if(
1f40: 20 73 71 6c 69 74 65 53 61 66 65 74 79 4f 66 66   sqliteSafetyOff
1f50: 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  (db) ){.    sqli
1f60: 74 65 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  teErrorMsg(pPars
1f70: 65 2c 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  e, "library rout
1f80: 69 6e 65 73 20 63 61 6c 6c 65 64 20 6f 75 74 20  ines called out 
1f90: 6f 66 20 73 65 71 75 65 6e 63 65 22 29 3b 0a 20  of sequence");. 
1fa0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76     goto end_of_v
1fb0: 61 63 75 75 6d 3b 0a 20 20 7d 0a 20 20 73 61 66  acuum;.  }.  saf
1fc0: 65 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 65  ety = 1;.  if( e
1fd0: 78 65 63 73 71 6c 28 70 50 61 72 73 65 2c 20 64  xecsql(pParse, d
1fe0: 62 2c 20 22 42 45 47 49 4e 22 29 20 29 20 67 6f  b, "BEGIN") ) go
1ff0: 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d  to end_of_vacuum
2000: 3b 0a 20 20 69 66 28 20 65 78 65 63 73 71 6c 28  ;.  if( execsql(
2010: 70 50 61 72 73 65 2c 20 64 62 4e 65 77 2c 20 22  pParse, dbNew, "
2020: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
2030: 75 73 3d 6f 66 66 3b 20 42 45 47 49 4e 22 29 20  us=off; BEGIN") 
2040: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
2050: 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 20  of_vacuum;.  }. 
2060: 20 73 56 61 63 2e 64 62 4f 6c 64 20 3d 20 64 62   sVac.dbOld = db
2070: 3b 0a 20 20 73 56 61 63 2e 64 62 4e 65 77 20 3d  ;.  sVac.dbNew =
2080: 20 64 62 4e 65 77 3b 0a 20 20 73 56 61 63 2e 70   dbNew;.  sVac.p
2090: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
20a0: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
20b0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73 69  QLITE_OK && i<si
20c0: 7a 65 6f 66 28 7a 50 72 61 67 6d 61 29 2f 73 69  zeof(zPragma)/si
20d0: 7a 65 6f 66 28 7a 50 72 61 67 6d 61 5b 30 5d 29  zeof(zPragma[0])
20e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
20f0: 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20 20   zBuf[200];.    
2100: 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a  assert( strlen(z
2110: 50 72 61 67 6d 61 5b 69 5d 29 3c 31 30 30 20 29  Pragma[i])<100 )
2120: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  ;.    sprintf(zB
2130: 75 66 2c 20 22 50 52 41 47 4d 41 20 25 73 3b 22  uf, "PRAGMA %s;"
2140: 2c 20 7a 50 72 61 67 6d 61 5b 69 5d 29 3b 0a 20  , zPragma[i]);. 
2150: 20 20 20 73 56 61 63 2e 7a 50 72 61 67 6d 61 20     sVac.zPragma 
2160: 3d 20 7a 50 72 61 67 6d 61 5b 69 5d 3b 0a 20 20  = zPragma[i];.  
2170: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 65 78    rc = sqlite_ex
2180: 65 63 28 64 62 2c 20 7a 42 75 66 2c 20 76 61 63  ec(db, zBuf, vac
2190: 75 75 6d 43 61 6c 6c 62 61 63 6b 33 2c 20 26 73  uumCallback3, &s
21a0: 56 61 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  Vac, &zErrMsg);.
21b0: 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 29 7b    }.  if( !rc ){
21c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
21d0: 5f 65 78 65 63 28 64 62 2c 20 22 53 45 4c 45 43  _exec(db, "SELEC
21e0: 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20 73 71  T type, name, sq
21f0: 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
2200: 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20 20  ster ".         
2210: 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
2220: 4f 54 20 4e 55 4c 4c 22 2c 20 76 61 63 75 75 6d  OT NULL", vacuum
2230: 43 61 6c 6c 62 61 63 6b 31 2c 20 26 73 56 61 63  Callback1, &sVac
2240: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d  , &zErrMsg);.  }
2250: 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20  .  if( !rc ){.  
2260: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72    rc = sqliteBtr
2270: 65 65 43 6f 70 79 46 69 6c 65 28 64 62 2d 3e 61  eeCopyFile(db->a
2280: 44 62 5b 30 5d 2e 70 42 74 2c 20 64 62 4e 65 77  Db[0].pBt, dbNew
2290: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
22a0: 20 20 20 73 71 6c 69 74 65 5f 65 78 65 63 28 64     sqlite_exec(d
22b0: 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  b, "COMMIT", 0, 
22c0: 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
22d0: 65 5f 65 78 65 63 28 64 62 2c 20 22 52 4f 4c 4c  e_exec(db, "ROLL
22e0: 42 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  BACK", 0, 0, 0);
22f0: 20 20 2f 2a 20 49 6e 20 63 61 73 65 20 74 68 65    /* In case the
2300: 20 43 4f 4d 4d 49 54 20 66 61 69 6c 65 64 20 2a   COMMIT failed *
2310: 2f 0a 20 20 20 20 73 71 6c 69 74 65 52 65 73 65  /.    sqliteRese
2320: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
2330: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 6e 64  db, 0);.  }..end
2340: 5f 6f 66 5f 76 61 63 75 75 6d 3a 0a 20 20 69 66  _of_vacuum:.  if
2350: 28 20 72 63 20 26 26 20 70 50 61 72 73 65 2d 3e  ( rc && pParse->
2360: 7a 45 72 72 4d 73 67 3d 3d 30 20 26 26 20 7a 45  zErrMsg==0 && zE
2370: 72 72 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20  rrMsg!=0 ){.    
2380: 73 71 6c 69 74 65 45 72 72 6f 72 4d 73 67 28 70  sqliteErrorMsg(p
2390: 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74  Parse, "unable t
23a0: 6f 20 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o vacuum databas
23b0: 65 20 2d 20 25 73 22 2c 20 7a 45 72 72 4d 73 67  e - %s", zErrMsg
23c0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 61 66  );.  }.  if( saf
23d0: 65 74 79 20 29 20 7b 0a 20 20 20 20 73 71 6c 69  ety ) {.    sqli
23e0: 74 65 5f 65 78 65 63 28 64 62 2c 20 22 43 4f 4d  te_exec(db, "COM
23f0: 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  MIT", 0, 0, 0);.
2400: 20 20 20 20 73 71 6c 69 74 65 5f 65 78 65 63 28      sqlite_exec(
2410: 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  db, "ROLLBACK", 
2420: 30 2c 20 30 2c 20 30 29 3b 20 20 2f 2a 20 49 6e  0, 0, 0);  /* In
2430: 20 63 61 73 65 20 74 68 65 20 43 4f 4d 4d 49 54   case the COMMIT
2440: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 73   failed */.    s
2450: 71 6c 69 74 65 53 61 66 65 74 79 4f 6e 28 64 62  qliteSafetyOn(db
2460: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62 4e  );.  }.  if( dbN
2470: 65 77 20 29 20 73 71 6c 69 74 65 5f 63 6c 6f 73  ew ) sqlite_clos
2480: 65 28 64 62 4e 65 77 29 3b 0a 20 20 73 71 6c 69  e(dbNew);.  sqli
2490: 74 65 4f 73 44 65 6c 65 74 65 28 7a 54 65 6d 70  teOsDelete(zTemp
24a0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
24b0: 7a 54 65 6d 70 29 3b 0a 20 20 73 71 6c 69 74 65  zTemp);.  sqlite
24c0: 46 72 65 65 28 73 56 61 63 2e 73 31 2e 7a 29 3b  Free(sVac.s1.z);
24d0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 56  .  sqliteFree(sV
24e0: 61 63 2e 73 32 2e 7a 29 3b 0a 20 20 69 66 28 20  ac.s2.z);.  if( 
24f0: 7a 45 72 72 4d 73 67 20 29 20 73 71 6c 69 74 65  zErrMsg ) sqlite
2500: 5f 66 72 65 65 6d 65 6d 28 7a 45 72 72 4d 73 67  _freemem(zErrMsg
2510: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 23 65 6e  );.  return;.#en
2520: 64 69 66 0a 7d 0a                                dif.}.