/ Hex Artifact Content
Login

Artifact 717aa6da40105f0597edc9b81114c65860b60e69:


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 31 30 20 32 30  cuum.c,v 1.10 20
0230: 30 34 2f 30 32 2f 31 31 20 30 39 3a 34 36 3a 33  04/02/11 09:46:3
0240: 33 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  3 drh Exp $.*/.#
0250: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0260: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
0270: 6f 73 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 73  os.h"../*.** A s
0280: 74 72 75 63 74 75 72 65 20 66 6f 72 20 68 6f 6c  tructure for hol
0290: 64 69 6e 67 20 61 20 64 79 6e 61 6d 69 63 20 73  ding a dynamic s
02a0: 74 72 69 6e 67 20 2d 20 61 20 73 74 72 69 6e 67  tring - a string
02b0: 20 74 68 61 74 20 63 61 6e 20 67 72 6f 77 0a 2a   that can grow.*
02c0: 2a 20 77 69 74 68 6f 75 74 20 62 6f 75 6e 64 2e  * without bound.
02d0: 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72   .*/.typedef str
02e0: 75 63 74 20 64 79 6e 53 74 72 20 64 79 6e 53 74  uct dynStr dynSt
02f0: 72 3b 0a 73 74 72 75 63 74 20 64 79 6e 53 74 72  r;.struct dynStr
0300: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20   {.  char *z;   
0310: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
0320: 74 68 65 20 73 74 72 69 6e 67 20 69 6e 20 73 70  the string in sp
0330: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
0340: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
0350: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
0360: 3b 20 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  ;     /* Amount 
0370: 6f 66 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  of space allocat
0380: 65 64 20 74 6f 20 7a 5b 5d 20 2a 2f 0a 20 20 69  ed to z[] */.  i
0390: 6e 74 20 6e 55 73 65 64 3b 20 20 20 20 20 20 2f  nt nUsed;      /
03a0: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 73 6c  * Next unused sl
03b0: 6f 74 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 7d 3b 0a  ot in z[] */.};.
03c0: 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75  ./*.** A structu
03d0: 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  re that holds th
03e0: 65 20 76 61 63 75 75 6d 20 63 6f 6e 74 65 78 74  e vacuum context
03f0: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0400: 63 74 20 76 61 63 75 75 6d 53 74 72 75 63 74 20  ct vacuumStruct 
0410: 76 61 63 75 75 6d 53 74 72 75 63 74 3b 0a 73 74  vacuumStruct;.st
0420: 72 75 63 74 20 76 61 63 75 75 6d 53 74 72 75 63  ruct vacuumStruc
0430: 74 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  t {.  sqlite *db
0440: 4f 6c 64 3b 20 20 20 20 20 20 20 2f 2a 20 4f 72  Old;       /* Or
0450: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
0460: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 4e  */.  sqlite *dbN
0470: 65 77 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 77  ew;       /* New
0480: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
0490: 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 3b 20  har **pzErrMsg; 
04a0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 65 72 72      /* Write err
04b0: 6f 72 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ors here */.  in
04c0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
04d0: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 6e 6f 6e     /* Set to non
04e0: 2d 7a 65 72 6f 20 6f 6e 20 61 6e 20 65 72 72 6f  -zero on an erro
04f0: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
0500: 72 20 2a 7a 54 61 62 6c 65 3b 20 20 2f 2a 20 4e  r *zTable;  /* N
0510: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 62  ame of a table b
0520: 65 69 6e 67 20 63 6f 70 69 65 64 20 2a 2f 0a 20  eing copied */. 
0530: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
0540: 61 67 6d 61 3b 20 2f 2a 20 50 72 61 67 6d 61 20  agma; /* Pragma 
0550: 74 6f 20 65 78 65 63 75 74 65 20 77 69 74 68 20  to execute with 
0560: 72 65 73 75 6c 74 73 20 2a 2f 0a 20 20 64 79 6e  results */.  dyn
0570: 53 74 72 20 73 31 2c 20 73 32 3b 20 20 20 20 20  Str s1, s2;     
0580: 20 20 2f 2a 20 54 77 6f 20 64 79 6e 61 6d 69 63    /* Two dynamic
0590: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 7d 3b 0a 0a   strings */.};..
05a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
05b0: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
05c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   || SQLITE_OMIT_
05d0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 41 70 70  VACUUM./*.** App
05e0: 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64 79  end text to a dy
05f0: 6e 61 6d 69 63 20 73 74 72 69 6e 67 0a 2a 2f 0a  namic string.*/.
0600: 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70 65  static void appe
0610: 6e 64 54 65 78 74 28 64 79 6e 53 74 72 20 2a 70  ndText(dynStr *p
0620: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
0630: 65 78 74 2c 20 69 6e 74 20 6e 54 65 78 74 29 7b  ext, int nText){
0640: 0a 20 20 69 66 28 20 6e 54 65 78 74 3c 30 20 29  .  if( nText<0 )
0650: 20 6e 54 65 78 74 20 3d 20 73 74 72 6c 65 6e 28   nText = strlen(
0660: 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20 70 2d  zText);.  if( p-
0670: 3e 7a 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 55 73 65  >z==0 || p->nUse
0680: 64 20 2b 20 6e 54 65 78 74 20 2b 20 31 20 3e 3d  d + nText + 1 >=
0690: 20 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20   p->nAlloc ){.  
06a0: 20 20 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20    char *zNew;.  
06b0: 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d    p->nAlloc = p-
06c0: 3e 6e 55 73 65 64 20 2b 20 6e 54 65 78 74 20 2b  >nUsed + nText +
06d0: 20 31 30 30 30 3b 0a 20 20 20 20 7a 4e 65 77 20   1000;.    zNew 
06e0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
06f0: 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->z, p->nAlloc)
0700: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d  ;.    if( zNew==
0710: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
0720: 65 46 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20  eFree(p->z);.   
0730: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
0740: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20  sizeof(*p));.   
0750: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
0760: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77  .    p->z = zNew
0770: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26  ;.  }.  memcpy(&
0780: 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20  p->z[p->nUsed], 
0790: 7a 54 65 78 74 2c 20 6e 54 65 78 74 2b 31 29 3b  zText, nText+1);
07a0: 0a 20 20 70 2d 3e 6e 55 73 65 64 20 2b 3d 20 6e  .  p->nUsed += n
07b0: 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Text;.}../*.** A
07c0: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
07d0: 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 2c 20  dynamic string, 
07e0: 68 61 76 69 6e 67 20 66 69 72 73 74 20 70 75 74  having first put
07f0: 20 74 68 65 20 74 65 78 74 20 69 6e 20 71 75 6f   the text in quo
0800: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
0810: 6f 69 64 20 61 70 70 65 6e 64 51 75 6f 74 65 64  oid appendQuoted
0820: 28 64 79 6e 53 74 72 20 2a 70 2c 20 63 6f 6e 73  (dynStr *p, cons
0830: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a  t char *zText){.
0840: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 70    int i, j;.  ap
0850: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 27 22 2c  pendText(p, "'",
0860: 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30   1);.  for(i=j=0
0870: 3b 20 7a 54 65 78 74 5b 69 5d 3b 20 69 2b 2b 29  ; zText[i]; i++)
0880: 7b 0a 20 20 20 20 69 66 28 20 7a 54 65 78 74 5b  {.    if( zText[
0890: 69 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20  i]=='\'' ){.    
08a0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20    appendText(p, 
08b0: 26 7a 54 65 78 74 5b 6a 5d 2c 20 69 2d 6a 2b 31  &zText[j], i-j+1
08c0: 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 69 20 2b  );.      j = i +
08d0: 20 31 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64   1;.      append
08e0: 54 65 78 74 28 70 2c 20 22 27 22 2c 20 31 29 3b  Text(p, "'", 1);
08f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
0900: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 61 70 70 65   j<i ){.    appe
0910: 6e 64 54 65 78 74 28 70 2c 20 26 7a 54 65 78 74  ndText(p, &zText
0920: 5b 6a 5d 2c 20 69 2d 6a 29 3b 0a 20 20 7d 0a 20  [j], i-j);.  }. 
0930: 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22   appendText(p, "
0940: 27 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  '", 1);.}../*.**
0950: 20 45 78 65 63 75 74 65 20 73 74 61 74 65 6d 65   Execute stateme
0960: 6e 74 73 20 6f 66 20 53 51 4c 2e 20 20 49 66 20  nts of SQL.  If 
0970: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
0980: 20 77 72 69 74 65 20 74 68 65 20 65 72 72 6f 72   write the error
0990: 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  .** message into
09a0: 20 2a 70 7a 45 72 72 4d 73 67 20 61 6e 64 20 72   *pzErrMsg and r
09b0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
09c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
09d0: 65 63 73 71 6c 28 63 68 61 72 20 2a 2a 70 7a 45  ecsql(char **pzE
09e0: 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 20 2a 64  rrMsg, sqlite *d
09f0: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0a00: 53 71 6c 29 7b 20 0a 20 20 63 68 61 72 20 2a 7a  Sql){ .  char *z
0a10: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 6e  ErrMsg = 0;.  in
0a20: 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 72 69 6e  t rc;..  /* prin
0a30: 74 66 28 22 2a 2a 2a 2a 2a 20 65 78 65 63 75 74  tf("***** execut
0a40: 69 6e 67 20 2a 2a 2a 2a 2a 5c 6e 25 73 5c 6e 22  ing *****\n%s\n"
0a50: 2c 20 7a 53 71 6c 29 3b 20 2a 2f 0a 20 20 72 63  , zSql); */.  rc
0a60: 20 3d 20 73 71 6c 69 74 65 5f 65 78 65 63 28 64   = sqlite_exec(d
0a70: 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  b, zSql, 0, 0, &
0a80: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
0a90: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73  zErrMsg ){.    s
0aa0: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70  qliteSetString(p
0ab0: 7a 45 72 72 4d 73 67 2c 20 7a 45 72 72 4d 73 67  zErrMsg, zErrMsg
0ac0: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
0ad0: 20 73 71 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28   sqlite_freemem(
0ae0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
0af0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
0b00: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
0b10: 73 65 63 6f 6e 64 20 73 74 61 67 65 20 63 61 6c  second stage cal
0b20: 6c 62 61 63 6b 2e 20 20 45 61 63 68 20 69 6e 76  lback.  Each inv
0b30: 6f 63 61 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ocation contains
0b40: 20 61 6c 6c 20 74 68 65 0a 2a 2a 20 64 61 74 61   all the.** data
0b50: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 72 6f   for a single ro
0b60: 77 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 74 61  w of a single ta
0b70: 62 6c 65 20 69 6e 20 74 68 65 20 6f 72 69 67 69  ble in the origi
0b80: 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 20 20 54  nal database.  T
0b90: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 6d  his.** routine m
0ba0: 75 73 74 20 77 72 69 74 65 20 74 68 61 74 20 69  ust write that i
0bb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20  nformation into 
0bc0: 74 68 65 20 6e 65 77 20 64 61 74 61 62 61 73 65  the new database
0bd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0be0: 76 61 63 75 75 6d 43 61 6c 6c 62 61 63 6b 32 28  vacuumCallback2(
0bf0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
0c00: 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67  argc, char **arg
0c10: 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65  v, char **NotUse
0c20: 64 29 7b 0a 20 20 76 61 63 75 75 6d 53 74 72 75  d){.  vacuumStru
0c30: 63 74 20 2a 70 20 3d 20 28 76 61 63 75 75 6d 53  ct *p = (vacuumS
0c40: 74 72 75 63 74 2a 29 70 41 72 67 3b 0a 20 20 69  truct*)pArg;.  i
0c50: 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e  nt rc = 0;.  con
0c60: 73 74 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20  st char *zSep = 
0c70: 22 28 22 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  "(";.  int i;.. 
0c80: 20 69 66 28 20 61 72 67 76 3d 3d 30 20 29 20 72   if( argv==0 ) r
0c90: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 73 32  eturn 0;.  p->s2
0ca0: 2e 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20 61 70  .nUsed = 0;.  ap
0cb0: 70 65 6e 64 54 65 78 74 28 26 70 2d 3e 73 32 2c  pendText(&p->s2,
0cc0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 2c   "INSERT INTO ",
0cd0: 20 2d 31 29 3b 0a 20 20 61 70 70 65 6e 64 51 75   -1);.  appendQu
0ce0: 6f 74 65 64 28 26 70 2d 3e 73 32 2c 20 70 2d 3e  oted(&p->s2, p->
0cf0: 7a 54 61 62 6c 65 29 3b 0a 20 20 61 70 70 65 6e  zTable);.  appen
0d00: 64 54 65 78 74 28 26 70 2d 3e 73 32 2c 20 22 20  dText(&p->s2, " 
0d10: 56 41 4c 55 45 53 22 2c 20 2d 31 29 3b 0a 20 20  VALUES", -1);.  
0d20: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
0d30: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 70 65 6e   i++){.    appen
0d40: 64 54 65 78 74 28 26 70 2d 3e 73 32 2c 20 7a 53  dText(&p->s2, zS
0d50: 65 70 2c 20 31 29 3b 0a 20 20 20 20 7a 53 65 70  ep, 1);.    zSep
0d60: 20 3d 20 22 2c 22 3b 0a 20 20 20 20 69 66 28 20   = ",";.    if( 
0d70: 61 72 67 76 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  argv[i]==0 ){.  
0d80: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
0d90: 70 2d 3e 73 32 2c 20 22 4e 55 4c 4c 22 2c 20 34  p->s2, "NULL", 4
0da0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
0db0: 20 20 20 20 61 70 70 65 6e 64 51 75 6f 74 65 64      appendQuoted
0dc0: 28 26 70 2d 3e 73 32 2c 20 61 72 67 76 5b 69 5d  (&p->s2, argv[i]
0dd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
0de0: 70 70 65 6e 64 54 65 78 74 28 26 70 2d 3e 73 32  ppendText(&p->s2
0df0: 2c 22 29 22 2c 20 31 29 3b 0a 20 20 72 63 20 3d  ,")", 1);.  rc =
0e00: 20 65 78 65 63 73 71 6c 28 70 2d 3e 70 7a 45 72   execsql(p->pzEr
0e10: 72 4d 73 67 2c 20 70 2d 3e 64 62 4e 65 77 2c 20  rMsg, p->dbNew, 
0e20: 70 2d 3e 73 32 2e 7a 29 3b 0a 20 20 72 65 74 75  p->s2.z);.  retu
0e30: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
0e40: 54 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  This is the firs
0e50: 74 20 73 74 61 67 65 20 63 61 6c 6c 62 61 63 6b  t stage callback
0e60: 2e 20 20 45 61 63 68 20 69 6e 76 6f 63 61 74 69  .  Each invocati
0e70: 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 72 65  on contains thre
0e80: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 77  e.** arguments w
0e90: 68 65 72 65 20 61 72 65 20 74 61 6b 65 6e 20 66  here are taken f
0ea0: 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d  rom the SQLITE_M
0eb0: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
0ec0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64  he original.** d
0ed0: 61 74 61 62 61 73 65 3a 20 20 28 31 29 20 74 68  atabase:  (1) th
0ee0: 65 20 65 6e 74 72 79 20 74 79 70 65 2c 20 28 32  e entry type, (2
0ef0: 29 20 74 68 65 20 65 6e 74 72 79 20 6e 61 6d 65  ) the entry name
0f00: 2c 20 61 6e 64 20 28 33 29 20 74 68 65 20 53 51  , and (3) the SQ
0f10: 4c 20 66 6f 72 0a 2a 2a 20 74 68 65 20 65 6e 74  L for.** the ent
0f20: 72 79 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ry.  In all case
0f30: 73 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53  s, execute the S
0f40: 51 4c 20 6f 66 20 74 68 65 20 74 68 69 72 64 20  QL of the third 
0f50: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 46 6f 72  argument..** For
0f60: 20 74 61 62 6c 65 73 2c 20 72 75 6e 20 61 20 71   tables, run a q
0f70: 75 65 72 79 20 74 6f 20 73 65 6c 65 63 74 20 61  uery to select a
0f80: 6c 6c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ll entries in th
0f90: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 0a 2a 2a  at table and .**
0fa0: 20 74 72 61 6e 73 66 65 72 20 74 68 65 6d 20 74   transfer them t
0fb0: 6f 20 74 68 65 20 73 65 63 6f 6e 64 2d 73 74 61  o the second-sta
0fc0: 67 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a  ge callback..*/.
0fd0: 73 74 61 74 69 63 20 69 6e 74 20 76 61 63 75 75  static int vacuu
0fe0: 6d 43 61 6c 6c 62 61 63 6b 31 28 76 6f 69 64 20  mCallback1(void 
0ff0: 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c  *pArg, int argc,
1000: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
1010: 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ar **NotUsed){. 
1020: 20 76 61 63 75 75 6d 53 74 72 75 63 74 20 2a 70   vacuumStruct *p
1030: 20 3d 20 28 76 61 63 75 75 6d 53 74 72 75 63 74   = (vacuumStruct
1040: 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 72 63  *)pArg;.  int rc
1050: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1060: 61 72 67 63 3d 3d 33 20 29 3b 0a 20 20 69 66 28  argc==3 );.  if(
1070: 20 61 72 67 76 3d 3d 30 20 29 20 72 65 74 75 72   argv==0 ) retur
1080: 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  n 0;.  assert( a
1090: 72 67 76 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 61  rgv[0]!=0 );.  a
10a0: 73 73 65 72 74 28 20 61 72 67 76 5b 31 5d 21 3d  ssert( argv[1]!=
10b0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  0 );.  assert( a
10c0: 72 67 76 5b 32 5d 21 3d 30 20 29 3b 0a 20 20 72  rgv[2]!=0 );.  r
10d0: 63 20 3d 20 65 78 65 63 73 71 6c 28 70 2d 3e 70  c = execsql(p->p
10e0: 7a 45 72 72 4d 73 67 2c 20 70 2d 3e 64 62 4e 65  zErrMsg, p->dbNe
10f0: 77 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69  w, argv[2]);.  i
1100: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1110: 20 26 26 20 73 74 72 63 6d 70 28 61 72 67 76 5b   && strcmp(argv[
1120: 30 5d 2c 22 74 61 62 6c 65 22 29 3d 3d 30 20 29  0],"table")==0 )
1130: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  {.    char *zErr
1140: 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Msg = 0;.    p->
1150: 73 31 2e 6e 55 73 65 64 20 3d 20 30 3b 0a 20 20  s1.nUsed = 0;.  
1160: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 70 2d    appendText(&p-
1170: 3e 73 31 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  >s1, "SELECT * F
1180: 52 4f 4d 20 22 2c 20 2d 31 29 3b 0a 20 20 20 20  ROM ", -1);.    
1190: 61 70 70 65 6e 64 51 75 6f 74 65 64 28 26 70 2d  appendQuoted(&p-
11a0: 3e 73 31 2c 20 61 72 67 76 5b 31 5d 29 3b 0a 20  >s1, argv[1]);. 
11b0: 20 20 20 70 2d 3e 7a 54 61 62 6c 65 20 3d 20 61     p->zTable = a
11c0: 72 67 76 5b 31 5d 3b 0a 20 20 20 20 72 63 20 3d  rgv[1];.    rc =
11d0: 20 73 71 6c 69 74 65 5f 65 78 65 63 28 70 2d 3e   sqlite_exec(p->
11e0: 64 62 4f 6c 64 2c 20 70 2d 3e 73 31 2e 7a 2c 20  dbOld, p->s1.z, 
11f0: 76 61 63 75 75 6d 43 61 6c 6c 62 61 63 6b 32 2c  vacuumCallback2,
1200: 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   p, &zErrMsg);. 
1210: 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
1220: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
1230: 74 53 74 72 69 6e 67 28 70 2d 3e 70 7a 45 72 72  tString(p->pzErr
1240: 4d 73 67 2c 20 7a 45 72 72 4d 73 67 2c 20 28 63  Msg, zErrMsg, (c
1250: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73  har*)0);.      s
1260: 71 6c 69 74 65 5f 66 72 65 65 6d 65 6d 28 7a 45  qlite_freemem(zE
1270: 72 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20  rrMsg);.    }.  
1280: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1290: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c  ../*.** This cal
12a0: 6c 62 61 63 6b 20 69 73 20 75 73 65 64 20 74 6f  lback is used to
12b0: 20 74 72 61 6e 73 66 65 72 20 50 52 41 47 4d 41   transfer PRAGMA
12c0: 20 73 65 74 74 69 6e 67 73 20 66 72 6f 6d 20 6f   settings from o
12d0: 6e 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74  ne database.** t
12e0: 6f 20 74 68 65 20 6f 74 68 65 72 2e 20 20 54 68  o the other.  Th
12f0: 65 20 76 61 6c 75 65 20 69 6e 20 61 72 67 76 5b  e value in argv[
1300: 30 5d 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  0] should be pas
1310: 73 65 64 20 74 6f 20 61 20 70 72 61 67 6d 61 0a  sed to a pragma.
1320: 2a 2a 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ** identified by
1330: 20 28 28 76 61 63 75 75 6d 53 74 72 75 63 74 2a   ((vacuumStruct*
1340: 29 70 41 72 67 29 2d 3e 7a 50 72 61 67 6d 61 2e  )pArg)->zPragma.
1350: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
1360: 61 63 75 75 6d 43 61 6c 6c 62 61 63 6b 33 28 76  acuumCallback3(v
1370: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 61  oid *pArg, int a
1380: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
1390: 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64  , char **NotUsed
13a0: 29 7b 0a 20 20 76 61 63 75 75 6d 53 74 72 75 63  ){.  vacuumStruc
13b0: 74 20 2a 70 20 3d 20 28 76 61 63 75 75 6d 53 74  t *p = (vacuumSt
13c0: 72 75 63 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e  ruct*)pArg;.  in
13d0: 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72  t rc = 0;.  char
13e0: 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 61 73   zBuf[200];.  as
13f0: 73 65 72 74 28 20 61 72 67 63 3d 3d 31 20 29 3b  sert( argc==1 );
1400: 0a 20 20 69 66 28 20 61 72 67 76 3d 3d 30 20 29  .  if( argv==0 )
1410: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 73   return 0;.  ass
1420: 65 72 74 28 20 61 72 67 76 5b 30 5d 21 3d 30 20  ert( argv[0]!=0 
1430: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 72  );.  assert( str
1440: 6c 65 6e 28 70 2d 3e 7a 50 72 61 67 6d 61 29 3c  len(p->zPragma)<
1450: 31 30 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  100 );.  assert(
1460: 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29   strlen(argv[0])
1470: 3c 33 30 20 29 3b 0a 20 20 73 70 72 69 6e 74 66  <30 );.  sprintf
1480: 28 7a 42 75 66 2c 22 50 52 41 47 4d 41 20 25 73  (zBuf,"PRAGMA %s
1490: 3d 25 73 3b 22 2c 20 70 2d 3e 7a 50 72 61 67 6d  =%s;", p->zPragm
14a0: 61 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 72  a, argv[0]);.  r
14b0: 63 20 3d 20 65 78 65 63 73 71 6c 28 70 2d 3e 70  c = execsql(p->p
14c0: 7a 45 72 72 4d 73 67 2c 20 70 2d 3e 64 62 4e 65  zErrMsg, p->dbNe
14d0: 77 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75  w, zBuf);.  retu
14e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14f0: 47 65 6e 65 72 61 74 65 20 61 20 72 61 6e 64 6f  Generate a rando
1500: 6d 20 6e 61 6d 65 20 6f 66 20 32 30 20 63 68 61  m name of 20 cha
1510: 72 61 63 74 65 72 20 69 6e 20 6c 65 6e 67 74 68  racter in length
1520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1530: 20 72 61 6e 64 6f 6d 4e 61 6d 65 28 75 6e 73 69   randomName(unsi
1540: 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66 29  gned char *zBuf)
1550: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
1560: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
1570: 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
1580: 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
1590: 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
15a0: 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 69  0123456789";.  i
15b0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 52 61  nt i;.  sqliteRa
15c0: 6e 64 6f 6d 6e 65 73 73 28 32 30 2c 20 7a 42 75  ndomness(20, zBu
15d0: 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  f);.  for(i=0; i
15e0: 3c 32 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  <20; i++){.    z
15f0: 42 75 66 5b 69 5d 20 3d 20 7a 43 68 61 72 73 5b  Buf[i] = zChars[
1600: 20 7a 42 75 66 5b 69 5d 25 28 73 69 7a 65 6f 66   zBuf[i]%(sizeof
1610: 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20  (zChars)-1) ];. 
1620: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
1630: 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64  ** The non-stand
1640: 61 72 64 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  ard VACUUM comma
1650: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 63 6c  nd is used to cl
1660: 65 61 6e 20 75 70 20 74 68 65 20 64 61 74 61 62  ean up the datab
1670: 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65  ase,.** collapse
1680: 20 66 72 65 65 20 73 70 61 63 65 2c 20 65 74 63   free space, etc
1690: 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65  .  It is modelle
16a0: 64 20 61 66 74 65 72 20 74 68 65 20 56 41 43 55  d after the VACU
16b0: 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e  UM command.** in
16c0: 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a   PostgreSQL..**.
16d0: 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e  ** In version 1.
16e0: 30 2e 78 20 6f 66 20 53 51 4c 69 74 65 2c 20 74  0.x of SQLite, t
16f0: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
1700: 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20  d would call.** 
1710: 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28  gdbm_reorganize(
1720: 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20 64 61 74  ) on all the dat
1730: 61 62 61 73 65 20 74 61 62 6c 65 73 2e 20 20 42  abase tables.  B
1740: 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  ut beginning.** 
1750: 77 69 74 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69  with 2.0.0, SQLi
1760: 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65  te no longer use
1770: 73 20 47 44 42 4d 20 73 6f 20 74 68 69 73 20 63  s GDBM so this c
1780: 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65  ommand has.** be
1790: 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  come a no-op..*/
17a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 56 61 63 75  .void sqliteVacu
17b0: 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  um(Parse *pParse
17c0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 4e  , Token *pTableN
17d0: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ame){.  Vdbe *v 
17e0: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
17f0: 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74  pParse);.  sqlit
1800: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
1810: 5f 56 61 63 75 75 6d 2c 20 30 2c 20 30 29 3b 0a  _Vacuum, 0, 0);.
1820: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
1830: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1840: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 4f  implements the O
1850: 50 5f 56 61 63 75 75 6d 20 6f 70 63 6f 64 65 20  P_Vacuum opcode 
1860: 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a  of the VDBE..*/.
1870: 69 6e 74 20 73 71 6c 69 74 65 52 75 6e 56 61 63  int sqliteRunVac
1880: 75 75 6d 28 63 68 61 72 20 2a 2a 70 7a 45 72 72  uum(char **pzErr
1890: 4d 73 67 2c 20 73 71 6c 69 74 65 20 2a 64 62 29  Msg, sqlite *db)
18a0: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
18b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
18c0: 4d 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4d 49  M) || SQLITE_OMI
18d0: 54 5f 56 41 43 55 55 4d 0a 20 20 63 6f 6e 73 74  T_VACUUM.  const
18e0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
18f0: 3b 20 20 2f 2a 20 66 75 6c 6c 20 70 61 74 68 6e  ;  /* full pathn
1900: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1910: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
1920: 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  t nFilename;    
1930: 20 20 20 20 20 20 2f 2a 20 6e 75 6d 62 65 72 20        /* number 
1940: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 20 69  of characters  i
1950: 6e 20 7a 46 69 6c 65 6e 61 6d 65 5b 5d 20 2a 2f  n zFilename[] */
1960: 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d  .  char *zTemp =
1970: 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 20   0;        /* a 
1980: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
1990: 6e 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  n same directory
19a0: 20 61 73 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   as zFilename */
19b0: 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 4e 65 77  .  sqlite *dbNew
19c0: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 68   = 0;      /* Th
19d0: 65 20 6e 65 77 20 76 61 63 75 75 6d 65 64 20 64  e new vacuumed d
19e0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
19f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a00: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
1a10: 6f 64 65 20 66 72 6f 6d 20 73 65 72 76 69 63 65  ode from service
1a20: 20 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69   routines */.  i
1a30: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1a40: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
1a50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 63 68 61 72  ounter */.  char
1a60: 20 2a 7a 45 72 72 4d 73 67 3b 20 20 20 20 20 20   *zErrMsg;      
1a70: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73      /* Error mes
1a80: 73 61 67 65 20 2a 2f 0a 20 20 76 61 63 75 75 6d  sage */.  vacuum
1a90: 53 74 72 75 63 74 20 73 56 61 63 3b 20 20 20 20  Struct sVac;    
1aa0: 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1ab0: 20 70 61 73 73 65 64 20 74 6f 20 63 61 6c 6c 62   passed to callb
1ac0: 61 63 6b 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  acks */..  /* Th
1ad0: 65 73 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ese are all of t
1ae0: 68 65 20 70 72 61 67 6d 61 73 20 74 68 61 74 20  he pragmas that 
1af0: 6e 65 65 64 20 74 6f 20 62 65 20 74 72 61 6e 73  need to be trans
1b00: 66 65 72 72 65 64 20 6f 76 65 72 0a 20 20 2a 2a  ferred over.  **
1b10: 20 74 6f 20 74 68 65 20 6e 65 77 20 64 61 74 61   to the new data
1b20: 62 61 73 65 20 2a 2f 0a 20 20 73 74 61 74 69 63  base */.  static
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 72   const char *zPr
1b40: 61 67 6d 61 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  agma[] = {.     
1b50: 22 64 65 66 61 75 6c 74 5f 73 79 6e 63 68 72 6f  "default_synchro
1b60: 6e 6f 75 73 22 2c 0a 20 20 20 20 20 22 64 65 66  nous",.     "def
1b70: 61 75 6c 74 5f 63 61 63 68 65 5f 73 69 7a 65 22  ault_cache_size"
1b80: 2c 0a 20 20 20 20 20 2f 2a 20 22 64 65 66 61 75  ,.     /* "defau
1b90: 6c 74 5f 74 65 6d 70 5f 73 74 6f 72 65 22 2c 20  lt_temp_store", 
1ba0: 2a 2f 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 64  */.  };..  if( d
1bb0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1bc0: 45 5f 49 6e 54 72 61 6e 73 20 29 7b 0a 20 20 20  E_InTrans ){.   
1bd0: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
1be0: 28 70 7a 45 72 72 4d 73 67 2c 20 22 63 61 6e 6e  (pzErrMsg, "cann
1bf0: 6f 74 20 56 41 43 55 55 4d 20 66 72 6f 6d 20 77  ot VACUUM from w
1c00: 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74  ithin a transact
1c10: 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 28 63  ion", .       (c
1c20: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
1c30: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
1c40: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26  ;.  }.  memset(&
1c50: 73 56 61 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sVac, 0, sizeof(
1c60: 73 56 61 63 29 29 3b 0a 0a 20 20 2f 2a 20 47 65  sVac));..  /* Ge
1c70: 74 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  t the full pathn
1c80: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1c90: 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63 72 65  ase file and cre
1ca0: 61 74 65 20 74 77 6f 0a 20 20 2a 2a 20 74 65 6d  ate two.  ** tem
1cb0: 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73  porary filenames
1cc0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
1cd0: 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 6f 72  ectory as the or
1ce0: 69 67 69 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  iginal file..  *
1cf0: 2f 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  /.  zFilename = 
1d00: 73 71 6c 69 74 65 42 74 72 65 65 47 65 74 46 69  sqliteBtreeGetFi
1d10: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
1d20: 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28 20 7a 46  ].pBt);.  if( zF
1d30: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
1d40: 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
1d50: 61 70 70 65 6e 73 20 77 69 74 68 20 74 68 65 20  appens with the 
1d60: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1d70: 73 65 2e 20 20 56 41 43 55 55 4d 20 69 73 20 61  se.  VACUUM is a
1d80: 20 6e 6f 2d 6f 70 0a 20 20 20 20 2a 2a 20 74 68   no-op.    ** th
1d90: 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ere, so just ret
1da0: 75 72 6e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  urn */.    retur
1db0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1dc0: 0a 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73  .  nFilename = s
1dd0: 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
1de0: 3b 0a 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69  ;.  zTemp = sqli
1df0: 74 65 4d 61 6c 6c 6f 63 28 20 6e 46 69 6c 65 6e  teMalloc( nFilen
1e00: 61 6d 65 2b 31 30 30 20 29 3b 0a 20 20 69 66 28  ame+100 );.  if(
1e10: 20 7a 54 65 6d 70 3d 3d 30 20 29 20 72 65 74 75   zTemp==0 ) retu
1e20: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
1e30: 0a 20 20 73 74 72 63 70 79 28 7a 54 65 6d 70 2c  .  strcpy(zTemp,
1e40: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66   zFilename);.  f
1e50: 6f 72 28 69 3d 30 3b 20 69 3c 31 30 3b 20 69 2b  or(i=0; i<10; i+
1e60: 2b 29 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 6e 46  +){.    zTemp[nF
1e70: 69 6c 65 6e 61 6d 65 5d 20 3d 20 27 2d 27 3b 0a  ilename] = '-';.
1e80: 20 20 20 20 72 61 6e 64 6f 6d 4e 61 6d 65 28 26      randomName(&
1e90: 7a 54 65 6d 70 5b 6e 46 69 6c 65 6e 61 6d 65 2b  zTemp[nFilename+
1ea0: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71  1]);.    if( !sq
1eb0: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73  liteOsFileExists
1ec0: 28 7a 54 65 6d 70 29 20 29 20 62 72 65 61 6b 3b  (zTemp) ) break;
1ed0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 31 30  .  }.  if( i>=10
1ee0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65   ){.    sqliteSe
1ef0: 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67  tString(pzErrMsg
1f00: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 72 65  , "unable to cre
1f10: 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
1f20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 0a  database file ".
1f30: 20 20 20 20 20 20 20 22 69 6e 20 74 68 65 20 73         "in the s
1f40: 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
1f50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1f60: 74 61 62 61 73 65 22 2c 20 28 63 68 61 72 2a 29  tabase", (char*)
1f70: 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  0);.    goto end
1f80: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a  _of_vacuum;.  }.
1f90: 0a 20 20 0a 20 20 64 62 4e 65 77 20 3d 20 73 71  .  .  dbNew = sq
1fa0: 6c 69 74 65 5f 6f 70 65 6e 28 7a 54 65 6d 70 2c  lite_open(zTemp,
1fb0: 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
1fc0: 20 69 66 28 20 64 62 4e 65 77 3d 3d 30 20 29 7b   if( dbNew==0 ){
1fd0: 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53 74  .    sqliteSetSt
1fe0: 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 22  ring(pzErrMsg, "
1ff0: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
2000: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
2010: 61 73 65 20 61 74 20 22 2c 0a 20 20 20 20 20 20  ase at ",.      
2020: 20 7a 54 65 6d 70 2c 20 22 20 2d 20 22 2c 20 7a   zTemp, " - ", z
2030: 45 72 72 4d 73 67 2c 20 28 63 68 61 72 2a 29 30  ErrMsg, (char*)0
2040: 29 3b 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 69 66 28 20 65 78 65 63 73 71 6c 28 70 7a 45   if( execsql(pzE
2070: 72 72 4d 73 67 2c 20 64 62 2c 20 22 42 45 47 49  rrMsg, db, "BEGI
2080: 4e 22 29 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f  N") ) goto end_o
2090: 66 5f 76 61 63 75 75 6d 3b 0a 20 20 69 66 28 20  f_vacuum;.  if( 
20a0: 65 78 65 63 73 71 6c 28 70 7a 45 72 72 4d 73 67  execsql(pzErrMsg
20b0: 2c 20 64 62 4e 65 77 2c 20 22 50 52 41 47 4d 41  , dbNew, "PRAGMA
20c0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 6f 66 66   synchronous=off
20d0: 3b 20 42 45 47 49 4e 22 29 20 29 7b 0a 20 20 20  ; BEGIN") ){.   
20e0: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63   goto end_of_vac
20f0: 75 75 6d 3b 0a 20 20 7d 0a 20 20 0a 20 20 73 56  uum;.  }.  .  sV
2100: 61 63 2e 64 62 4f 6c 64 20 3d 20 64 62 3b 0a 20  ac.dbOld = db;. 
2110: 20 73 56 61 63 2e 64 62 4e 65 77 20 3d 20 64 62   sVac.dbNew = db
2120: 4e 65 77 3b 0a 20 20 73 56 61 63 2e 70 7a 45 72  New;.  sVac.pzEr
2130: 72 4d 73 67 20 3d 20 70 7a 45 72 72 4d 73 67 3b  rMsg = pzErrMsg;
2140: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
2150: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 73  SQLITE_OK && i<s
2160: 69 7a 65 6f 66 28 7a 50 72 61 67 6d 61 29 2f 73  izeof(zPragma)/s
2170: 69 7a 65 6f 66 28 7a 50 72 61 67 6d 61 5b 30 5d  izeof(zPragma[0]
2180: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  ); i++){.    cha
2190: 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20  r zBuf[200];.   
21a0: 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e 28   assert( strlen(
21b0: 7a 50 72 61 67 6d 61 5b 69 5d 29 3c 31 30 30 20  zPragma[i])<100 
21c0: 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a  );.    sprintf(z
21d0: 42 75 66 2c 20 22 50 52 41 47 4d 41 20 25 73 3b  Buf, "PRAGMA %s;
21e0: 22 2c 20 7a 50 72 61 67 6d 61 5b 69 5d 29 3b 0a  ", zPragma[i]);.
21f0: 20 20 20 20 73 56 61 63 2e 7a 50 72 61 67 6d 61      sVac.zPragma
2200: 20 3d 20 7a 50 72 61 67 6d 61 5b 69 5d 3b 0a 20   = zPragma[i];. 
2210: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f 65     rc = sqlite_e
2220: 78 65 63 28 64 62 2c 20 7a 42 75 66 2c 20 76 61  xec(db, zBuf, va
2230: 63 75 75 6d 43 61 6c 6c 62 61 63 6b 33 2c 20 26  cuumCallback3, &
2240: 73 56 61 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b  sVac, &zErrMsg);
2250: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
2260: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2270: 72 63 20 3d 20 73 71 6c 69 74 65 5f 65 78 65 63  rc = sqlite_exec
2280: 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  (db, .      "SEL
2290: 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c 20  ECT type, name, 
22a0: 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
22b0: 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 22  master ".      "
22c0: 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20 4e 55  WHERE sql NOT NU
22d0: 4c 4c 20 41 4e 44 20 74 79 70 65 21 3d 27 76 69  LL AND type!='vi
22e0: 65 77 27 20 22 0a 20 20 20 20 20 20 22 55 4e 49  ew' ".      "UNI
22f0: 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 20 20 22  ON ALL ".      "
2300: 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d  SELECT type, nam
2310: 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
2320: 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2330: 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
2340: 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d   NULL AND type==
2350: 27 76 69 65 77 27 22 2c 0a 20 20 20 20 20 20 76  'view'",.      v
2360: 61 63 75 75 6d 43 61 6c 6c 62 61 63 6b 31 2c 20  acuumCallback1, 
2370: 26 73 56 61 63 2c 20 26 7a 45 72 72 4d 73 67 29  &sVac, &zErrMsg)
2380: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2390: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 42 74 72 65   rc = sqliteBtre
23b0: 65 43 6f 70 79 46 69 6c 65 28 64 62 2d 3e 61 44  eCopyFile(db->aD
23c0: 62 5b 30 5d 2e 70 42 74 2c 20 64 62 4e 65 77 2d  b[0].pBt, dbNew-
23d0: 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
23e0: 20 20 73 71 6c 69 74 65 5f 65 78 65 63 28 64 62    sqlite_exec(db
23f0: 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
2400: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2410: 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68  ResetInternalSch
2420: 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a  ema(db, 0);.  }.
2430: 0a 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3a 0a  .end_of_vacuum:.
2440: 20 20 69 66 28 20 72 63 20 26 26 20 7a 45 72 72    if( rc && zErr
2450: 4d 73 67 21 3d 30 20 29 7b 0a 20 20 20 20 73 71  Msg!=0 ){.    sq
2460: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 70 7a  liteSetString(pz
2470: 45 72 72 4d 73 67 2c 20 22 75 6e 61 62 6c 65 20  ErrMsg, "unable 
2480: 74 6f 20 76 61 63 75 75 6d 20 64 61 74 61 62 61  to vacuum databa
2490: 73 65 20 2d 20 22 2c 20 0a 20 20 20 20 20 20 20  se - ", .       
24a0: 7a 45 72 72 4d 73 67 2c 20 28 63 68 61 72 2a 29  zErrMsg, (char*)
24b0: 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
24c0: 5f 65 78 65 63 28 64 62 2c 20 22 52 4f 4c 4c 42  _exec(db, "ROLLB
24d0: 41 43 4b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ACK", 0, 0, 0);.
24e0: 20 20 69 66 28 20 64 62 4e 65 77 20 29 20 73 71    if( dbNew ) sq
24f0: 6c 69 74 65 5f 63 6c 6f 73 65 28 64 62 4e 65 77  lite_close(dbNew
2500: 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 44 65 6c  );.  sqliteOsDel
2510: 65 74 65 28 7a 54 65 6d 70 29 3b 0a 20 20 73 71  ete(zTemp);.  sq
2520: 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70 29 3b  liteFree(zTemp);
2530: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 73 56  .  sqliteFree(sV
2540: 61 63 2e 73 31 2e 7a 29 3b 0a 20 20 73 71 6c 69  ac.s1.z);.  sqli
2550: 74 65 46 72 65 65 28 73 56 61 63 2e 73 32 2e 7a  teFree(sVac.s2.z
2560: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
2570: 20 29 20 73 71 6c 69 74 65 5f 66 72 65 65 6d 65   ) sqlite_freeme
2580: 6d 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66  m(zErrMsg);.  if
2590: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  ( rc==SQLITE_ABO
25a0: 52 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  RT ) rc = SQLITE
25b0: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
25c0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a         rc;.#endif.}.