/ Hex Artifact Content
Login

Artifact c31a0fe4ca640e0aabf483bc2c65065b41622a3f6e820cd83817cce3e55a2581:


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 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  CH)../*.** Execu
0290: 74 65 20 7a 53 71 6c 20 6f 6e 20 64 61 74 61 62  te zSql on datab
02a0: 61 73 65 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 49 66  ase db..**.** If
02b0: 20 7a 53 71 6c 20 72 65 74 75 72 6e 73 20 72 6f   zSql returns ro
02c0: 77 73 2c 20 74 68 65 6e 20 65 61 63 68 20 72 6f  ws, then each ro
02d0: 77 20 77 69 6c 6c 20 68 61 76 65 20 65 78 61 63  w will have exac
02e0: 74 6c 79 20 6f 6e 65 0a 2a 2a 20 63 6f 6c 75 6d  tly one.** colum
02f0: 6e 2e 20 20 28 54 68 69 73 20 77 69 6c 6c 20 6f  n.  (This will o
0300: 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20 7a 53  nly happen if zS
0310: 71 6c 20 62 65 67 69 6e 73 20 77 69 74 68 20 22  ql begins with "
0320: 53 45 4c 45 43 54 22 2e 29 0a 2a 2a 20 54 61 6b  SELECT".).** Tak
0330: 65 20 65 61 63 68 20 72 6f 77 20 6f 66 20 72 65  e each row of re
0340: 73 75 6c 74 20 61 6e 64 20 63 61 6c 6c 20 65 78  sult and call ex
0350: 65 63 53 71 6c 28 29 20 61 67 61 69 6e 20 72 65  ecSql() again re
0360: 63 75 72 73 69 76 65 6c 79 2e 0a 2a 2a 0a 2a 2a  cursively..**.**
0370: 20 54 68 65 20 65 78 65 63 53 71 6c 46 28 29 20   The execSqlF() 
0380: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
0390: 20 73 61 6d 65 20 74 68 69 6e 67 2c 20 65 78 63   same thing, exc
03a0: 65 70 74 20 69 74 20 61 63 63 65 70 74 73 0a 2a  ept it accepts.*
03b0: 2a 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  * a format strin
03c0: 67 20 61 73 20 69 74 73 20 74 68 69 72 64 20 61  g as its third a
03d0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
03e0: 63 20 69 6e 74 20 65 78 65 63 53 71 6c 28 73 71  c int execSql(sq
03f0: 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72 20  lite3 *db, char 
0400: 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 63 6f 6e 73  **pzErrMsg, cons
0410: 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
0420: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
0430: 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
0440: 0a 20 20 2f 2a 20 70 72 69 6e 74 66 28 22 53 51  .  /* printf("SQ
0450: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 53 71 6c  L: [%s]\n", zSql
0460: 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
0470: 29 3b 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  ); */.  rc = sql
0480: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
0490: 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
04a0: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
04b0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
04c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 77 68 69  return rc;.  whi
04d0: 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  le( SQLITE_ROW==
04e0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
04f0: 65 70 28 70 53 74 6d 74 29 29 20 29 7b 0a 20 20  ep(pStmt)) ){.  
0500: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
0510: 75 62 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63  ubSql = (const c
0520: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
0530: 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30  umn_text(pStmt,0
0540: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
0550: 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
0560: 7a 53 71 6c 2c 22 53 45 4c 45 43 54 22 2c 36 29  zSql,"SELECT",6)
0570: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
0580: 53 75 62 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  SubSql ){.      
0590: 61 73 73 65 72 74 28 20 7a 53 75 62 53 71 6c 5b  assert( zSubSql[
05a0: 30 5d 21 3d 27 53 27 20 29 3b 0a 20 20 20 20 20  0]!='S' );.     
05b0: 20 72 63 20 3d 20 65 78 65 63 53 71 6c 28 64 62   rc = execSql(db
05c0: 2c 20 70 7a 45 72 72 4d 73 67 2c 20 7a 53 75 62  , pzErrMsg, zSub
05d0: 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Sql);.      if( 
05e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
05f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
0600: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
0610: 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20 69  QLITE_ROW );.  i
0620: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
0630: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
0640: 5f 4f 4b 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  _OK;.  if( rc ){
0650: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53  .    sqlite3SetS
0660: 74 72 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20  tring(pzErrMsg, 
0670: 64 62 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  db, sqlite3_errm
0680: 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 28  sg(db));.  }.  (
0690: 76 6f 69 64 29 73 71 6c 69 74 65 33 5f 66 69 6e  void)sqlite3_fin
06a0: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
06b0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
06c0: 74 69 63 20 69 6e 74 20 65 78 65 63 53 71 6c 46  tic int execSqlF
06d0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 68  (sqlite3 *db, ch
06e0: 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 63  ar **pzErrMsg, c
06f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
0700: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a   ...){.  char *z
0710: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  ;.  va_list ap;.
0720: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73    int rc;.  va_s
0730: 74 61 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a  tart(ap, zSql);.
0740: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50    z = sqlite3VMP
0750: 72 69 6e 74 66 28 64 62 2c 20 7a 53 71 6c 2c 20  rintf(db, zSql, 
0760: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
0770: 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20  );.  if( z==0 ) 
0780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
0790: 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 65 78 65 63  MEM;.  rc = exec
07a0: 53 71 6c 28 64 62 2c 20 70 7a 45 72 72 4d 73 67  Sql(db, pzErrMsg
07b0: 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , z);.  sqlite3D
07c0: 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
07d0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
07e0: 0a 2a 2a 20 54 68 65 20 56 41 43 55 55 4d 20 63  .** The VACUUM c
07f0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
0800: 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 64  o clean up the d
0810: 61 74 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c  atabase,.** coll
0820: 61 70 73 65 20 66 72 65 65 20 73 70 61 63 65 2c  apse free space,
0830: 20 65 74 63 2e 20 20 49 74 20 69 73 20 6d 6f 64   etc.  It is mod
0840: 65 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  elled after the 
0850: 56 41 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a  VACUUM command.*
0860: 2a 20 69 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e  * in PostgreSQL.
0870: 20 20 54 68 65 20 56 41 43 55 55 4d 20 63 6f 6d    The VACUUM com
0880: 6d 61 6e 64 20 77 6f 72 6b 73 20 61 73 20 66 6f  mand works as fo
0890: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28  llows:.**.**   (
08a0: 31 29 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  1)  Create a new
08b0: 20 74 72 61 6e 73 69 65 6e 74 20 64 61 74 61 62   transient datab
08c0: 61 73 65 20 66 69 6c 65 0a 2a 2a 20 20 20 28 32  ase file.**   (2
08d0: 29 20 20 43 6f 70 79 20 61 6c 6c 20 63 6f 6e 74  )  Copy all cont
08e0: 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ent from the dat
08f0: 61 62 61 73 65 20 62 65 69 6e 67 20 76 61 63 75  abase being vacu
0900: 75 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20 20 20 20  umed into.**    
0910: 20 20 20 20 74 68 65 20 6e 65 77 20 74 72 61 6e      the new tran
0920: 73 69 65 6e 74 20 64 61 74 61 62 61 73 65 20 66  sient database f
0930: 69 6c 65 0a 2a 2a 20 20 20 28 33 29 20 20 43 6f  ile.**   (3)  Co
0940: 70 79 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  py content from 
0950: 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 64 61  the transient da
0960: 74 61 62 61 73 65 20 62 61 63 6b 20 69 6e 74 6f  tabase back into
0970: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 6f   the.**        o
0980: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
0990: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ..**.** The tran
09a0: 73 69 65 6e 74 20 64 61 74 61 62 61 73 65 20 72  sient database r
09b0: 65 71 75 69 72 65 73 20 74 65 6d 70 6f 72 61 72  equires temporar
09c0: 79 20 64 69 73 6b 20 73 70 61 63 65 20 61 70 70  y disk space app
09d0: 72 6f 78 69 6d 61 74 65 6c 79 0a 2a 2a 20 65 71  roximately.** eq
09e0: 75 61 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ual to the size 
09f0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
0a00: 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 63  database.  The c
0a10: 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  opy operation of
0a20: 0a 2a 2a 20 73 74 65 70 20 28 33 29 20 72 65 71  .** step (3) req
0a30: 75 69 72 65 73 20 61 64 64 69 74 69 6f 6e 61 6c  uires additional
0a40: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 73 6b 20   temporary disk 
0a50: 73 70 61 63 65 20 61 70 70 72 6f 78 69 6d 61 74  space approximat
0a60: 65 6c 79 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20  ely equal.** to 
0a70: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
0a80: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
0a90: 65 20 66 6f 72 20 74 68 65 20 72 6f 6c 6c 62 61  e for the rollba
0aa0: 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 48  ck journal..** H
0ab0: 65 6e 63 65 2c 20 74 65 6d 70 6f 72 61 72 79 20  ence, temporary 
0ac0: 64 69 73 6b 20 73 70 61 63 65 20 74 68 61 74 20  disk space that 
0ad0: 69 73 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79  is approximately
0ae0: 20 32 78 20 74 68 65 20 73 69 7a 65 20 6f 66 20   2x the size of 
0af0: 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
0b00: 64 61 74 61 62 61 73 65 20 69 73 20 72 65 71 75  database is requ
0b10: 69 72 65 64 2e 20 20 45 76 65 72 79 20 70 61 67  ired.  Every pag
0b20: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
0b30: 65 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  e is written.** 
0b40: 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 33 20  approximately 3 
0b50: 74 69 6d 65 73 3a 20 20 4f 6e 63 65 20 66 6f 72  times:  Once for
0b60: 20 73 74 65 70 20 28 32 29 20 61 6e 64 20 74 77   step (2) and tw
0b70: 69 63 65 20 66 6f 72 20 73 74 65 70 20 28 33 29  ice for step (3)
0b80: 2e 0a 2a 2a 20 54 77 6f 20 77 72 69 74 65 73 20  ..** Two writes 
0b90: 70 65 72 20 70 61 67 65 20 61 72 65 20 72 65 71  per page are req
0ba0: 75 69 72 65 64 20 69 6e 20 73 74 65 70 20 28 33  uired in step (3
0bb0: 29 20 62 65 63 61 75 73 65 20 74 68 65 20 6f 72  ) because the or
0bc0: 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  iginal.** databa
0bd0: 73 65 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20  se content must 
0be0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
0bf0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
0c00: 72 6e 61 6c 20 70 72 69 6f 72 20 74 6f 0a 2a 2a  rnal prior to.**
0c10: 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74 68 65   overwriting the
0c20: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
0c30: 68 65 20 76 61 63 75 75 6d 65 64 20 63 6f 6e 74  he vacuumed cont
0c40: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20  ent..**.** Only 
0c50: 31 78 20 74 65 6d 70 6f 72 61 72 79 20 73 70 61  1x temporary spa
0c60: 63 65 20 61 6e 64 20 6f 6e 6c 79 20 31 78 20 77  ce and only 1x w
0c70: 72 69 74 65 73 20 77 6f 75 6c 64 20 62 65 20 72  rites would be r
0c80: 65 71 75 69 72 65 64 20 69 66 0a 2a 2a 20 74 68  equired if.** th
0c90: 65 20 63 6f 70 79 20 6f 66 20 73 74 65 70 20 28  e copy of step (
0ca0: 33 29 20 77 65 72 65 20 72 65 70 6c 61 63 65 64  3) were replaced
0cb0: 20 62 79 20 64 65 6c 65 74 69 6e 67 20 74 68 65   by deleting the
0cc0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
0cd0: 73 65 0a 2a 2a 20 61 6e 64 20 72 65 6e 61 6d 69  se.** and renami
0ce0: 6e 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74  ng the transient
0cf0: 20 64 61 74 61 62 61 73 65 20 61 73 20 74 68 65   database as the
0d00: 20 6f 72 69 67 69 6e 61 6c 2e 20 20 42 75 74 20   original.  But 
0d10: 74 68 61 74 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  that will.** not
0d20: 20 77 6f 72 6b 20 69 66 20 6f 74 68 65 72 20 70   work if other p
0d30: 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 74 74  rocesses are att
0d40: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
0d50: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a  ginal database..
0d60: 2a 2a 20 41 6e 64 20 61 20 70 6f 77 65 72 20 6c  ** And a power l
0d70: 6f 73 73 20 69 6e 20 62 65 74 77 65 65 6e 20 64  oss in between d
0d80: 65 6c 65 74 69 6e 67 20 74 68 65 20 6f 72 69 67  eleting the orig
0d90: 69 6e 61 6c 20 61 6e 64 20 72 65 6e 61 6d 69 6e  inal and renamin
0da0: 67 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65  g the.** transie
0db0: 6e 74 20 77 6f 75 6c 64 20 63 61 75 73 65 20 74  nt would cause t
0dc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0dd0: 20 74 6f 20 61 70 70 65 61 72 20 74 6f 20 62 65   to appear to be
0de0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 66 6f 6c 6c   deleted.** foll
0df0: 6f 77 69 6e 67 20 72 65 62 6f 6f 74 2e 0a 2a 2f  owing reboot..*/
0e00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 61 63  .void sqlite3Vac
0e10: 75 75 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73  uum(Parse *pPars
0e20: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 6d 29 7b 0a  e, Token *pNm){.
0e30: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
0e40: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
0e50: 65 29 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20  e);.  int iDb = 
0e60: 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20  0;.  if( v==0 ) 
0e70: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4e  return;.  if( pN
0e80: 6d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  m ){.#ifndef SQL
0e90: 49 54 45 5f 42 55 47 5f 43 4f 4d 50 41 54 49 42  ITE_BUG_COMPATIB
0ea0: 4c 45 5f 32 30 31 36 30 38 31 39 0a 20 20 20 20  LE_20160819.    
0eb0: 2f 2a 20 44 65 66 61 75 6c 74 20 62 65 68 61 76  /* Default behav
0ec0: 69 6f 72 3a 20 20 52 65 70 6f 72 74 20 61 6e 20  ior:  Report an 
0ed0: 65 72 72 6f 72 20 69 66 20 74 68 65 20 61 72 67  error if the arg
0ee0: 75 6d 65 6e 74 20 74 6f 20 56 41 43 55 55 4d 20  ument to VACUUM 
0ef0: 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 65  is.    ** not re
0f00: 63 6f 67 6e 69 7a 65 64 20 2a 2f 0a 20 20 20 20  cognized */.    
0f10: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
0f20: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
0f30: 20 70 4e 6d 2c 20 70 4e 6d 2c 20 26 70 4e 6d 29   pNm, pNm, &pNm)
0f40: 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
0f50: 29 20 72 65 74 75 72 6e 3b 0a 23 65 6c 73 65 0a  ) return;.#else.
0f60: 20 20 20 20 2f 2a 20 57 68 65 6e 20 53 51 4c 49      /* When SQLI
0f70: 54 45 5f 42 55 47 5f 43 4f 4d 50 41 54 49 42 4c  TE_BUG_COMPATIBL
0f80: 45 5f 32 30 31 36 30 38 31 39 20 69 73 20 64 65  E_20160819 is de
0f90: 66 69 6e 65 64 2c 20 75 6e 72 65 63 6f 67 6e 69  fined, unrecogni
0fa0: 7a 65 64 20 61 72 67 75 6d 65 6e 74 73 0a 20 20  zed arguments.  
0fb0: 20 20 2a 2a 20 74 6f 20 56 41 43 55 55 4d 20 61    ** to VACUUM a
0fc0: 72 65 20 73 69 6c 65 6e 74 6c 79 20 69 67 6e 6f  re silently igno
0fd0: 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 61 20  red.  This is a 
0fe0: 62 61 63 6b 2d 6f 75 74 20 6f 66 20 61 20 62 75  back-out of a bu
0ff0: 67 20 66 69 78 20 74 68 61 74 0a 20 20 20 20 2a  g fix that.    *
1000: 2a 20 6f 63 63 75 72 72 65 64 20 6f 6e 20 32 30  * occurred on 20
1010: 31 36 2d 30 38 2d 31 39 20 28 68 74 74 70 73 3a  16-08-19 (https:
1020: 2f 2f 77 77 77 2e 73 71 6c 69 74 65 2e 6f 72 67  //www.sqlite.org
1030: 2f 73 72 63 2f 69 6e 66 6f 2f 30 38 33 66 39 65  /src/info/083f9e
1040: 36 32 37 30 29 2e 0a 20 20 20 20 2a 2a 20 54 68  6270)..    ** Th
1050: 65 20 62 75 67 67 79 20 62 65 68 61 76 69 6f 72  e buggy behavior
1060: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72   is required for
1070: 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 74 69 62   binary compatib
1080: 69 6c 69 74 79 20 77 69 74 68 20 73 6f 6d 65 0a  ility with some.
1090: 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 61 70      ** legacy ap
10a0: 70 6c 69 63 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  plications. */. 
10b0: 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33     iDb = sqlite3
10c0: 46 69 6e 64 44 62 28 70 50 61 72 73 65 2d 3e 64  FindDb(pParse->d
10d0: 62 2c 20 70 4e 6d 29 3b 0a 20 20 20 20 69 66 28  b, pNm);.    if(
10e0: 20 69 44 62 3c 30 20 29 20 69 44 62 20 3d 20 30   iDb<0 ) iDb = 0
10f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69  ;.#endif.  }.  i
1100: 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20  f( iDb!=1 ){.   
1110: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 57 72   sqlite3SchemaWr
1120: 69 74 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  itable(pParse, i
1130: 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
1140: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
1150: 5f 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 0a 20  _Vacuum, iDb);. 
1160: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1170: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
1180: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
1190: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
11a0: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
11b0: 74 68 65 20 4f 50 5f 56 61 63 75 75 6d 20 6f 70  the OP_Vacuum op
11c0: 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
11d0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11e0: 52 75 6e 56 61 63 75 75 6d 28 63 68 61 72 20 2a  RunVacuum(char *
11f0: 2a 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  *pzErrMsg, sqlit
1200: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
1210: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1220: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 52  ITE_OK;     /* R
1230: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
1240: 73 65 72 76 69 63 65 20 72 6f 75 74 69 6e 65 73  service routines
1250: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 4d 61   */.  Btree *pMa
1260: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
1270: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 62 65   The database be
1280: 69 6e 67 20 76 61 63 75 75 6d 65 64 20 2a 2f 0a  ing vacuumed */.
1290: 20 20 42 74 72 65 65 20 2a 70 54 65 6d 70 3b 20    Btree *pTemp; 
12a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
12b0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
12c0: 61 73 65 20 77 65 20 76 61 63 75 75 6d 20 69 6e  ase we vacuum in
12d0: 74 6f 20 2a 2f 0a 20 20 75 31 36 20 73 61 76 65  to */.  u16 save
12e0: 64 5f 6d 44 62 46 6c 61 67 73 3b 20 20 20 20 20  d_mDbFlags;     
12f0: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1300: 66 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 2a  f db->mDbFlags *
1310: 2f 0a 20 20 75 33 32 20 73 61 76 65 64 5f 66 6c  /.  u32 saved_fl
1320: 61 67 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  ags;        /* S
1330: 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 64 62  aved value of db
1340: 2d 3e 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  ->flags */.  int
1350: 20 73 61 76 65 64 5f 6e 43 68 61 6e 67 65 3b 20   saved_nChange; 
1360: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 76 61       /* Saved va
1370: 6c 75 65 20 6f 66 20 64 62 2d 3e 6e 43 68 61 6e  lue of db->nChan
1380: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  ge */.  int save
1390: 64 5f 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 20  d_nTotalChange; 
13a0: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
13b0: 66 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e  f db->nTotalChan
13c0: 67 65 20 2a 2f 0a 20 20 75 38 20 73 61 76 65 64  ge */.  u8 saved
13d0: 5f 6d 54 72 61 63 65 3b 20 20 20 20 20 20 20 20  _mTrace;        
13e0: 2f 2a 20 53 61 76 65 64 20 74 72 61 63 65 20 73  /* Saved trace s
13f0: 65 74 74 69 6e 67 73 20 2a 2f 0a 20 20 44 62 20  ettings */.  Db 
1400: 2a 70 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20  *pDb = 0;       
1410: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1420: 20 74 6f 20 64 65 74 61 63 68 20 61 74 20 65 6e   to detach at en
1430: 64 20 6f 66 20 76 61 63 75 75 6d 20 2a 2f 0a 20  d of vacuum */. 
1440: 20 69 6e 74 20 69 73 4d 65 6d 44 62 3b 20 20 20   int isMemDb;   
1450: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1460: 20 69 66 20 76 61 63 75 75 6d 69 6e 67 20 61 20   if vacuuming a 
1470: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73  :memory: databas
1480: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 3b  e */.  int nRes;
1490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14a0: 2a 20 42 79 74 65 73 20 6f 66 20 72 65 73 65 72  * Bytes of reser
14b0: 76 65 64 20 73 70 61 63 65 20 61 74 20 74 68 65  ved space at the
14c0: 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   end of each pag
14d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 62 3b 20  e */.  int nDb; 
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 74 74 61  * Number of atta
1500: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 2a  ched databases *
1510: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
1520: 7a 44 62 4d 61 69 6e 3b 20 20 20 20 2f 2a 20 53  zDbMain;    /* S
1530: 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 20 64 61  chema name of da
1540: 74 61 62 61 73 65 20 74 6f 20 76 61 63 75 75 6d  tabase to vacuum
1550: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 64 62 2d 3e   */..  if( !db->
1560: 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
1570: 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
1580: 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 64 62 2c  ng(pzErrMsg, db,
1590: 20 22 63 61 6e 6e 6f 74 20 56 41 43 55 55 4d 20   "cannot VACUUM 
15a0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 74 72  from within a tr
15b0: 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20  ansaction");.   
15c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
15d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
15e0: 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
15f0: 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 ){.    sqlite3
1600: 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72 4d  SetString(pzErrM
1610: 73 67 2c 20 64 62 2c 22 63 61 6e 6e 6f 74 20 56  sg, db,"cannot V
1620: 41 43 55 55 4d 20 2d 20 53 51 4c 20 73 74 61 74  ACUUM - SQL stat
1630: 65 6d 65 6e 74 73 20 69 6e 20 70 72 6f 67 72 65  ements in progre
1640: 73 73 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ss");.    return
1650: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1660: 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68   }..  /* Save th
1670: 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1680: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1690: 66 6c 61 67 73 20 73 6f 20 74 68 61 74 20 69 74  flags so that it
16a0: 20 63 61 6e 20 62 65 20 0a 20 20 2a 2a 20 72 65   can be .  ** re
16b0: 73 74 6f 72 65 64 20 62 65 66 6f 72 65 20 72 65  stored before re
16c0: 74 75 72 6e 69 6e 67 2e 20 54 68 65 6e 20 73 65  turning. Then se
16d0: 74 20 74 68 65 20 77 72 69 74 61 62 6c 65 2d 73  t the writable-s
16e0: 63 68 65 6d 61 20 66 6c 61 67 2c 20 61 6e 64 0a  chema flag, and.
16f0: 20 20 2a 2a 20 64 69 73 61 62 6c 65 20 43 48 45    ** disable CHE
1700: 43 4b 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  CK and foreign k
1710: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 20  ey constraints. 
1720: 20 2a 2f 0a 20 20 73 61 76 65 64 5f 66 6c 61 67   */.  saved_flag
1730: 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73 3b 0a 20  s = db->flags;. 
1740: 20 73 61 76 65 64 5f 6d 44 62 46 6c 61 67 73 20   saved_mDbFlags 
1750: 3d 20 64 62 2d 3e 6d 44 62 46 6c 61 67 73 3b 0a  = db->mDbFlags;.
1760: 20 20 73 61 76 65 64 5f 6e 43 68 61 6e 67 65 20    saved_nChange 
1770: 3d 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20  = db->nChange;. 
1780: 20 73 61 76 65 64 5f 6e 54 6f 74 61 6c 43 68 61   saved_nTotalCha
1790: 6e 67 65 20 3d 20 64 62 2d 3e 6e 54 6f 74 61 6c  nge = db->nTotal
17a0: 43 68 61 6e 67 65 3b 0a 20 20 73 61 76 65 64 5f  Change;.  saved_
17b0: 6d 54 72 61 63 65 20 3d 20 64 62 2d 3e 6d 54 72  mTrace = db->mTr
17c0: 61 63 65 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  ace;.  db->flags
17d0: 20 7c 3d 20 53 51 4c 49 54 45 5f 57 72 69 74 65   |= SQLITE_Write
17e0: 53 63 68 65 6d 61 20 7c 20 53 51 4c 49 54 45 5f  Schema | SQLITE_
17f0: 49 67 6e 6f 72 65 43 68 65 63 6b 73 3b 0a 20 20  IgnoreChecks;.  
1800: 64 62 2d 3e 6d 44 62 46 6c 61 67 73 20 7c 3d 20  db->mDbFlags |= 
1810: 44 42 46 4c 41 47 5f 50 72 65 66 65 72 42 75 69  DBFLAG_PreferBui
1820: 6c 74 69 6e 20 7c 20 44 42 46 4c 41 47 5f 56 61  ltin | DBFLAG_Va
1830: 63 75 75 6d 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  cuum;.  db->flag
1840: 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 46 6f  s &= ~(SQLITE_Fo
1850: 72 65 69 67 6e 4b 65 79 73 20 7c 20 53 51 4c 49  reignKeys | SQLI
1860: 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20  TE_ReverseOrder 
1870: 7c 20 53 51 4c 49 54 45 5f 43 6f 75 6e 74 52 6f  | SQLITE_CountRo
1880: 77 73 29 3b 0a 20 20 64 62 2d 3e 6d 54 72 61 63  ws);.  db->mTrac
1890: 65 20 3d 20 30 3b 0a 0a 20 20 7a 44 62 4d 61 69  e = 0;..  zDbMai
18a0: 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  n = db->aDb[iDb]
18b0: 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20 70 4d 61  .zDbSName;.  pMa
18c0: 69 6e 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  in = db->aDb[iDb
18d0: 5d 2e 70 42 74 3b 0a 20 20 69 73 4d 65 6d 44 62  ].pBt;.  isMemDb
18e0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49   = sqlite3PagerI
18f0: 73 4d 65 6d 64 62 28 73 71 6c 69 74 65 33 42 74  sMemdb(sqlite3Bt
1900: 72 65 65 50 61 67 65 72 28 70 4d 61 69 6e 29 29  reePager(pMain))
1910: 3b 0a 0a 20 20 2f 2a 20 41 74 74 61 63 68 20 74  ;..  /* Attach t
1920: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  he temporary dat
1930: 61 62 61 73 65 20 61 73 20 27 76 61 63 75 75 6d  abase as 'vacuum
1940: 5f 64 62 27 2e 20 54 68 65 20 73 79 6e 63 68 72  _db'. The synchr
1950: 6f 6e 6f 75 73 20 70 72 61 67 6d 61 0a 20 20 2a  onous pragma.  *
1960: 2a 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f 20  * can be set to 
1970: 27 6f 66 66 27 20 66 6f 72 20 74 68 69 73 20 66  'off' for this f
1980: 69 6c 65 2c 20 61 73 20 69 74 20 69 73 20 6e 6f  ile, as it is no
1990: 74 20 72 65 63 6f 76 65 72 65 64 20 69 66 20 61  t recovered if a
19a0: 20 63 72 61 73 68 0a 20 20 2a 2a 20 6f 63 63 75   crash.  ** occu
19b0: 72 73 20 61 6e 79 77 61 79 2e 20 54 68 65 20 69  rs anyway. The i
19c0: 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20  ntegrity of the 
19d0: 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 69 6e  database is main
19e0: 74 61 69 6e 65 64 20 62 79 20 61 0a 20 20 2a 2a  tained by a.  **
19f0: 20 28 70 6f 73 73 69 62 6c 79 20 73 79 6e 63 68   (possibly synch
1a00: 72 6f 6e 6f 75 73 29 20 74 72 61 6e 73 61 63 74  ronous) transact
1a10: 69 6f 6e 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  ion opened on th
1a20: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1a30: 62 65 66 6f 72 65 0a 20 20 2a 2a 20 73 71 6c 69  before.  ** sqli
1a40: 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65  te3BtreeCopyFile
1a50: 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20  () is called..  
1a60: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 6f 70 74 69 6d  **.  ** An optim
1a70: 69 73 61 74 69 6f 6e 20 77 6f 75 6c 64 20 62 65  isation would be
1a80: 20 74 6f 20 75 73 65 20 61 20 6e 6f 6e 2d 6a 6f   to use a non-jo
1a90: 75 72 6e 61 6c 65 64 20 70 61 67 65 72 2e 0a 20  urnaled pager.. 
1aa0: 20 2a 2a 20 28 4c 61 74 65 72 3a 29 20 49 20 74   ** (Later:) I t
1ab0: 72 69 65 64 20 73 65 74 74 69 6e 67 20 22 50 52  ried setting "PR
1ac0: 41 47 4d 41 20 76 61 63 75 75 6d 5f 64 62 2e 6a  AGMA vacuum_db.j
1ad0: 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 22  ournal_mode=OFF"
1ae0: 20 62 75 74 0a 20 20 2a 2a 20 74 68 61 74 20 61   but.  ** that a
1af0: 63 74 75 61 6c 6c 79 20 6d 61 64 65 20 74 68 65  ctually made the
1b00: 20 56 41 43 55 55 4d 20 72 75 6e 20 73 6c 6f 77   VACUUM run slow
1b10: 65 72 2e 20 20 56 65 72 79 20 6c 69 74 74 6c 65  er.  Very little
1b20: 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 0a 20 20 2a   journalling.  *
1b30: 2a 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72  * actually occur
1b40: 73 20 77 68 65 6e 20 64 6f 69 6e 67 20 61 20 76  s when doing a v
1b50: 61 63 75 75 6d 20 73 69 6e 63 65 20 74 68 65 20  acuum since the 
1b60: 76 61 63 75 75 6d 5f 64 62 20 69 73 20 69 6e 69  vacuum_db is ini
1b70: 74 69 61 6c 6c 79 0a 20 20 2a 2a 20 65 6d 70 74  tially.  ** empt
1b80: 79 2e 20 20 4f 6e 6c 79 20 74 68 65 20 6a 6f 75  y.  Only the jou
1b90: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
1ba0: 72 69 74 74 65 6e 2e 20 20 41 70 70 61 72 65 6e  ritten.  Apparen
1bb0: 74 6c 79 20 69 74 20 74 61 6b 65 73 20 6d 6f 72  tly it takes mor
1bc0: 65 0a 20 20 2a 2a 20 74 69 6d 65 20 74 6f 20 70  e.  ** time to p
1bd0: 61 72 73 65 20 61 6e 64 20 72 75 6e 20 74 68 65  arse and run the
1be0: 20 50 52 41 47 4d 41 20 74 6f 20 74 75 72 6e 20   PRAGMA to turn 
1bf0: 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66 66 20  journalling off 
1c00: 74 68 61 6e 20 69 74 20 64 6f 65 73 0a 20 20 2a  than it does.  *
1c10: 2a 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 6a  * to write the j
1c20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
1c30: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6e 44 62 20 3d  le..  */.  nDb =
1c40: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 72 63 20 3d   db->nDb;.  rc =
1c50: 20 65 78 65 63 53 71 6c 28 64 62 2c 20 70 7a 45   execSql(db, pzE
1c60: 72 72 4d 73 67 2c 20 22 41 54 54 41 43 48 27 27  rrMsg, "ATTACH''
1c70: 41 53 20 76 61 63 75 75 6d 5f 64 62 22 29 3b 0a  AS vacuum_db");.
1c80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c90: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f  _OK ) goto end_o
1ca0: 66 5f 76 61 63 75 75 6d 3b 0a 20 20 61 73 73 65  f_vacuum;.  asse
1cb0: 72 74 28 20 28 64 62 2d 3e 6e 44 62 2d 31 29 3d  rt( (db->nDb-1)=
1cc0: 3d 6e 44 62 20 29 3b 0a 20 20 70 44 62 20 3d 20  =nDb );.  pDb = 
1cd0: 26 64 62 2d 3e 61 44 62 5b 6e 44 62 5d 3b 0a 20  &db->aDb[nDb];. 
1ce0: 20 61 73 73 65 72 74 28 20 73 74 72 63 6d 70 28   assert( strcmp(
1cf0: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 22 76  pDb->zDbSName,"v
1d00: 61 63 75 75 6d 5f 64 62 22 29 3d 3d 30 20 29 3b  acuum_db")==0 );
1d10: 0a 20 20 70 54 65 6d 70 20 3d 20 70 44 62 2d 3e  .  pTemp = pDb->
1d20: 70 42 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 63  pBt;..  /* The c
1d30: 61 6c 6c 20 74 6f 20 65 78 65 63 53 71 6c 28 29  all to execSql()
1d40: 20 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 74   to attach the t
1d50: 65 6d 70 20 64 61 74 61 62 61 73 65 20 68 61 73  emp database has
1d60: 20 6c 65 66 74 20 74 68 65 20 66 69 6c 65 0a 20   left the file. 
1d70: 20 2a 2a 20 6c 6f 63 6b 65 64 20 28 61 73 20 74   ** locked (as t
1d80: 68 65 72 65 20 77 61 73 20 6d 6f 72 65 20 74 68  here was more th
1d90: 61 6e 20 6f 6e 65 20 61 63 74 69 76 65 20 73 74  an one active st
1da0: 61 74 65 6d 65 6e 74 20 77 68 65 6e 20 74 68 65  atement when the
1db0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
1dc0: 2a 20 74 6f 20 72 65 61 64 20 74 68 65 20 73 63  * to read the sc
1dd0: 68 65 6d 61 20 77 61 73 20 63 6f 6e 63 6c 75 64  hema was conclud
1de0: 65 64 2e 20 55 6e 6c 6f 63 6b 20 69 74 20 68 65  ed. Unlock it he
1df0: 72 65 20 73 6f 20 74 68 61 74 20 74 68 69 73 20  re so that this 
1e00: 64 6f 65 73 6e 27 74 0a 20 20 2a 2a 20 63 61 75  doesn't.  ** cau
1e10: 73 65 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20  se problems for 
1e20: 74 68 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65  the call to Btre
1e30: 65 53 65 74 50 61 67 65 53 69 7a 65 28 29 20 62  eSetPageSize() b
1e40: 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 73 71 6c 69  elow.  */.  sqli
1e50: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 70  te3BtreeCommit(p
1e60: 54 65 6d 70 29 3b 0a 0a 20 20 6e 52 65 73 20 3d  Temp);..  nRes =
1e70: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1e80: 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 70  OptimalReserve(p
1e90: 4d 61 69 6e 29 3b 0a 0a 20 20 2f 2a 20 41 20 56  Main);..  /* A V
1ea0: 41 43 55 55 4d 20 63 61 6e 6e 6f 74 20 63 68 61  ACUUM cannot cha
1eb0: 6e 67 65 20 74 68 65 20 70 61 67 65 73 69 7a 65  nge the pagesize
1ec0: 20 6f 66 20 61 6e 20 65 6e 63 72 79 70 74 65 64   of an encrypted
1ed0: 20 64 61 74 61 62 61 73 65 2e 20 2a 2f 0a 23 69   database. */.#i
1ee0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
1ef0: 43 4f 44 45 43 0a 20 20 69 66 28 20 64 62 2d 3e  CODEC.  if( db->
1f00: 6e 65 78 74 50 61 67 65 73 69 7a 65 20 29 7b 0a  nextPagesize ){.
1f10: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
1f20: 73 71 6c 69 74 65 33 43 6f 64 65 63 47 65 74 4b  sqlite3CodecGetK
1f30: 65 79 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74  ey(sqlite3*, int
1f40: 2c 20 76 6f 69 64 2a 2a 2c 20 69 6e 74 2a 29 3b  , void**, int*);
1f50: 0a 20 20 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20  .    int nKey;. 
1f60: 20 20 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20     char *zKey;. 
1f70: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 63 47     sqlite3CodecG
1f80: 65 74 4b 65 79 28 64 62 2c 20 69 44 62 2c 20 28  etKey(db, iDb, (
1f90: 76 6f 69 64 2a 2a 29 26 7a 4b 65 79 2c 20 26 6e  void**)&zKey, &n
1fa0: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  Key);.    if( nK
1fb0: 65 79 20 29 20 64 62 2d 3e 6e 65 78 74 50 61 67  ey ) db->nextPag
1fc0: 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 7d 0a 23  esize = 0;.  }.#
1fd0: 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
1fe0: 42 74 72 65 65 53 65 74 43 61 63 68 65 53 69 7a  BtreeSetCacheSiz
1ff0: 65 28 70 54 65 6d 70 2c 20 64 62 2d 3e 61 44 62  e(pTemp, db->aDb
2000: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 63  [iDb].pSchema->c
2010: 61 63 68 65 5f 73 69 7a 65 29 3b 0a 20 20 73 71  ache_size);.  sq
2020: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
2030: 6c 6c 53 69 7a 65 28 70 54 65 6d 70 2c 20 73 71  llSize(pTemp, sq
2040: 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
2050: 6c 6c 53 69 7a 65 28 70 4d 61 69 6e 2c 30 29 29  llSize(pMain,0))
2060: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2070: 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 70 54  SetPagerFlags(pT
2080: 65 6d 70 2c 20 50 41 47 45 52 5f 53 59 4e 43 48  emp, PAGER_SYNCH
2090: 52 4f 4e 4f 55 53 5f 4f 46 46 7c 50 41 47 45 52  RONOUS_OFF|PAGER
20a0: 5f 43 41 43 48 45 53 50 49 4c 4c 29 3b 0a 0a 20  _CACHESPILL);.. 
20b0: 20 2f 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e   /* Begin a tran
20c0: 73 61 63 74 69 6f 6e 20 61 6e 64 20 74 61 6b 65  saction and take
20d0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
20e0: 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
20f0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
2100: 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
2110: 62 65 66 6f 72 65 20 74 68 65 20 73 71 6c 69 74  before the sqlit
2120: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
2130: 7a 65 28 70 4d 61 69 6e 29 20 63 61 6c 6c 20 62  ze(pMain) call b
2140: 65 6c 6f 77 2c 0a 20 20 2a 2a 20 74 6f 20 65 6e  elow,.  ** to en
2150: 73 75 72 65 20 74 68 61 74 20 77 65 20 64 6f 20  sure that we do 
2160: 6e 6f 74 20 74 72 79 20 74 6f 20 63 68 61 6e 67  not try to chang
2170: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
2180: 6f 6e 20 61 20 57 41 4c 20 64 61 74 61 62 61 73  on a WAL databas
2190: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 65  e..  */.  rc = e
21a0: 78 65 63 53 71 6c 28 64 62 2c 20 70 7a 45 72 72  xecSql(db, pzErr
21b0: 4d 73 67 2c 20 22 42 45 47 49 4e 22 29 3b 0a 20  Msg, "BEGIN");. 
21c0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
21d0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  OK ) goto end_of
21e0: 5f 76 61 63 75 75 6d 3b 0a 20 20 72 63 20 3d 20  _vacuum;.  rc = 
21f0: 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
2200: 6e 54 72 61 6e 73 28 70 4d 61 69 6e 2c 20 32 29  nTrans(pMain, 2)
2210: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2220: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
2230: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 0a 20 20 2f  _of_vacuum;..  /
2240: 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
2250: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 70   to change the p
2260: 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 57  age size for a W
2270: 41 4c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  AL database */. 
2280: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
2290: 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
22a0: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
22b0: 72 28 70 4d 61 69 6e 29 29 0a 20 20 20 20 20 20  r(pMain)).      
22c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 20 20 20 20 3d 3d 50 41 47 45 52           ==PAGER
22f0: 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
2300: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 65 78 74   ){.    db->next
2310: 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20  Pagesize = 0;.  
2320: 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  }..  if( sqlite3
2330: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
2340: 28 70 54 65 6d 70 2c 20 73 71 6c 69 74 65 33 42  (pTemp, sqlite3B
2350: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
2360: 70 4d 61 69 6e 29 2c 20 6e 52 65 73 2c 20 30 29  pMain), nRes, 0)
2370: 0a 20 20 20 7c 7c 20 28 21 69 73 4d 65 6d 44 62  .   || (!isMemDb
2380: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65   && sqlite3Btree
2390: 53 65 74 50 61 67 65 53 69 7a 65 28 70 54 65 6d  SetPageSize(pTem
23a0: 70 2c 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73  p, db->nextPages
23b0: 69 7a 65 2c 20 6e 52 65 73 2c 20 30 29 29 0a 20  ize, nRes, 0)). 
23c0: 20 20 7c 7c 20 4e 45 56 45 52 28 64 62 2d 3e 6d    || NEVER(db->m
23d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 29  allocFailed).  )
23e0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
23f0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2400: 20 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61    goto end_of_va
2410: 63 75 75 6d 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  cuum;.  }..#ifnd
2420: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2430: 55 54 4f 56 41 43 55 55 4d 0a 20 20 73 71 6c 69  UTOVACUUM.  sqli
2440: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
2450: 61 63 75 75 6d 28 70 54 65 6d 70 2c 20 64 62 2d  acuum(pTemp, db-
2460: 3e 6e 65 78 74 41 75 74 6f 76 61 63 3e 3d 30 20  >nextAutovac>=0 
2470: 3f 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61  ? db->nextAutova
2480: 63 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  c :.            
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
24b0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41 75  qlite3BtreeGetAu
24c0: 74 6f 56 61 63 75 75 6d 28 70 4d 61 69 6e 29 29  toVacuum(pMain))
24d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 51  ;.#endif..  /* Q
24e0: 75 65 72 79 20 74 68 65 20 73 63 68 65 6d 61 20  uery the schema 
24f0: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
2500: 62 61 73 65 2e 20 43 72 65 61 74 65 20 61 20 6d  base. Create a m
2510: 69 72 72 6f 72 20 73 63 68 65 6d 61 0a 20 20 2a  irror schema.  *
2520: 2a 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72 61  * in the tempora
2530: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ry database..  *
2540: 2f 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  /.  db->init.iDb
2550: 20 3d 20 6e 44 62 3b 20 2f 2a 20 66 6f 72 63 65   = nDb; /* force
2560: 20 6e 65 77 20 43 52 45 41 54 45 20 73 74 61 74   new CREATE stat
2570: 65 6d 65 6e 74 73 20 69 6e 74 6f 20 76 61 63 75  ements into vacu
2580: 75 6d 5f 64 62 20 2a 2f 0a 20 20 72 63 20 3d 20  um_db */.  rc = 
2590: 65 78 65 63 53 71 6c 46 28 64 62 2c 20 70 7a 45  execSqlF(db, pzE
25a0: 72 72 4d 73 67 2c 0a 20 20 20 20 20 20 22 53 45  rrMsg,.      "SE
25b0: 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 5c 22  LECT sql FROM \"
25c0: 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74  %w\".sqlite_mast
25d0: 65 72 22 0a 20 20 20 20 20 20 22 20 57 48 45 52  er".      " WHER
25e0: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 41 4e  E type='table'AN
25f0: 44 20 6e 61 6d 65 3c 3e 27 73 71 6c 69 74 65 5f  D name<>'sqlite_
2600: 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20  sequence'".     
2610: 20 22 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28   " AND coalesce(
2620: 72 6f 6f 74 70 61 67 65 2c 31 29 3e 30 22 2c 0a  rootpage,1)>0",.
2630: 20 20 20 20 20 20 7a 44 62 4d 61 69 6e 0a 20 20        zDbMain.  
2640: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2650: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
2660: 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 72  d_of_vacuum;.  r
2670: 63 20 3d 20 65 78 65 63 53 71 6c 46 28 64 62 2c  c = execSqlF(db,
2680: 20 70 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20   pzErrMsg,.     
2690: 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
26a0: 4d 20 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f  M \"%w\".sqlite_
26b0: 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 22 20  master".      " 
26c0: 57 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65  WHERE type='inde
26d0: 78 27 20 41 4e 44 20 6c 65 6e 67 74 68 28 73 71  x' AND length(sq
26e0: 6c 29 3e 31 30 22 2c 0a 20 20 20 20 20 20 7a 44  l)>10",.      zD
26f0: 62 4d 61 69 6e 0a 20 20 29 3b 0a 20 20 69 66 28  bMain.  );.  if(
2700: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2710: 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61 63   goto end_of_vac
2720: 75 75 6d 3b 0a 20 20 64 62 2d 3e 69 6e 69 74 2e  uum;.  db->init.
2730: 69 44 62 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4c  iDb = 0;..  /* L
2740: 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 65 20  oop through the 
2750: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6d 61  tables in the ma
2760: 69 6e 20 64 61 74 61 62 61 73 65 2e 20 46 6f 72  in database. For
2770: 20 65 61 63 68 2c 20 64 6f 0a 20 20 2a 2a 20 61   each, do.  ** a
2780: 6e 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 76  n "INSERT INTO v
2790: 61 63 75 75 6d 5f 64 62 2e 78 78 78 20 53 45 4c  acuum_db.xxx SEL
27a0: 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61 69 6e 2e  ECT * FROM main.
27b0: 78 78 78 3b 22 20 74 6f 20 63 6f 70 79 0a 20 20  xxx;" to copy.  
27c0: 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ** the contents 
27d0: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
27e0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
27f0: 20 20 72 63 20 3d 20 65 78 65 63 53 71 6c 46 28    rc = execSqlF(
2800: 64 62 2c 20 70 7a 45 72 72 4d 73 67 2c 0a 20 20  db, pzErrMsg,.  
2810: 20 20 20 20 22 53 45 4c 45 43 54 27 49 4e 53 45      "SELECT'INSE
2820: 52 54 20 49 4e 54 4f 20 76 61 63 75 75 6d 5f 64  RT INTO vacuum_d
2830: 62 2e 27 7c 7c 71 75 6f 74 65 28 6e 61 6d 65 29  b.'||quote(name)
2840: 22 0a 20 20 20 20 20 20 22 7c 7c 27 20 53 45 4c  ".      "||' SEL
2850: 45 43 54 2a 46 52 4f 4d 5c 22 25 77 5c 22 2e 27  ECT*FROM\"%w\".'
2860: 7c 7c 71 75 6f 74 65 28 6e 61 6d 65 29 22 0a 20  ||quote(name)". 
2870: 20 20 20 20 20 22 46 52 4f 4d 20 76 61 63 75 75       "FROM vacuu
2880: 6d 5f 64 62 2e 73 71 6c 69 74 65 5f 6d 61 73 74  m_db.sqlite_mast
2890: 65 72 20 22 0a 20 20 20 20 20 20 22 57 48 45 52  er ".      "WHER
28a0: 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 41 4e  E type='table'AN
28b0: 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70  D coalesce(rootp
28c0: 61 67 65 2c 31 29 3e 30 22 2c 0a 20 20 20 20 20  age,1)>0",.     
28d0: 20 7a 44 62 4d 61 69 6e 0a 20 20 29 3b 0a 20 20   zDbMain.  );.  
28e0: 61 73 73 65 72 74 28 20 28 64 62 2d 3e 6d 44 62  assert( (db->mDb
28f0: 46 6c 61 67 73 20 26 20 44 42 46 4c 41 47 5f 56  Flags & DBFLAG_V
2900: 61 63 75 75 6d 29 21 3d 30 20 29 3b 0a 20 20 64  acuum)!=0 );.  d
2910: 62 2d 3e 6d 44 62 46 6c 61 67 73 20 26 3d 20 7e  b->mDbFlags &= ~
2920: 44 42 46 4c 41 47 5f 56 61 63 75 75 6d 3b 0a 20  DBFLAG_Vacuum;. 
2930: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2940: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  OK ) goto end_of
2950: 5f 76 61 63 75 75 6d 3b 0a 0a 20 20 2f 2a 20 43  _vacuum;..  /* C
2960: 6f 70 79 20 74 68 65 20 74 72 69 67 67 65 72 73  opy the triggers
2970: 2c 20 76 69 65 77 73 2c 20 61 6e 64 20 76 69 72  , views, and vir
2980: 74 75 61 6c 20 74 61 62 6c 65 73 20 66 72 6f 6d  tual tables from
2990: 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
29a0: 73 65 0a 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20  se.  ** over to 
29b0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 61  the temporary da
29c0: 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66  tabase.  None of
29d0: 20 74 68 65 73 65 20 6f 62 6a 65 63 74 73 20 68   these objects h
29e0: 61 73 20 61 6e 79 0a 20 20 2a 2a 20 61 73 73 6f  as any.  ** asso
29f0: 63 69 61 74 65 64 20 73 74 6f 72 61 67 65 2c 20  ciated storage, 
2a00: 73 6f 20 61 6c 6c 20 77 65 20 68 61 76 65 20 74  so all we have t
2a10: 6f 20 64 6f 20 69 73 20 63 6f 70 79 20 74 68 65  o do is copy the
2a20: 69 72 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  ir entries.  ** 
2a30: 66 72 6f 6d 20 74 68 65 20 53 51 4c 49 54 45 5f  from the SQLITE_
2a40: 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 0a 20 20  MASTER table..  
2a50: 2a 2f 0a 20 20 72 63 20 3d 20 65 78 65 63 53 71  */.  rc = execSq
2a60: 6c 46 28 64 62 2c 20 70 7a 45 72 72 4d 73 67 2c  lF(db, pzErrMsg,
2a70: 0a 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49  .      "INSERT I
2a80: 4e 54 4f 20 76 61 63 75 75 6d 5f 64 62 2e 73 71  NTO vacuum_db.sq
2a90: 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
2aa0: 20 20 20 22 20 53 45 4c 45 43 54 2a 46 52 4f 4d     " SELECT*FROM
2ab0: 20 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d   \"%w\".sqlite_m
2ac0: 61 73 74 65 72 22 0a 20 20 20 20 20 20 22 20 57  aster".      " W
2ad0: 48 45 52 45 20 74 79 70 65 20 49 4e 28 27 76 69  HERE type IN('vi
2ae0: 65 77 27 2c 27 74 72 69 67 67 65 72 27 29 22 0a  ew','trigger')".
2af0: 20 20 20 20 20 20 22 20 4f 52 28 74 79 70 65 3d        " OR(type=
2b00: 27 74 61 62 6c 65 27 41 4e 44 20 72 6f 6f 74 70  'table'AND rootp
2b10: 61 67 65 3d 30 29 22 2c 0a 20 20 20 20 20 20 7a  age=0)",.      z
2b20: 44 62 4d 61 69 6e 0a 20 20 29 3b 0a 20 20 69 66  DbMain.  );.  if
2b30: 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
2b40: 6f 66 5f 76 61 63 75 75 6d 3b 0a 0a 20 20 2f 2a  of_vacuum;..  /*
2b50: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
2b60: 74 68 65 72 65 20 69 73 20 61 20 77 72 69 74 65  there is a write
2b70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
2b80: 6e 20 6f 6e 20 62 6f 74 68 20 74 68 65 20 0a 20  n on both the . 
2b90: 20 2a 2a 20 76 61 63 75 75 6d 20 64 61 74 61 62   ** vacuum datab
2ba0: 61 73 65 20 61 6e 64 20 74 68 65 20 6d 61 69 6e  ase and the main
2bb0: 20 64 61 74 61 62 61 73 65 2e 20 41 73 73 75 6d   database. Assum
2bc0: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  ing no error occ
2bd0: 75 72 73 2c 0a 20 20 2a 2a 20 62 6f 74 68 20 74  urs,.  ** both t
2be0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
2bf0: 63 6c 6f 73 65 64 20 62 79 20 74 68 69 73 20 62  closed by this b
2c00: 6c 6f 63 6b 20 2d 20 74 68 65 20 6d 61 69 6e 20  lock - the main 
2c10: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 72  database.  ** tr
2c20: 61 6e 73 61 63 74 69 6f 6e 20 62 79 20 73 71 6c  ansaction by sql
2c30: 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c  ite3BtreeCopyFil
2c40: 65 28 29 20 61 6e 64 20 74 68 65 20 6f 74 68 65  e() and the othe
2c50: 72 20 62 79 20 61 6e 20 65 78 70 6c 69 63 69 74  r by an explicit
2c60: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
2c70: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
2c80: 28 29 2e 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20  ()..  */.  {.   
2c90: 20 75 33 32 20 6d 65 74 61 3b 0a 20 20 20 20 69   u32 meta;.    i
2ca0: 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  nt i;..    /* Th
2cb0: 69 73 20 61 72 72 61 79 20 64 65 74 65 72 6d 69  is array determi
2cc0: 6e 65 73 20 77 68 69 63 68 20 6d 65 74 61 20 6d  nes which meta m
2cd0: 65 74 61 20 76 61 6c 75 65 73 20 61 72 65 20 70  eta values are p
2ce0: 72 65 73 65 72 76 65 64 20 69 6e 20 74 68 65 0a  reserved in the.
2cf0: 20 20 20 20 2a 2a 20 76 61 63 75 75 6d 2e 20 20      ** vacuum.  
2d00: 45 76 65 6e 20 65 6e 74 72 69 65 73 20 61 72 65  Even entries are
2d10: 20 74 68 65 20 6d 65 74 61 20 76 61 6c 75 65 20   the meta value 
2d20: 6e 75 6d 62 65 72 20 61 6e 64 20 6f 64 64 20 65  number and odd e
2d30: 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 61 72  ntries.    ** ar
2d40: 65 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74  e an increment t
2d50: 6f 20 61 70 70 6c 79 20 74 6f 20 74 68 65 20 6d  o apply to the m
2d60: 65 74 61 20 76 61 6c 75 65 20 61 66 74 65 72 20  eta value after 
2d70: 74 68 65 20 76 61 63 75 75 6d 2e 0a 20 20 20 20  the vacuum..    
2d80: 2a 2a 20 54 68 65 20 69 6e 63 72 65 6d 65 6e 74  ** The increment
2d90: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6e 63 72   is used to incr
2da0: 65 61 73 65 20 74 68 65 20 73 63 68 65 6d 61 20  ease the schema 
2db0: 63 6f 6f 6b 69 65 20 73 6f 20 74 68 61 74 20 6f  cookie so that o
2dc0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e  ther.    ** conn
2dd0: 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
2de0: 61 6d 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  ame database wil
2df0: 6c 20 6b 6e 6f 77 20 74 6f 20 72 65 72 65 61 64  l know to reread
2e00: 20 74 68 65 20 73 63 68 65 6d 61 2e 0a 20 20 20   the schema..   
2e10: 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63   */.    static c
2e20: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2e30: 61 72 20 61 43 6f 70 79 5b 5d 20 3d 20 7b 0a 20  ar aCopy[] = {. 
2e40: 20 20 20 20 20 20 42 54 52 45 45 5f 53 43 48 45        BTREE_SCHE
2e50: 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20  MA_VERSION,     
2e60: 31 2c 20 20 2f 2a 20 41 64 64 20 6f 6e 65 20 74  1,  /* Add one t
2e70: 6f 20 74 68 65 20 6f 6c 64 20 73 63 68 65 6d 61  o the old schema
2e80: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 20   cookie */.     
2e90: 20 20 42 54 52 45 45 5f 44 45 46 41 55 4c 54 5f    BTREE_DEFAULT_
2ea0: 43 41 43 48 45 5f 53 49 5a 45 2c 20 30 2c 20 20  CACHE_SIZE, 0,  
2eb0: 2f 2a 20 50 72 65 73 65 72 76 65 20 74 68 65 20  /* Preserve the 
2ec0: 64 65 66 61 75 6c 74 20 70 61 67 65 20 63 61 63  default page cac
2ed0: 68 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20  he size */.     
2ee0: 20 20 42 54 52 45 45 5f 54 45 58 54 5f 45 4e 43    BTREE_TEXT_ENC
2ef0: 4f 44 49 4e 47 2c 20 20 20 20 20 20 30 2c 20 20  ODING,      0,  
2f00: 2f 2a 20 50 72 65 73 65 72 76 65 20 74 68 65 20  /* Preserve the 
2f10: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  text encoding */
2f20: 0a 20 20 20 20 20 20 20 42 54 52 45 45 5f 55 53  .       BTREE_US
2f30: 45 52 5f 56 45 52 53 49 4f 4e 2c 20 20 20 20 20  ER_VERSION,     
2f40: 20 20 30 2c 20 20 2f 2a 20 50 72 65 73 65 72 76    0,  /* Preserv
2f50: 65 20 74 68 65 20 75 73 65 72 20 76 65 72 73 69  e the user versi
2f60: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 42 54 52  on */.       BTR
2f70: 45 45 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 49  EE_APPLICATION_I
2f80: 44 2c 20 20 20 20 20 30 2c 20 20 2f 2a 20 50 72  D,     0,  /* Pr
2f90: 65 73 65 72 76 65 20 74 68 65 20 61 70 70 6c 69  eserve the appli
2fa0: 63 61 74 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20  cation id */.   
2fb0: 20 7d 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28   };..    assert(
2fc0: 20 31 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65   1==sqlite3Btree
2fd0: 49 73 49 6e 54 72 61 6e 73 28 70 54 65 6d 70 29  IsInTrans(pTemp)
2fe0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2ff0: 31 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49  1==sqlite3BtreeI
3000: 73 49 6e 54 72 61 6e 73 28 70 4d 61 69 6e 29 20  sInTrans(pMain) 
3010: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  );..    /* Copy 
3020: 42 74 72 65 65 20 6d 65 74 61 20 76 61 6c 75 65  Btree meta value
3030: 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  s */.    for(i=0
3040: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 43  ; i<ArraySize(aC
3050: 6f 70 79 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  opy); i+=2){.   
3060: 20 20 20 2f 2a 20 47 65 74 4d 65 74 61 28 29 20     /* GetMeta() 
3070: 61 6e 64 20 55 70 64 61 74 65 4d 65 74 61 28 29  and UpdateMeta()
3080: 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
3090: 74 68 69 73 20 63 6f 6e 74 65 78 74 20 62 65 63  this context bec
30a0: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 77 65  ause.      ** we
30b0: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 70 61   already have pa
30c0: 67 65 20 31 20 6c 6f 61 64 65 64 20 69 6e 74 6f  ge 1 loaded into
30d0: 20 63 61 63 68 65 20 61 6e 64 20 6d 61 72 6b 65   cache and marke
30e0: 64 20 64 69 72 74 79 2e 20 2a 2f 0a 20 20 20 20  d dirty. */.    
30f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
3100: 74 4d 65 74 61 28 70 4d 61 69 6e 2c 20 61 43 6f  tMeta(pMain, aCo
3110: 70 79 5b 69 5d 2c 20 26 6d 65 74 61 29 3b 0a 20  py[i], &meta);. 
3120: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
3130: 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
3140: 28 70 54 65 6d 70 2c 20 61 43 6f 70 79 5b 69 5d  (pTemp, aCopy[i]
3150: 2c 20 6d 65 74 61 2b 61 43 6f 70 79 5b 69 2b 31  , meta+aCopy[i+1
3160: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 45  ]);.      if( NE
3170: 56 45 52 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  VER(rc!=SQLITE_O
3180: 4b 29 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  K) ) goto end_of
3190: 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 7d 0a 0a  _vacuum;.    }..
31a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31b0: 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70 4d  BtreeCopyFile(pM
31c0: 61 69 6e 2c 20 70 54 65 6d 70 29 3b 0a 20 20 20  ain, pTemp);.   
31d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
31e0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  OK ) goto end_of
31f0: 5f 76 61 63 75 75 6d 3b 0a 20 20 20 20 72 63 20  _vacuum;.    rc 
3200: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
3210: 6d 6d 69 74 28 70 54 65 6d 70 29 3b 0a 20 20 20  mmit(pTemp);.   
3220: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
3230: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  OK ) goto end_of
3240: 5f 76 61 63 75 75 6d 3b 0a 23 69 66 6e 64 65 66  _vacuum;.#ifndef
3250: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3260: 4f 56 41 43 55 55 4d 0a 20 20 20 20 73 71 6c 69  OVACUUM.    sqli
3270: 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56  te3BtreeSetAutoV
3280: 61 63 75 75 6d 28 70 4d 61 69 6e 2c 20 73 71 6c  acuum(pMain, sql
3290: 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
32a0: 56 61 63 75 75 6d 28 70 54 65 6d 70 29 29 3b 0a  Vacuum(pTemp));.
32b0: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73  #endif.  }..  as
32c0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
32d0: 5f 4f 4b 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  _OK );.  rc = sq
32e0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
32f0: 65 53 69 7a 65 28 70 4d 61 69 6e 2c 20 73 71 6c  eSize(pMain, sql
3300: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
3310: 53 69 7a 65 28 70 54 65 6d 70 29 2c 20 6e 52 65  Size(pTemp), nRe
3320: 73 2c 31 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 76 61  s,1);..end_of_va
3330: 63 75 75 6d 3a 0a 20 20 2f 2a 20 52 65 73 74 6f  cuum:.  /* Resto
3340: 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  re the original 
3350: 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 66 6c 61  value of db->fla
3360: 67 73 20 2a 2f 0a 20 20 64 62 2d 3e 69 6e 69 74  gs */.  db->init
3370: 2e 69 44 62 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  .iDb = 0;.  db->
3380: 6d 44 62 46 6c 61 67 73 20 3d 20 73 61 76 65 64  mDbFlags = saved
3390: 5f 6d 44 62 46 6c 61 67 73 3b 0a 20 20 64 62 2d  _mDbFlags;.  db-
33a0: 3e 66 6c 61 67 73 20 3d 20 73 61 76 65 64 5f 66  >flags = saved_f
33b0: 6c 61 67 73 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  lags;.  db->nCha
33c0: 6e 67 65 20 3d 20 73 61 76 65 64 5f 6e 43 68 61  nge = saved_nCha
33d0: 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61  nge;.  db->nTota
33e0: 6c 43 68 61 6e 67 65 20 3d 20 73 61 76 65 64 5f  lChange = saved_
33f0: 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 20 20  nTotalChange;.  
3400: 64 62 2d 3e 6d 54 72 61 63 65 20 3d 20 73 61 76  db->mTrace = sav
3410: 65 64 5f 6d 54 72 61 63 65 3b 0a 20 20 73 71 6c  ed_mTrace;.  sql
3420: 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
3430: 53 69 7a 65 28 70 4d 61 69 6e 2c 20 2d 31 2c 20  Size(pMain, -1, 
3440: 2d 31 2c 20 31 29 3b 0a 0a 20 20 2f 2a 20 43 75  -1, 1);..  /* Cu
3450: 72 72 65 6e 74 6c 79 20 74 68 65 72 65 20 69 73  rrently there is
3460: 20 61 6e 20 53 51 4c 20 6c 65 76 65 6c 20 74 72   an SQL level tr
3470: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
3480: 6e 20 74 68 65 20 76 61 63 75 75 6d 0a 20 20 2a  n the vacuum.  *
3490: 2a 20 64 61 74 61 62 61 73 65 2e 20 4e 6f 20 6c  * database. No l
34a0: 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e  ocks are held on
34b0: 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 73   any other files
34c0: 20 28 73 69 6e 63 65 20 74 68 65 20 6d 61 69 6e   (since the main
34d0: 20 66 69 6c 65 0a 20 20 2a 2a 20 77 61 73 20 63   file.  ** was c
34e0: 6f 6d 6d 69 74 74 65 64 20 61 74 20 74 68 65 20  ommitted at the 
34f0: 62 74 72 65 65 20 6c 65 76 65 6c 29 2e 20 53 6f  btree level). So
3500: 20 69 74 20 73 61 66 65 20 74 6f 20 65 6e 64 20   it safe to end 
3510: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
3520: 20 20 2a 2a 20 62 79 20 6d 61 6e 75 61 6c 6c 79    ** by manually
3530: 20 73 65 74 74 69 6e 67 20 74 68 65 20 61 75 74   setting the aut
3540: 6f 43 6f 6d 6d 69 74 20 66 6c 61 67 20 74 6f 20  oCommit flag to 
3550: 74 72 75 65 20 61 6e 64 20 64 65 74 61 63 68 69  true and detachi
3560: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 76 61 63 75  ng the.  ** vacu
3570: 75 6d 20 64 61 74 61 62 61 73 65 2e 20 54 68 65  um database. The
3580: 20 76 61 63 75 75 6d 5f 64 62 20 6a 6f 75 72 6e   vacuum_db journ
3590: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
35a0: 65 64 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  ed when the page
35b0: 72 0a 20 20 2a 2a 20 69 73 20 63 6c 6f 73 65 64  r.  ** is closed
35c0: 20 62 79 20 74 68 65 20 44 45 54 41 43 48 2e 0a   by the DETACH..
35d0: 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 75 74 6f 43    */.  db->autoC
35e0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 0a 20 20 69 66  ommit = 1;..  if
35f0: 28 20 70 44 62 20 29 7b 0a 20 20 20 20 73 71 6c  ( pDb ){.    sql
3600: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
3610: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 70 44  Db->pBt);.    pD
3620: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
3630: 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30  pDb->pSchema = 0
3640: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
3650: 20 62 6f 74 68 20 63 6c 65 61 72 73 20 74 68 65   both clears the
3660: 20 73 63 68 65 6d 61 73 20 61 6e 64 20 72 65 64   schemas and red
3670: 75 63 65 73 20 74 68 65 20 73 69 7a 65 20 6f 66  uces the size of
3680: 20 74 68 65 20 64 62 2d 3e 61 44 62 5b 5d 0a 20   the db->aDb[]. 
3690: 20 2a 2a 20 61 72 72 61 79 2e 20 2a 2f 20 0a 20   ** array. */ . 
36a0: 20 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c   sqlite3ResetAll
36b0: 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74  SchemasOfConnect
36c0: 69 6f 6e 28 64 62 29 3b 0a 0a 20 20 72 65 74 75  ion(db);..  retu
36d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66  rn rc;.}..#endif
36e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54    /* SQLITE_OMIT
36f0: 5f 56 41 43 55 55 4d 20 26 26 20 53 51 4c 49 54  _VACUUM && SQLIT
3700: 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 20 2a 2f  E_OMIT_ATTACH */
3710: 0a                                               .