/ Hex Artifact Content
Login

Artifact 28ee5a4963d16cf2477075d85966c0f461cd79de:


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 2f 0a 23 69 6e 63 6c 75 64 65 20 22  o..*/.#include "
0220: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0230: 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68  clude "vdbeInt.h
0240: 22 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  "..#if !defined(
0250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
0260: 55 4d 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  UM) && !defined(
0270: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41  SQLITE_OMIT_ATTA
0280: 43 48 29 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  CH)./*.** Execut
0290: 65 20 7a 53 71 6c 20 6f 6e 20 64 61 74 61 62 61  e zSql on databa
02a0: 73 65 20 64 62 2e 20 52 65 74 75 72 6e 20 61 6e  se db. Return an
02b0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
02c0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63 53  static int execS
02d0: 71 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ql(sqlite3 *db, 
02e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
02f0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
0300: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 56 56 41 5f  t *pStmt;.  VVA_
0310: 4f 4e 4c 59 28 20 69 6e 74 20 72 63 3b 20 29 0a  ONLY( int rc; ).
0320: 20 20 69 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20    if( !zSql ){. 
0330: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0340: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
0350: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
0360: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
0370: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
0380: 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74  t, 0) ){.    ret
0390: 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 72 72 63  urn sqlite3_errc
03a0: 6f 64 65 28 64 62 29 3b 0a 20 20 7d 0a 20 20 56  ode(db);.  }.  V
03b0: 56 41 5f 4f 4e 4c 59 28 20 72 63 20 3d 20 29 20  VA_ONLY( rc = ) 
03c0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
03d0: 6d 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  mt);.  assert( r
03e0: 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b  c!=SQLITE_ROW );
03f0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
0400: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
0410: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
0420: 75 74 65 20 7a 53 71 6c 20 6f 6e 20 64 61 74 61  ute zSql on data
0430: 62 61 73 65 20 64 62 2e 20 54 68 65 20 73 74 61  base db. The sta
0440: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 65  tement returns e
0450: 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e 65 20 63 6f  xactly.** one co
0460: 6c 75 6d 6e 2e 20 45 78 65 63 75 74 65 20 74 68  lumn. Execute th
0470: 69 73 20 61 73 20 53 51 4c 20 6f 6e 20 74 68 65  is as SQL on the
0480: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e 0a   same database..
0490: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
04a0: 65 63 45 78 65 63 53 71 6c 28 73 71 6c 69 74 65  ecExecSql(sqlite
04b0: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
04c0: 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69  r *zSql){.  sqli
04d0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
04e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
04f0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
0500: 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  re(db, zSql, -1,
0510: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
0520: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
0530: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
0540: 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
0550: 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
0560: 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 72  (pStmt) ){.    r
0570: 63 20 3d 20 65 78 65 63 53 71 6c 28 64 62 2c 20  c = execSql(db, 
0580: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63  (char*)sqlite3_c
0590: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
05a0: 2c 20 30 29 29 3b 0a 20 20 20 20 69 66 28 20 72  , 0));.    if( r
05b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
05c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
05d0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
05e0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
05f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
0600: 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
0610: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a  lize(pStmt);.}..
0620: 2f 2a 0a 2a 2a 20 54 68 65 20 6e 6f 6e 2d 73 74  /*.** The non-st
0630: 61 6e 64 61 72 64 20 56 41 43 55 55 4d 20 63 6f  andard VACUUM co
0640: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
0650: 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 64 61   clean up the da
0660: 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61  tabase,.** colla
0670: 70 73 65 20 66 72 65 65 20 73 70 61 63 65 2c 20  pse free space, 
0680: 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f 64 65  etc.  It is mode
0690: 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 56  lled after the V
06a0: 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  ACUUM command.**
06b0: 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e 0a   in PostgreSQL..
06c0: 2a 2a 0a 2a 2a 20 49 6e 20 76 65 72 73 69 6f 6e  **.** In version
06d0: 20 31 2e 30 2e 78 20 6f 66 20 53 51 4c 69 74 65   1.0.x of SQLite
06e0: 2c 20 74 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  , the VACUUM com
06f0: 6d 61 6e 64 20 77 6f 75 6c 64 20 63 61 6c 6c 0a  mand would call.
0700: 2a 2a 20 67 64 62 6d 5f 72 65 6f 72 67 61 6e 69  ** gdbm_reorgani
0710: 7a 65 28 29 20 6f 6e 20 61 6c 6c 20 74 68 65 20  ze() on all the 
0720: 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 2e  database tables.
0730: 20 20 42 75 74 20 62 65 67 69 6e 6e 69 6e 67 0a    But beginning.
0740: 2a 2a 20 77 69 74 68 20 32 2e 30 2e 30 2c 20 53  ** with 2.0.0, S
0750: 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
0760: 75 73 65 73 20 47 44 42 4d 20 73 6f 20 74 68 69  uses GDBM so thi
0770: 73 20 63 6f 6d 6d 61 6e 64 20 68 61 73 0a 2a 2a  s command has.**
0780: 20 62 65 63 6f 6d 65 20 61 20 6e 6f 2d 6f 70 2e   become a no-op.
0790: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
07a0: 56 61 63 75 75 6d 28 50 61 72 73 65 20 2a 70 50  Vacuum(Parse *pP
07b0: 61 72 73 65 29 7b 0a 20 20 56 64 62 65 20 2a 76  arse){.  Vdbe *v
07c0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
07d0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
07e0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
07f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
0800: 50 5f 56 61 63 75 75 6d 2c 20 30 2c 20 30 29 3b  P_Vacuum, 0, 0);
0810: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
0820: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0830: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
0840: 74 68 65 20 4f 50 5f 56 61 63 75 75 6d 20 6f 70  the OP_Vacuum op
0850: 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
0860: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0870: 52 75 6e 56 61 63 75 75 6d 28 63 68 61 72 20 2a  RunVacuum(char *
0880: 2a 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  *pzErrMsg, sqlit
0890: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
08a0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
08b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
08c0: 65 20 66 72 6f 6d 20 73 65 72 76 69 63 65 20 72  e from service r
08d0: 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 42 74 72  outines */.  Btr
08e0: 65 65 20 2a 70 4d 61 69 6e 3b 20 20 20 20 20 20  ee *pMain;      
08f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
0900: 62 61 73 65 20 62 65 69 6e 67 20 76 61 63 75 75  base being vacuu
0910: 6d 65 64 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  med */.  Btree *
0920: 70 54 65 6d 70 3b 20 20 20 20 20 20 20 20 20 20  pTemp;          
0930: 20 2f 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72   /* The temporar
0940: 79 20 64 61 74 61 62 61 73 65 20 77 65 20 76 61  y database we va
0950: 63 75 75 6d 20 69 6e 74 6f 20 2a 2f 0a 20 20 63  cuum into */.  c
0960: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 30 3b 20 20  har *zSql = 0;  
0970: 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 73 74         /* SQL st
0980: 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  atements */.  in
0990: 74 20 73 61 76 65 64 5f 66 6c 61 67 73 3b 20 20  t saved_flags;  
09a0: 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76        /* Saved v
09b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 64 62 2d 3e  alue of the db->
09c0: 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 73  flags */.  int s
09d0: 61 76 65 64 5f 6e 43 68 61 6e 67 65 3b 20 20 20  aved_nChange;   
09e0: 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75     /* Saved valu
09f0: 65 20 6f 66 20 64 62 2d 3e 6e 43 68 61 6e 67 65  e of db->nChange
0a00: 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f   */.  int saved_
0a10: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 20 2f 2a  nTotalChange; /*
0a20: 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
0a30: 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65  db->nTotalChange
0a40: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 73 61 76   */.  void (*sav
0a50: 65 64 5f 78 54 72 61 63 65 29 28 76 6f 69 64 2a  ed_xTrace)(void*
0a60: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 20 20  ,const char*);  
0a70: 2f 2a 20 53 61 76 65 64 20 64 62 2d 3e 78 54 72  /* Saved db->xTr
0a80: 61 63 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62  ace */.  Db *pDb
0a90: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
0aa0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20   /* Database to 
0ab0: 64 65 74 61 63 68 20 61 74 20 65 6e 64 20 6f 66  detach at end of
0ac0: 20 76 61 63 75 75 6d 20 2a 2f 0a 20 20 69 6e 74   vacuum */.  int
0ad0: 20 69 73 4d 65 6d 44 62 3b 20 20 20 20 20 20 20   isMemDb;       
0ae0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0af0: 76 61 63 75 75 6d 69 6e 67 20 61 20 3a 6d 65 6d  vacuuming a :mem
0b00: 6f 72 79 3a 20 64 61 74 61 62 61 73 65 20 2a 2f  ory: database */
0b10: 0a 20 20 69 6e 74 20 6e 52 65 73 3b 0a 0a 20 20  .  int nRes;..  
0b20: 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d  if( !db->autoCom
0b30: 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
0b40: 65 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72  e3SetString(pzEr
0b50: 72 4d 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f  rMsg, db, "canno
0b60: 74 20 56 41 43 55 55 4d 20 66 72 6f 6d 20 77 69  t VACUUM from wi
0b70: 74 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  thin a transacti
0b80: 6f 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  on");.    return
0b90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
0ba0: 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
0bb0: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
0bc0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
0bd0: 66 6c 61 67 73 20 73 6f 20 74 68 61 74 20 69 74  flags so that it
0be0: 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 72 65   can be .  ** re
0bf0: 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 72 65  stored before re
0c00: 74 75 72 6e 69 6e 67 2e 20 54 68 65 6e 20 73 65  turning. Then se
0c10: 74 20 74 68 65 20 77 72 69 74 61 62 6c 65 2d 73  t the writable-s
0c20: 63 68 65 6d 61 20 66 6c 61 67 2c 20 61 6e 64 0a  chema flag, and.
0c30: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 43 48 45    ** disable CHE
0c40: 43 4b 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  CK and foreign k
0c50: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ey constraints. 
0c60: 20 2a 2f 0a 20 20 73 61 76 65 64 5f 66 6c 61 67   */.  saved_flag
0c70: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
0c80: 20 73 61 76 65 64 5f 6e 43 68 61 6e 67 65 20 3d   saved_nChange =
0c90: 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20   db->nChange;.  
0ca0: 73 61 76 65 64 5f 6e 54 6f 74 61 6c 43 68 61 6e  saved_nTotalChan
0cb0: 67 65 20 3d 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  ge = db->nTotalC
0cc0: 68 61 6e 67 65 3b 0a 20 20 73 61 76 65 64 5f 78  hange;.  saved_x
0cd0: 54 72 61 63 65 20 3d 20 64 62 2d 3e 78 54 72 61  Trace = db->xTra
0ce0: 63 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20  ce;.  db->flags 
0cf0: 7c 3d 20 53 51 4c 49 54 45 5f 57 72 69 74 65 53  |= SQLITE_WriteS
0d00: 63 68 65 6d 61 20 7c 20 53 51 4c 49 54 45 5f 49  chema | SQLITE_I
0d10: 67 6e 6f 72 65 43 68 65 63 6b 73 3b 0a 20 20 64  gnoreChecks;.  d
0d20: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 53 51  b->flags &= ~(SQ
0d30: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
0d40: 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73   | SQLITE_Revers
0d50: 65 4f 72 64 65 72 29 3b 0a 20 20 64 62 2d 3e 78  eOrder);.  db->x
0d60: 54 72 61 63 65 20 3d 20 30 3b 0a 0a 20 20 70 4d  Trace = 0;..  pM
0d70: 61 69 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 30 5d  ain = db->aDb[0]
0d80: 2e 70 42 74 3b 0a 20 20 69 73 4d 65 6d 44 62 20  .pBt;.  isMemDb 
0d90: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
0da0: 4d 65 6d 64 62 28 73 71 6c 69 74 65 33 42 74 72  Memdb(sqlite3Btr
0db0: 65 65 50 61 67 65 72 28 70 4d 61 69 6e 29 29 3b  eePager(pMain));
0dc0: 0a 0a 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68  ..  /* Attach th
0dd0: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  e temporary data
0de0: 62 61 73 65 20 61 73 20 27 76 61 63 75 75 6d 5f  base as 'vacuum_
0df0: 64 62 27 2e 20 54 68 65 20 73 79 6e 63 68 72 6f  db'. The synchro
0e00: 6e 6f 75 73 20 70 72 61 67 6d 61 0a 20 20 2a 2a  nous pragma.  **
0e10: 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f 20 27   can be set to '
0e20: 6f 66 66 27 20 66 6f 72 20 74 68 69 73 20 66 69  off' for this fi
0e30: 6c 65 2c 20 61 73 20 69 74 20 69 73 20 6e 6f 74  le, as it is not
0e40: 20 72 65 63 6f 76 65 72 65 64 20 69 66 20 61 20   recovered if a 
0e50: 63 72 61 73 68 0a 20 20 2a 2a 20 6f 63 63 75 72  crash.  ** occur
0e60: 73 20 61 6e 79 77 61 79 2e 20 54 68 65 20 69 6e  s anyway. The in
0e70: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 64  tegrity of the d
0e80: 61 74 61 62 61 73 65 20 69 73 20 6d 61 69 6e 74  atabase is maint
0e90: 61 69 6e 65 64 20 62 79 20 61 0a 20 20 2a 2a 20  ained by a.  ** 
0ea0: 28 70 6f 73 73 69 62 6c 79 20 73 79 6e 63 68 72  (possibly synchr
0eb0: 6f 6e 6f 75 73 29 20 74 72 61 6e 73 61 63 74 69  onous) transacti
0ec0: 6f 6e 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  on opened on the
0ed0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 62   main database b
0ee0: 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74  efore.  ** sqlit
0ef0: 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28  e3BtreeCopyFile(
0f00: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a  ) is called..  *
0f10: 2a 0a 20 20 2a 2a 20 41 6e 20 6f 70 74 69 6d 69  *.  ** An optimi
0f20: 73 61 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20  sation would be 
0f30: 74 6f 20 75 73 65 20 61 20 6e 6f 6e 2d 6a 6f 75  to use a non-jou
0f40: 72 6e 61 6c 65 64 20 70 61 67 65 72 2e 0a 20 20  rnaled pager..  
0f50: 2a 2a 20 28 4c 61 74 65 72 3a 29 20 49 20 74 72  ** (Later:) I tr
0f60: 69 65 64 20 73 65 74 74 69 6e 67 20 22 50 52 41  ied setting "PRA
0f70: 47 4d 41 20 76 61 63 75 75 6d 5f 64 62 2e 6a 6f  GMA vacuum_db.jo
0f80: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22 20  urnal_mode=OFF" 
0f90: 62 75 74 0a 20 20 2a 2a 20 74 68 61 74 20 61 63  but.  ** that ac
0fa0: 74 75 61 6c 6c 79 20 6d 61 64 65 20 74 68 65 20  tually made the 
0fb0: 56 41 43 55 55 4d 20 72 75 6e 20 73 6c 6f 77 65  VACUUM run slowe
0fc0: 72 2e 20 20 56 65 72 79 20 6c 69 74 74 6c 65 20  r.  Very little 
0fd0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 0a 20 20 2a 2a  journalling.  **
0fe0: 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 73   actually occurs
0ff0: 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 76 61   when doing a va
1000: 63 75 75 6d 20 73 69 6e 63 65 20 74 68 65 20 76  cuum since the v
1010: 61 63 75 75 6d 5f 64 62 20 69 73 20 69 6e 69 74  acuum_db is init
1020: 69 61 6c 6c 79 0a 20 20 2a 2a 20 65 6d 70 74 79  ially.  ** empty
1030: 2e 20 20 4f 6e 6c 79 20 74 68 65 20 6a 6f 75 72  .  Only the jour
1040: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
1050: 69 74 74 65 6e 2e 20 20 41 70 70 61 72 65 6e 74  itten.  Apparent
1060: 6c 79 20 69 74 20 74 61 6b 65 73 20 6d 6f 72 65  ly it takes more
1070: 0a 20 20 2a 2a 20 74 69 6d 65 20 74 6f 20 70 61  .  ** time to pa
1080: 72 73 65 20 61 6e 64 20 72 75 6e 20 74 68 65 20  rse and run the 
1090: 50 52 41 47 4d 41 20 74 6f 20 74 75 72 6e 20 6a  PRAGMA to turn j
10a0: 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66 66 20 74  ournalling off t
10b0: 68 61 6e 20 69 74 20 64 6f 65 73 0a 20 20 2a 2a  han it does.  **
10c0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6a 6f   to write the jo
10d0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
10e0: 65 2e 0a 20 20 2a 2f 0a 20 20 7a 53 71 6c 20 3d  e..  */.  zSql =
10f0: 20 22 41 54 54 41 43 48 20 27 27 20 41 53 20 76   "ATTACH '' AS v
1100: 61 63 75 75 6d 5f 64 62 3b 22 3b 0a 20 20 72 63  acuum_db;";.  rc
1110: 20 3d 20 65 78 65 63 53 71 6c 28 64 62 2c 20 7a   = execSql(db, z
1120: 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Sql);.  if( rc!=
1130: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1140: 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a   end_of_vacuum;.
1150: 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62    pDb = &db->aDb
1160: 5b 64 62 2d 3e 6e 44 62 2d 31 5d 3b 0a 20 20 61  [db->nDb-1];.  a
1170: 73 73 65 72 74 28 20 73 74 72 63 6d 70 28 64 62  ssert( strcmp(db
1180: 2d 3e 61 44 62 5b 64 62 2d 3e 6e 44 62 2d 31 5d  ->aDb[db->nDb-1]
1190: 2e 7a 4e 61 6d 65 2c 22 76 61 63 75 75 6d 5f 64  .zName,"vacuum_d
11a0: 62 22 29 3d 3d 30 20 29 3b 0a 20 20 70 54 65 6d  b")==0 );.  pTem
11b0: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 64 62 2d 3e  p = db->aDb[db->
11c0: 6e 44 62 2d 31 5d 2e 70 42 74 3b 0a 0a 20 20 2f  nDb-1].pBt;..  /
11d0: 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 65 78  * The call to ex
11e0: 65 63 53 71 6c 28 29 20 74 6f 20 61 74 74 61 63  ecSql() to attac
11f0: 68 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  h the temp datab
1200: 61 73 65 20 68 61 73 20 6c 65 66 74 20 74 68 65  ase has left the
1210: 20 66 69 6c 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65   file.  ** locke
1220: 64 20 28 61 73 20 74 68 65 72 65 20 77 61 73 20  d (as there was 
1230: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 63  more than one ac
1240: 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20 77  tive statement w
1250: 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
1260: 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 72 65 61 64  ion.  ** to read
1270: 20 74 68 65 20 73 63 68 65 6d 61 20 77 61 73 20   the schema was 
1280: 63 6f 6e 63 6c 75 64 65 64 2e 20 55 6e 6c 6f 63  concluded. Unloc
1290: 6b 20 69 74 20 68 65 72 65 20 73 6f 20 74 68 61  k it here so tha
12a0: 74 20 74 68 69 73 20 64 6f 65 73 6e 27 74 0a 20  t this doesn't. 
12b0: 20 2a 2a 20 63 61 75 73 65 20 70 72 6f 62 6c 65   ** cause proble
12c0: 6d 73 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 20  ms for the call 
12d0: 74 6f 20 42 74 72 65 65 53 65 74 50 61 67 65 53  to BtreeSetPageS
12e0: 69 7a 65 28 29 20 62 65 6c 6f 77 2e 20 20 2a 2f  ize() below.  */
12f0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  .  sqlite3BtreeC
1300: 6f 6d 6d 69 74 28 70 54 65 6d 70 29 3b 0a 0a 20  ommit(pTemp);.. 
1310: 20 6e 52 65 73 20 3d 20 73 71 6c 69 74 65 33 42   nRes = sqlite3B
1320: 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 70  treeGetReserve(p
1330: 4d 61 69 6e 29 3b 0a 0a 20 20 2f 2a 20 41 20 56  Main);..  /* A V
1340: 41 43 55 55 4d 20 63 61 6e 6e 6f 74 20 63 68 61  ACUUM cannot cha
1350: 6e 67 65 20 74 68 65 20 70 61 67 65 73 69 7a 65  nge the pagesize
1360: 20 6f 66 20 61 6e 20 65 6e 63 72 79 70 74 65 64   of an encrypted
1370: 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 23 69   database. */.#i
1380: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
1390: 43 4f 44 45 43 0a 20 20 69 66 28 20 64 62 2d 3e  CODEC.  if( db->
13a0: 6e 65 78 74 50 61 67 65 73 69 7a 65 20 29 7b 0a  nextPagesize ){.
13b0: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
13c0: 73 71 6c 69 74 65 33 43 6f 64 65 63 47 65 74 4b  sqlite3CodecGetK
13d0: 65 79 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74  ey(sqlite3*, int
13e0: 2c 20 76 6f 69 64 2a 2a 2c 20 69 6e 74 2a 29 3b  , void**, int*);
13f0: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
1400: 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20     char *zKey;. 
1410: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 63 47     sqlite3CodecG
1420: 65 74 4b 65 79 28 64 62 2c 20 30 2c 20 28 76 6f  etKey(db, 0, (vo
1430: 69 64 2a 2a 29 26 7a 4b 65 79 2c 20 26 6e 4b 65  id**)&zKey, &nKe
1440: 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 79  y);.    if( nKey
1450: 20 29 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73   ) db->nextPages
1460: 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  ize = 0;.  }.#en
1470: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
1480: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
1490: 7a 65 28 70 54 65 6d 70 2c 20 73 71 6c 69 74 65  ze(pTemp, sqlite
14a0: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
14b0: 65 28 70 4d 61 69 6e 29 2c 20 6e 52 65 73 2c 20  e(pMain), nRes, 
14c0: 30 29 0a 20 20 20 7c 7c 20 28 21 69 73 4d 65 6d  0).   || (!isMem
14d0: 44 62 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  Db && sqlite3Btr
14e0: 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70 54  eeSetPageSize(pT
14f0: 65 6d 70 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67  emp, db->nextPag
1500: 65 73 69 7a 65 2c 20 6e 52 65 73 2c 20 30 29 29  esize, nRes, 0))
1510: 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d  .   || NEVER(db-
1520: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20  >mallocFailed). 
1530: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1540: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
1550: 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75  oto end_of_vacuu
1560: 6d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 65 78  m;.  }.  rc = ex
1570: 65 63 53 71 6c 28 64 62 2c 20 22 50 52 41 47 4d  ecSql(db, "PRAGM
1580: 41 20 76 61 63 75 75 6d 5f 64 62 2e 73 79 6e 63  A vacuum_db.sync
1590: 68 72 6f 6e 6f 75 73 3d 4f 46 46 22 29 3b 0a 20  hronous=OFF");. 
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 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
15c0: 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20  nd_of_vacuum;.  
15d0: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15e0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
15f0: 4d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  M.  sqlite3Btree
1600: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 70 54  SetAutoVacuum(pT
1610: 65 6d 70 2c 20 64 62 2d 3e 6e 65 78 74 41 75 74  emp, db->nextAut
1620: 6f 76 61 63 3e 3d 30 20 3f 20 64 62 2d 3e 6e 65  ovac>=0 ? db->ne
1630: 78 74 41 75 74 6f 76 61 63 20 3a 0a 20 20 20 20  xtAutovac :.    
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1670: 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
1680: 28 70 4d 61 69 6e 29 29 3b 0a 23 65 6e 64 69 66  (pMain));.#endif
1690: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 74  ..  /* Begin a t
16a0: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
16b0: 72 63 20 3d 20 65 78 65 63 53 71 6c 28 64 62 2c  rc = execSql(db,
16c0: 20 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56   "BEGIN EXCLUSIV
16d0: 45 3b 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  E;");.  if( rc!=
16e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
16f0: 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a   end_of_vacuum;.
1700: 0a 20 20 2f 2a 20 51 75 65 72 79 20 74 68 65 20  .  /* Query the 
1710: 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 6d 61  schema of the ma
1720: 69 6e 20 64 61 74 61 62 61 73 65 2e 20 43 72 65  in database. Cre
1730: 61 74 65 20 61 20 6d 69 72 72 6f 72 20 73 63 68  ate a mirror sch
1740: 65 6d 61 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ema.  ** in the 
1750: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
1760: 73 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  se..  */.  rc = 
1770: 65 78 65 63 45 78 65 63 53 71 6c 28 64 62 2c 20  execExecSql(db, 
1780: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 27  .      "SELECT '
1790: 43 52 45 41 54 45 20 54 41 42 4c 45 20 76 61 63  CREATE TABLE vac
17a0: 75 75 6d 5f 64 62 2e 27 20 7c 7c 20 73 75 62 73  uum_db.' || subs
17b0: 74 72 28 73 71 6c 2c 31 34 29 20 22 0a 20 20 20  tr(sql,14) ".   
17c0: 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c 69 74     "  FROM sqlit
17d0: 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45 20 74  e_master WHERE t
17e0: 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  ype='table' AND 
17f0: 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65  name!='sqlite_se
1800: 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 22  quence'".      "
1810: 20 20 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3e     AND rootpage>
1820: 30 22 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  0".  );.  if( rc
1830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1840: 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d  to end_of_vacuum
1850: 3b 0a 20 20 72 63 20 3d 20 65 78 65 63 45 78 65  ;.  rc = execExe
1860: 63 53 71 6c 28 64 62 2c 20 0a 20 20 20 20 20 20  cSql(db, .      
1870: 22 53 45 4c 45 43 54 20 27 43 52 45 41 54 45 20  "SELECT 'CREATE 
1880: 49 4e 44 45 58 20 76 61 63 75 75 6d 5f 64 62 2e  INDEX vacuum_db.
1890: 27 20 7c 7c 20 73 75 62 73 74 72 28 73 71 6c 2c  ' || substr(sql,
18a0: 31 34 29 22 0a 20 20 20 20 20 20 22 20 20 46 52  14)".      "  FR
18b0: 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
18c0: 20 57 48 45 52 45 20 73 71 6c 20 4c 49 4b 45 20   WHERE sql LIKE 
18d0: 27 43 52 45 41 54 45 20 49 4e 44 45 58 20 25 27  'CREATE INDEX %'
18e0: 20 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   ");.  if( rc!=S
18f0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1900: 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20  end_of_vacuum;. 
1910: 20 72 63 20 3d 20 65 78 65 63 45 78 65 63 53 71   rc = execExecSq
1920: 6c 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45  l(db, .      "SE
1930: 4c 45 43 54 20 27 43 52 45 41 54 45 20 55 4e 49  LECT 'CREATE UNI
1940: 51 55 45 20 49 4e 44 45 58 20 76 61 63 75 75 6d  QUE INDEX vacuum
1950: 5f 64 62 2e 27 20 7c 7c 20 73 75 62 73 74 72 28  _db.' || substr(
1960: 73 71 6c 2c 32 31 29 20 22 0a 20 20 20 20 20 20  sql,21) ".      
1970: 22 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  "  FROM sqlite_m
1980: 61 73 74 65 72 20 57 48 45 52 45 20 73 71 6c 20  aster WHERE sql 
1990: 4c 49 4b 45 20 27 43 52 45 41 54 45 20 55 4e 49  LIKE 'CREATE UNI
19a0: 51 55 45 20 49 4e 44 45 58 20 25 27 22 29 3b 0a  QUE INDEX %'");.
19b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19c0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f  _OK ) goto end_o
19d0: 66 5f 76 61 63 75 75 6d 3b 0a 0a 20 20 2f 2a 20  f_vacuum;..  /* 
19e0: 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65  Loop through the
19f0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6d   tables in the m
1a00: 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 46 6f  ain database. Fo
1a10: 72 20 65 61 63 68 2c 20 64 6f 0a 20 20 2a 2a 20  r each, do.  ** 
1a20: 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  an "INSERT INTO 
1a30: 76 61 63 75 75 6d 5f 64 62 2e 78 78 78 20 53 45  vacuum_db.xxx SE
1a40: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6e  LECT * FROM main
1a50: 2e 78 78 78 3b 22 20 74 6f 20 63 6f 70 79 0a 20  .xxx;" to copy. 
1a60: 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73   ** the contents
1a70: 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72   to the temporar
1a80: 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  y database..  */
1a90: 0a 20 20 72 63 20 3d 20 65 78 65 63 45 78 65 63  .  rc = execExec
1aa0: 53 71 6c 28 64 62 2c 20 0a 20 20 20 20 20 20 22  Sql(db, .      "
1ab0: 53 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20 49  SELECT 'INSERT I
1ac0: 4e 54 4f 20 76 61 63 75 75 6d 5f 64 62 2e 27 20  NTO vacuum_db.' 
1ad0: 7c 7c 20 71 75 6f 74 65 28 6e 61 6d 65 29 20 22  || quote(name) "
1ae0: 0a 20 20 20 20 20 20 22 7c 7c 20 27 20 53 45 4c  .      "|| ' SEL
1af0: 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6e 2e  ECT * FROM main.
1b00: 27 20 7c 7c 20 71 75 6f 74 65 28 6e 61 6d 65 29  ' || quote(name)
1b10: 20 7c 7c 20 27 3b 27 22 0a 20 20 20 20 20 20 22   || ';'".      "
1b20: 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65  FROM main.sqlite
1b30: 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
1b40: 22 57 48 45 52 45 20 74 79 70 65 20 3d 20 27 74  "WHERE type = 't
1b50: 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65 21 3d  able' AND name!=
1b60: 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  'sqlite_sequence
1b70: 27 20 22 0a 20 20 20 20 20 20 22 20 20 41 4e 44  ' ".      "  AND
1b80: 20 72 6f 6f 74 70 61 67 65 3e 30 22 0a 0a 20 20   rootpage>0"..  
1b90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1ba0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
1bb0: 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 0a 20 20  d_of_vacuum;..  
1bc0: 2f 2a 20 43 6f 70 79 20 6f 76 65 72 20 74 68 65  /* Copy over the
1bd0: 20 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 0a   sequence table.
1be0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 65 78 65 63    */.  rc = exec
1bf0: 45 78 65 63 53 71 6c 28 64 62 2c 20 0a 20 20 20  ExecSql(db, .   
1c00: 20 20 20 22 53 45 4c 45 43 54 20 27 44 45 4c 45     "SELECT 'DELE
1c10: 54 45 20 46 52 4f 4d 20 76 61 63 75 75 6d 5f 64  TE FROM vacuum_d
1c20: 62 2e 27 20 7c 7c 20 71 75 6f 74 65 28 6e 61 6d  b.' || quote(nam
1c30: 65 29 20 7c 7c 20 27 3b 27 20 22 0a 20 20 20 20  e) || ';' ".    
1c40: 20 20 22 46 52 4f 4d 20 76 61 63 75 75 6d 5f 64    "FROM vacuum_d
1c50: 62 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  b.sqlite_master 
1c60: 57 48 45 52 45 20 6e 61 6d 65 3d 27 73 71 6c 69  WHERE name='sqli
1c70: 74 65 5f 73 65 71 75 65 6e 63 65 27 20 22 0a 20  te_sequence' ". 
1c80: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
1c90: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
1ca0: 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20  nd_of_vacuum;.  
1cb0: 72 63 20 3d 20 65 78 65 63 45 78 65 63 53 71 6c  rc = execExecSql
1cc0: 28 64 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c  (db, .      "SEL
1cd0: 45 43 54 20 27 49 4e 53 45 52 54 20 49 4e 54 4f  ECT 'INSERT INTO
1ce0: 20 76 61 63 75 75 6d 5f 64 62 2e 27 20 7c 7c 20   vacuum_db.' || 
1cf0: 71 75 6f 74 65 28 6e 61 6d 65 29 20 22 0a 20 20  quote(name) ".  
1d00: 20 20 20 20 22 7c 7c 20 27 20 53 45 4c 45 43 54      "|| ' SELECT
1d10: 20 2a 20 46 52 4f 4d 20 6d 61 69 6e 2e 27 20 7c   * FROM main.' |
1d20: 7c 20 71 75 6f 74 65 28 6e 61 6d 65 29 20 7c 7c  | quote(name) ||
1d30: 20 27 3b 27 20 22 0a 20 20 20 20 20 20 22 46 52   ';' ".      "FR
1d40: 4f 4d 20 76 61 63 75 75 6d 5f 64 62 2e 73 71 6c  OM vacuum_db.sql
1d50: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
1d60: 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73   name=='sqlite_s
1d70: 65 71 75 65 6e 63 65 27 3b 22 0a 20 20 29 3b 0a  equence';".  );.
1d80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d90: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f  _OK ) goto end_o
1da0: 66 5f 76 61 63 75 75 6d 3b 0a 0a 0a 20 20 2f 2a  f_vacuum;...  /*
1db0: 20 43 6f 70 79 20 74 68 65 20 74 72 69 67 67 65   Copy the trigge
1dc0: 72 73 2c 20 76 69 65 77 73 2c 20 61 6e 64 20 76  rs, views, and v
1dd0: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 66 72  irtual tables fr
1de0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  om the main data
1df0: 62 61 73 65 0a 20 20 2a 2a 20 6f 76 65 72 20 74  base.  ** over t
1e00: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  o the temporary 
1e10: 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20  database.  None 
1e20: 6f 66 20 74 68 65 73 65 20 6f 62 6a 65 63 74 73  of these objects
1e30: 20 68 61 73 20 61 6e 79 0a 20 20 2a 2a 20 61 73   has any.  ** as
1e40: 73 6f 63 69 61 74 65 64 20 73 74 6f 72 61 67 65  sociated storage
1e50: 2c 20 73 6f 20 61 6c 6c 20 77 65 20 68 61 76 65  , so all we have
1e60: 20 74 6f 20 64 6f 20 69 73 20 63 6f 70 79 20 74   to do is copy t
1e70: 68 65 69 72 20 65 6e 74 72 69 65 73 0a 20 20 2a  heir entries.  *
1e80: 2a 20 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54  * from the SQLIT
1e90: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 0a  E_MASTER table..
1ea0: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 65 78 65 63    */.  rc = exec
1eb0: 53 71 6c 28 64 62 2c 0a 20 20 20 20 20 20 22 49  Sql(db,.      "I
1ec0: 4e 53 45 52 54 20 49 4e 54 4f 20 76 61 63 75 75  NSERT INTO vacuu
1ed0: 6d 5f 64 62 2e 73 71 6c 69 74 65 5f 6d 61 73 74  m_db.sqlite_mast
1ee0: 65 72 20 22 0a 20 20 20 20 20 20 22 20 20 53 45  er ".      "  SE
1ef0: 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 2c  LECT type, name,
1f00: 20 74 62 6c 5f 6e 61 6d 65 2c 20 72 6f 6f 74 70   tbl_name, rootp
1f10: 61 67 65 2c 20 73 71 6c 22 0a 20 20 20 20 20 20  age, sql".      
1f20: 22 20 20 20 20 46 52 4f 4d 20 6d 61 69 6e 2e 73  "    FROM main.s
1f30: 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
1f40: 20 20 20 20 22 20 20 20 57 48 45 52 45 20 74 79      "   WHERE ty
1f50: 70 65 3d 27 76 69 65 77 27 20 4f 52 20 74 79 70  pe='view' OR typ
1f60: 65 3d 27 74 72 69 67 67 65 72 27 22 0a 20 20 20  e='trigger'".   
1f70: 20 20 20 22 20 20 20 20 20 20 4f 52 20 28 74 79     "      OR (ty
1f80: 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 72  pe='table' AND r
1f90: 6f 6f 74 70 61 67 65 3d 30 29 22 0a 20 20 29 3b  ootpage=0)".  );
1fa0: 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
1fb0: 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a   end_of_vacuum;.
1fc0: 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
1fd0: 69 6e 74 2c 20 75 6e 6c 65 73 73 20 74 68 65 20  int, unless the 
1fe0: 6d 61 69 6e 20 64 62 20 77 61 73 20 63 6f 6d 70  main db was comp
1ff0: 6c 65 74 65 6c 79 20 65 6d 70 74 79 2c 20 74 68  letely empty, th
2000: 65 72 65 20 69 73 20 6e 6f 77 20 61 0a 20 20 2a  ere is now a.  *
2010: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  * transaction op
2020: 65 6e 20 6f 6e 20 74 68 65 20 76 61 63 75 75 6d  en on the vacuum
2030: 20 64 61 74 61 62 61 73 65 2c 20 62 75 74 20 6e   database, but n
2040: 6f 74 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ot on the main d
2050: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20 4f 70  atabase..  ** Op
2060: 65 6e 20 61 20 62 74 72 65 65 20 6c 65 76 65 6c  en a btree level
2070: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20   transaction on 
2080: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2090: 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 61  e. This allows a
20a0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
20b0: 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69  lite3BtreeCopyFi
20c0: 6c 65 28 29 2e 20 54 68 65 20 6d 61 69 6e 20 64  le(). The main d
20d0: 61 74 61 62 61 73 65 20 62 74 72 65 65 20 6c 65  atabase btree le
20e0: 76 65 6c 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63  vel.  ** transac
20f0: 74 69 6f 6e 20 69 73 20 74 68 65 6e 20 63 6f 6d  tion is then com
2100: 6d 69 74 74 65 64 2c 20 73 6f 20 74 68 65 20 53  mitted, so the S
2110: 51 4c 20 6c 65 76 65 6c 20 6e 65 76 65 72 20 6b  QL level never k
2120: 6e 6f 77 73 20 69 74 20 77 61 73 0a 20 20 2a 2a  nows it was.  **
2130: 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
2140: 69 6e 67 2e 20 54 68 69 73 20 77 61 79 2c 20 74  ing. This way, t
2150: 68 65 20 53 51 4c 20 74 72 61 6e 73 61 63 74 69  he SQL transacti
2160: 6f 6e 20 75 73 65 64 20 74 6f 20 63 72 65 61 74  on used to creat
2170: 65 20 74 68 65 0a 20 20 2a 2a 20 74 65 6d 70 6f  e the.  ** tempo
2180: 72 61 72 79 20 64 61 74 61 62 61 73 65 20 6e 65  rary database ne
2190: 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ver needs to be 
21a0: 63 6f 6d 6d 69 74 74 65 64 2e 0a 20 20 2a 2f 0a  committed..  */.
21b0: 20 20 7b 0a 20 20 20 20 75 33 32 20 6d 65 74 61    {.    u32 meta
21c0: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
21d0: 20 20 2f 2a 20 54 68 69 73 20 61 72 72 61 79 20    /* This array 
21e0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
21f0: 20 6d 65 74 61 20 6d 65 74 61 20 76 61 6c 75 65   meta meta value
2200: 73 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20  s are preserved 
2210: 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61  in the.    ** va
2220: 63 75 75 6d 2e 20 20 45 76 65 6e 20 65 6e 74 72  cuum.  Even entr
2230: 69 65 73 20 61 72 65 20 74 68 65 20 6d 65 74 61  ies are the meta
2240: 20 76 61 6c 75 65 20 6e 75 6d 62 65 72 20 61 6e   value number an
2250: 64 20 6f 64 64 20 65 6e 74 72 69 65 73 0a 20 20  d odd entries.  
2260: 20 20 2a 2a 20 61 72 65 20 61 6e 20 69 6e 63 72    ** are an incr
2270: 65 6d 65 6e 74 20 74 6f 20 61 70 70 6c 79 20 74  ement to apply t
2280: 6f 20 74 68 65 20 6d 65 74 61 20 76 61 6c 75 65  o the meta value
2290: 20 61 66 74 65 72 20 74 68 65 20 76 61 63 75 75   after the vacuu
22a0: 6d 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e  m..    ** The in
22b0: 63 72 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20  crement is used 
22c0: 74 6f 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  to increase the 
22d0: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 73 6f  schema cookie so
22e0: 20 74 68 61 74 20 6f 74 68 65 72 0a 20 20 20 20   that other.    
22f0: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  ** connections t
2300: 6f 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  o the same datab
2310: 61 73 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f  ase will know to
2320: 20 72 65 72 65 61 64 20 74 68 65 20 73 63 68 65   reread the sche
2330: 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ma..    */.    s
2340: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
2350: 67 6e 65 64 20 63 68 61 72 20 61 43 6f 70 79 5b  gned char aCopy[
2360: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 42 54 52  ] = {.       BTR
2370: 45 45 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f  EE_SCHEMA_VERSIO
2380: 4e 2c 20 20 20 20 20 31 2c 20 20 2f 2a 20 41 64  N,     1,  /* Ad
2390: 64 20 6f 6e 65 20 74 6f 20 74 68 65 20 6f 6c 64  d one to the old
23a0: 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 2a   schema cookie *
23b0: 2f 0a 20 20 20 20 20 20 20 42 54 52 45 45 5f 44  /.       BTREE_D
23c0: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
23d0: 45 2c 20 30 2c 20 20 2f 2a 20 50 72 65 73 65 72  E, 0,  /* Preser
23e0: 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ve the default p
23f0: 61 67 65 20 63 61 63 68 65 20 73 69 7a 65 20 2a  age cache size *
2400: 2f 0a 20 20 20 20 20 20 20 42 54 52 45 45 5f 54  /.       BTREE_T
2410: 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c 20 20 20  EXT_ENCODING,   
2420: 20 20 20 30 2c 20 20 2f 2a 20 50 72 65 73 65 72     0,  /* Preser
2430: 76 65 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  ve the text enco
2440: 64 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 20 42  ding */.       B
2450: 54 52 45 45 5f 55 53 45 52 5f 56 45 52 53 49 4f  TREE_USER_VERSIO
2460: 4e 2c 20 20 20 20 20 20 20 30 2c 20 20 2f 2a 20  N,       0,  /* 
2470: 50 72 65 73 65 72 76 65 20 74 68 65 20 75 73 65  Preserve the use
2480: 72 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20  r version */.   
2490: 20 7d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   };..    assert(
24a0: 20 31 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65   1==sqlite3Btree
24b0: 49 73 49 6e 54 72 61 6e 73 28 70 54 65 6d 70 29  IsInTrans(pTemp)
24c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
24d0: 31 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49  1==sqlite3BtreeI
24e0: 73 49 6e 54 72 61 6e 73 28 70 4d 61 69 6e 29 20  sInTrans(pMain) 
24f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  );..    /* Copy 
2500: 42 74 72 65 65 20 6d 65 74 61 20 76 61 6c 75 65  Btree meta value
2510: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  s */.    for(i=0
2520: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 43  ; i<ArraySize(aC
2530: 6f 70 79 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  opy); i+=2){.   
2540: 20 20 20 2f 2a 20 47 65 74 4d 65 74 61 28 29 20     /* GetMeta() 
2550: 61 6e 64 20 55 70 64 61 74 65 4d 65 74 61 28 29  and UpdateMeta()
2560: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
2570: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 62 65 63  this context bec
2580: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 77 65  ause.      ** we
2590: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 70 61   already have pa
25a0: 67 65 20 31 20 6c 6f 61 64 65 64 20 69 6e 74 6f  ge 1 loaded into
25b0: 20 63 61 63 68 65 20 61 6e 64 20 6d 61 72 6b 65   cache and marke
25c0: 64 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20 20 20  d dirty. */.    
25d0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
25e0: 74 4d 65 74 61 28 70 4d 61 69 6e 2c 20 61 43 6f  tMeta(pMain, aCo
25f0: 70 79 5b 69 5d 2c 20 26 6d 65 74 61 29 3b 0a 20  py[i], &meta);. 
2600: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2610: 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
2620: 28 70 54 65 6d 70 2c 20 61 43 6f 70 79 5b 69 5d  (pTemp, aCopy[i]
2630: 2c 20 6d 65 74 61 2b 61 43 6f 70 79 5b 69 2b 31  , meta+aCopy[i+1
2640: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 45  ]);.      if( NE
2650: 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  VER(rc!=SQLITE_O
2660: 4b 29 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  K) ) goto end_of
2670: 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 7d 0a 0a  _vacuum;.    }..
2680: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2690: 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70 4d  BtreeCopyFile(pM
26a0: 61 69 6e 2c 20 70 54 65 6d 70 29 3b 0a 20 20 20  ain, pTemp);.   
26b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26c0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  OK ) goto end_of
26d0: 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 72 63 20  _vacuum;.    rc 
26e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
26f0: 6d 6d 69 74 28 70 54 65 6d 70 29 3b 0a 20 20 20  mmit(pTemp);.   
2700: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2710: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  OK ) goto end_of
2720: 5f 76 61 63 75 75 6d 3b 0a 23 69 66 6e 64 65 66  _vacuum;.#ifndef
2730: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2740: 4f 56 41 43 55 55 4d 0a 20 20 20 20 73 71 6c 69  OVACUUM.    sqli
2750: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
2760: 61 63 75 75 6d 28 70 4d 61 69 6e 2c 20 73 71 6c  acuum(pMain, sql
2770: 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
2780: 56 61 63 75 75 6d 28 70 54 65 6d 70 29 29 3b 0a  Vacuum(pTemp));.
2790: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73  #endif.  }..  as
27a0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
27b0: 5f 4f 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  _OK );.  rc = sq
27c0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
27d0: 65 53 69 7a 65 28 70 4d 61 69 6e 2c 20 73 71 6c  eSize(pMain, sql
27e0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
27f0: 53 69 7a 65 28 70 54 65 6d 70 29 2c 20 6e 52 65  Size(pTemp), nRe
2800: 73 2c 31 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 76 61  s,1);..end_of_va
2810: 63 75 75 6d 3a 0a 20 20 2f 2a 20 52 65 73 74 6f  cuum:.  /* Resto
2820: 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
2830: 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 66 6c 61  value of db->fla
2840: 67 73 20 2a 2f 0a 20 20 64 62 2d 3e 66 6c 61 67  gs */.  db->flag
2850: 73 20 3d 20 73 61 76 65 64 5f 66 6c 61 67 73 3b  s = saved_flags;
2860: 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
2870: 20 73 61 76 65 64 5f 6e 43 68 61 6e 67 65 3b 0a   saved_nChange;.
2880: 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
2890: 67 65 20 3d 20 73 61 76 65 64 5f 6e 54 6f 74 61  ge = saved_nTota
28a0: 6c 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 78  lChange;.  db->x
28b0: 54 72 61 63 65 20 3d 20 73 61 76 65 64 5f 78 54  Trace = saved_xT
28c0: 72 61 63 65 3b 0a 0a 20 20 2f 2a 20 43 75 72 72  race;..  /* Curr
28d0: 65 6e 74 6c 79 20 74 68 65 72 65 20 69 73 20 61  ently there is a
28e0: 6e 20 53 51 4c 20 6c 65 76 65 6c 20 74 72 61 6e  n SQL level tran
28f0: 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20  saction open on 
2900: 74 68 65 20 76 61 63 75 75 6d 0a 20 20 2a 2a 20  the vacuum.  ** 
2910: 64 61 74 61 62 61 73 65 2e 20 4e 6f 20 6c 6f 63  database. No loc
2920: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  ks are held on a
2930: 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 73 20 28  ny other files (
2940: 73 69 6e 63 65 20 74 68 65 20 6d 61 69 6e 20 66  since the main f
2950: 69 6c 65 0a 20 20 2a 2a 20 77 61 73 20 63 6f 6d  ile.  ** was com
2960: 6d 69 74 74 65 64 20 61 74 20 74 68 65 20 62 74  mitted at the bt
2970: 72 65 65 20 6c 65 76 65 6c 29 2e 20 53 6f 20 69  ree level). So i
2980: 74 20 73 61 66 65 20 74 6f 20 65 6e 64 20 74 68  t safe to end th
2990: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
29a0: 2a 2a 20 62 79 20 6d 61 6e 75 61 6c 6c 79 20 73  ** by manually s
29b0: 65 74 74 69 6e 67 20 74 68 65 20 61 75 74 6f 43  etting the autoC
29c0: 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20 74 72  ommit flag to tr
29d0: 75 65 20 61 6e 64 20 64 65 74 61 63 68 69 6e 67  ue and detaching
29e0: 20 74 68 65 0a 20 20 2a 2a 20 76 61 63 75 75 6d   the.  ** vacuum
29f0: 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 76   database. The v
2a00: 61 63 75 75 6d 5f 64 62 20 6a 6f 75 72 6e 61 6c  acuum_db journal
2a10: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
2a20: 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 0a   when the pager.
2a30: 20 20 2a 2a 20 69 73 20 63 6c 6f 73 65 64 20 62    ** is closed b
2a40: 79 20 74 68 65 20 44 45 54 41 43 48 2e 0a 20 20  y the DETACH..  
2a50: 2a 2f 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  */.  db->autoCom
2a60: 6d 69 74 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20  mit = 1;..  if( 
2a70: 70 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pDb ){.    sqlit
2a80: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
2a90: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 70 44 62 2d  ->pBt);.    pDb-
2aa0: 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 70 44  >pBt = 0;.    pD
2ab0: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
2ac0: 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 52 65    }..  sqlite3Re
2ad0: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
2ae0: 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 72 65 74  a(db, 0);..  ret
2af0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
2b00: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
2b10: 5f 56 41 43 55 55 4d 20 26 26 20 53 51 4c 49 54  _VACUUM && SQLIT
2b20: 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 20 2a 2f  E_OMIT_ATTACH */
2b30: 0a                                               .