/ Hex Artifact Content
Login

Artifact 0fecf4ba5ae91a2f1d601345f976b028888803d4:


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 62 65 67 69 6e 73 20 77 69 74   zSql begins wit
02c0: 68 20 27 53 27 20 28 69 66 20 69 74 20 69 73 20  h 'S' (if it is 
02d0: 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
02e0: 6e 74 29 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  nt) then.** take
02f0: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 72 65 73   each row of res
0300: 75 6c 74 20 61 6e 64 20 63 61 6c 6c 20 65 78 65  ult and call exe
0310: 63 53 71 6c 28 29 20 61 67 61 69 6e 20 72 65 63  cSql() again rec
0320: 75 72 73 69 76 65 6c 79 2e 0a 2a 2a 20 49 74 20  ursively..** It 
0330: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
0340: 61 74 20 65 61 63 68 20 72 6f 77 20 77 69 6c 6c  at each row will
0350: 20 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 63   have only one c
0360: 6f 6c 75 6d 6e 20 74 68 61 74 0a 2a 2a 20 64 6f  olumn that.** do
0370: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
0380: 68 20 27 53 27 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  h 'S'..**.** The
0390: 20 65 78 65 63 53 71 6c 46 28 29 20 72 6f 75 74   execSqlF() rout
03a0: 69 6e 65 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ine does the sam
03b0: 65 20 74 68 69 6e 67 2c 20 65 78 63 65 70 74 20  e thing, except 
03c0: 69 74 20 61 63 63 65 70 74 73 0a 2a 2a 20 61 20  it accepts.** a 
03d0: 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 20 61 73  format string as
03e0: 20 69 74 73 20 74 68 69 72 64 20 61 72 67 75 6d   its third argum
03f0: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
0400: 74 20 65 78 65 63 53 71 6c 28 73 71 6c 69 74 65  t execSql(sqlite
0410: 33 20 2a 64 62 2c 20 63 68 61 72 20 2a 2a 70 7a  3 *db, char **pz
0420: 45 72 72 4d 73 67 2c 20 63 6f 6e 73 74 20 63 68  ErrMsg, const ch
0430: 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c  ar *zSql){.  sql
0440: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
0450: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
0460: 2a 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b  * printf("SQL: [
0470: 25 73 5d 5c 6e 22 2c 20 7a 53 71 6c 29 3b 20 66  %s]\n", zSql); f
0480: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 20 2a  flush(stdout); *
0490: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
04a0: 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
04b0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
04c0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
04d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
04e0: 72 6e 20 72 63 3b 0a 20 20 77 68 69 6c 65 28 20  rn rc;.  while( 
04f0: 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 28 72 63 20  SQLITE_ROW==(rc 
0500: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
0510: 53 74 6d 74 29 29 20 26 26 20 7a 53 71 6c 5b 30  Stmt)) && zSql[0
0520: 5d 3d 3d 27 53 27 20 29 7b 0a 20 20 20 20 63 6f  ]=='S' ){.    co
0530: 6e 73 74 20 63 68 61 72 20 2a 7a 53 75 62 53 71  nst char *zSubSq
0540: 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const 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 30 29 3b 0a 20  text(pStmt,0);. 
0570: 20 20 20 69 66 28 20 7a 53 75 62 53 71 6c 20 29     if( zSubSql )
0580: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0590: 7a 53 75 62 53 71 6c 5b 30 5d 21 3d 27 53 27 20  zSubSql[0]!='S' 
05a0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 65 78  );.      rc = ex
05b0: 65 63 53 71 6c 28 64 62 2c 20 70 7a 45 72 72 4d  ecSql(db, pzErrM
05c0: 73 67 2c 20 7a 53 75 62 53 71 6c 29 3b 0a 20 20  sg, zSubSql);.  
05d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
05e0: 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20  TE_OK ) break;. 
05f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
0600: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c  c==SQLITE_ROW ||
0610: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
0620: 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f   ) rc = SQLITE_O
0630: 4b 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  K;.  if( rc ){. 
0640: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
0650: 69 6e 67 28 70 7a 45 72 72 4d 73 67 2c 20 64 62  ing(pzErrMsg, db
0660: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
0670: 28 64 62 29 29 3b 0a 20 20 7d 0a 20 20 28 76 6f  (db));.  }.  (vo
0680: 69 64 29 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  id)sqlite3_final
0690: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  ize(pStmt);.  re
06a0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
06b0: 63 20 69 6e 74 20 65 78 65 63 53 71 6c 46 28 73  c int execSqlF(s
06c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 68 61 72  qlite3 *db, char
06d0: 20 2a 2a 70 7a 45 72 72 4d 73 67 2c 20 63 6f 6e   **pzErrMsg, con
06e0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 2e  st char *zSql, .
06f0: 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ..){.  char *z;.
0700: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
0710: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61  int rc;.  va_sta
0720: 72 74 28 61 70 2c 20 7a 53 71 6c 29 3b 0a 20 20  rt(ap, zSql);.  
0730: 7a 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  z = sqlite3VMPri
0740: 6e 74 66 28 64 62 2c 20 7a 53 71 6c 2c 20 61 70  ntf(db, zSql, ap
0750: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
0760: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
0770: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
0780: 4d 3b 0a 20 20 72 63 20 3d 20 65 78 65 63 53 71  M;.  rc = execSq
0790: 6c 28 64 62 2c 20 70 7a 45 72 72 4d 73 67 2c 20  l(db, pzErrMsg, 
07a0: 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  z);.  sqlite3DbF
07b0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 72 65  ree(db, z);.  re
07c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
07d0: 2a 20 54 68 65 20 56 41 43 55 55 4d 20 63 6f 6d  * The VACUUM com
07e0: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
07f0: 63 6c 65 61 6e 20 75 70 20 74 68 65 20 64 61 74  clean up the dat
0800: 61 62 61 73 65 2c 0a 2a 2a 20 63 6f 6c 6c 61 70  abase,.** collap
0810: 73 65 20 66 72 65 65 20 73 70 61 63 65 2c 20 65  se free space, e
0820: 74 63 2e 20 20 49 74 20 69 73 20 6d 6f 64 65 6c  tc.  It is model
0830: 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 56 41  led after the VA
0840: 43 55 55 4d 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  CUUM command.** 
0850: 69 6e 20 50 6f 73 74 67 72 65 53 51 4c 2e 20 20  in PostgreSQL.  
0860: 54 68 65 20 56 41 43 55 55 4d 20 63 6f 6d 6d 61  The VACUUM comma
0870: 6e 64 20 77 6f 72 6b 73 20 61 73 20 66 6f 6c 6c  nd works as foll
0880: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ows:.**.**   (1)
0890: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 74    Create a new t
08a0: 72 61 6e 73 69 65 6e 74 20 64 61 74 61 62 61 73  ransient databas
08b0: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 28 32 29 20  e file.**   (2) 
08c0: 20 43 6f 70 79 20 61 6c 6c 20 63 6f 6e 74 65 6e   Copy all conten
08d0: 74 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  t from the datab
08e0: 61 73 65 20 62 65 69 6e 67 20 76 61 63 75 75 6d  ase being vacuum
08f0: 65 64 20 69 6e 74 6f 0a 2a 2a 20 20 20 20 20 20  ed into.**      
0900: 20 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 69    the new transi
0910: 65 6e 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  ent database fil
0920: 65 0a 2a 2a 20 20 20 28 33 29 20 20 43 6f 70 79  e.**   (3)  Copy
0930: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 74 68   content from th
0940: 65 20 74 72 61 6e 73 69 65 6e 74 20 64 61 74 61  e transient data
0950: 62 61 73 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  base back into t
0960: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 6f 72 69  he.**        ori
0970: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a  ginal database..
0980: 2a 2a 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69  **.** The transi
0990: 65 6e 74 20 64 61 74 61 62 61 73 65 20 72 65 71  ent database req
09a0: 75 69 72 65 73 20 74 65 6d 70 6f 72 61 72 79 20  uires temporary 
09b0: 64 69 73 6b 20 73 70 61 63 65 20 61 70 70 72 6f  disk space appro
09c0: 78 69 6d 61 74 65 6c 79 0a 2a 2a 20 65 71 75 61  ximately.** equa
09d0: 6c 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  l to the size of
09e0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
09f0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 63 6f 70  tabase.  The cop
0a00: 79 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 0a 2a  y operation of.*
0a10: 2a 20 73 74 65 70 20 28 33 29 20 72 65 71 75 69  * step (3) requi
0a20: 72 65 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 74  res additional t
0a30: 65 6d 70 6f 72 61 72 79 20 64 69 73 6b 20 73 70  emporary disk sp
0a40: 61 63 65 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  ace approximatel
0a50: 79 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 74 68  y equal.** to th
0a60: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  e size of the or
0a70: 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
0a80: 66 6f 72 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  for the rollback
0a90: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 48 65 6e   journal..** Hen
0aa0: 63 65 2c 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ce, temporary di
0ab0: 73 6b 20 73 70 61 63 65 20 74 68 61 74 20 69 73  sk space that is
0ac0: 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 32   approximately 2
0ad0: 78 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  x the size of th
0ae0: 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 64 61  e.** original da
0af0: 74 61 62 61 73 65 20 69 73 20 72 65 71 75 69 72  tabase is requir
0b00: 65 64 2e 20 20 45 76 65 72 79 20 70 61 67 65 20  ed.  Every page 
0b10: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
0b20: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 61 70  is written.** ap
0b30: 70 72 6f 78 69 6d 61 74 65 6c 79 20 33 20 74 69  proximately 3 ti
0b40: 6d 65 73 3a 20 20 4f 6e 63 65 20 66 6f 72 20 73  mes:  Once for s
0b50: 74 65 70 20 28 32 29 20 61 6e 64 20 74 77 69 63  tep (2) and twic
0b60: 65 20 66 6f 72 20 73 74 65 70 20 28 33 29 2e 0a  e for step (3)..
0b70: 2a 2a 20 54 77 6f 20 77 72 69 74 65 73 20 70 65  ** Two writes pe
0b80: 72 20 70 61 67 65 20 61 72 65 20 72 65 71 75 69  r page are requi
0b90: 72 65 64 20 69 6e 20 73 74 65 70 20 28 33 29 20  red in step (3) 
0ba0: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67  because the orig
0bb0: 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  inal.** database
0bc0: 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 62 65   content must be
0bd0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
0be0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
0bf0: 61 6c 20 70 72 69 6f 72 20 74 6f 0a 2a 2a 20 6f  al prior to.** o
0c00: 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 64  verwriting the d
0c10: 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
0c20: 20 76 61 63 75 75 6d 65 64 20 63 6f 6e 74 65 6e   vacuumed conten
0c30: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 31 78  t..**.** Only 1x
0c40: 20 74 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   temporary space
0c50: 20 61 6e 64 20 6f 6e 6c 79 20 31 78 20 77 72 69   and only 1x wri
0c60: 74 65 73 20 77 6f 75 6c 64 20 62 65 20 72 65 71  tes would be req
0c70: 75 69 72 65 64 20 69 66 0a 2a 2a 20 74 68 65 20  uired if.** the 
0c80: 63 6f 70 79 20 6f 66 20 73 74 65 70 20 28 33 29  copy of step (3)
0c90: 20 77 65 72 65 20 72 65 70 6c 61 63 65 64 20 62   were replaced b
0ca0: 79 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6f  y deleting the o
0cb0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
0cc0: 0a 2a 2a 20 61 6e 64 20 72 65 6e 61 6d 69 6e 67  .** and renaming
0cd0: 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 64   the transient d
0ce0: 61 74 61 62 61 73 65 20 61 73 20 74 68 65 20 6f  atabase as the o
0cf0: 72 69 67 69 6e 61 6c 2e 20 20 42 75 74 20 74 68  riginal.  But th
0d00: 61 74 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77  at will.** not w
0d10: 6f 72 6b 20 69 66 20 6f 74 68 65 72 20 70 72 6f  ork if other pro
0d20: 63 65 73 73 65 73 20 61 72 65 20 61 74 74 61 63  cesses are attac
0d30: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
0d40: 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  nal database..**
0d50: 20 41 6e 64 20 61 20 70 6f 77 65 72 20 6c 6f 73   And a power los
0d60: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 64 65 6c  s in between del
0d70: 65 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  eting the origin
0d80: 61 6c 20 61 6e 64 20 72 65 6e 61 6d 69 6e 67 20  al and renaming 
0d90: 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65 6e 74  the.** transient
0da0: 20 77 6f 75 6c 64 20 63 61 75 73 65 20 74 68 65   would cause the
0db0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
0dc0: 6f 20 61 70 70 65 61 72 20 74 6f 20 62 65 20 64  o appear to be d
0dd0: 65 6c 65 74 65 64 0a 2a 2a 20 66 6f 6c 6c 6f 77  eleted.** follow
0de0: 69 6e 67 20 72 65 62 6f 6f 74 2e 0a 2a 2f 0a 76  ing reboot..*/.v
0df0: 6f 69 64 20 73 71 6c 69 74 65 33 56 61 63 75 75  oid sqlite3Vacuu
0e00: 6d 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  m(Parse *pParse,
0e10: 20 54 6f 6b 65 6e 20 2a 70 4e 6d 29 7b 0a 20 20   Token *pNm){.  
0e20: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
0e30: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
0e40: 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 70 4e  ;.  int iDb = pN
0e50: 6d 20 3f 20 73 71 6c 69 74 65 33 54 77 6f 50 61  m ? sqlite3TwoPa
0e60: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
0e70: 4e 6d 2c 20 70 4e 6d 2c 20 26 70 4e 6d 29 20 3a  Nm, pNm, &pNm) :
0e80: 20 30 3b 0a 20 20 69 66 28 20 76 20 26 26 20 28   0;.  if( v && (
0e90: 69 44 62 3e 3d 32 20 7c 7c 20 69 44 62 3d 3d 30  iDb>=2 || iDb==0
0ea0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
0eb0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
0ec0: 5f 56 61 63 75 75 6d 2c 20 69 44 62 29 3b 0a 20  _Vacuum, iDb);. 
0ed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
0ee0: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
0ef0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
0f00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
0f10: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
0f20: 74 68 65 20 4f 50 5f 56 61 63 75 75 6d 20 6f 70  the OP_Vacuum op
0f30: 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45  code of the VDBE
0f40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0f50: 52 75 6e 56 61 63 75 75 6d 28 63 68 61 72 20 2a  RunVacuum(char *
0f60: 2a 70 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74  *pzErrMsg, sqlit
0f70: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29  e3 *db, int iDb)
0f80: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
0f90: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 2f 2a 20 52  ITE_OK;     /* R
0fa0: 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
0fb0: 73 65 72 76 69 63 65 20 72 6f 75 74 69 6e 65 73  service routines
0fc0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 4d 61   */.  Btree *pMa
0fd0: 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
0fe0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 62 65   The database be
0ff0: 69 6e 67 20 76 61 63 75 75 6d 65 64 20 2a 2f 0a  ing vacuumed */.
1000: 20 20 42 74 72 65 65 20 2a 70 54 65 6d 70 3b 20    Btree *pTemp; 
1010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1020: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
1030: 61 73 65 20 77 65 20 76 61 63 75 75 6d 20 69 6e  ase we vacuum in
1040: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65  to */.  int save
1050: 64 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  d_flags;        
1060: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
1070: 66 20 74 68 65 20 64 62 2d 3e 66 6c 61 67 73 20  f the db->flags 
1080: 2a 2f 0a 20 20 69 6e 74 20 73 61 76 65 64 5f 6e  */.  int saved_n
1090: 43 68 61 6e 67 65 3b 20 20 20 20 20 20 2f 2a 20  Change;      /* 
10a0: 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 64  Saved value of d
10b0: 62 2d 3e 6e 43 68 61 6e 67 65 20 2a 2f 0a 20 20  b->nChange */.  
10c0: 69 6e 74 20 73 61 76 65 64 5f 6e 54 6f 74 61 6c  int saved_nTotal
10d0: 43 68 61 6e 67 65 3b 20 2f 2a 20 53 61 76 65 64  Change; /* Saved
10e0: 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 6e 54   value of db->nT
10f0: 6f 74 61 6c 43 68 61 6e 67 65 20 2a 2f 0a 20 20  otalChange */.  
1100: 75 38 20 73 61 76 65 64 5f 6d 54 72 61 63 65 3b  u8 saved_mTrace;
1110: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
1120: 20 74 72 61 63 65 20 73 65 74 74 69 6e 67 73 20   trace settings 
1130: 2a 2f 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 30  */.  Db *pDb = 0
1140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1150: 44 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 61  Database to deta
1160: 63 68 20 61 74 20 65 6e 64 20 6f 66 20 76 61 63  ch at end of vac
1170: 75 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  uum */.  int isM
1180: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
1190: 20 2f 2a 20 54 72 75 65 20 69 66 20 76 61 63 75   /* True if vacu
11a0: 75 6d 69 6e 67 20 61 20 3a 6d 65 6d 6f 72 79 3a  uming a :memory:
11b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
11c0: 6e 74 20 6e 52 65 73 3b 20 20 20 20 20 20 20 20  nt nRes;        
11d0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
11e0: 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61 63  of reserved spac
11f0: 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
1200: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  each page */.  i
1210: 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
1220: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1230: 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
1240: 61 62 61 73 65 73 20 2a 2f 0a 20 20 63 6f 6e 73  abases */.  cons
1250: 74 20 63 68 61 72 20 2a 7a 44 62 4d 61 69 6e 3b  t char *zDbMain;
1260: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6e 61      /* Schema na
1270: 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 74  me of database t
1280: 6f 20 76 61 63 75 75 6d 20 2a 2f 0a 0a 20 20 69  o vacuum */..  i
1290: 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  f( !db->autoComm
12a0: 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  it ){.    sqlite
12b0: 33 53 65 74 53 74 72 69 6e 67 28 70 7a 45 72 72  3SetString(pzErr
12c0: 4d 73 67 2c 20 64 62 2c 20 22 63 61 6e 6e 6f 74  Msg, db, "cannot
12d0: 20 56 41 43 55 55 4d 20 66 72 6f 6d 20 77 69 74   VACUUM from wit
12e0: 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
12f0: 6e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n");.    return 
1300: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1310: 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62  }.  if( db->nVdb
1320: 65 41 63 74 69 76 65 3e 31 20 29 7b 0a 20 20 20  eActive>1 ){.   
1330: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
1340: 67 28 70 7a 45 72 72 4d 73 67 2c 20 64 62 2c 22  g(pzErrMsg, db,"
1350: 63 61 6e 6e 6f 74 20 56 41 43 55 55 4d 20 2d 20  cannot VACUUM - 
1360: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 69  SQL statements i
1370: 6e 20 70 72 6f 67 72 65 73 73 22 29 3b 0a 20 20  n progress");.  
1380: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1390: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
13a0: 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
13b0: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  t value of the d
13c0: 61 74 61 62 61 73 65 20 66 6c 61 67 73 20 73 6f  atabase flags so
13d0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
13e0: 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 64 20 62  .  ** restored b
13f0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1400: 20 54 68 65 6e 20 73 65 74 20 74 68 65 20 77 72   Then set the wr
1410: 69 74 61 62 6c 65 2d 73 63 68 65 6d 61 20 66 6c  itable-schema fl
1420: 61 67 2c 20 61 6e 64 0a 20 20 2a 2a 20 64 69 73  ag, and.  ** dis
1430: 61 62 6c 65 20 43 48 45 43 4b 20 61 6e 64 20 66  able CHECK and f
1440: 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
1450: 72 61 69 6e 74 73 2e 20 20 2a 2f 0a 20 20 73 61  raints.  */.  sa
1460: 76 65 64 5f 66 6c 61 67 73 20 3d 20 64 62 2d 3e  ved_flags = db->
1470: 66 6c 61 67 73 3b 0a 20 20 73 61 76 65 64 5f 6e  flags;.  saved_n
1480: 43 68 61 6e 67 65 20 3d 20 64 62 2d 3e 6e 43 68  Change = db->nCh
1490: 61 6e 67 65 3b 0a 20 20 73 61 76 65 64 5f 6e 54  ange;.  saved_nT
14a0: 6f 74 61 6c 43 68 61 6e 67 65 20 3d 20 64 62 2d  otalChange = db-
14b0: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 20  >nTotalChange;. 
14c0: 20 73 61 76 65 64 5f 6d 54 72 61 63 65 20 3d 20   saved_mTrace = 
14d0: 64 62 2d 3e 6d 54 72 61 63 65 3b 0a 20 20 64 62  db->mTrace;.  db
14e0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49  ->flags |= (SQLI
14f0: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 20 7c  TE_WriteSchema |
1500: 20 53 51 4c 49 54 45 5f 49 67 6e 6f 72 65 43 68   SQLITE_IgnoreCh
1510: 65 63 6b 73 0a 20 20 20 20 20 20 20 20 20 20 20  ecks.           
1520: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 50        | SQLITE_P
1530: 72 65 66 65 72 42 75 69 6c 74 69 6e 20 7c 20 53  referBuiltin | S
1540: 51 4c 49 54 45 5f 56 61 63 75 75 6d 29 3b 0a 20  QLITE_Vacuum);. 
1550: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28   db->flags &= ~(
1560: 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
1570: 79 73 20 7c 20 53 51 4c 49 54 45 5f 52 65 76 65  ys | SQLITE_Reve
1580: 72 73 65 4f 72 64 65 72 29 3b 0a 20 20 64 62 2d  rseOrder);.  db-
1590: 3e 6d 54 72 61 63 65 20 3d 20 30 3b 0a 0a 20 20  >mTrace = 0;..  
15a0: 7a 44 62 4d 61 69 6e 20 3d 20 64 62 2d 3e 61 44  zDbMain = db->aD
15b0: 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d 65 3b  b[iDb].zDbSName;
15c0: 0a 20 20 70 4d 61 69 6e 20 3d 20 64 62 2d 3e 61  .  pMain = db->a
15d0: 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 69  Db[iDb].pBt;.  i
15e0: 73 4d 65 6d 44 62 20 3d 20 73 71 6c 69 74 65 33  sMemDb = sqlite3
15f0: 50 61 67 65 72 49 73 4d 65 6d 64 62 28 73 71 6c  PagerIsMemdb(sql
1600: 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
1610: 4d 61 69 6e 29 29 3b 0a 0a 20 20 2f 2a 20 41 74  Main));..  /* At
1620: 74 61 63 68 20 74 68 65 20 74 65 6d 70 6f 72 61  tach the tempora
1630: 72 79 20 64 61 74 61 62 61 73 65 20 61 73 20 27  ry database as '
1640: 76 61 63 75 75 6d 5f 64 62 27 2e 20 54 68 65 20  vacuum_db'. The 
1650: 73 79 6e 63 68 72 6f 6e 6f 75 73 20 70 72 61 67  synchronous prag
1660: 6d 61 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73  ma.  ** can be s
1670: 65 74 20 74 6f 20 27 6f 66 66 27 20 66 6f 72 20  et to 'off' for 
1680: 74 68 69 73 20 66 69 6c 65 2c 20 61 73 20 69 74  this file, as it
1690: 20 69 73 20 6e 6f 74 20 72 65 63 6f 76 65 72 65   is not recovere
16a0: 64 20 69 66 20 61 20 63 72 61 73 68 0a 20 20 2a  d if a crash.  *
16b0: 2a 20 6f 63 63 75 72 73 20 61 6e 79 77 61 79 2e  * occurs anyway.
16c0: 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
16d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
16e0: 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  s maintained by 
16f0: 61 0a 20 20 2a 2a 20 28 70 6f 73 73 69 62 6c 79  a.  ** (possibly
1700: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 29 20 74 72   synchronous) tr
1710: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64  ansaction opened
1720: 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   on the main dat
1730: 61 62 61 73 65 20 62 65 66 6f 72 65 0a 20 20 2a  abase before.  *
1740: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
1750: 70 79 46 69 6c 65 28 29 20 69 73 20 63 61 6c 6c  pyFile() is call
1760: 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ed..  **.  ** An
1770: 20 6f 70 74 69 6d 69 73 61 74 69 6f 6e 20 77 6f   optimisation wo
1780: 75 6c 64 20 62 65 20 74 6f 20 75 73 65 20 61 20  uld be to use a 
1790: 6e 6f 6e 2d 6a 6f 75 72 6e 61 6c 65 64 20 70 61  non-journaled pa
17a0: 67 65 72 2e 0a 20 20 2a 2a 20 28 4c 61 74 65 72  ger..  ** (Later
17b0: 3a 29 20 49 20 74 72 69 65 64 20 73 65 74 74 69  :) I tried setti
17c0: 6e 67 20 22 50 52 41 47 4d 41 20 76 61 63 75 75  ng "PRAGMA vacuu
17d0: 6d 5f 64 62 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  m_db.journal_mod
17e0: 65 3d 4f 46 46 22 20 62 75 74 0a 20 20 2a 2a 20  e=OFF" but.  ** 
17f0: 74 68 61 74 20 61 63 74 75 61 6c 6c 79 20 6d 61  that actually ma
1800: 64 65 20 74 68 65 20 56 41 43 55 55 4d 20 72 75  de the VACUUM ru
1810: 6e 20 73 6c 6f 77 65 72 2e 20 20 56 65 72 79 20  n slower.  Very 
1820: 6c 69 74 74 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69  little journalli
1830: 6e 67 0a 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79  ng.  ** actually
1840: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 64 6f 69   occurs when doi
1850: 6e 67 20 61 20 76 61 63 75 75 6d 20 73 69 6e 63  ng a vacuum sinc
1860: 65 20 74 68 65 20 76 61 63 75 75 6d 5f 64 62 20  e the vacuum_db 
1870: 69 73 20 69 6e 69 74 69 61 6c 6c 79 0a 20 20 2a  is initially.  *
1880: 2a 20 65 6d 70 74 79 2e 20 20 4f 6e 6c 79 20 74  * empty.  Only t
1890: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
18a0: 72 20 69 73 20 77 72 69 74 74 65 6e 2e 20 20 41  r is written.  A
18b0: 70 70 61 72 65 6e 74 6c 79 20 69 74 20 74 61 6b  pparently it tak
18c0: 65 73 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 69 6d  es more.  ** tim
18d0: 65 20 74 6f 20 70 61 72 73 65 20 61 6e 64 20 72  e to parse and r
18e0: 75 6e 20 74 68 65 20 50 52 41 47 4d 41 20 74 6f  un the PRAGMA to
18f0: 20 74 75 72 6e 20 6a 6f 75 72 6e 61 6c 6c 69 6e   turn journallin
1900: 67 20 6f 66 66 20 74 68 61 6e 20 69 74 20 64 6f  g off than it do
1910: 65 73 0a 20 20 2a 2a 20 74 6f 20 77 72 69 74 65  es.  ** to write
1920: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
1930: 64 65 72 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  der file..  */. 
1940: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
1950: 20 20 72 63 20 3d 20 65 78 65 63 53 71 6c 28 64    rc = execSql(d
1960: 62 2c 20 70 7a 45 72 72 4d 73 67 2c 20 22 41 54  b, pzErrMsg, "AT
1970: 54 41 43 48 27 27 41 53 20 76 61 63 75 75 6d 5f  TACH''AS vacuum_
1980: 64 62 22 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  db");.  if( rc!=
1990: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
19a0: 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a   end_of_vacuum;.
19b0: 20 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 6e    assert( (db->n
19c0: 44 62 2d 31 29 3d 3d 6e 44 62 20 29 3b 0a 20 20  Db-1)==nDb );.  
19d0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6e  pDb = &db->aDb[n
19e0: 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Db];.  assert( s
19f0: 74 72 63 6d 70 28 70 44 62 2d 3e 7a 44 62 53 4e  trcmp(pDb->zDbSN
1a00: 61 6d 65 2c 22 76 61 63 75 75 6d 5f 64 62 22 29  ame,"vacuum_db")
1a10: 3d 3d 30 20 29 3b 0a 20 20 70 54 65 6d 70 20 3d  ==0 );.  pTemp =
1a20: 20 70 44 62 2d 3e 70 42 74 3b 0a 0a 20 20 2f 2a   pDb->pBt;..  /*
1a30: 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 65 78 65   The call to exe
1a40: 63 53 71 6c 28 29 20 74 6f 20 61 74 74 61 63 68  cSql() to attach
1a50: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
1a60: 73 65 20 68 61 73 20 6c 65 66 74 20 74 68 65 20  se has left the 
1a70: 66 69 6c 65 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64  file.  ** locked
1a80: 20 28 61 73 20 74 68 65 72 65 20 77 61 73 20 6d   (as there was m
1a90: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 63 74  ore than one act
1aa0: 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20 77 68  ive statement wh
1ab0: 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
1ac0: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 72 65 61 64 20  on.  ** to read 
1ad0: 74 68 65 20 73 63 68 65 6d 61 20 77 61 73 20 63  the schema was c
1ae0: 6f 6e 63 6c 75 64 65 64 2e 20 55 6e 6c 6f 63 6b  oncluded. Unlock
1af0: 20 69 74 20 68 65 72 65 20 73 6f 20 74 68 61 74   it here so that
1b00: 20 74 68 69 73 20 64 6f 65 73 6e 27 74 0a 20 20   this doesn't.  
1b10: 2a 2a 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d  ** cause problem
1b20: 73 20 66 6f 72 20 74 68 65 20 63 61 6c 6c 20 74  s for the call t
1b30: 6f 20 42 74 72 65 65 53 65 74 50 61 67 65 53 69  o BtreeSetPageSi
1b40: 7a 65 28 29 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  ze() below.  */.
1b50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
1b60: 6d 6d 69 74 28 70 54 65 6d 70 29 3b 0a 0a 20 20  mmit(pTemp);..  
1b70: 6e 52 65 73 20 3d 20 73 71 6c 69 74 65 33 42 74  nRes = sqlite3Bt
1b80: 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73  reeGetOptimalRes
1b90: 65 72 76 65 28 70 4d 61 69 6e 29 3b 0a 0a 20 20  erve(pMain);..  
1ba0: 2f 2a 20 41 20 56 41 43 55 55 4d 20 63 61 6e 6e  /* A VACUUM cann
1bb0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
1bc0: 67 65 73 69 7a 65 20 6f 66 20 61 6e 20 65 6e 63  gesize of an enc
1bd0: 72 79 70 74 65 64 20 64 61 74 61 62 61 73 65 2e  rypted database.
1be0: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1bf0: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66  E_HAS_CODEC.  if
1c00: 28 20 64 62 2d 3e 6e 65 78 74 50 61 67 65 73 69  ( db->nextPagesi
1c10: 7a 65 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  ze ){.    extern
1c20: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64   void sqlite3Cod
1c30: 65 63 47 65 74 4b 65 79 28 73 71 6c 69 74 65 33  ecGetKey(sqlite3
1c40: 2a 2c 20 69 6e 74 2c 20 76 6f 69 64 2a 2a 2c 20  *, int, void**, 
1c50: 69 6e 74 2a 29 3b 0a 20 20 20 20 69 6e 74 20 6e  int*);.    int n
1c60: 4b 65 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Key;.    char *z
1c70: 4b 65 79 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Key;.    sqlite3
1c80: 43 6f 64 65 63 47 65 74 4b 65 79 28 64 62 2c 20  CodecGetKey(db, 
1c90: 30 2c 20 28 76 6f 69 64 2a 2a 29 26 7a 4b 65 79  0, (void**)&zKey
1ca0: 2c 20 26 6e 4b 65 79 29 3b 0a 20 20 20 20 69 66  , &nKey);.    if
1cb0: 28 20 6e 4b 65 79 20 29 20 64 62 2d 3e 6e 65 78  ( nKey ) db->nex
1cc0: 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tPagesize = 0;. 
1cd0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c   }.#endif..  sql
1ce0: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
1cf0: 65 53 69 7a 65 28 70 54 65 6d 70 2c 20 64 62 2d  eSize(pTemp, db-
1d00: 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
1d10: 61 2d 3e 63 61 63 68 65 5f 73 69 7a 65 29 3b 0a  a->cache_size);.
1d20: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
1d30: 74 53 70 69 6c 6c 53 69 7a 65 28 70 54 65 6d 70  tSpillSize(pTemp
1d40: 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  , sqlite3BtreeSe
1d50: 74 53 70 69 6c 6c 53 69 7a 65 28 70 4d 61 69 6e  tSpillSize(pMain
1d60: 2c 30 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ,0));.  sqlite3B
1d70: 74 72 65 65 53 65 74 50 61 67 65 72 46 6c 61 67  treeSetPagerFlag
1d80: 73 28 70 54 65 6d 70 2c 20 50 41 47 45 52 5f 53  s(pTemp, PAGER_S
1d90: 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 29 3b  YNCHRONOUS_OFF);
1da0: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 61 20 74  ..  /* Begin a t
1db0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 74  ransaction and t
1dc0: 61 6b 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ake an exclusive
1dd0: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
1de0: 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  n database.  ** 
1df0: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f  file. This is do
1e00: 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 73 71  ne before the sq
1e10: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
1e20: 65 53 69 7a 65 28 70 4d 61 69 6e 29 20 63 61 6c  eSize(pMain) cal
1e30: 6c 20 62 65 6c 6f 77 2c 0a 20 20 2a 2a 20 74 6f  l below,.  ** to
1e40: 20 65 6e 73 75 72 65 20 74 68 61 74 20 77 65 20   ensure that we 
1e50: 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 68  do not try to ch
1e60: 61 6e 67 65 20 74 68 65 20 70 61 67 65 2d 73 69  ange the page-si
1e70: 7a 65 20 6f 6e 20 61 20 57 41 4c 20 64 61 74 61  ze on a WAL data
1e80: 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  base..  */.  rc 
1e90: 3d 20 65 78 65 63 53 71 6c 28 64 62 2c 20 70 7a  = execSql(db, pz
1ea0: 45 72 72 4d 73 67 2c 20 22 42 45 47 49 4e 22 29  ErrMsg, "BEGIN")
1eb0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1ec0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
1ed0: 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 20 20 72 63  _of_vacuum;.  rc
1ee0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42   = sqlite3BtreeB
1ef0: 65 67 69 6e 54 72 61 6e 73 28 70 4d 61 69 6e 2c  eginTrans(pMain,
1f00: 20 32 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   2);.  if( rc!=S
1f10: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1f20: 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a 0a  end_of_vacuum;..
1f30: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65    /* Do not atte
1f40: 6d 70 74 20 74 6f 20 63 68 61 6e 67 65 20 74 68  mpt to change th
1f50: 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
1f60: 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 20 2a  a WAL database *
1f70: 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 50  /.  if( sqlite3P
1f80: 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f  agerGetJournalMo
1f90: 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  de(sqlite3BtreeP
1fa0: 61 67 65 72 28 70 4d 61 69 6e 29 29 0a 20 20 20  ager(pMain)).   
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 50 41              ==PA
1fe0: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
1ff0: 57 41 4c 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  WAL ){.    db->n
2000: 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
2010: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69  .  }..  if( sqli
2020: 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
2030: 69 7a 65 28 70 54 65 6d 70 2c 20 73 71 6c 69 74  ize(pTemp, sqlit
2040: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
2050: 7a 65 28 70 4d 61 69 6e 29 2c 20 6e 52 65 73 2c  ze(pMain), nRes,
2060: 20 30 29 0a 20 20 20 7c 7c 20 28 21 69 73 4d 65   0).   || (!isMe
2070: 6d 44 62 20 26 26 20 73 71 6c 69 74 65 33 42 74  mDb && sqlite3Bt
2080: 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28 70  reeSetPageSize(p
2090: 54 65 6d 70 2c 20 64 62 2d 3e 6e 65 78 74 50 61  Temp, db->nextPa
20a0: 67 65 73 69 7a 65 2c 20 6e 52 65 73 2c 20 30 29  gesize, nRes, 0)
20b0: 29 0a 20 20 20 7c 7c 20 4e 45 56 45 52 28 64 62  ).   || NEVER(db
20c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a  ->mallocFailed).
20d0: 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
20e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
20f0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6f 66  .    goto end_of
2100: 5f 76 61 63 75 75 6d 3b 0a 20 20 7d 0a 0a 23 69  _vacuum;.  }..#i
2110: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2120: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 73  T_AUTOVACUUM.  s
2130: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
2140: 74 6f 56 61 63 75 75 6d 28 70 54 65 6d 70 2c 20  toVacuum(pTemp, 
2150: 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 3e  db->nextAutovac>
2160: 3d 30 20 3f 20 64 62 2d 3e 6e 65 78 74 41 75 74  =0 ? db->nextAut
2170: 6f 76 61 63 20 3a 0a 20 20 20 20 20 20 20 20 20  ovac :.         
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
21b0: 74 41 75 74 6f 56 61 63 75 75 6d 28 70 4d 61 69  tAutoVacuum(pMai
21c0: 6e 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  n));.#endif..  /
21d0: 2a 20 51 75 65 72 79 20 74 68 65 20 73 63 68 65  * Query the sche
21e0: 6d 61 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ma of the main d
21f0: 61 74 61 62 61 73 65 2e 20 43 72 65 61 74 65 20  atabase. Create 
2200: 61 20 6d 69 72 72 6f 72 20 73 63 68 65 6d 61 0a  a mirror schema.
2210: 20 20 2a 2a 20 69 6e 20 74 68 65 20 74 65 6d 70    ** in the temp
2220: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 2e 0a  orary database..
2230: 20 20 2a 2f 0a 20 20 64 62 2d 3e 69 6e 69 74 2e    */.  db->init.
2240: 69 44 62 20 3d 20 6e 44 62 3b 20 2f 2a 20 66 6f  iDb = nDb; /* fo
2250: 72 63 65 20 6e 65 77 20 43 52 45 41 54 45 20 73  rce new CREATE s
2260: 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 6f 20 76  tatements into v
2270: 61 63 75 75 6d 5f 64 62 20 2a 2f 0a 20 20 72 63  acuum_db */.  rc
2280: 20 3d 20 65 78 65 63 53 71 6c 46 28 64 62 2c 20   = execSqlF(db, 
2290: 70 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20  pzErrMsg,.      
22a0: 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
22b0: 20 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d   \"%w\".sqlite_m
22c0: 61 73 74 65 72 22 0a 20 20 20 20 20 20 22 20 57  aster".      " W
22d0: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
22e0: 27 41 4e 44 20 6e 61 6d 65 3c 3e 27 73 71 6c 69  'AND name<>'sqli
22f0: 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20  te_sequence'".  
2300: 20 20 20 20 22 20 41 4e 44 20 63 6f 61 6c 65 73      " AND coales
2310: 63 65 28 72 6f 6f 74 70 61 67 65 2c 31 29 3e 30  ce(rootpage,1)>0
2320: 22 2c 0a 20 20 20 20 20 20 7a 44 62 4d 61 69 6e  ",.      zDbMain
2330: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
2340: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2350: 20 65 6e 64 5f 6f 66 5f 76 61 63 75 75 6d 3b 0a   end_of_vacuum;.
2360: 20 20 72 63 20 3d 20 65 78 65 63 53 71 6c 46 28    rc = execSqlF(
2370: 64 62 2c 20 70 7a 45 72 72 4d 73 67 2c 0a 20 20  db, pzErrMsg,.  
2380: 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
2390: 46 52 4f 4d 20 5c 22 25 77 5c 22 2e 73 71 6c 69  FROM \"%w\".sqli
23a0: 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
23b0: 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 69   " WHERE type='i
23c0: 6e 64 65 78 27 20 41 4e 44 20 6c 65 6e 67 74 68  ndex' AND length
23d0: 28 73 71 6c 29 3e 31 30 22 2c 0a 20 20 20 20 20  (sql)>10",.     
23e0: 20 7a 44 62 4d 61 69 6e 0a 20 20 29 3b 0a 20 20   zDbMain.  );.  
23f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2400: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  K ) goto end_of_
2410: 76 61 63 75 75 6d 3b 0a 20 20 64 62 2d 3e 69 6e  vacuum;.  db->in
2420: 69 74 2e 69 44 62 20 3d 20 30 3b 0a 0a 20 20 2f  it.iDb = 0;..  /
2430: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74  * Loop through t
2440: 68 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  he tables in the
2450: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
2460: 46 6f 72 20 65 61 63 68 2c 20 64 6f 0a 20 20 2a  For each, do.  *
2470: 2a 20 61 6e 20 22 49 4e 53 45 52 54 20 49 4e 54  * an "INSERT INT
2480: 4f 20 76 61 63 75 75 6d 5f 64 62 2e 78 78 78 20  O vacuum_db.xxx 
2490: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6d 61  SELECT * FROM ma
24a0: 69 6e 2e 78 78 78 3b 22 20 74 6f 20 63 6f 70 79  in.xxx;" to copy
24b0: 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  .  ** the conten
24c0: 74 73 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72  ts to the tempor
24d0: 61 72 79 20 64 61 74 61 62 61 73 65 2e 0a 20 20  ary database..  
24e0: 2a 2f 0a 20 20 72 63 20 3d 20 65 78 65 63 53 71  */.  rc = execSq
24f0: 6c 46 28 64 62 2c 20 70 7a 45 72 72 4d 73 67 2c  lF(db, pzErrMsg,
2500: 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 27 49  .      "SELECT'I
2510: 4e 53 45 52 54 20 49 4e 54 4f 20 76 61 63 75 75  NSERT INTO vacuu
2520: 6d 5f 64 62 2e 27 7c 7c 71 75 6f 74 65 28 6e 61  m_db.'||quote(na
2530: 6d 65 29 22 0a 20 20 20 20 20 20 22 7c 7c 27 20  me)".      "||' 
2540: 53 45 4c 45 43 54 2a 46 52 4f 4d 5c 22 25 77 5c  SELECT*FROM\"%w\
2550: 22 2e 27 7c 7c 71 75 6f 74 65 28 6e 61 6d 65 29  ".'||quote(name)
2560: 22 0a 20 20 20 20 20 20 22 46 52 4f 4d 20 76 61  ".      "FROM va
2570: 63 75 75 6d 5f 64 62 2e 73 71 6c 69 74 65 5f 6d  cuum_db.sqlite_m
2580: 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 22 57  aster ".      "W
2590: 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
25a0: 27 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f  'AND coalesce(ro
25b0: 6f 74 70 61 67 65 2c 31 29 3e 30 22 2c 0a 20 20  otpage,1)>0",.  
25c0: 20 20 20 20 7a 44 62 4d 61 69 6e 0a 20 20 29 3b      zDbMain.  );
25d0: 0a 20 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e  .  assert( (db->
25e0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
25f0: 61 63 75 75 6d 29 21 3d 30 20 29 3b 0a 20 20 64  acuum)!=0 );.  d
2600: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
2610: 49 54 45 5f 56 61 63 75 75 6d 3b 0a 20 20 69 66  ITE_Vacuum;.  if
2620: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2630: 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61  ) goto end_of_va
2640: 63 75 75 6d 3b 0a 0a 20 20 2f 2a 20 43 6f 70 79  cuum;..  /* Copy
2650: 20 74 68 65 20 74 72 69 67 67 65 72 73 2c 20 76   the triggers, v
2660: 69 65 77 73 2c 20 61 6e 64 20 76 69 72 74 75 61  iews, and virtua
2670: 6c 20 74 61 62 6c 65 73 20 66 72 6f 6d 20 74 68  l tables from th
2680: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
2690: 20 20 2a 2a 20 6f 76 65 72 20 74 6f 20 74 68 65    ** over to the
26a0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
26b0: 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ase.  None of th
26c0: 65 73 65 20 6f 62 6a 65 63 74 73 20 68 61 73 20  ese objects has 
26d0: 61 6e 79 0a 20 20 2a 2a 20 61 73 73 6f 63 69 61  any.  ** associa
26e0: 74 65 64 20 73 74 6f 72 61 67 65 2c 20 73 6f 20  ted storage, so 
26f0: 61 6c 6c 20 77 65 20 68 61 76 65 20 74 6f 20 64  all we have to d
2700: 6f 20 69 73 20 63 6f 70 79 20 74 68 65 69 72 20  o is copy their 
2710: 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 66 72 6f  entries.  ** fro
2720: 6d 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53  m the SQLITE_MAS
2730: 54 45 52 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  TER table..  */.
2740: 20 20 72 63 20 3d 20 65 78 65 63 53 71 6c 46 28    rc = execSqlF(
2750: 64 62 2c 20 70 7a 45 72 72 4d 73 67 2c 0a 20 20  db, pzErrMsg,.  
2760: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
2770: 20 76 61 63 75 75 6d 5f 64 62 2e 73 71 6c 69 74   vacuum_db.sqlit
2780: 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
2790: 22 20 53 45 4c 45 43 54 2a 46 52 4f 4d 20 5c 22  " SELECT*FROM \"
27a0: 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74  %w\".sqlite_mast
27b0: 65 72 22 0a 20 20 20 20 20 20 22 20 57 48 45 52  er".      " WHER
27c0: 45 20 74 79 70 65 20 49 4e 28 27 76 69 65 77 27  E type IN('view'
27d0: 2c 27 74 72 69 67 67 65 72 27 29 22 0a 20 20 20  ,'trigger')".   
27e0: 20 20 20 22 20 4f 52 28 74 79 70 65 3d 27 74 61     " OR(type='ta
27f0: 62 6c 65 27 41 4e 44 20 72 6f 6f 74 70 61 67 65  ble'AND rootpage
2800: 3d 30 29 22 2c 0a 20 20 20 20 20 20 7a 44 62 4d  =0)",.      zDbM
2810: 61 69 6e 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  ain.  );.  if( r
2820: 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f  c ) goto end_of_
2830: 76 61 63 75 75 6d 3b 0a 0a 20 20 2f 2a 20 41 74  vacuum;..  /* At
2840: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2850: 72 65 20 69 73 20 61 20 77 72 69 74 65 20 74 72  re is a write tr
2860: 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 20 6f  ansaction open o
2870: 6e 20 62 6f 74 68 20 74 68 65 20 0a 20 20 2a 2a  n both the .  **
2880: 20 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65   vacuum database
2890: 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 64 61   and the main da
28a0: 74 61 62 61 73 65 2e 20 41 73 73 75 6d 69 6e 67  tabase. Assuming
28b0: 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
28c0: 2c 0a 20 20 2a 2a 20 62 6f 74 68 20 74 72 61 6e  ,.  ** both tran
28d0: 73 61 63 74 69 6f 6e 73 20 61 72 65 20 63 6c 6f  sactions are clo
28e0: 73 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63  sed by this bloc
28f0: 6b 20 2d 20 74 68 65 20 6d 61 69 6e 20 64 61 74  k - the main dat
2900: 61 62 61 73 65 0a 20 20 2a 2a 20 74 72 61 6e 73  abase.  ** trans
2910: 61 63 74 69 6f 6e 20 62 79 20 73 71 6c 69 74 65  action by sqlite
2920: 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 29  3BtreeCopyFile()
2930: 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 62   and the other b
2940: 79 20 61 6e 20 65 78 70 6c 69 63 69 74 0a 20 20  y an explicit.  
2950: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
2960: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 2e  e3BtreeCommit().
2970: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 75 33  .  */.  {.    u3
2980: 32 20 6d 65 74 61 3b 0a 20 20 20 20 69 6e 74 20  2 meta;.    int 
2990: 69 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  i;..    /* This 
29a0: 61 72 72 61 79 20 64 65 74 65 72 6d 69 6e 65 73  array determines
29b0: 20 77 68 69 63 68 20 6d 65 74 61 20 6d 65 74 61   which meta meta
29c0: 20 76 61 6c 75 65 73 20 61 72 65 20 70 72 65 73   values are pres
29d0: 65 72 76 65 64 20 69 6e 20 74 68 65 0a 20 20 20  erved in the.   
29e0: 20 2a 2a 20 76 61 63 75 75 6d 2e 20 20 45 76 65   ** vacuum.  Eve
29f0: 6e 20 65 6e 74 72 69 65 73 20 61 72 65 20 74 68  n entries are th
2a00: 65 20 6d 65 74 61 20 76 61 6c 75 65 20 6e 75 6d  e meta value num
2a10: 62 65 72 20 61 6e 64 20 6f 64 64 20 65 6e 74 72  ber and odd entr
2a20: 69 65 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 61  ies.    ** are a
2a30: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 6f 20 61  n increment to a
2a40: 70 70 6c 79 20 74 6f 20 74 68 65 20 6d 65 74 61  pply to the meta
2a50: 20 76 61 6c 75 65 20 61 66 74 65 72 20 74 68 65   value after the
2a60: 20 76 61 63 75 75 6d 2e 0a 20 20 20 20 2a 2a 20   vacuum..    ** 
2a70: 54 68 65 20 69 6e 63 72 65 6d 65 6e 74 20 69 73  The increment is
2a80: 20 75 73 65 64 20 74 6f 20 69 6e 63 72 65 61 73   used to increas
2a90: 65 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  e the schema coo
2aa0: 6b 69 65 20 73 6f 20 74 68 61 74 20 6f 74 68 65  kie so that othe
2ab0: 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74  r.    ** connect
2ac0: 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
2ad0: 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 6b   database will k
2ae0: 6e 6f 77 20 74 6f 20 72 65 72 65 61 64 20 74 68  now to reread th
2af0: 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
2b00: 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
2b10: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
2b20: 61 43 6f 70 79 5b 5d 20 3d 20 7b 0a 20 20 20 20  aCopy[] = {.    
2b30: 20 20 20 42 54 52 45 45 5f 53 43 48 45 4d 41 5f     BTREE_SCHEMA_
2b40: 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 31 2c 20  VERSION,     1, 
2b50: 20 2f 2a 20 41 64 64 20 6f 6e 65 20 74 6f 20 74   /* Add one to t
2b60: 68 65 20 6f 6c 64 20 73 63 68 65 6d 61 20 63 6f  he old schema co
2b70: 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 20 20 20 42  okie */.       B
2b80: 54 52 45 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  TREE_DEFAULT_CAC
2b90: 48 45 5f 53 49 5a 45 2c 20 30 2c 20 20 2f 2a 20  HE_SIZE, 0,  /* 
2ba0: 50 72 65 73 65 72 76 65 20 74 68 65 20 64 65 66  Preserve the def
2bb0: 61 75 6c 74 20 70 61 67 65 20 63 61 63 68 65 20  ault page cache 
2bc0: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 42  size */.       B
2bd0: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
2be0: 4e 47 2c 20 20 20 20 20 20 30 2c 20 20 2f 2a 20  NG,      0,  /* 
2bf0: 50 72 65 73 65 72 76 65 20 74 68 65 20 74 65 78  Preserve the tex
2c00: 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  t encoding */.  
2c10: 20 20 20 20 20 42 54 52 45 45 5f 55 53 45 52 5f       BTREE_USER_
2c20: 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 30  VERSION,       0
2c30: 2c 20 20 2f 2a 20 50 72 65 73 65 72 76 65 20 74  ,  /* Preserve t
2c40: 68 65 20 75 73 65 72 20 76 65 72 73 69 6f 6e 20  he user version 
2c50: 2a 2f 0a 20 20 20 20 20 20 20 42 54 52 45 45 5f  */.       BTREE_
2c60: 41 50 50 4c 49 43 41 54 49 4f 4e 5f 49 44 2c 20  APPLICATION_ID, 
2c70: 20 20 20 20 30 2c 20 20 2f 2a 20 50 72 65 73 65      0,  /* Prese
2c80: 72 76 65 20 74 68 65 20 61 70 70 6c 69 63 61 74  rve the applicat
2c90: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 7d 3b  ion id */.    };
2ca0: 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 31 3d  ..    assert( 1=
2cb0: 3d 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49  =sqlite3BtreeIsI
2cc0: 6e 54 72 61 6e 73 28 70 54 65 6d 70 29 20 29 3b  nTrans(pTemp) );
2cd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 31 3d 3d  .    assert( 1==
2ce0: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
2cf0: 54 72 61 6e 73 28 70 4d 61 69 6e 29 20 29 3b 0a  Trans(pMain) );.
2d00: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 42 74 72  .    /* Copy Btr
2d10: 65 65 20 6d 65 74 61 20 76 61 6c 75 65 73 20 2a  ee meta values *
2d20: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
2d30: 3c 41 72 72 61 79 53 69 7a 65 28 61 43 6f 70 79  <ArraySize(aCopy
2d40: 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  ); i+=2){.      
2d50: 2f 2a 20 47 65 74 4d 65 74 61 28 29 20 61 6e 64  /* GetMeta() and
2d60: 20 55 70 64 61 74 65 4d 65 74 61 28 29 20 63 61   UpdateMeta() ca
2d70: 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 74 68 69  nnot fail in thi
2d80: 73 20 63 6f 6e 74 65 78 74 20 62 65 63 61 75 73  s context becaus
2d90: 65 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 61 6c  e.      ** we al
2da0: 72 65 61 64 79 20 68 61 76 65 20 70 61 67 65 20  ready have page 
2db0: 31 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 63 61  1 loaded into ca
2dc0: 63 68 65 20 61 6e 64 20 6d 61 72 6b 65 64 20 64  che and marked d
2dd0: 69 72 74 79 2e 20 2a 2f 0a 20 20 20 20 20 20 73  irty. */.      s
2de0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d 65  qlite3BtreeGetMe
2df0: 74 61 28 70 4d 61 69 6e 2c 20 61 43 6f 70 79 5b  ta(pMain, aCopy[
2e00: 69 5d 2c 20 26 6d 65 74 61 29 3b 0a 20 20 20 20  i], &meta);.    
2e10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2e20: 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70 54  reeUpdateMeta(pT
2e30: 65 6d 70 2c 20 61 43 6f 70 79 5b 69 5d 2c 20 6d  emp, aCopy[i], m
2e40: 65 74 61 2b 61 43 6f 70 79 5b 69 2b 31 5d 29 3b  eta+aCopy[i+1]);
2e50: 0a 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52  .      if( NEVER
2e60: 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20  (rc!=SQLITE_OK) 
2e70: 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61  ) goto end_of_va
2e80: 63 75 75 6d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  cuum;.    }..   
2e90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2ea0: 65 65 43 6f 70 79 46 69 6c 65 28 70 4d 61 69 6e  eeCopyFile(pMain
2eb0: 2c 20 70 54 65 6d 70 29 3b 0a 20 20 20 20 69 66  , pTemp);.    if
2ec0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ed0: 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61  ) goto end_of_va
2ee0: 63 75 75 6d 3b 0a 20 20 20 20 72 63 20 3d 20 73  cuum;.    rc = s
2ef0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
2f00: 74 28 70 54 65 6d 70 29 3b 0a 20 20 20 20 69 66  t(pTemp);.    if
2f10: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2f20: 29 20 67 6f 74 6f 20 65 6e 64 5f 6f 66 5f 76 61  ) goto end_of_va
2f30: 63 75 75 6d 3b 0a 23 69 66 6e 64 65 66 20 53 51  cuum;.#ifndef SQ
2f40: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2f50: 43 55 55 4d 0a 20 20 20 20 73 71 6c 69 74 65 33  CUUM.    sqlite3
2f60: 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63 75  BtreeSetAutoVacu
2f70: 75 6d 28 70 4d 61 69 6e 2c 20 73 71 6c 69 74 65  um(pMain, sqlite
2f80: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
2f90: 75 75 6d 28 70 54 65 6d 70 29 29 3b 0a 23 65 6e  uum(pTemp));.#en
2fa0: 64 69 66 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  dif.  }..  asser
2fb0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2fc0: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2fd0: 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
2fe0: 7a 65 28 70 4d 61 69 6e 2c 20 73 71 6c 69 74 65  ze(pMain, sqlite
2ff0: 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
3000: 65 28 70 54 65 6d 70 29 2c 20 6e 52 65 73 2c 31  e(pTemp), nRes,1
3010: 29 3b 0a 0a 65 6e 64 5f 6f 66 5f 76 61 63 75 75  );..end_of_vacuu
3020: 6d 3a 0a 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  m:.  /* Restore 
3030: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 76 61 6c  the original val
3040: 75 65 20 6f 66 20 64 62 2d 3e 66 6c 61 67 73 20  ue of db->flags 
3050: 2a 2f 0a 20 20 64 62 2d 3e 69 6e 69 74 2e 69 44  */.  db->init.iD
3060: 62 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  b = 0;.  db->fla
3070: 67 73 20 3d 20 73 61 76 65 64 5f 66 6c 61 67 73  gs = saved_flags
3080: 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
3090: 3d 20 73 61 76 65 64 5f 6e 43 68 61 6e 67 65 3b  = saved_nChange;
30a0: 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  .  db->nTotalCha
30b0: 6e 67 65 20 3d 20 73 61 76 65 64 5f 6e 54 6f 74  nge = saved_nTot
30c0: 61 6c 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e  alChange;.  db->
30d0: 6d 54 72 61 63 65 20 3d 20 73 61 76 65 64 5f 6d  mTrace = saved_m
30e0: 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33  Trace;.  sqlite3
30f0: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
3100: 28 70 4d 61 69 6e 2c 20 2d 31 2c 20 2d 31 2c 20  (pMain, -1, -1, 
3110: 31 29 3b 0a 0a 20 20 2f 2a 20 43 75 72 72 65 6e  1);..  /* Curren
3120: 74 6c 79 20 74 68 65 72 65 20 69 73 20 61 6e 20  tly there is an 
3130: 53 51 4c 20 6c 65 76 65 6c 20 74 72 61 6e 73 61  SQL level transa
3140: 63 74 69 6f 6e 20 6f 70 65 6e 20 6f 6e 20 74 68  ction open on th
3150: 65 20 76 61 63 75 75 6d 0a 20 20 2a 2a 20 64 61  e vacuum.  ** da
3160: 74 61 62 61 73 65 2e 20 4e 6f 20 6c 6f 63 6b 73  tabase. No locks
3170: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 6e 79   are held on any
3180: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 28 73 69   other files (si
3190: 6e 63 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c  nce the main fil
31a0: 65 0a 20 20 2a 2a 20 77 61 73 20 63 6f 6d 6d 69  e.  ** was commi
31b0: 74 74 65 64 20 61 74 20 74 68 65 20 62 74 72 65  tted at the btre
31c0: 65 20 6c 65 76 65 6c 29 2e 20 53 6f 20 69 74 20  e level). So it 
31d0: 73 61 66 65 20 74 6f 20 65 6e 64 20 74 68 65 20  safe to end the 
31e0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
31f0: 20 62 79 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74   by manually set
3200: 74 69 6e 67 20 74 68 65 20 61 75 74 6f 43 6f 6d  ting the autoCom
3210: 6d 69 74 20 66 6c 61 67 20 74 6f 20 74 72 75 65  mit flag to true
3220: 20 61 6e 64 20 64 65 74 61 63 68 69 6e 67 20 74   and detaching t
3230: 68 65 0a 20 20 2a 2a 20 76 61 63 75 75 6d 20 64  he.  ** vacuum d
3240: 61 74 61 62 61 73 65 2e 20 54 68 65 20 76 61 63  atabase. The vac
3250: 75 75 6d 5f 64 62 20 6a 6f 75 72 6e 61 6c 20 66  uum_db journal f
3260: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 77  ile is deleted w
3270: 68 65 6e 20 74 68 65 20 70 61 67 65 72 0a 20 20  hen the pager.  
3280: 2a 2a 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20  ** is closed by 
3290: 74 68 65 20 44 45 54 41 43 48 2e 0a 20 20 2a 2f  the DETACH..  */
32a0: 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
32b0: 74 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 70 44  t = 1;..  if( pD
32c0: 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
32d0: 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e  BtreeClose(pDb->
32e0: 70 42 74 29 3b 0a 20 20 20 20 70 44 62 2d 3e 70  pBt);.    pDb->p
32f0: 42 74 20 3d 20 30 3b 0a 20 20 20 20 70 44 62 2d  Bt = 0;.    pDb-
3300: 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20  >pSchema = 0;.  
3310: 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6f 74  }..  /* This bot
3320: 68 20 63 6c 65 61 72 73 20 74 68 65 20 73 63 68  h clears the sch
3330: 65 6d 61 73 20 61 6e 64 20 72 65 64 75 63 65 73  emas and reduces
3340: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
3350: 20 64 62 2d 3e 61 44 62 5b 5d 0a 20 20 2a 2a 20   db->aDb[].  ** 
3360: 61 72 72 61 79 2e 20 2a 2f 20 0a 20 20 73 71 6c  array. */ .  sql
3370: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
3380: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
3390: 64 62 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  db);..  return r
33a0: 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 20 2f 2a  c;.}..#endif  /*
33b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
33c0: 55 55 4d 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d  UUM && SQLITE_OM
33d0: 49 54 5f 41 54 54 41 43 48 20 2a 2f 0a           IT_ATTACH */.