/ Hex Artifact Content
Login

Artifact b620ffff5a84af88b970894a92bb330bd2b9fc45:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 41 70 72 69 6c  /*.** 2003 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
0180: 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 75 73 65  ontains code use
0190: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  d to implement t
01a0: 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e  he VACUUM comman
01b0: 64 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66  d..**.** Most of
01c0: 20 74 68 65 20 63 6f 64 65 20 69 6e 20 74 68 69   the code in thi
01d0: 73 20 66 69 6c 65 20 6d 61 79 20 62 65 20 6f 6d  s file may be om
01e0: 69 74 74 65 64 20 62 79 20 64 65 66 69 6e 69 6e  itted by definin
01f0: 67 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  g the.** SQLITE_
0200: 4f 4d 49 54 5f 56 41 43 55 55 4d 20 6d 61 63 72  OMIT_VACUUM macr
0210: 6f 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 76 61  o..**.** $Id: va
0220: 63 75 75 6d 2e 63 2c 76 20 31 2e 36 35 20 32 30  cuum.c,v 1.65 20
0230: 30 36 2f 31 31 2f 31 38 20 32 30 3a 32 30 3a 32  06/11/18 20:20:2
0240: 32 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23  2 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 23 69 6e 63 6c  vdbeInt.h".#incl
0280: 75 64 65 20 22 6f 73 2e 68 22 0a 0a 23 69 66 6e  ude "os.h"..#ifn
0290: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
02a0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 45 78 65  VACUUM./*.** Exe
02b0: 63 75 74 65 20 7a 53 71 6c 20 6f 6e 20 64 61 74  cute zSql on dat
02c0: 61 62 61 73 65 20 64 62 2e 20 52 65 74 75 72 6e  abase db. Return
02d0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
02e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
02f0: 65 63 53 71 6c 28 73 71 6c 69 74 65 33 20 2a 64  ecSql(sqlite3 *d
0300: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
0310: 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql){.  sqlite3_
0320: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
0330: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
0340: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62  lite3_prepare(db
0350: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
0360: 6d 74 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65  mt, 0) ){.    re
0370: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 72 72  turn sqlite3_err
0380: 63 6f 64 65 28 64 62 29 3b 0a 20 20 7d 0a 20 20  code(db);.  }.  
0390: 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
03a0: 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
03b0: 70 53 74 6d 74 29 20 29 7b 7d 0a 20 20 72 65 74  pStmt) ){}.  ret
03c0: 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  urn sqlite3_fina
03d0: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 0a  lize(pStmt);.}..
03e0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 7a 53  /*.** Execute zS
03f0: 71 6c 20 6f 6e 20 64 61 74 61 62 61 73 65 20 64  ql on database d
0400: 62 2e 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  b. The statement
0410: 20 72 65 74 75 72 6e 73 20 65 78 61 63 74 6c 79   returns exactly
0420: 0a 2a 2a 20 6f 6e 65 20 63 6f 6c 75 6d 6e 2e 20  .** one column. 
0430: 45 78 65 63 75 74 65 20 74 68 69 73 20 61 73 20  Execute this as 
0440: 53 51 4c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  SQL on the same 
0450: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
0460: 74 69 63 20 69 6e 74 20 65 78 65 63 45 78 65 63  tic int execExec
0470: 53 71 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Sql(sqlite3 *db,
0480: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
0490: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  l){.  sqlite3_st
04a0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
04b0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
04c0: 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
04d0: 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
04e0: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
04f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
0500: 75 72 6e 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65  urn rc;..  while
0510: 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
0520: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
0530: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78  ) ){.    rc = ex
0540: 65 63 53 71 6c 28 64 62 2c 20 28 63 68 61 72 2a  ecSql(db, (char*
0550: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
0560: 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  text(pStmt, 0));
0570: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
0580: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
0590: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
05a0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
05b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
05c0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
05d0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
05e0: 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
05f0: 54 68 65 20 6e 6f 6e 2d 73 74 61 6e 64 61 72 64  The non-standard
0600: 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20   VACUUM command 
0610: 69 73 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  is used to clean
0620: 20 75 70 20 74 68 65 20 64 61 74 61 62 61 73 65   up the database
0630: 2c 0a 2a 2a 20 63 6f 6c 6c 61 70 73 65 20 66 72  ,.** collapse fr
0640: 65 65 20 73 70 61 63 65 2c 20 65 74 63 2e 20 20  ee space, etc.  
0650: 49 74 20 69 73 20 6d 6f 64 65 6c 6c 65 64 20 61  It is modelled a
0660: 66 74 65 72 20 74 68 65 20 56 41 43 55 55 4d 20  fter the VACUUM 
0670: 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 69 6e 20 50 6f  command.** in Po
0680: 73 74 67 72 65 53 51 4c 2e 0a 2a 2a 0a 2a 2a 20  stgreSQL..**.** 
0690: 49 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30 2e 78  In version 1.0.x
06a0: 20 6f 66 20 53 51 4c 69 74 65 2c 20 74 68 65 20   of SQLite, the 
06b0: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 20 77  VACUUM command w
06c0: 6f 75 6c 64 20 63 61 6c 6c 0a 2a 2a 20 67 64 62  ould call.** gdb
06d0: 6d 5f 72 65 6f 72 67 61 6e 69 7a 65 28 29 20 6f  m_reorganize() o
06e0: 6e 20 61 6c 6c 20 74 68 65 20 64 61 74 61 62 61  n all the databa
06f0: 73 65 20 74 61 62 6c 65 73 2e 20 20 42 75 74 20  se tables.  But 
0700: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74  beginning.** wit
0710: 68 20 32 2e 30 2e 30 2c 20 53 51 4c 69 74 65 20  h 2.0.0, SQLite 
0720: 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 47  no longer uses G
0730: 44 42 4d 20 73 6f 20 74 68 69 73 20 63 6f 6d 6d  DBM so this comm
0740: 61 6e 64 20 68 61 73 0a 2a 2a 20 62 65 63 6f 6d  and has.** becom
0750: 65 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 76 6f  e a no-op..*/.vo
0760: 69 64 20 73 71 6c 69 74 65 33 56 61 63 75 75 6d  id sqlite3Vacuum
0770: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
0780: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
0790: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
07a0: 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
07b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
07c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 63 75 75  ddOp(v, OP_Vacuu
07d0: 6d 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  m, 0, 0);.  }.  
07e0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
07f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
0800: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 4f 50 5f  plements the OP_
0810: 56 61 63 75 75 6d 20 6f 70 63 6f 64 65 20 6f 66  Vacuum opcode of
0820: 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e   the VDBE..*/.in
0830: 74 20 73 71 6c 69 74 65 33 52 75 6e 56 61 63 75  t sqlite3RunVacu
0840: 75 6d 28 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  um(char **pzErrM
0850: 73 67 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 29  sg, sqlite3 *db)
0860: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
0870: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 52  ITE_OK;     /* R
0880: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
0890: 73 65 72 76 69 63 65 20 72 6f 75 74 69 6e 65 73  service routines
08a0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 4d 61   */.  Btree *pMa
08b0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
08c0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 62 65   The database be
08d0: 69 6e 67 20 76 61 63 75 75 6d 65 64 20 2a 2f 0a  ing vacuumed */.
08e0: 20 20 42 74 72 65 65 20 2a 70 54 65 6d 70 3b 20    Btree *pTemp; 
08f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0900: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
0910: 61 73 65 20 77 65 20 76 61 63 75 75 6d 20 69 6e  ase we vacuum in
0920: 74 6f 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  to */.  char *zS
0930: 71 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ql = 0;         
0940: 2f 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  /* SQL statement
0950: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64  s */.  int saved
0960: 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 2f  _flags;        /
0970: 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66  * Saved value of
0980: 20 74 68 65 20 64 62 2d 3e 66 6c 61 67 73 20 2a   the db->flags *
0990: 2f 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 30 3b  /.  Db *pDb = 0;
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
09b0: 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 61 63  atabase to detac
09c0: 68 20 61 74 20 65 6e 64 20 6f 66 20 76 61 63 75  h at end of vacu
09d0: 75 6d 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65  um */.  char zTe
09e0: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
09f0: 4d 45 5f 53 49 5a 45 2b 32 30 5d 3b 20 20 2f 2a  ME_SIZE+20];  /*
0a00: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 54 45 4d   Name of the TEM
0a10: 50 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  P file */..  /* 
0a20: 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Save the current
0a30: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 77 72   value of the wr
0a40: 69 74 65 2d 73 63 68 65 6d 61 20 66 6c 61 67 20  ite-schema flag 
0a50: 62 65 66 6f 72 65 20 73 65 74 74 69 6e 67 20 69  before setting i
0a60: 74 2e 20 2a 2f 0a 20 20 73 61 76 65 64 5f 66 6c  t. */.  saved_fl
0a70: 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b  ags = db->flags;
0a80: 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
0a90: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
0aa0: 6d 61 20 7c 20 53 51 4c 49 54 45 5f 49 67 6e 6f  ma | SQLITE_Igno
0ab0: 72 65 43 68 65 63 6b 73 3b 0a 0a 20 20 69 66 28  reChecks;..  if(
0ac0: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
0ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53   ){.    sqlite3S
0ae0: 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d 73  etString(pzErrMs
0af0: 67 2c 20 22 63 61 6e 6e 6f 74 20 56 41 43 55 55  g, "cannot VACUU
0b00: 4d 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20  M from within a 
0b10: 74 72 61 6e 73 61 63 74 69 6f 6e 22 2c 20 0a 20  transaction", . 
0b20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
0b30: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
0b40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 67 6f 74 6f  _ERROR;.    goto
0b50: 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a   end_of_vacuum;.
0b60: 20 20 7d 0a 20 20 70 4d 61 69 6e 20 3d 20 64 62    }.  pMain = db
0b70: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20  ->aDb[0].pBt;.  
0b80: 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c  sqlite3OsTempFil
0b90: 65 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 0a 20  eName(zTemp);.. 
0ba0: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 74   /* Attach the t
0bb0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
0bc0: 65 20 61 73 20 27 76 61 63 75 75 6d 5f 64 62 27  e as 'vacuum_db'
0bd0: 2e 20 54 68 65 20 73 79 6e 63 68 72 6f 6e 6f 75  . The synchronou
0be0: 73 20 70 72 61 67 6d 61 0a 20 20 2a 2a 20 63 61  s pragma.  ** ca
0bf0: 6e 20 62 65 20 73 65 74 20 74 6f 20 27 6f 66 66  n be set to 'off
0c00: 27 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  ' for this file,
0c10: 20 61 73 20 69 74 20 69 73 20 6e 6f 74 20 72 65   as it is not re
0c20: 63 6f 76 65 72 65 64 20 69 66 20 61 20 63 72 61  covered if a cra
0c30: 73 68 0a 20 20 2a 2a 20 6f 63 63 75 72 73 20 61  sh.  ** occurs a
0c40: 6e 79 77 61 79 2e 20 54 68 65 20 69 6e 74 65 67  nyway. The integ
0c50: 72 69 74 79 20 6f 66 20 74 68 65 20 64 61 74 61  rity of the data
0c60: 62 61 73 65 20 69 73 20 6d 61 69 6e 74 61 69 6e  base is maintain
0c70: 65 64 20 62 79 20 61 0a 20 20 2a 2a 20 28 70 6f  ed by a.  ** (po
0c80: 73 73 69 62 6c 79 20 73 79 6e 63 68 72 6f 6e 6f  ssibly synchrono
0c90: 75 73 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  us) transaction 
0ca0: 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 6d 61  opened on the ma
0cb0: 69 6e 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  in database befo
0cc0: 72 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 42  re.  ** sqlite3B
0cd0: 74 72 65 65 43 6f 70 79 46 69 6c 65 28 29 20 69  treeCopyFile() i
0ce0: 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2a 0a 20  s called..  **. 
0cf0: 20 2a 2a 20 41 6e 20 6f 70 74 69 6d 69 73 61 74   ** An optimisat
0d00: 69 6f 6e 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ion would be to 
0d10: 75 73 65 20 61 20 6e 6f 6e 2d 6a 6f 75 72 6e 61  use a non-journa
0d20: 6c 65 64 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  led pager..  */.
0d30: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
0d40: 4d 50 72 69 6e 74 66 28 22 41 54 54 41 43 48 20  MPrintf("ATTACH 
0d50: 27 25 71 27 20 41 53 20 76 61 63 75 75 6d 5f 64  '%q' AS vacuum_d
0d60: 62 3b 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 69  b;", zTemp);.  i
0d70: 66 28 20 21 7a 53 71 6c 20 29 7b 0a 20 20 20 20  f( !zSql ){.    
0d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
0d90: 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
0da0: 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 20  of_vacuum;.  }. 
0db0: 20 72 63 20 3d 20 65 78 65 63 53 71 6c 28 64 62   rc = execSql(db
0dc0: 2c 20 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  , zSql);.  sqlit
0dd0: 65 46 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7a  eFree(zSql);.  z
0de0: 53 71 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Sql = 0;.  if( r
0df0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
0e00: 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75  oto end_of_vacuu
0e10: 6d 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  m;.  pDb = &db->
0e20: 61 44 62 5b 64 62 2d 3e 6e 44 62 2d 31 5d 3b 0a  aDb[db->nDb-1];.
0e30: 20 20 61 73 73 65 72 74 28 20 73 74 72 63 6d 70    assert( strcmp
0e40: 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 6e 44 62  (db->aDb[db->nDb
0e50: 2d 31 5d 2e 7a 4e 61 6d 65 2c 22 76 61 63 75 75  -1].zName,"vacuu
0e60: 6d 5f 64 62 22 29 3d 3d 30 20 29 3b 0a 20 20 70  m_db")==0 );.  p
0e70: 54 65 6d 70 20 3d 20 64 62 2d 3e 61 44 62 5b 64  Temp = db->aDb[d
0e80: 62 2d 3e 6e 44 62 2d 31 5d 2e 70 42 74 3b 0a 20  b->nDb-1].pBt;. 
0e90: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
0ea0: 50 61 67 65 53 69 7a 65 28 70 54 65 6d 70 2c 20  PageSize(pTemp, 
0eb0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
0ec0: 61 67 65 53 69 7a 65 28 70 4d 61 69 6e 29 2c 0a  ageSize(pMain),.
0ed0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
0ee0: 65 47 65 74 52 65 73 65 72 76 65 28 70 4d 61 69  eGetReserve(pMai
0ef0: 6e 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  n));.  assert( s
0f00: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
0f10: 67 65 53 69 7a 65 28 70 54 65 6d 70 29 3d 3d 73  geSize(pTemp)==s
0f20: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
0f30: 67 65 53 69 7a 65 28 70 4d 61 69 6e 29 20 29 3b  geSize(pMain) );
0f40: 0a 20 20 72 63 20 3d 20 65 78 65 63 53 71 6c 28  .  rc = execSql(
0f50: 64 62 2c 20 22 50 52 41 47 4d 41 20 76 61 63 75  db, "PRAGMA vacu
0f60: 75 6d 5f 64 62 2e 73 79 6e 63 68 72 6f 6e 6f 75  um_db.synchronou
0f70: 73 3d 4f 46 46 22 29 3b 0a 20 20 69 66 28 20 72  s=OFF");.  if( r
0f80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
0f90: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f      goto end_of_
0fa0: 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 0a 23 69 66  vacuum;.  }..#if
0fb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0fc0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 73 71  _AUTOVACUUM.  sq
0fd0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
0fe0: 6f 56 61 63 75 75 6d 28 70 54 65 6d 70 2c 20 73  oVacuum(pTemp, s
0ff0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
1000: 74 6f 56 61 63 75 75 6d 28 70 4d 61 69 6e 29 29  toVacuum(pMain))
1010: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
1020: 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
1030: 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 65 78 65  on */.  rc = exe
1040: 63 53 71 6c 28 64 62 2c 20 22 42 45 47 49 4e 20  cSql(db, "BEGIN 
1050: 45 58 43 4c 55 53 49 56 45 3b 22 29 3b 0a 20 20  EXCLUSIVE;");.  
1060: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1070: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  K ) goto end_of_
1080: 76 61 63 75 75 6d 3b 0a 0a 20 20 2f 2a 20 51 75  vacuum;..  /* Qu
1090: 65 72 79 20 74 68 65 20 73 63 68 65 6d 61 20 6f  ery the schema o
10a0: 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
10b0: 61 73 65 2e 20 43 72 65 61 74 65 20 61 20 6d 69  ase. Create a mi
10c0: 72 72 6f 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  rror schema.  **
10d0: 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72   in the temporar
10e0: 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  y database..  */
10f0: 0a 20 20 72 63 20 3d 20 65 78 65 63 45 78 65 63  .  rc = execExec
1100: 53 71 6c 28 64 62 2c 20 0a 20 20 20 20 20 20 22  Sql(db, .      "
1110: 53 45 4c 45 43 54 20 27 43 52 45 41 54 45 20 54  SELECT 'CREATE T
1120: 41 42 4c 45 20 76 61 63 75 75 6d 5f 64 62 2e 27  ABLE vacuum_db.'
1130: 20 7c 7c 20 73 75 62 73 74 72 28 73 71 6c 2c 31   || substr(sql,1
1140: 34 2c 31 30 30 30 30 30 30 30 30 29 20 22 0a 20  4,100000000) ". 
1150: 20 20 20 20 20 22 20 20 46 52 4f 4d 20 73 71 6c       "  FROM sql
1160: 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52 45  ite_master WHERE
1170: 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e   type='table' AN
1180: 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f  D name!='sqlite_
1190: 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20  sequence'".     
11a0: 20 22 20 20 20 41 4e 44 20 72 6f 6f 74 70 61 67   "   AND rootpag
11b0: 65 3e 30 22 0a 20 20 29 3b 0a 20 20 69 66 28 20  e>0".  );.  if( 
11c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11d0: 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75  goto end_of_vacu
11e0: 75 6d 3b 0a 20 20 72 63 20 3d 20 65 78 65 63 45  um;.  rc = execE
11f0: 78 65 63 53 71 6c 28 64 62 2c 20 0a 20 20 20 20  xecSql(db, .    
1200: 20 20 22 53 45 4c 45 43 54 20 27 43 52 45 41 54    "SELECT 'CREAT
1210: 45 20 49 4e 44 45 58 20 76 61 63 75 75 6d 5f 64  E INDEX vacuum_d
1220: 62 2e 27 20 7c 7c 20 73 75 62 73 74 72 28 73 71  b.' || substr(sq
1230: 6c 2c 31 34 2c 31 30 30 30 30 30 30 30 30 29 22  l,14,100000000)"
1240: 0a 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 73  .      "  FROM s
1250: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
1260: 52 45 20 73 71 6c 20 4c 49 4b 45 20 27 43 52 45  RE sql LIKE 'CRE
1270: 41 54 45 20 49 4e 44 45 58 20 25 27 20 22 29 3b  ATE INDEX %' ");
1280: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1290: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
12a0: 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 72 63 20  of_vacuum;.  rc 
12b0: 3d 20 65 78 65 63 45 78 65 63 53 71 6c 28 64 62  = execExecSql(db
12c0: 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  , .      "SELECT
12d0: 20 27 43 52 45 41 54 45 20 55 4e 49 51 55 45 20   'CREATE UNIQUE 
12e0: 49 4e 44 45 58 20 76 61 63 75 75 6d 5f 64 62 2e  INDEX vacuum_db.
12f0: 27 20 7c 7c 20 73 75 62 73 74 72 28 73 71 6c 2c  ' || substr(sql,
1300: 32 31 2c 31 30 30 30 30 30 30 30 30 29 20 22 0a  21,100000000) ".
1310: 20 20 20 20 20 20 22 20 20 46 52 4f 4d 20 73 71        "  FROM sq
1320: 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45 52  lite_master WHER
1330: 45 20 73 71 6c 20 4c 49 4b 45 20 27 43 52 45 41  E sql LIKE 'CREA
1340: 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 20  TE UNIQUE INDEX 
1350: 25 27 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  %'");.  if( rc!=
1360: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1370: 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a   end_of_vacuum;.
1380: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
1390: 67 68 20 74 68 65 20 74 61 62 6c 65 73 20 69 6e  gh the tables in
13a0: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
13b0: 73 65 2e 20 46 6f 72 20 65 61 63 68 2c 20 64 6f  se. For each, do
13c0: 0a 20 20 2a 2a 20 61 6e 20 22 49 4e 53 45 52 54  .  ** an "INSERT
13d0: 20 49 4e 54 4f 20 76 61 63 75 75 6d 5f 64 62 2e   INTO vacuum_db.
13e0: 78 78 78 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  xxx SELECT * FRO
13f0: 4d 20 78 78 78 3b 22 20 74 6f 20 63 6f 70 79 0a  M xxx;" to copy.
1400: 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74    ** the content
1410: 73 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  s to the tempora
1420: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ry database..  *
1430: 2f 0a 20 20 72 63 20 3d 20 65 78 65 63 45 78 65  /.  rc = execExe
1440: 63 53 71 6c 28 64 62 2c 20 0a 20 20 20 20 20 20  cSql(db, .      
1450: 22 53 45 4c 45 43 54 20 27 49 4e 53 45 52 54 20  "SELECT 'INSERT 
1460: 49 4e 54 4f 20 76 61 63 75 75 6d 5f 64 62 2e 27  INTO vacuum_db.'
1470: 20 7c 7c 20 71 75 6f 74 65 28 6e 61 6d 65 29 20   || quote(name) 
1480: 22 0a 20 20 20 20 20 20 22 7c 7c 20 27 20 53 45  ".      "|| ' SE
1490: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27 20 7c 7c  LECT * FROM ' ||
14a0: 20 71 75 6f 74 65 28 6e 61 6d 65 29 20 7c 7c 20   quote(name) || 
14b0: 27 3b 27 22 0a 20 20 20 20 20 20 22 46 52 4f 4d  ';'".      "FROM
14c0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
14d0: 0a 20 20 20 20 20 20 22 57 48 45 52 45 20 74 79  .      "WHERE ty
14e0: 70 65 20 3d 20 27 74 61 62 6c 65 27 20 41 4e 44  pe = 'table' AND
14f0: 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73   name!='sqlite_s
1500: 65 71 75 65 6e 63 65 27 20 22 0a 20 20 20 20 20  equence' ".     
1510: 20 22 20 20 41 4e 44 20 72 6f 6f 74 70 61 67 65   "  AND rootpage
1520: 3e 30 22 0a 0a 20 20 29 3b 0a 20 20 69 66 28 20  >0"..  );.  if( 
1530: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1540: 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63 75  goto end_of_vacu
1550: 75 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79 20 6f  um;..  /* Copy o
1560: 76 65 72 20 74 68 65 20 73 65 71 75 65 6e 63 65  ver the sequence
1570: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 72 63   table.  */.  rc
1580: 20 3d 20 65 78 65 63 45 78 65 63 53 71 6c 28 64   = execExecSql(d
1590: 62 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45 43  b, .      "SELEC
15a0: 54 20 27 44 45 4c 45 54 45 20 46 52 4f 4d 20 76  T 'DELETE FROM v
15b0: 61 63 75 75 6d 5f 64 62 2e 27 20 7c 7c 20 71 75  acuum_db.' || qu
15c0: 6f 74 65 28 6e 61 6d 65 29 20 7c 7c 20 27 3b 27  ote(name) || ';'
15d0: 20 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20 76   ".      "FROM v
15e0: 61 63 75 75 6d 5f 64 62 2e 73 71 6c 69 74 65 5f  acuum_db.sqlite_
15f0: 6d 61 73 74 65 72 20 57 48 45 52 45 20 6e 61 6d  master WHERE nam
1600: 65 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  e='sqlite_sequen
1610: 63 65 27 20 22 0a 20 20 29 3b 0a 20 20 69 66 28  ce' ".  );.  if(
1620: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1630: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63   goto end_of_vac
1640: 75 75 6d 3b 0a 20 20 72 63 20 3d 20 65 78 65 63  uum;.  rc = exec
1650: 45 78 65 63 53 71 6c 28 64 62 2c 20 0a 20 20 20  ExecSql(db, .   
1660: 20 20 20 22 53 45 4c 45 43 54 20 27 49 4e 53 45     "SELECT 'INSE
1670: 52 54 20 49 4e 54 4f 20 76 61 63 75 75 6d 5f 64  RT INTO vacuum_d
1680: 62 2e 27 20 7c 7c 20 71 75 6f 74 65 28 6e 61 6d  b.' || quote(nam
1690: 65 29 20 22 0a 20 20 20 20 20 20 22 7c 7c 20 27  e) ".      "|| '
16a0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 27   SELECT * FROM '
16b0: 20 7c 7c 20 71 75 6f 74 65 28 6e 61 6d 65 29 20   || quote(name) 
16c0: 7c 7c 20 27 3b 27 20 22 0a 20 20 20 20 20 20 22  || ';' ".      "
16d0: 46 52 4f 4d 20 76 61 63 75 75 6d 5f 64 62 2e 73  FROM vacuum_db.s
16e0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 57 48 45  qlite_master WHE
16f0: 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65  RE name=='sqlite
1700: 5f 73 65 71 75 65 6e 63 65 27 3b 22 0a 20 20 29  _sequence';".  )
1710: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1720: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
1730: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 0a 0a 20 20  _of_vacuum;...  
1740: 2f 2a 20 43 6f 70 79 20 74 68 65 20 74 72 69 67  /* Copy the trig
1750: 67 65 72 73 2c 20 76 69 65 77 73 2c 20 61 6e 64  gers, views, and
1760: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
1770: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61  from the main da
1780: 74 61 62 61 73 65 0a 20 20 2a 2a 20 6f 76 65 72  tabase.  ** over
1790: 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72   to the temporar
17a0: 79 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  y database.  Non
17b0: 65 20 6f 66 20 74 68 65 73 65 20 6f 62 6a 65 63  e of these objec
17c0: 74 73 20 68 61 73 20 61 6e 79 0a 20 20 2a 2a 20  ts has any.  ** 
17d0: 61 73 73 6f 63 69 61 74 65 64 20 73 74 6f 72 61  associated stora
17e0: 67 65 2c 20 73 6f 20 61 6c 6c 20 77 65 20 68 61  ge, so all we ha
17f0: 76 65 20 74 6f 20 64 6f 20 69 73 20 63 6f 70 79  ve to do is copy
1800: 20 74 68 65 69 72 20 65 6e 74 72 69 65 73 0a 20   their entries. 
1810: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 51 4c   ** from the SQL
1820: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
1830: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 65 78  ..  */.  rc = ex
1840: 65 63 53 71 6c 28 64 62 2c 0a 20 20 20 20 20 20  ecSql(db,.      
1850: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 76 61 63  "INSERT INTO vac
1860: 75 75 6d 5f 64 62 2e 73 71 6c 69 74 65 5f 6d 61  uum_db.sqlite_ma
1870: 73 74 65 72 20 22 0a 20 20 20 20 20 20 22 20 20  ster ".      "  
1880: 53 45 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d  SELECT type, nam
1890: 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 72 6f 6f  e, tbl_name, roo
18a0: 74 70 61 67 65 2c 20 73 71 6c 22 0a 20 20 20 20  tpage, sql".    
18b0: 20 20 22 20 20 20 20 46 52 4f 4d 20 73 71 6c 69    "    FROM sqli
18c0: 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
18d0: 20 22 20 20 20 57 48 45 52 45 20 74 79 70 65 3d   "   WHERE type=
18e0: 27 76 69 65 77 27 20 4f 52 20 74 79 70 65 3d 27  'view' OR type='
18f0: 74 72 69 67 67 65 72 27 22 0a 20 20 20 20 20 20  trigger'".      
1900: 22 20 20 20 20 20 20 4f 52 20 28 74 79 70 65 3d  "      OR (type=
1910: 27 74 61 62 6c 65 27 20 41 4e 44 20 72 6f 6f 74  'table' AND root
1920: 70 61 67 65 3d 30 29 22 0a 20 20 29 3b 0a 20 20  page=0)".  );.  
1930: 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
1940: 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 0a 20 20  d_of_vacuum;..  
1950: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
1960: 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  , unless the mai
1970: 6e 20 64 62 20 77 61 73 20 63 6f 6d 70 6c 65 74  n db was complet
1980: 65 6c 79 20 65 6d 70 74 79 2c 20 74 68 65 72 65  ely empty, there
1990: 20 69 73 20 6e 6f 77 20 61 0a 20 20 2a 2a 20 74   is now a.  ** t
19a0: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20  ransaction open 
19b0: 6f 6e 20 74 68 65 20 76 61 63 75 75 6d 20 64 61  on the vacuum da
19c0: 74 61 62 61 73 65 2c 20 62 75 74 20 6e 6f 74 20  tabase, but not 
19d0: 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
19e0: 62 61 73 65 2e 0a 20 20 2a 2a 20 4f 70 65 6e 20  base..  ** Open 
19f0: 61 20 62 74 72 65 65 20 6c 65 76 65 6c 20 74 72  a btree level tr
1a00: 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65  ansaction on the
1a10: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
1a20: 54 68 69 73 20 61 6c 6c 6f 77 73 20 61 0a 20 20  This allows a.  
1a30: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
1a40: 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28  e3BtreeCopyFile(
1a50: 29 2e 20 54 68 65 20 6d 61 69 6e 20 64 61 74 61  ). The main data
1a60: 62 61 73 65 20 62 74 72 65 65 20 6c 65 76 65 6c  base btree level
1a70: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
1a80: 6e 20 69 73 20 74 68 65 6e 20 63 6f 6d 6d 69 74  n is then commit
1a90: 74 65 64 2c 20 73 6f 20 74 68 65 20 53 51 4c 20  ted, so the SQL 
1aa0: 6c 65 76 65 6c 20 6e 65 76 65 72 20 6b 6e 6f 77  level never know
1ab0: 73 20 69 74 20 77 61 73 0a 20 20 2a 2a 20 6f 70  s it was.  ** op
1ac0: 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  ened for writing
1ad0: 2e 20 54 68 69 73 20 77 61 79 2c 20 74 68 65 20  . This way, the 
1ae0: 53 51 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  SQL transaction 
1af0: 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 74  used to create t
1b00: 68 65 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72  he.  ** temporar
1b10: 79 20 64 61 74 61 62 61 73 65 20 6e 65 76 65 72  y database never
1b20: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 63 6f 6d   needs to be com
1b30: 6d 69 74 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  mitted..  */.  i
1b40: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b50: 20 29 7b 0a 20 20 20 20 75 33 32 20 6d 65 74 61   ){.    u32 meta
1b60: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ;.    int i;..  
1b70: 20 20 2f 2a 20 54 68 69 73 20 61 72 72 61 79 20    /* This array 
1b80: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
1b90: 20 6d 65 74 61 20 6d 65 74 61 20 76 61 6c 75 65   meta meta value
1ba0: 73 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20  s are preserved 
1bb0: 69 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 76 61  in the.    ** va
1bc0: 63 75 75 6d 2e 20 20 45 76 65 6e 20 65 6e 74 72  cuum.  Even entr
1bd0: 69 65 73 20 61 72 65 20 74 68 65 20 6d 65 74 61  ies are the meta
1be0: 20 76 61 6c 75 65 20 6e 75 6d 62 65 72 20 61 6e   value number an
1bf0: 64 20 6f 64 64 20 65 6e 74 72 69 65 73 0a 20 20  d odd entries.  
1c00: 20 20 2a 2a 20 61 72 65 20 61 6e 20 69 6e 63 72    ** are an incr
1c10: 65 6d 65 6e 74 20 74 6f 20 61 70 70 6c 79 20 74  ement to apply t
1c20: 6f 20 74 68 65 20 6d 65 74 61 20 76 61 6c 75 65  o the meta value
1c30: 20 61 66 74 65 72 20 74 68 65 20 76 61 63 75 75   after the vacuu
1c40: 6d 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 69 6e  m..    ** The in
1c50: 63 72 65 6d 65 6e 74 20 69 73 20 75 73 65 64 20  crement is used 
1c60: 74 6f 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  to increase the 
1c70: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 73 6f  schema cookie so
1c80: 20 74 68 61 74 20 6f 74 68 65 72 0a 20 20 20 20   that other.    
1c90: 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  ** connections t
1ca0: 6f 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  o the same datab
1cb0: 61 73 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 74 6f  ase will know to
1cc0: 20 72 65 72 65 61 64 20 74 68 65 20 73 63 68 65   reread the sche
1cd0: 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ma..    */.    s
1ce0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
1cf0: 67 6e 65 64 20 63 68 61 72 20 61 43 6f 70 79 5b  gned char aCopy[
1d00: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 31 2c 20  ] = {.       1, 
1d10: 31 2c 20 20 20 20 2f 2a 20 41 64 64 20 6f 6e 65  1,    /* Add one
1d20: 20 74 6f 20 74 68 65 20 6f 6c 64 20 73 63 68 65   to the old sche
1d30: 6d 61 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20  ma cookie */.   
1d40: 20 20 20 20 33 2c 20 30 2c 20 20 20 20 2f 2a 20      3, 0,    /* 
1d50: 50 72 65 73 65 72 76 65 20 74 68 65 20 64 65 66  Preserve the def
1d60: 61 75 6c 74 20 70 61 67 65 20 63 61 63 68 65 20  ault page cache 
1d70: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 35  size */.       5
1d80: 2c 20 30 2c 20 20 20 20 2f 2a 20 50 72 65 73 65  , 0,    /* Prese
1d90: 72 76 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  rve the default 
1da0: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  text encoding */
1db0: 0a 20 20 20 20 20 20 20 36 2c 20 30 2c 20 20 20  .       6, 0,   
1dc0: 20 2f 2a 20 50 72 65 73 65 72 76 65 20 74 68 65   /* Preserve the
1dd0: 20 75 73 65 72 20 76 65 72 73 69 6f 6e 20 2a 2f   user version */
1de0: 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 61 73 73  .    };..    ass
1df0: 65 72 74 28 20 31 3d 3d 73 71 6c 69 74 65 33 42  ert( 1==sqlite3B
1e00: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 54  treeIsInTrans(pT
1e10: 65 6d 70 29 20 29 3b 0a 20 20 20 20 61 73 73 65  emp) );.    asse
1e20: 72 74 28 20 31 3d 3d 73 71 6c 69 74 65 33 42 74  rt( 1==sqlite3Bt
1e30: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 4d 61  reeIsInTrans(pMa
1e40: 69 6e 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  in) );..    /* C
1e50: 6f 70 79 20 42 74 72 65 65 20 6d 65 74 61 20 76  opy Btree meta v
1e60: 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 66 6f 72  alues */.    for
1e70: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
1e80: 43 6f 70 79 29 2f 73 69 7a 65 6f 66 28 61 43 6f  Copy)/sizeof(aCo
1e90: 70 79 5b 30 5d 29 3b 20 69 2b 3d 32 29 7b 0a 20  py[0]); i+=2){. 
1ea0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1eb0: 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 4d  3BtreeGetMeta(pM
1ec0: 61 69 6e 2c 20 61 43 6f 70 79 5b 69 5d 2c 20 26  ain, aCopy[i], &
1ed0: 6d 65 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  meta);.      if(
1ee0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1ef0: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63   goto end_of_vac
1f00: 75 75 6d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  uum;.      rc = 
1f10: 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
1f20: 74 65 4d 65 74 61 28 70 54 65 6d 70 2c 20 61 43  teMeta(pTemp, aC
1f30: 6f 70 79 5b 69 5d 2c 20 6d 65 74 61 2b 61 43 6f  opy[i], meta+aCo
1f40: 70 79 5b 69 2b 31 5d 29 3b 0a 20 20 20 20 20 20  py[i+1]);.      
1f50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f60: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  K ) goto end_of_
1f70: 76 61 63 75 75 6d 3b 0a 20 20 20 20 7d 0a 0a 20  vacuum;.    }.. 
1f80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1f90: 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70 4d 61  treeCopyFile(pMa
1fa0: 69 6e 2c 20 70 54 65 6d 70 29 3b 0a 20 20 20 20  in, pTemp);.    
1fb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fc0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  K ) goto end_of_
1fd0: 76 61 63 75 75 6d 3b 0a 20 20 20 20 72 63 20 3d  vacuum;.    rc =
1fe0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1ff0: 6d 69 74 28 70 54 65 6d 70 29 3b 0a 20 20 20 20  mit(pTemp);.    
2000: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2010: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  K ) goto end_of_
2020: 76 61 63 75 75 6d 3b 0a 20 20 20 20 72 63 20 3d  vacuum;.    rc =
2030: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
2040: 6d 69 74 28 70 4d 61 69 6e 29 3b 0a 20 20 7d 0a  mit(pMain);.  }.
2050: 0a 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3a 0a  .end_of_vacuum:.
2060: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
2070: 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65 20   original value 
2080: 6f 66 20 64 62 2d 3e 66 6c 61 67 73 20 2a 2f 0a  of db->flags */.
2090: 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 73 61    db->flags = sa
20a0: 76 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 2f 2a  ved_flags;..  /*
20b0: 20 43 75 72 72 65 6e 74 6c 79 20 74 68 65 72 65   Currently there
20c0: 20 69 73 20 61 6e 20 53 51 4c 20 6c 65 76 65 6c   is an SQL level
20d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
20e0: 6e 20 6f 6e 20 74 68 65 20 76 61 63 75 75 6d 0a  n on the vacuum.
20f0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 4e    ** database. N
2100: 6f 20 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64  o locks are held
2110: 20 6f 6e 20 61 6e 79 20 6f 74 68 65 72 20 66 69   on any other fi
2120: 6c 65 73 20 28 73 69 6e 63 65 20 74 68 65 20 6d  les (since the m
2130: 61 69 6e 20 66 69 6c 65 0a 20 20 2a 2a 20 77 61  ain file.  ** wa
2140: 73 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 20 74  s committed at t
2150: 68 65 20 62 74 72 65 65 20 6c 65 76 65 6c 29 2e  he btree level).
2160: 20 53 6f 20 69 74 20 73 61 66 65 20 74 6f 20 65   So it safe to e
2170: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
2180: 6f 6e 0a 20 20 2a 2a 20 62 79 20 6d 61 6e 75 61  on.  ** by manua
2190: 6c 6c 79 20 73 65 74 74 69 6e 67 20 74 68 65 20  lly setting the 
21a0: 61 75 74 6f 43 6f 6d 6d 69 74 20 66 6c 61 67 20  autoCommit flag 
21b0: 74 6f 20 74 72 75 65 20 61 6e 64 20 64 65 74 61  to true and deta
21c0: 63 68 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 76  ching the.  ** v
21d0: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 20  acuum database. 
21e0: 54 68 65 20 76 61 63 75 75 6d 5f 64 62 20 6a 6f  The vacuum_db jo
21f0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65  urnal file is de
2200: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 70  leted when the p
2210: 61 67 65 72 0a 20 20 2a 2a 20 69 73 20 63 6c 6f  ager.  ** is clo
2220: 73 65 64 20 62 79 20 74 68 65 20 44 45 54 41 43  sed by the DETAC
2230: 48 2e 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 75  H..  */.  db->au
2240: 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 0a 20  toCommit = 1;.. 
2250: 20 69 66 28 20 70 44 62 20 29 7b 0a 20 20 20 20   if( pDb ){.    
2260: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 44 69 73  sqlite3MallocDis
2270: 61 6c 6c 6f 77 28 29 3b 0a 20 20 20 20 73 71 6c  allow();.    sql
2280: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
2290: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 73 71  Db->pBt);.    sq
22a0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 41 6c 6c 6f 77  lite3MallocAllow
22b0: 28 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70 42 74  ();.    pDb->pBt
22c0: 20 3d 20 30 3b 0a 20 20 20 20 70 44 62 2d 3e 70   = 0;.    pDb->p
22d0: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 7d 0a  Schema = 0;.  }.
22e0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  .  sqlite3OsDele
22f0: 74 65 28 7a 54 65 6d 70 29 3b 0a 20 20 73 74 72  te(zTemp);.  str
2300: 63 61 74 28 7a 54 65 6d 70 2c 20 22 2d 6a 6f 75  cat(zTemp, "-jou
2310: 72 6e 61 6c 22 29 3b 0a 20 20 73 71 6c 69 74 65  rnal");.  sqlite
2320: 33 4f 73 44 65 6c 65 74 65 28 7a 54 65 6d 70 29  3OsDelete(zTemp)
2330: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 20  ;.  sqliteFree( 
2340: 7a 53 71 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65  zSql );.  sqlite
2350: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
2360: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20  hema(db, 0);..  
2370: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
2380: 64 69 66 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  dif  /* SQLITE_O
2390: 4d 49 54 5f 56 41 43 55 55 4d 20 2a 2f 0a        MIT_VACUUM */.