/ Hex Artifact Content
Login

Artifact 318ccae7c4e3ddf241aeaee4d2611bfe1949a373:


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 37 31 20 32 30  cuum.c,v 1.71 20
0230: 30 37 2f 30 38 2f 32 31 20 31 30 3a 34 34 3a 31  07/08/21 10:44:1
0240: 36 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  6 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: 76 64 62 65 49 6e 74 2e 68 22 0a 0a 23 69 66 20  vdbeInt.h"..#if 
0280: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
0290: 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 26 26 20  OMIT_VACUUM) && 
02a0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
02b0: 4f 4d 49 54 5f 41 54 54 41 43 48 29 0a 2f 2a 0a  OMIT_ATTACH)./*.
02c0: 2a 2a 20 45 78 65 63 75 74 65 20 7a 53 71 6c 20  ** Execute zSql 
02d0: 6f 6e 20 64 61 74 61 62 61 73 65 20 64 62 2e 20  on database db. 
02e0: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
02f0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
0300: 69 6e 74 20 65 78 65 63 53 71 6c 28 73 71 6c 69  int execSql(sqli
0310: 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
0320: 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71  har *zSql){.  sq
0330: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
0340: 74 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  t;.  if( SQLITE_
0350: 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 70 72 65 70  OK!=sqlite3_prep
0360: 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  are(db, zSql, -1
0370: 2c 20 26 70 53 74 6d 74 2c 20 30 29 20 29 7b 0a  , &pStmt, 0) ){.
0380: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
0390: 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
03a0: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 53 51 4c    }.  while( SQL
03b0: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
03c0: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 7d  _step(pStmt) ){}
03d0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
03e0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
03f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
0400: 75 74 65 20 7a 53 71 6c 20 6f 6e 20 64 61 74 61  ute zSql on data
0410: 62 61 73 65 20 64 62 2e 20 54 68 65 20 73 74 61  base db. The sta
0420: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 65  tement returns e
0430: 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 63 6f  xactly.** one co
0440: 6c 75 6d 6e 2e 20 45 78 65 63 75 74 65 20 74 68  lumn. Execute th
0450: 69 73 20 61 73 20 53 51 4c 20 6f 6e 20 74 68 65  is as SQL on the
0460: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 0a   same database..
0470: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
0480: 65 63 45 78 65 63 53 71 6c 28 73 71 6c 69 74 65  ecExecSql(sqlite
0490: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
04a0: 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69  r *zSql){.  sqli
04b0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
04c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
04d0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
04e0: 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  re(db, zSql, -1,
04f0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
0500: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
0510: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
0520: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
0530: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
0540: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 72  (pStmt) ){.    r
0550: 63 20 3d 20 65 78 65 63 53 71 6c 28 64 62 2c 20  c = execSql(db, 
0560: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63  (char*)sqlite3_c
0570: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
0580: 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 72  , 0));.    if( r
0590: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
05a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
05b0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
05c0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
05d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
05e0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
05f0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a  lize(pStmt);.}..
0600: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74  /*.** The non-st
0610: 61 6e 64 61 72 64 20 56 41 43 55 55 4d 20 63 6f  andard VACUUM co
0620: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
0630: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 64 61   clean up the da
0640: 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61  tabase,.** colla
0650: 70 73 65 20 66 72 65 65 20 73 70 61 63 65 2c 20  pse free space, 
0660: 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f 64 65  etc.  It is mode
0670: 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 56  lled after the V
0680: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  ACUUM command.**
0690: 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a   in PostgreSQL..
06a0: 2a 2a 0a 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e  **.** In version
06b0: 20 31 2e 30 2e 78 20 6f 66 20 53 51 4c 69 74 65   1.0.x of SQLite
06c0: 2c 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  , the VACUUM com
06d0: 6d 61 6e 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a  mand would call.
06e0: 2a 2a 20 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69  ** gdbm_reorgani
06f0: 7a 65 28 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ze() on all the 
0700: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 2e  database tables.
0710: 20 20 42 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a    But beginning.
0720: 2a 2a 20 77 69 74 68 20 32 2e 30 2e 30 2c 20 53  ** with 2.0.0, S
0730: 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
0740: 75 73 65 73 20 47 44 42 4d 20 73 6f 20 74 68 69  uses GDBM so thi
0750: 73 20 63 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a  s command has.**
0760: 20 62 65 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e   become a no-op.
0770: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
0780: 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70 50  Vacuum(Parse *pP
0790: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
07a0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
07b0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
07c0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
07d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
07e0: 5f 56 61 63 75 75 6d 2c 20 30 2c 20 30 29 3b 0a  _Vacuum, 0, 0);.
07f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
0800: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0810: 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
0820: 68 65 20 4f 50 5f 56 61 63 75 75 6d 20 6f 70 63  he OP_Vacuum opc
0830: 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
0840: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52  .*/.int sqlite3R
0850: 75 6e 56 61 63 75 75 6d 28 63 68 61 72 20 2a 2a  unVacuum(char **
0860: 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65  pzErrMsg, sqlite
0870: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63  3 *db){.  int rc
0880: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
0890: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
08a0: 20 66 72 6f 6d 20 73 65 72 76 69 63 65 20 72 6f   from service ro
08b0: 75 74 69 6e 65 73 20 2a 2f 0a 20 20 42 74 72 65  utines */.  Btre
08c0: 65 20 2a 70 4d 61 69 6e 3b 20 20 20 20 20 20 20  e *pMain;       
08d0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
08e0: 61 73 65 20 62 65 69 6e 67 20 76 61 63 75 75 6d  ase being vacuum
08f0: 65 64 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70  ed */.  Btree *p
0900: 54 65 6d 70 3b 20 20 20 20 20 20 20 20 20 20 20  Temp;           
0910: 2f 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72 79  /* The temporary
0920: 20 64 61 74 61 62 61 73 65 20 77 65 20 76 61 63   database we vac
0930: 75 75 6d 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 68  uum into */.  ch
0940: 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 20 20 20  ar *zSql = 0;   
0950: 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74 61        /* SQL sta
0960: 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  tements */.  int
0970: 20 73 61 76 65 64 5f 66 6c 61 67 73 3b 20 20 20   saved_flags;   
0980: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
0990: 6c 75 65 20 6f 66 20 74 68 65 20 64 62 2d 3e 66  lue of the db->f
09a0: 6c 61 67 73 20 2a 2f 0a 20 20 44 62 20 2a 70 44  lags */.  Db *pD
09b0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
09c0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
09d0: 20 64 65 74 61 63 68 20 61 74 20 65 6e 64 20 6f   detach at end o
09e0: 66 20 76 61 63 75 75 6d 20 2a 2f 0a 0a 20 20 2f  f vacuum */..  /
09f0: 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65  * Save the curre
0a00: 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  nt value of the 
0a10: 77 72 69 74 65 2d 73 63 68 65 6d 61 20 66 6c 61  write-schema fla
0a20: 67 20 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67  g before setting
0a30: 20 69 74 2e 20 2a 2f 0a 20 20 73 61 76 65 64 5f   it. */.  saved_
0a40: 66 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67  flags = db->flag
0a50: 73 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  s;.  db->flags |
0a60: 3d 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63  = SQLITE_WriteSc
0a70: 68 65 6d 61 20 7c 20 53 51 4c 49 54 45 5f 49 67  hema | SQLITE_Ig
0a80: 6e 6f 72 65 43 68 65 63 6b 73 3b 0a 0a 20 20 69  noreChecks;..  i
0a90: 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
0aa0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
0ab0: 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  3SetString(pzErr
0ac0: 4d 73 67 2c 20 22 63 61 6e 6e 6f 74 20 56 41 43  Msg, "cannot VAC
0ad0: 55 55 4d 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  UUM from within 
0ae0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20  a transaction", 
0af0: 0a 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30  .       (char*)0
0b00: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
0b10: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f  TE_ERROR;.    go
0b20: 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d  to end_of_vacuum
0b30: 3b 0a 20 20 7d 0a 20 20 70 4d 61 69 6e 20 3d 20  ;.  }.  pMain = 
0b40: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b 0a  db->aDb[0].pBt;.
0b50: 0a 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65  .  /* Attach the
0b60: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
0b70: 61 73 65 20 61 73 20 27 76 61 63 75 75 6d 5f 64  ase as 'vacuum_d
0b80: 62 27 2e 20 54 68 65 20 73 79 6e 63 68 72 6f 6e  b'. The synchron
0b90: 6f 75 73 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20  ous pragma.  ** 
0ba0: 63 61 6e 20 62 65 20 73 65 74 20 74 6f 20 27 6f  can be set to 'o
0bb0: 66 66 27 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ff' for this fil
0bc0: 65 2c 20 61 73 20 69 74 20 69 73 20 6e 6f 74 20  e, as it is not 
0bd0: 72 65 63 6f 76 65 72 65 64 20 69 66 20 61 20 63  recovered if a c
0be0: 72 61 73 68 0a 20 20 2a 2a 20 6f 63 63 75 72 73  rash.  ** occurs
0bf0: 20 61 6e 79 77 61 79 2e 20 54 68 65 20 69 6e 74   anyway. The int
0c00: 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 64 61  egrity of the da
0c10: 74 61 62 61 73 65 20 69 73 20 6d 61 69 6e 74 61  tabase is mainta
0c20: 69 6e 65 64 20 62 79 20 61 0a 20 20 2a 2a 20 28  ined by a.  ** (
0c30: 70 6f 73 73 69 62 6c 79 20 73 79 6e 63 68 72 6f  possibly synchro
0c40: 6e 6f 75 73 29 20 74 72 61 6e 73 61 63 74 69 6f  nous) transactio
0c50: 6e 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20  n opened on the 
0c60: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 62 65  main database be
0c70: 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65  fore.  ** sqlite
0c80: 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 29  3BtreeCopyFile()
0c90: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2a   is called..  **
0ca0: 0a 20 20 2a 2a 20 41 6e 20 6f 70 74 69 6d 69 73  .  ** An optimis
0cb0: 61 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74  ation would be t
0cc0: 6f 20 75 73 65 20 61 20 6e 6f 6e 2d 6a 6f 75 72  o use a non-jour
0cd0: 6e 61 6c 65 64 20 70 61 67 65 72 2e 0a 20 20 2a  naled pager..  *
0ce0: 2f 0a 20 20 7a 53 71 6c 20 3d 20 22 41 54 54 41  /.  zSql = "ATTA
0cf0: 43 48 20 27 27 20 41 53 20 76 61 63 75 75 6d 5f  CH '' AS vacuum_
0d00: 64 62 3b 22 3b 0a 20 20 72 63 20 3d 20 65 78 65  db;";.  rc = exe
0d10: 63 53 71 6c 28 64 62 2c 20 7a 53 71 6c 29 3b 0a  cSql(db, zSql);.
0d20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
0d30: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f  _OK ) goto end_o
0d40: 66 5f 76 61 63 75 75 6d 3b 0a 20 20 70 44 62 20  f_vacuum;.  pDb 
0d50: 3d 20 26 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 6e  = &db->aDb[db->n
0d60: 44 62 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28  Db-1];.  assert(
0d70: 20 73 74 72 63 6d 70 28 64 62 2d 3e 61 44 62 5b   strcmp(db->aDb[
0d80: 64 62 2d 3e 6e 44 62 2d 31 5d 2e 7a 4e 61 6d 65  db->nDb-1].zName
0d90: 2c 22 76 61 63 75 75 6d 5f 64 62 22 29 3d 3d 30  ,"vacuum_db")==0
0da0: 20 29 3b 0a 20 20 70 54 65 6d 70 20 3d 20 64 62   );.  pTemp = db
0db0: 2d 3e 61 44 62 5b 64 62 2d 3e 6e 44 62 2d 31 5d  ->aDb[db->nDb-1]
0dc0: 2e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  .pBt;.  sqlite3B
0dd0: 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
0de0: 70 54 65 6d 70 2c 20 73 71 6c 69 74 65 33 42 74  pTemp, sqlite3Bt
0df0: 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 70  reeGetPageSize(p
0e00: 4d 61 69 6e 29 2c 0a 20 20 20 20 20 73 71 6c 69  Main),.     sqli
0e10: 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
0e20: 76 65 28 70 4d 61 69 6e 29 29 3b 0a 20 20 69 66  ve(pMain));.  if
0e30: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
0e40: 65 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ed ){.    rc = S
0e50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
0e60: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63   goto end_of_vac
0e70: 75 75 6d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  uum;.  }.  asser
0e80: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  t( sqlite3BtreeG
0e90: 65 74 50 61 67 65 53 69 7a 65 28 70 54 65 6d 70  etPageSize(pTemp
0ea0: 29 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 47  )==sqlite3BtreeG
0eb0: 65 74 50 61 67 65 53 69 7a 65 28 70 4d 61 69 6e  etPageSize(pMain
0ec0: 29 20 29 3b 0a 20 20 72 63 20 3d 20 65 78 65 63  ) );.  rc = exec
0ed0: 53 71 6c 28 64 62 2c 20 22 50 52 41 47 4d 41 20  Sql(db, "PRAGMA 
0ee0: 76 61 63 75 75 6d 5f 64 62 2e 73 79 6e 63 68 72  vacuum_db.synchr
0ef0: 6f 6e 6f 75 73 3d 4f 46 46 22 29 3b 0a 20 20 69  onous=OFF");.  i
0f00: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
0f10: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64   ){.    goto end
0f20: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a  _of_vacuum;.  }.
0f30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
0f40: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
0f50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
0f60: 74 41 75 74 6f 56 61 63 75 75 6d 28 70 54 65 6d  tAutoVacuum(pTem
0f70: 70 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  p, sqlite3BtreeG
0f80: 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 4d 61  etAutoVacuum(pMa
0f90: 69 6e 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  in));.#endif..  
0fa0: 2f 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e 73  /* Begin a trans
0fb0: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d  action */.  rc =
0fc0: 20 65 78 65 63 53 71 6c 28 64 62 2c 20 22 42 45   execSql(db, "BE
0fd0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 29  GIN EXCLUSIVE;")
0fe0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
0ff0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
1000: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 0a 20 20 2f  _of_vacuum;..  /
1010: 2a 20 51 75 65 72 79 20 74 68 65 20 73 63 68 65  * Query the sche
1020: 6d 61 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ma of the main d
1030: 61 74 61 62 61 73 65 2e 20 43 72 65 61 74 65 20  atabase. Create 
1040: 61 20 6d 69 72 72 6f 72 20 73 63 68 65 6d 61 0a  a mirror schema.
1050: 20 20 2a 2a 20 69 6e 20 74 68 65 20 74 65 6d 70    ** in the temp
1060: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 2e 0a  orary database..
1070: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 65 78 65 63    */.  rc = exec
1080: 45 78 65 63 53 71 6c 28 64 62 2c 20 0a 20 20 20  ExecSql(db, .   
1090: 20 20 20 22 53 45 4c 45 43 54 20 27 43 52 45 41     "SELECT 'CREA
10a0: 54 45 20 54 41 42 4c 45 20 76 61 63 75 75 6d 5f  TE TABLE vacuum_
10b0: 64 62 2e 27 20 7c 7c 20 73 75 62 73 74 72 28 73  db.' || substr(s
10c0: 71 6c 2c 31 34 2c 31 30 30 30 30 30 30 30 30 29  ql,14,100000000)
10d0: 20 22 0a 20 20 20 20 20 20 22 20 20 46 52 4f 4d   ".      "  FROM
10e0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57   sqlite_master W
10f0: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
1100: 27 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c  ' AND name!='sql
1110: 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20  ite_sequence'". 
1120: 20 20 20 20 20 22 20 20 20 41 4e 44 20 72 6f 6f       "   AND roo
1130: 74 70 61 67 65 3e 30 22 0a 20 20 29 3b 0a 20 20  tpage>0".  );.  
1140: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1150: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  K ) goto end_of_
1160: 76 61 63 75 75 6d 3b 0a 20 20 72 63 20 3d 20 65  vacuum;.  rc = e
1170: 78 65 63 45 78 65 63 53 71 6c 28 64 62 2c 20 0a  xecExecSql(db, .
1180: 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27 43        "SELECT 'C
1190: 52 45 41 54 45 20 49 4e 44 45 58 20 76 61 63 75  REATE INDEX vacu
11a0: 75 6d 5f 64 62 2e 27 20 7c 7c 20 73 75 62 73 74  um_db.' || subst
11b0: 72 28 73 71 6c 2c 31 34 2c 31 30 30 30 30 30 30  r(sql,14,1000000
11c0: 30 30 29 22 0a 20 20 20 20 20 20 22 20 20 46 52  00)".      "  FR
11d0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
11e0: 20 57 48 45 52 45 20 73 71 6c 20 4c 49 4b 45 20   WHERE sql LIKE 
11f0: 27 43 52 45 41 54 45 20 49 4e 44 45 58 20 25 27  'CREATE INDEX %'
1200: 20 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   ");.  if( rc!=S
1210: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1220: 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20  end_of_vacuum;. 
1230: 20 72 63 20 3d 20 65 78 65 63 45 78 65 63 53 71   rc = execExecSq
1240: 6c 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45  l(db, .      "SE
1250: 4c 45 43 54 20 27 43 52 45 41 54 45 20 55 4e 49  LECT 'CREATE UNI
1260: 51 55 45 20 49 4e 44 45 58 20 76 61 63 75 75 6d  QUE INDEX vacuum
1270: 5f 64 62 2e 27 20 7c 7c 20 73 75 62 73 74 72 28  _db.' || substr(
1280: 73 71 6c 2c 32 31 2c 31 30 30 30 30 30 30 30 30  sql,21,100000000
1290: 29 20 22 0a 20 20 20 20 20 20 22 20 20 46 52 4f  ) ".      "  FRO
12a0: 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
12b0: 57 48 45 52 45 20 73 71 6c 20 4c 49 4b 45 20 27  WHERE sql LIKE '
12c0: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
12d0: 44 45 58 20 25 27 22 29 3b 0a 20 20 69 66 28 20  DEX %'");.  if( 
12e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
12f0: 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75  goto end_of_vacu
1300: 75 6d 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74  um;..  /* Loop t
1310: 68 72 6f 75 67 68 20 74 68 65 20 74 61 62 6c 65  hrough the table
1320: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  s in the main da
1330: 74 61 62 61 73 65 2e 20 46 6f 72 20 65 61 63 68  tabase. For each
1340: 2c 20 64 6f 0a 20 20 2a 2a 20 61 6e 20 22 49 4e  , do.  ** an "IN
1350: 53 45 52 54 20 49 4e 54 4f 20 76 61 63 75 75 6d  SERT INTO vacuum
1360: 5f 64 62 2e 78 78 78 20 53 45 4c 45 43 54 20 2a  _db.xxx SELECT *
1370: 20 46 52 4f 4d 20 78 78 78 3b 22 20 74 6f 20 63   FROM xxx;" to c
1380: 6f 70 79 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e  opy.  ** the con
1390: 74 65 6e 74 73 20 74 6f 20 74 68 65 20 74 65 6d  tents to the tem
13a0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 2e  porary database.
13b0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 65 78 65  .  */.  rc = exe
13c0: 63 45 78 65 63 53 71 6c 28 64 62 2c 20 0a 20 20  cExecSql(db, .  
13d0: 20 20 20 20 22 53 45 4c 45 43 54 20 27 49 4e 53      "SELECT 'INS
13e0: 45 52 54 20 49 4e 54 4f 20 76 61 63 75 75 6d 5f  ERT INTO vacuum_
13f0: 64 62 2e 27 20 7c 7c 20 71 75 6f 74 65 28 6e 61  db.' || quote(na
1400: 6d 65 29 20 22 0a 20 20 20 20 20 20 22 7c 7c 20  me) ".      "|| 
1410: 27 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ' SELECT * FROM 
1420: 27 20 7c 7c 20 71 75 6f 74 65 28 6e 61 6d 65 29  ' || quote(name)
1430: 20 7c 7c 20 27 3b 27 22 0a 20 20 20 20 20 20 22   || ';'".      "
1440: 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1450: 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  er ".      "WHER
1460: 45 20 74 79 70 65 20 3d 20 27 74 61 62 6c 65 27  E type = 'table'
1470: 20 41 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69   AND name!='sqli
1480: 74 65 5f 73 65 71 75 65 6e 63 65 27 20 22 0a 20  te_sequence' ". 
1490: 20 20 20 20 20 22 20 20 41 4e 44 20 72 6f 6f 74       "  AND root
14a0: 70 61 67 65 3e 30 22 0a 0a 20 20 29 3b 0a 20 20  page>0"..  );.  
14b0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14c0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  K ) goto end_of_
14d0: 76 61 63 75 75 6d 3b 0a 0a 20 20 2f 2a 20 43 6f  vacuum;..  /* Co
14e0: 70 79 20 6f 76 65 72 20 74 68 65 20 73 65 71 75  py over the sequ
14f0: 65 6e 63 65 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  ence table.  */.
1500: 20 20 72 63 20 3d 20 65 78 65 63 45 78 65 63 53    rc = execExecS
1510: 71 6c 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53  ql(db, .      "S
1520: 45 4c 45 43 54 20 27 44 45 4c 45 54 45 20 46 52  ELECT 'DELETE FR
1530: 4f 4d 20 76 61 63 75 75 6d 5f 64 62 2e 27 20 7c  OM vacuum_db.' |
1540: 7c 20 71 75 6f 74 65 28 6e 61 6d 65 29 20 7c 7c  | quote(name) ||
1550: 20 27 3b 27 20 22 0a 20 20 20 20 20 20 22 46 52   ';' ".      "FR
1560: 4f 4d 20 76 61 63 75 75 6d 5f 64 62 2e 73 71 6c  OM vacuum_db.sql
1570: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
1580: 20 6e 61 6d 65 3d 27 73 71 6c 69 74 65 5f 73 65   name='sqlite_se
1590: 71 75 65 6e 63 65 27 20 22 0a 20 20 29 3b 0a 20  quence' ".  );. 
15a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15b0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  OK ) goto end_of
15c0: 5f 76 61 63 75 75 6d 3b 0a 20 20 72 63 20 3d 20  _vacuum;.  rc = 
15d0: 65 78 65 63 45 78 65 63 53 71 6c 28 64 62 2c 20  execExecSql(db, 
15e0: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27  .      "SELECT '
15f0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 61 63 75  INSERT INTO vacu
1600: 75 6d 5f 64 62 2e 27 20 7c 7c 20 71 75 6f 74 65  um_db.' || quote
1610: 28 6e 61 6d 65 29 20 22 0a 20 20 20 20 20 20 22  (name) ".      "
1620: 7c 7c 20 27 20 53 45 4c 45 43 54 20 2a 20 46 52  || ' SELECT * FR
1630: 4f 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 6e 61  OM ' || quote(na
1640: 6d 65 29 20 7c 7c 20 27 3b 27 20 22 0a 20 20 20  me) || ';' ".   
1650: 20 20 20 22 46 52 4f 4d 20 76 61 63 75 75 6d 5f     "FROM vacuum_
1660: 64 62 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  db.sqlite_master
1670: 20 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71   WHERE name=='sq
1680: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 3b 22  lite_sequence';"
1690: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
16a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
16b0: 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a   end_of_vacuum;.
16c0: 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20  ..  /* Copy the 
16d0: 74 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 2c  triggers, views,
16e0: 20 61 6e 64 20 76 69 72 74 75 61 6c 20 74 61 62   and virtual tab
16f0: 6c 65 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  les from the mai
1700: 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
1710: 6f 76 65 72 20 74 6f 20 74 68 65 20 74 65 6d 70  over to the temp
1720: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 2e 20  orary database. 
1730: 20 4e 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 6f   None of these o
1740: 62 6a 65 63 74 73 20 68 61 73 20 61 6e 79 0a 20  bjects has any. 
1750: 20 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 73   ** associated s
1760: 74 6f 72 61 67 65 2c 20 73 6f 20 61 6c 6c 20 77  torage, so all w
1770: 65 20 68 61 76 65 20 74 6f 20 64 6f 20 69 73 20  e have to do is 
1780: 63 6f 70 79 20 74 68 65 69 72 20 65 6e 74 72 69  copy their entri
1790: 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
17a0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
17b0: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  able..  */.  rc 
17c0: 3d 20 65 78 65 63 53 71 6c 28 64 62 2c 0a 20 20  = execSql(db,.  
17d0: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
17e0: 20 76 61 63 75 75 6d 5f 64 62 2e 73 71 6c 69 74   vacuum_db.sqlit
17f0: 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
1800: 20 22 20 20 53 45 4c 45 43 54 20 74 79 70 65 2c   "  SELECT type,
1810: 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c   name, tbl_name,
1820: 20 72 6f 6f 74 70 61 67 65 2c 20 73 71 6c 22 0a   rootpage, sql".
1830: 20 20 20 20 20 20 22 20 20 20 20 46 52 4f 4d 20        "    FROM 
1840: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
1850: 20 20 20 20 20 22 20 20 20 57 48 45 52 45 20 74       "   WHERE t
1860: 79 70 65 3d 27 76 69 65 77 27 20 4f 52 20 74 79  ype='view' OR ty
1870: 70 65 3d 27 74 72 69 67 67 65 72 27 22 0a 20 20  pe='trigger'".  
1880: 20 20 20 20 22 20 20 20 20 20 20 4f 52 20 28 74      "      OR (t
1890: 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  ype='table' AND 
18a0: 72 6f 6f 74 70 61 67 65 3d 30 29 22 0a 20 20 29  rootpage=0)".  )
18b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
18c0: 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b  o end_of_vacuum;
18d0: 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
18e0: 6f 69 6e 74 2c 20 75 6e 6c 65 73 73 20 74 68 65  oint, unless the
18f0: 20 6d 61 69 6e 20 64 62 20 77 61 73 20 63 6f 6d   main db was com
1900: 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20 74  pletely empty, t
1910: 68 65 72 65 20 69 73 20 6e 6f 77 20 61 0a 20 20  here is now a.  
1920: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1930: 70 65 6e 20 6f 6e 20 74 68 65 20 76 61 63 75 75  pen on the vacuu
1940: 6d 20 64 61 74 61 62 61 73 65 2c 20 62 75 74 20  m database, but 
1950: 6e 6f 74 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  not on the main 
1960: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 4f  database..  ** O
1970: 70 65 6e 20 61 20 62 74 72 65 65 20 6c 65 76 65  pen a btree leve
1980: 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  l transaction on
1990: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
19a0: 73 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  se. This allows 
19b0: 61 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  a.  ** call to s
19c0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46  qlite3BtreeCopyF
19d0: 69 6c 65 28 29 2e 20 54 68 65 20 6d 61 69 6e 20  ile(). The main 
19e0: 64 61 74 61 62 61 73 65 20 62 74 72 65 65 20 6c  database btree l
19f0: 65 76 65 6c 0a 20 20 2a 2a 20 74 72 61 6e 73 61  evel.  ** transa
1a00: 63 74 69 6f 6e 20 69 73 20 74 68 65 6e 20 63 6f  ction is then co
1a10: 6d 6d 69 74 74 65 64 2c 20 73 6f 20 74 68 65 20  mmitted, so the 
1a20: 53 51 4c 20 6c 65 76 65 6c 20 6e 65 76 65 72 20  SQL level never 
1a30: 6b 6e 6f 77 73 20 69 74 20 77 61 73 0a 20 20 2a  knows it was.  *
1a40: 2a 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  * opened for wri
1a50: 74 69 6e 67 2e 20 54 68 69 73 20 77 61 79 2c 20  ting. This way, 
1a60: 74 68 65 20 53 51 4c 20 74 72 61 6e 73 61 63 74  the SQL transact
1a70: 69 6f 6e 20 75 73 65 64 20 74 6f 20 63 72 65 61  ion used to crea
1a80: 74 65 20 74 68 65 0a 20 20 2a 2a 20 74 65 6d 70  te the.  ** temp
1a90: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 6e  orary database n
1aa0: 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
1ab0: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 20 20 2a 2f   committed..  */
1ac0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ad0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 33 32 20  E_OK ){.    u32 
1ae0: 6d 65 74 61 3b 0a 20 20 20 20 69 6e 74 20 69 3b  meta;.    int i;
1af0: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 61 72  ..    /* This ar
1b00: 72 61 79 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ray determines w
1b10: 68 69 63 68 20 6d 65 74 61 20 6d 65 74 61 20 76  hich meta meta v
1b20: 61 6c 75 65 73 20 61 72 65 20 70 72 65 73 65 72  alues are preser
1b30: 76 65 64 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ved in the.    *
1b40: 2a 20 76 61 63 75 75 6d 2e 20 20 45 76 65 6e 20  * vacuum.  Even 
1b50: 65 6e 74 72 69 65 73 20 61 72 65 20 74 68 65 20  entries are the 
1b60: 6d 65 74 61 20 76 61 6c 75 65 20 6e 75 6d 62 65  meta value numbe
1b70: 72 20 61 6e 64 20 6f 64 64 20 65 6e 74 72 69 65  r and odd entrie
1b80: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61 6e 20  s.    ** are an 
1b90: 69 6e 63 72 65 6d 65 6e 74 20 74 6f 20 61 70 70  increment to app
1ba0: 6c 79 20 74 6f 20 74 68 65 20 6d 65 74 61 20 76  ly to the meta v
1bb0: 61 6c 75 65 20 61 66 74 65 72 20 74 68 65 20 76  alue after the v
1bc0: 61 63 75 75 6d 2e 0a 20 20 20 20 2a 2a 20 54 68  acuum..    ** Th
1bd0: 65 20 69 6e 63 72 65 6d 65 6e 74 20 69 73 20 75  e increment is u
1be0: 73 65 64 20 74 6f 20 69 6e 63 72 65 61 73 65 20  sed to increase 
1bf0: 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
1c00: 65 20 73 6f 20 74 68 61 74 20 6f 74 68 65 72 0a  e so that other.
1c10: 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f      ** connectio
1c20: 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 64  ns to the same d
1c30: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 6b 6e 6f  atabase will kno
1c40: 77 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  w to reread the 
1c50: 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20  schema..    */. 
1c60: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1c70: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 43  unsigned char aC
1c80: 6f 70 79 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  opy[] = {.      
1c90: 20 31 2c 20 31 2c 20 20 20 20 2f 2a 20 41 64 64   1, 1,    /* Add
1ca0: 20 6f 6e 65 20 74 6f 20 74 68 65 20 6f 6c 64 20   one to the old 
1cb0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 2a 2f  schema cookie */
1cc0: 0a 20 20 20 20 20 20 20 33 2c 20 30 2c 20 20 20  .       3, 0,   
1cd0: 20 2f 2a 20 50 72 65 73 65 72 76 65 20 74 68 65   /* Preserve the
1ce0: 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 63 61   default page ca
1cf0: 63 68 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  che size */.    
1d00: 20 20 20 35 2c 20 30 2c 20 20 20 20 2f 2a 20 50     5, 0,    /* P
1d10: 72 65 73 65 72 76 65 20 74 68 65 20 64 65 66 61  reserve the defa
1d20: 75 6c 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ult text encodin
1d30: 67 20 2a 2f 0a 20 20 20 20 20 20 20 36 2c 20 30  g */.       6, 0
1d40: 2c 20 20 20 20 2f 2a 20 50 72 65 73 65 72 76 65  ,    /* Preserve
1d50: 20 74 68 65 20 75 73 65 72 20 76 65 72 73 69 6f   the user versio
1d60: 6e 20 2a 2f 0a 20 20 20 20 7d 3b 0a 0a 20 20 20  n */.    };..   
1d70: 20 61 73 73 65 72 74 28 20 31 3d 3d 73 71 6c 69   assert( 1==sqli
1d80: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
1d90: 73 28 70 54 65 6d 70 29 20 29 3b 0a 20 20 20 20  s(pTemp) );.    
1da0: 61 73 73 65 72 74 28 20 31 3d 3d 73 71 6c 69 74  assert( 1==sqlit
1db0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
1dc0: 28 70 4d 61 69 6e 29 20 29 3b 0a 0a 20 20 20 20  (pMain) );..    
1dd0: 2f 2a 20 43 6f 70 79 20 42 74 72 65 65 20 6d 65  /* Copy Btree me
1de0: 74 61 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  ta values */.   
1df0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1e00: 6f 66 28 61 43 6f 70 79 29 2f 73 69 7a 65 6f 66  of(aCopy)/sizeof
1e10: 28 61 43 6f 70 79 5b 30 5d 29 3b 20 69 2b 3d 32  (aCopy[0]); i+=2
1e20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1e30: 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74  lite3BtreeGetMet
1e40: 61 28 70 4d 61 69 6e 2c 20 61 43 6f 70 79 5b 69  a(pMain, aCopy[i
1e50: 5d 2c 20 26 6d 65 74 61 29 3b 0a 20 20 20 20 20  ], &meta);.     
1e60: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e70: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  OK ) goto end_of
1e80: 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 20 20 72  _vacuum;.      r
1e90: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1ea0: 55 70 64 61 74 65 4d 65 74 61 28 70 54 65 6d 70  UpdateMeta(pTemp
1eb0: 2c 20 61 43 6f 70 79 5b 69 5d 2c 20 6d 65 74 61  , aCopy[i], meta
1ec0: 2b 61 43 6f 70 79 5b 69 2b 31 5d 29 3b 0a 20 20  +aCopy[i+1]);.  
1ed0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ee0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
1ef0: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20  _of_vacuum;.    
1f00: 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  }..    rc = sqli
1f10: 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65  te3BtreeCopyFile
1f20: 28 70 4d 61 69 6e 2c 20 70 54 65 6d 70 29 3b 0a  (pMain, pTemp);.
1f30: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f40: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
1f50: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20  _of_vacuum;.    
1f60: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1f70: 65 43 6f 6d 6d 69 74 28 70 54 65 6d 70 29 3b 0a  eCommit(pTemp);.
1f80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f90: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
1fa0: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20  _of_vacuum;.    
1fb0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1fc0: 65 43 6f 6d 6d 69 74 28 70 4d 61 69 6e 29 3b 0a  eCommit(pMain);.
1fd0: 20 20 7d 0a 0a 65 6e 64 5f 6f 66 5f 76 61 63 75    }..end_of_vacu
1fe0: 75 6d 3a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65  um:.  /* Restore
1ff0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61   the original va
2000: 6c 75 65 20 6f 66 20 64 62 2d 3e 66 6c 61 67 73  lue of db->flags
2010: 20 2a 2f 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   */.  db->flags 
2020: 3d 20 73 61 76 65 64 5f 66 6c 61 67 73 3b 0a 0a  = saved_flags;..
2030: 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 74    /* Currently t
2040: 68 65 72 65 20 69 73 20 61 6e 20 53 51 4c 20 6c  here is an SQL l
2050: 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  evel transaction
2060: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 76 61 63   open on the vac
2070: 75 75 6d 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  uum.  ** databas
2080: 65 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20  e. No locks are 
2090: 68 65 6c 64 20 6f 6e 20 61 6e 79 20 6f 74 68 65  held on any othe
20a0: 72 20 66 69 6c 65 73 20 28 73 69 6e 63 65 20 74  r files (since t
20b0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 0a 20 20 2a  he main file.  *
20c0: 2a 20 77 61 73 20 63 6f 6d 6d 69 74 74 65 64 20  * was committed 
20d0: 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
20e0: 65 6c 29 2e 20 53 6f 20 69 74 20 73 61 66 65 20  el). So it safe 
20f0: 74 6f 20 65 6e 64 20 74 68 65 20 74 72 61 6e 73  to end the trans
2100: 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 62 79 20 6d  action.  ** by m
2110: 61 6e 75 61 6c 6c 79 20 73 65 74 74 69 6e 67 20  anually setting 
2120: 74 68 65 20 61 75 74 6f 43 6f 6d 6d 69 74 20 66  the autoCommit f
2130: 6c 61 67 20 74 6f 20 74 72 75 65 20 61 6e 64 20  lag to true and 
2140: 64 65 74 61 63 68 69 6e 67 20 74 68 65 0a 20 20  detaching the.  
2150: 2a 2a 20 76 61 63 75 75 6d 20 64 61 74 61 62 61  ** vacuum databa
2160: 73 65 2e 20 54 68 65 20 76 61 63 75 75 6d 5f 64  se. The vacuum_d
2170: 62 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  b journal file i
2180: 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  s deleted when t
2190: 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 69 73  he pager.  ** is
21a0: 20 63 6c 6f 73 65 64 20 62 79 20 74 68 65 20 44   closed by the D
21b0: 45 54 41 43 48 2e 0a 20 20 2a 2f 0a 20 20 64 62  ETACH..  */.  db
21c0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
21d0: 3b 0a 0a 20 20 69 66 28 20 70 44 62 20 29 7b 0a  ;..  if( pDb ){.
21e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f      sqlite3Mallo
21f0: 63 44 69 73 61 6c 6c 6f 77 28 29 3b 0a 20 20 20  cDisallow();.   
2200: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
2210: 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  se(pDb->pBt);.  
2220: 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 41    sqlite3MallocA
2230: 6c 6c 6f 77 28 29 3b 0a 20 20 20 20 70 44 62 2d  llow();.    pDb-
2240: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 70 44  >pBt = 0;.    pD
2250: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
2260: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 52 65    }..  sqlite3Re
2270: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
2280: 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 72 65 74  a(db, 0);..  ret
2290: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
22a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
22b0: 5f 56 41 43 55 55 4d 20 26 26 20 53 51 4c 49 54  _VACUUM && SQLIT
22c0: 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 20 2a 2f  E_OMIT_ATTACH */
22d0: 0a                                               .