/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact ad7eeae19c0844d3b329781c5a35ccda0a2010d2:


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 41 54 54 41 43 48 20 61 6e 64 20 44 45  he ATTACH and DE
01b0: 54 41 43 48 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a  TACH commands..*
01c0: 2a 0a 2a 2a 20 24 49 64 3a 20 61 74 74 61 63 68  *.** $Id: attach
01d0: 2e 63 2c 76 20 31 2e 39 32 20 32 30 30 39 2f 30  .c,v 1.92 2009/0
01e0: 35 2f 32 38 20 30 31 3a 30 30 3a 35 35 20 64 72  5/28 01:00:55 dr
01f0: 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  h Exp $.*/.#incl
0200: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0210: 22 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  "..#ifndef SQLIT
0220: 45 5f 4f 4d 49 54 5f 41 54 54 41 43 48 0a 2f 2a  E_OMIT_ATTACH./*
0230: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6e 20 65  .** Resolve an e
0240: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77  xpression that w
0250: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 41 54  as part of an AT
0260: 54 41 43 48 20 6f 72 20 44 45 54 41 43 48 20 73  TACH or DETACH s
0270: 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 0a 2a  tatement. This.*
0280: 2a 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  * is slightly di
0290: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 72 65 73  fferent from res
02a0: 6f 6c 76 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20  olving a normal 
02b0: 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  SQL expression, 
02c0: 62 65 63 61 75 73 65 20 73 69 6d 70 6c 65 0a 2a  because simple.*
02d0: 2a 20 69 64 65 6e 74 69 66 69 65 72 73 20 61 72  * identifiers ar
02e0: 65 20 74 72 65 61 74 65 64 20 61 73 20 73 74 72  e treated as str
02f0: 69 6e 67 73 2c 20 6e 6f 74 20 70 6f 73 73 69 62  ings, not possib
0300: 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  le column names 
0310: 6f 72 20 61 6c 69 61 73 65 73 2e 0a 2a 2a 0a 2a  or aliases..**.*
0320: 2a 20 69 2e 65 2e 20 69 66 20 74 68 65 20 70 61  * i.e. if the pa
0330: 72 73 65 72 20 73 65 65 73 3a 0a 2a 2a 0a 2a 2a  rser sees:.**.**
0340: 20 20 20 20 20 41 54 54 41 43 48 20 44 41 54 41       ATTACH DATA
0350: 42 41 53 45 20 61 62 63 20 41 53 20 64 65 66 0a  BASE abc AS def.
0360: 2a 2a 0a 2a 2a 20 69 74 20 74 72 65 61 74 73 20  **.** it treats 
0370: 74 68 65 20 74 77 6f 20 65 78 70 72 65 73 73 69  the two expressi
0380: 6f 6e 73 20 61 73 20 6c 69 74 65 72 61 6c 20 73  ons as literal s
0390: 74 72 69 6e 67 73 20 27 61 62 63 27 20 61 6e 64  trings 'abc' and
03a0: 20 27 64 65 66 27 20 69 6e 73 74 65 61 64 20 6f   'def' instead o
03b0: 66 0a 2a 2a 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  f.** looking for
03c0: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
03d0: 73 61 6d 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  same name..**.**
03e0: 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69   This only appli
03f0: 65 73 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 6e  es to the root n
0400: 6f 64 65 20 6f 66 20 70 45 78 70 72 2c 20 73 6f  ode of pExpr, so
0410: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 3a 0a   the statement:.
0420: 2a 2a 0a 2a 2a 20 20 20 20 20 41 54 54 41 43 48  **.**     ATTACH
0430: 20 44 41 54 41 42 41 53 45 20 61 62 63 7c 7c 64   DATABASE abc||d
0440: 65 66 20 41 53 20 27 64 62 32 27 0a 2a 2a 0a 2a  ef AS 'db2'.**.*
0450: 2a 20 77 69 6c 6c 20 66 61 69 6c 20 62 65 63 61  * will fail beca
0460: 75 73 65 20 6e 65 69 74 68 65 72 20 61 62 63 20  use neither abc 
0470: 6f 72 20 64 65 66 20 63 61 6e 20 62 65 20 72 65  or def can be re
0480: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  solved..*/.stati
0490: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 41 74 74  c int resolveAtt
04a0: 61 63 68 45 78 70 72 28 4e 61 6d 65 43 6f 6e 74  achExpr(NameCont
04b0: 65 78 74 20 2a 70 4e 61 6d 65 2c 20 45 78 70 72  ext *pName, Expr
04c0: 20 2a 70 45 78 70 72 29 0a 7b 0a 20 20 69 6e 74   *pExpr).{.  int
04d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
04e0: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
04f0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
0500: 70 21 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p!=TK_ID ){.    
0510: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65    rc = sqlite3Re
0520: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70  solveExprNames(p
0530: 4e 61 6d 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  Name, pExpr);.  
0540: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
0550: 54 45 5f 4f 4b 20 26 26 20 21 73 71 6c 69 74 65  TE_OK && !sqlite
0560: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
0570: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
0580: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
0590: 67 28 70 4e 61 6d 65 2d 3e 70 50 61 72 73 65 2c  g(pName->pParse,
05a0: 20 22 69 6e 76 61 6c 69 64 20 6e 61 6d 65 3a 20   "invalid name: 
05b0: 5c 22 25 73 5c 22 22 2c 20 70 45 78 70 72 2d 3e  \"%s\"", pExpr->
05c0: 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20  u.zToken);.     
05d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
05e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
05f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0600: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
0610: 53 54 52 49 4e 47 3b 0a 20 20 20 20 7d 0a 20 20  STRING;.    }.  
0620: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
0630: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 53 51 4c 20 75  ../*.** An SQL u
0640: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 67  ser-function reg
0650: 69 73 74 65 72 65 64 20 74 6f 20 64 6f 20 74 68  istered to do th
0660: 65 20 77 6f 72 6b 20 6f 66 20 61 6e 20 41 54 54  e work of an ATT
0670: 41 43 48 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ACH statement. T
0680: 68 65 0a 2a 2a 20 74 68 72 65 65 20 61 72 67 75  he.** three argu
0690: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
06a0: 63 74 69 6f 6e 20 63 6f 6d 65 20 64 69 72 65 63  ction come direc
06b0: 74 6c 79 20 66 72 6f 6d 20 61 6e 20 61 74 74 61  tly from an atta
06c0: 63 68 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a  ch statement:.**
06d0: 0a 2a 2a 20 20 20 20 20 41 54 54 41 43 48 20 44  .**     ATTACH D
06e0: 41 54 41 42 41 53 45 20 78 20 41 53 20 79 20 4b  ATABASE x AS y K
06f0: 45 59 20 7a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53  EY z.**.**     S
0700: 45 4c 45 43 54 20 73 71 6c 69 74 65 5f 61 74 74  ELECT sqlite_att
0710: 61 63 68 28 78 2c 20 79 2c 20 7a 29 0a 2a 2a 0a  ach(x, y, z).**.
0720: 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6f 6e  ** If the option
0730: 61 6c 20 22 4b 45 59 20 7a 22 20 73 79 6e 74 61  al "KEY z" synta
0740: 78 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 61 6e  x is omitted, an
0750: 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 70 61 73   SQL NULL is pas
0760: 73 65 64 20 61 73 20 74 68 65 0a 2a 2a 20 74 68  sed as the.** th
0770: 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ird argument..*/
0780: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 74 74  .static void att
0790: 61 63 68 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  achFunc(.  sqlit
07a0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
07b0: 65 78 74 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73  ext,.  int NotUs
07c0: 65 64 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ed,.  sqlite3_va
07d0: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
07e0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
07f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
0800: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
0810: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63  text_db_handle(c
0820: 6f 6e 74 65 78 74 29 3b 0a 20 20 63 6f 6e 73 74  ontext);.  const
0830: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
0840: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
0850: 65 3b 0a 20 20 44 62 20 2a 61 4e 65 77 3b 0a 20  e;.  Db *aNew;. 
0860: 20 63 68 61 72 20 2a 7a 45 72 72 44 79 6e 20 3d   char *zErrDyn =
0870: 20 30 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   0;..  UNUSED_PA
0880: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
0890: 3b 0a 0a 20 20 7a 46 69 6c 65 20 3d 20 28 63 6f  ;..  zFile = (co
08a0: 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69 74  nst char *)sqlit
08b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
08c0: 67 76 5b 30 5d 29 3b 0a 20 20 7a 4e 61 6d 65 20  gv[0]);.  zName 
08d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
08e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
08f0: 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69  xt(argv[1]);.  i
0900: 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 20 7a 46  f( zFile==0 ) zF
0910: 69 6c 65 20 3d 20 22 22 3b 0a 20 20 69 66 28 20  ile = "";.  if( 
0920: 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65  zName==0 ) zName
0930: 20 3d 20 22 22 3b 0a 0a 20 20 2f 2a 20 43 68 65   = "";..  /* Che
0940: 63 6b 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f  ck for the follo
0950: 77 69 6e 67 20 65 72 72 6f 72 73 3a 0a 20 20 2a  wing errors:.  *
0960: 2a 0a 20 20 2a 2a 20 20 20 20 20 2a 20 54 6f 6f  *.  **     * Too
0970: 20 6d 61 6e 79 20 61 74 74 61 63 68 65 64 20 64   many attached d
0980: 61 74 61 62 61 73 65 73 2c 0a 20 20 2a 2a 20 20  atabases,.  **  
0990: 20 20 20 2a 20 54 72 61 6e 73 61 63 74 69 6f 6e     * Transaction
09a0: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 0a   currently open.
09b0: 20 20 2a 2a 20 20 20 20 20 2a 20 53 70 65 63 69    **     * Speci
09c0: 66 69 65 64 20 64 61 74 61 62 61 73 65 20 6e 61  fied database na
09d0: 6d 65 20 61 6c 72 65 61 64 79 20 62 65 69 6e 67  me already being
09e0: 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66   used..  */.  if
09f0: 28 20 64 62 2d 3e 6e 44 62 3e 3d 64 62 2d 3e 61  ( db->nDb>=db->a
0a00: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
0a10: 49 54 5f 41 54 54 41 43 48 45 44 5d 2b 32 20 29  IT_ATTACHED]+2 )
0a20: 7b 0a 20 20 20 20 7a 45 72 72 44 79 6e 20 3d 20  {.    zErrDyn = 
0a30: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
0a40: 62 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 74 74  b, "too many att
0a50: 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
0a60: 2d 20 6d 61 78 20 25 64 22 2c 20 0a 20 20 20 20  - max %d", .    
0a70: 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c    db->aLimit[SQL
0a80: 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48  ITE_LIMIT_ATTACH
0a90: 45 44 5d 0a 20 20 20 20 29 3b 0a 20 20 20 20 67  ED].    );.    g
0aa0: 6f 74 6f 20 61 74 74 61 63 68 5f 65 72 72 6f 72  oto attach_error
0ab0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d  ;.  }.  if( !db-
0ac0: 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
0ad0: 20 20 20 7a 45 72 72 44 79 6e 20 3d 20 73 71 6c     zErrDyn = sql
0ae0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
0af0: 22 63 61 6e 6e 6f 74 20 41 54 54 41 43 48 20 64  "cannot ATTACH d
0b00: 61 74 61 62 61 73 65 20 77 69 74 68 69 6e 20 74  atabase within t
0b10: 72 61 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20  ransaction");.  
0b20: 20 20 67 6f 74 6f 20 61 74 74 61 63 68 5f 65 72    goto attach_er
0b30: 72 6f 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ror;.  }.  for(i
0b40: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
0b50: 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
0b60: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e   = db->aDb[i].zN
0b70: 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ame;.    assert(
0b80: 20 7a 20 26 26 20 7a 4e 61 6d 65 20 29 3b 0a 20   z && zName );. 
0b90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
0ba0: 72 49 43 6d 70 28 7a 2c 20 7a 4e 61 6d 65 29 3d  rICmp(z, zName)=
0bb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72  =0 ){.      zErr
0bc0: 44 79 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Dyn = sqlite3MPr
0bd0: 69 6e 74 66 28 64 62 2c 20 22 64 61 74 61 62 61  intf(db, "databa
0be0: 73 65 20 25 73 20 69 73 20 61 6c 72 65 61 64 79  se %s is already
0bf0: 20 69 6e 20 75 73 65 22 2c 20 7a 4e 61 6d 65 29   in use", zName)
0c00: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 74 74  ;.      goto att
0c10: 61 63 68 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ach_error;.    }
0c20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
0c30: 61 74 65 20 74 68 65 20 6e 65 77 20 65 6e 74 72  ate the new entr
0c40: 79 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 44 62  y in the db->aDb
0c50: 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 69 6e 69  [] array and ini
0c60: 74 69 61 6c 69 73 65 20 74 68 65 20 73 63 68 65  tialise the sche
0c70: 6d 61 0a 20 20 2a 2a 20 68 61 73 68 20 74 61 62  ma.  ** hash tab
0c80: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  les..  */.  if( 
0c90: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
0ca0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 61 4e  Static ){.    aN
0cb0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ew = sqlite3DbMa
0cc0: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
0cd0: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 2a 33  of(db->aDb[0])*3
0ce0: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77   );.    if( aNew
0cf0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
0d00: 20 20 6d 65 6d 63 70 79 28 61 4e 65 77 2c 20 64    memcpy(aNew, d
0d10: 62 2d 3e 61 44 62 2c 20 73 69 7a 65 6f 66 28 64  b->aDb, sizeof(d
0d20: 62 2d 3e 61 44 62 5b 30 5d 29 2a 32 29 3b 0a 20  b->aDb[0])*2);. 
0d30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 4e 65 77   }else{.    aNew
0d40: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
0d50: 6c 6f 63 28 64 62 2c 20 64 62 2d 3e 61 44 62 2c  loc(db, db->aDb,
0d60: 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b   sizeof(db->aDb[
0d70: 30 5d 29 2a 28 64 62 2d 3e 6e 44 62 2b 31 29 20  0])*(db->nDb+1) 
0d80: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
0d90: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d  =0 ) return;.  }
0da0: 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 61 4e 65  .  db->aDb = aNe
0db0: 77 3b 0a 20 20 61 4e 65 77 20 3d 20 26 64 62 2d  w;.  aNew = &db-
0dc0: 3e 61 44 62 5b 64 62 2d 3e 6e 44 62 5d 3b 0a 20  >aDb[db->nDb];. 
0dd0: 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c   memset(aNew, 0,
0de0: 20 73 69 7a 65 6f 66 28 2a 61 4e 65 77 29 29 3b   sizeof(*aNew));
0df0: 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20  ..  /* Open the 
0e00: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
0e10: 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 73  f the btree is s
0e20: 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
0e30: 65 64 2c 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ed, use.  ** it 
0e40: 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 64 61  to obtain the da
0e50: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 41  tabase schema. A
0e60: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
0e70: 20 73 63 68 65 6d 61 20 6d 61 79 0a 20 20 2a 2a   schema may.  **
0e80: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   or may not be i
0e90: 6e 69 74 69 61 6c 69 73 65 64 2e 0a 20 20 2a 2f  nitialised..  */
0ea0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
0eb0: 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20  treeFactory(db, 
0ec0: 7a 46 69 6c 65 2c 20 30 2c 20 53 51 4c 49 54 45  zFile, 0, SQLITE
0ed0: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
0ee0: 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f00: 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 7c 20  db->openFlags | 
0f10: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
0f20: 5f 44 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _DB,.           
0f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f40: 26 61 4e 65 77 2d 3e 70 42 74 29 3b 0a 20 20 64  &aNew->pBt);.  d
0f50: 62 2d 3e 6e 44 62 2b 2b 3b 0a 20 20 69 66 28 20  b->nDb++;.  if( 
0f60: 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  rc==SQLITE_CONST
0f70: 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 72 63 20  RAINT ){.    rc 
0f80: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
0f90: 20 20 20 20 7a 45 72 72 44 79 6e 20 3d 20 73 71      zErrDyn = sq
0fa0: 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
0fb0: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 61 6c   "database is al
0fc0: 72 65 61 64 79 20 61 74 74 61 63 68 65 64 22 29  ready attached")
0fd0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
0fe0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
0ff0: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
1000: 3b 0a 20 20 20 20 61 4e 65 77 2d 3e 70 53 63 68  ;.    aNew->pSch
1010: 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
1020: 65 6d 61 47 65 74 28 64 62 2c 20 61 4e 65 77 2d  emaGet(db, aNew-
1030: 3e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 21  >pBt);.    if( !
1040: 61 4e 65 77 2d 3e 70 53 63 68 65 6d 61 20 29 7b  aNew->pSchema ){
1050: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1060: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
1070: 6c 73 65 20 69 66 28 20 61 4e 65 77 2d 3e 70 53  lse if( aNew->pS
1080: 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
1090: 61 74 20 26 26 20 61 4e 65 77 2d 3e 70 53 63 68  at && aNew->pSch
10a0: 65 6d 61 2d 3e 65 6e 63 21 3d 45 4e 43 28 64 62  ema->enc!=ENC(db
10b0: 29 20 29 7b 0a 20 20 20 20 20 20 7a 45 72 72 44  ) ){.      zErrD
10c0: 79 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  yn = sqlite3MPri
10d0: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
10e0: 20 22 61 74 74 61 63 68 65 64 20 64 61 74 61 62   "attached datab
10f0: 61 73 65 73 20 6d 75 73 74 20 75 73 65 20 74 68  ases must use th
1100: 65 20 73 61 6d 65 20 74 65 78 74 20 65 6e 63 6f  e same text enco
1110: 64 69 6e 67 20 61 73 20 6d 61 69 6e 20 64 61 74  ding as main dat
1120: 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20 72  abase");.      r
1130: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1140: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1150: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
1160: 65 50 61 67 65 72 28 61 4e 65 77 2d 3e 70 42 74  ePager(aNew->pBt
1170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1180: 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  gerLockingMode(p
1190: 50 61 67 65 72 2c 20 64 62 2d 3e 64 66 6c 74 4c  Pager, db->dfltL
11a0: 6f 63 6b 4d 6f 64 65 29 3b 0a 20 20 20 20 73 71  ockMode);.    sq
11b0: 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
11c0: 6c 4d 6f 64 65 28 70 50 61 67 65 72 2c 20 64 62  lMode(pPager, db
11d0: 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64  ->dfltJournalMod
11e0: 65 29 3b 0a 20 20 7d 0a 20 20 61 4e 65 77 2d 3e  e);.  }.  aNew->
11f0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
1200: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
1210: 65 29 3b 0a 20 20 61 4e 65 77 2d 3e 73 61 66 65  e);.  aNew->safe
1220: 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 0a 23  ty_level = 3;..#
1230: 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
1240: 44 45 43 0a 20 20 7b 0a 20 20 20 20 65 78 74 65  DEC.  {.    exte
1250: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  rn int sqlite3Co
1260: 64 65 63 41 74 74 61 63 68 28 73 71 6c 69 74 65  decAttach(sqlite
1270: 33 2a 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 76  3*, int, const v
1280: 6f 69 64 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  oid*, int);.    
1290: 65 78 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69  extern void sqli
12a0: 74 65 33 43 6f 64 65 63 47 65 74 4b 65 79 28 73  te3CodecGetKey(s
12b0: 71 6c 69 74 65 33 2a 2c 20 69 6e 74 2c 20 76 6f  qlite3*, int, vo
12c0: 69 64 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  id**, int*);.   
12d0: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 63   int nKey;.    c
12e0: 68 61 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69  har *zKey;.    i
12f0: 6e 74 20 74 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt t = sqlite3_v
1300: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 32  alue_type(argv[2
1310: 5d 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20  ]);.    switch( 
1320: 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
1330: 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a  SQLITE_INTEGER:.
1340: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1350: 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20  E_FLOAT:.       
1360: 20 7a 45 72 72 44 79 6e 20 3d 20 73 71 6c 69 74   zErrDyn = sqlit
1370: 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 22  e3DbStrDup(db, "
1380: 49 6e 76 61 6c 69 64 20 6b 65 79 20 76 61 6c 75  Invalid key valu
1390: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  e");.        rc 
13a0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
13b0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13c0: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 63 61         .      ca
13d0: 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a  se SQLITE_TEXT:.
13e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
13f0: 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20  E_BLOB:.        
1400: 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 76  nKey = sqlite3_v
1410: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
1420: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 7a 4b 65  2]);.        zKe
1430: 79 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  y = (char *)sqli
1440: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
1450: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  rgv[2]);.       
1460: 20 73 71 6c 69 74 65 33 43 6f 64 65 63 41 74 74   sqlite3CodecAtt
1470: 61 63 68 28 64 62 2c 20 64 62 2d 3e 6e 44 62 2d  ach(db, db->nDb-
1480: 31 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  1, zKey, nKey);.
1490: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
14a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
14b0: 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20 20  E_NULL:.        
14c0: 2f 2a 20 4e 6f 20 6b 65 79 20 73 70 65 63 69 66  /* No key specif
14d0: 69 65 64 2e 20 20 55 73 65 20 74 68 65 20 6b 65  ied.  Use the ke
14e0: 79 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20  y from the main 
14f0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
1500: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 63      sqlite3Codec
1510: 47 65 74 4b 65 79 28 64 62 2c 20 30 2c 20 28 76  GetKey(db, 0, (v
1520: 6f 69 64 2a 2a 29 26 7a 4b 65 79 2c 20 26 6e 4b  oid**)&zKey, &nK
1530: 65 79 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ey);.        sql
1540: 69 74 65 33 43 6f 64 65 63 41 74 74 61 63 68 28  ite3CodecAttach(
1550: 64 62 2c 20 64 62 2d 3e 6e 44 62 2d 31 2c 20 7a  db, db->nDb-1, z
1560: 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20  Key, nKey);.    
1570: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1580: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
1590: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
15a0: 73 20 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73  s opened success
15b0: 66 75 6c 6c 79 2c 20 72 65 61 64 20 74 68 65 20  fully, read the 
15c0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 6e  schema for the n
15d0: 65 77 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  ew database..  *
15e0: 2a 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c  * If this fails,
15f0: 20 6f 72 20 69 66 20 6f 70 65 6e 69 6e 67 20 74   or if opening t
1600: 68 65 20 66 69 6c 65 20 66 61 69 6c 65 64 2c 20  he file failed, 
1610: 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 66  then close the f
1620: 69 6c 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65  ile and .  ** re
1630: 6d 6f 76 65 20 74 68 65 20 65 6e 74 72 79 20 66  move the entry f
1640: 72 6f 6d 20 74 68 65 20 64 62 2d 3e 61 44 62 5b  rom the db->aDb[
1650: 5d 20 61 72 72 61 79 2e 20 69 2e 65 2e 20 70 75  ] array. i.e. pu
1660: 74 20 65 76 65 72 79 74 68 69 6e 67 20 62 61 63  t everything bac
1670: 6b 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 77  k the way.  ** w
1680: 65 20 66 6f 75 6e 64 20 69 74 2e 0a 20 20 2a 2f  e found it..  */
1690: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 28 76 6f 69  E_OK ){.    (voi
16b0: 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f  d)sqlite3SafetyO
16c0: 6e 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  n(db);.    sqlit
16d0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
16e0: 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  db);.    rc = sq
16f0: 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a  lite3Init(db, &z
1700: 45 72 72 44 79 6e 29 3b 0a 20 20 20 20 73 71 6c  ErrDyn);.    sql
1710: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
1720: 6c 28 64 62 29 3b 0a 20 20 20 20 28 76 6f 69 64  l(db);.    (void
1730: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
1740: 66 28 64 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28  f(db);.  }.  if(
1750: 20 72 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 69   rc ){.    int i
1760: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 20 2d 20 31  Db = db->nDb - 1
1770: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
1780: 62 3e 3d 32 20 29 3b 0a 20 20 20 20 69 66 28 20  b>=2 );.    if( 
1790: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
17a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
17b0: 33 42 74 72 65 65 43 6c 6f 73 65 28 64 62 2d 3e  3BtreeClose(db->
17c0: 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 3b 0a 20  aDb[iDb].pBt);. 
17d0: 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
17e0: 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20 20  ].pBt = 0;.     
17f0: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1800: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 7d  chema = 0;.    }
1810: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
1820: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
1830: 64 62 2c 20 30 29 3b 0a 20 20 20 20 64 62 2d 3e  db, 0);.    db->
1840: 6e 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 69  nDb = iDb;.    i
1850: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
1860: 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  MEM || rc==SQLIT
1870: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b  E_IOERR_NOMEM ){
1880: 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  .      db->mallo
1890: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
18a0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18b0: 28 64 62 2c 20 7a 45 72 72 44 79 6e 29 3b 0a 20  (db, zErrDyn);. 
18c0: 20 20 20 20 20 7a 45 72 72 44 79 6e 20 3d 20 73       zErrDyn = s
18d0: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
18e0: 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
18f0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
1900: 28 20 7a 45 72 72 44 79 6e 3d 3d 30 20 29 7b 0a  ( zErrDyn==0 ){.
1910: 20 20 20 20 20 20 7a 45 72 72 44 79 6e 20 3d 20        zErrDyn = 
1920: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
1930: 62 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  b, "unable to op
1940: 65 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  en database: %s"
1950: 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  , zFile);.    }.
1960: 20 20 20 20 67 6f 74 6f 20 61 74 74 61 63 68 5f      goto attach_
1970: 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 0a 20 20  error;.  }.  .  
1980: 72 65 74 75 72 6e 3b 0a 0a 61 74 74 61 63 68 5f  return;..attach_
1990: 65 72 72 6f 72 3a 0a 20 20 2f 2a 20 52 65 74 75  error:.  /* Retu
19a0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77  rn an error if w
19b0: 65 20 67 65 74 20 68 65 72 65 20 2a 2f 0a 20 20  e get here */.  
19c0: 69 66 28 20 7a 45 72 72 44 79 6e 20 29 7b 0a 20  if( zErrDyn ){. 
19d0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
19e0: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
19f0: 20 7a 45 72 72 44 79 6e 2c 20 2d 31 29 3b 0a 20   zErrDyn, -1);. 
1a00: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1a10: 28 64 62 2c 20 7a 45 72 72 44 79 6e 29 3b 0a 20  (db, zErrDyn);. 
1a20: 20 7d 0a 20 20 69 66 28 20 72 63 20 29 20 73 71   }.  if( rc ) sq
1a30: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
1a40: 6f 72 5f 63 6f 64 65 28 63 6f 6e 74 65 78 74 2c  or_code(context,
1a50: 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   rc);.}../*.** A
1a60: 6e 20 53 51 4c 20 75 73 65 72 2d 66 75 6e 63 74  n SQL user-funct
1a70: 69 6f 6e 20 72 65 67 69 73 74 65 72 65 64 20 74  ion registered t
1a80: 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
1a90: 20 61 6e 20 44 45 54 41 43 48 20 73 74 61 74 65   an DETACH state
1aa0: 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20 74 68 72  ment. The.** thr
1ab0: 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  ee arguments to 
1ac0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  the function com
1ad0: 65 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20  e directly from 
1ae0: 61 20 64 65 74 61 63 68 20 73 74 61 74 65 6d 65  a detach stateme
1af0: 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45  nt:.**.**     DE
1b00: 54 41 43 48 20 44 41 54 41 42 41 53 45 20 78 0a  TACH DATABASE x.
1b10: 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  **.**     SELECT
1b20: 20 73 71 6c 69 74 65 5f 64 65 74 61 63 68 28 78   sqlite_detach(x
1b30: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
1b40: 20 64 65 74 61 63 68 46 75 6e 63 28 0a 20 20 73   detachFunc(.  s
1b50: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
1b60: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 4e  context,.  int N
1b70: 6f 74 55 73 65 64 2c 0a 20 20 73 71 6c 69 74 65  otUsed,.  sqlite
1b80: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
1b90: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1ba0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
1bb0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
1bc0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
1bd0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
1be0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
1bf0: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e  xt_db_handle(con
1c00: 74 65 78 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  text);.  int i;.
1c10: 20 20 44 62 20 2a 70 44 62 20 3d 20 30 3b 0a 20    Db *pDb = 0;. 
1c20: 20 63 68 61 72 20 7a 45 72 72 5b 31 32 38 5d 3b   char zErr[128];
1c30: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
1c40: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 0a  ETER(NotUsed);..
1c50: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
1c60: 20 7a 4e 61 6d 65 20 3d 20 22 22 3b 0a 20 20 66   zName = "";.  f
1c70: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1c80: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 44 62  b; i++){.    pDb
1c90: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
1ca0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
1cb0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1cc0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1cd0: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
1ce0: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  e, zName)==0 ) b
1cf0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
1d00: 20 69 3e 3d 64 62 2d 3e 6e 44 62 20 29 7b 0a 20   i>=db->nDb ){. 
1d10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1d20: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 72 29  ntf(sizeof(zErr)
1d30: 2c 7a 45 72 72 2c 20 22 6e 6f 20 73 75 63 68 20  ,zErr, "no such 
1d40: 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
1d50: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
1d60: 64 65 74 61 63 68 5f 65 72 72 6f 72 3b 0a 20 20  detach_error;.  
1d70: 7d 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  }.  if( i<2 ){. 
1d80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1d90: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 72 29  ntf(sizeof(zErr)
1da0: 2c 7a 45 72 72 2c 20 22 63 61 6e 6e 6f 74 20 64  ,zErr, "cannot d
1db0: 65 74 61 63 68 20 64 61 74 61 62 61 73 65 20 25  etach database %
1dc0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
1dd0: 67 6f 74 6f 20 64 65 74 61 63 68 5f 65 72 72 6f  goto detach_erro
1de0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  r;.  }.  if( !db
1df0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
1e00: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1e10: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 72  intf(sizeof(zErr
1e20: 29 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20  ), zErr,.       
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1e40: 61 6e 6e 6f 74 20 44 45 54 41 43 48 20 64 61 74  annot DETACH dat
1e50: 61 62 61 73 65 20 77 69 74 68 69 6e 20 74 72 61  abase within tra
1e60: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
1e70: 67 6f 74 6f 20 64 65 74 61 63 68 5f 65 72 72 6f  goto detach_erro
1e80: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  r;.  }.  if( sql
1e90: 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
1ea0: 64 54 72 61 6e 73 28 70 44 62 2d 3e 70 42 74 29  dTrans(pDb->pBt)
1eb0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
1ec0: 49 73 49 6e 42 61 63 6b 75 70 28 70 44 62 2d 3e  IsInBackup(pDb->
1ed0: 70 42 74 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  pBt) ){.    sqli
1ee0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1ef0: 65 6f 66 28 7a 45 72 72 29 2c 7a 45 72 72 2c 20  eof(zErr),zErr, 
1f00: 22 64 61 74 61 62 61 73 65 20 25 73 20 69 73 20  "database %s is 
1f10: 6c 6f 63 6b 65 64 22 2c 20 7a 4e 61 6d 65 29 3b  locked", zName);
1f20: 0a 20 20 20 20 67 6f 74 6f 20 64 65 74 61 63 68  .    goto detach
1f30: 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 73  _error;.  }..  s
1f40: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
1f50: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 70 44  (pDb->pBt);.  pD
1f60: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 70 44  b->pBt = 0;.  pD
1f70: 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a  b->pSchema = 0;.
1f80: 20 20 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e    sqlite3ResetIn
1f90: 74 65 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c  ternalSchema(db,
1fa0: 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 0a   0);.  return;..
1fb0: 64 65 74 61 63 68 5f 65 72 72 6f 72 3a 0a 20 20  detach_error:.  
1fc0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1fd0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45  rror(context, zE
1fe0: 72 72 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  rr, -1);.}../*.*
1ff0: 2a 20 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  * This procedure
2000: 20 67 65 6e 65 72 61 74 65 73 20 56 44 42 45 20   generates VDBE 
2010: 63 6f 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c  code for a singl
2020: 65 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  e invocation of 
2030: 65 69 74 68 65 72 20 74 68 65 0a 2a 2a 20 73 71  either the.** sq
2040: 6c 69 74 65 5f 64 65 74 61 63 68 28 29 20 6f 72  lite_detach() or
2050: 20 73 71 6c 69 74 65 5f 61 74 74 61 63 68 28 29   sqlite_attach()
2060: 20 53 51 4c 20 75 73 65 72 20 66 75 6e 63 74 69   SQL user functi
2070: 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ons..*/.static v
2080: 6f 69 64 20 63 6f 64 65 41 74 74 61 63 68 28 0a  oid codeAttach(.
2090: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
20b0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
20c0: 20 20 69 6e 74 20 74 79 70 65 2c 20 20 20 20 20    int type,     
20d0: 20 20 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72         /* Either
20e0: 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48 20 6f   SQLITE_ATTACH o
20f0: 72 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 20  r SQLITE_DETACH 
2100: 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 46  */.  FuncDef *pF
2110: 75 6e 63 2c 20 20 20 20 20 20 2f 2a 20 46 75 6e  unc,      /* Fun
2120: 63 44 65 66 20 77 72 61 70 70 65 72 20 66 6f 72  cDef wrapper for
2130: 20 64 65 74 61 63 68 46 75 6e 63 28 29 20 6f 72   detachFunc() or
2140: 20 61 74 74 61 63 68 46 75 6e 63 28 29 20 2a 2f   attachFunc() */
2150: 0a 20 20 45 78 70 72 20 2a 70 41 75 74 68 41 72  .  Expr *pAuthAr
2160: 67 2c 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65  g,      /* Expre
2170: 73 73 69 6f 6e 20 74 6f 20 70 61 73 73 20 74 6f  ssion to pass to
2180: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
2190: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 45 78 70  allback */.  Exp
21a0: 72 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *pFilename,   
21b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61 74    /* Name of dat
21c0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
21d0: 45 78 70 72 20 2a 70 44 62 6e 61 6d 65 2c 20 20  Expr *pDbname,  
21e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
21f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
2200: 75 73 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 2a  use internally *
2210: 2f 0a 20 20 45 78 70 72 20 2a 70 4b 65 79 20 20  /.  Expr *pKey  
2220: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2230: 62 61 73 65 20 6b 65 79 20 66 6f 72 20 65 6e 63  base key for enc
2240: 72 79 70 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f  ryption extensio
2250: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  n */.){.  int rc
2260: 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  ;.  NameContext 
2270: 73 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a 76  sName;.  Vdbe *v
2280: 3b 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 20  ;.  sqlite3* db 
2290: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
22a0: 69 6e 74 20 72 65 67 41 72 67 73 3b 0a 0a 20 20  int regArgs;..  
22b0: 6d 65 6d 73 65 74 28 26 73 4e 61 6d 65 2c 20 30  memset(&sName, 0
22c0: 2c 20 73 69 7a 65 6f 66 28 4e 61 6d 65 43 6f 6e  , sizeof(NameCon
22d0: 74 65 78 74 29 29 3b 0a 20 20 73 4e 61 6d 65 2e  text));.  sName.
22e0: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b  pParse = pParse;
22f0: 0a 0a 20 20 69 66 28 20 0a 20 20 20 20 20 20 53  ..  if( .      S
2300: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2310: 72 65 73 6f 6c 76 65 41 74 74 61 63 68 45 78 70  resolveAttachExp
2320: 72 28 26 73 4e 61 6d 65 2c 20 70 46 69 6c 65 6e  r(&sName, pFilen
2330: 61 6d 65 29 29 20 7c 7c 0a 20 20 20 20 20 20 53  ame)) ||.      S
2340: 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2350: 72 65 73 6f 6c 76 65 41 74 74 61 63 68 45 78 70  resolveAttachExp
2360: 72 28 26 73 4e 61 6d 65 2c 20 70 44 62 6e 61 6d  r(&sName, pDbnam
2370: 65 29 29 20 7c 7c 0a 20 20 20 20 20 20 53 51 4c  e)) ||.      SQL
2380: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
2390: 73 6f 6c 76 65 41 74 74 61 63 68 45 78 70 72 28  solveAttachExpr(
23a0: 26 73 4e 61 6d 65 2c 20 70 4b 65 79 29 29 0a 20  &sName, pKey)). 
23b0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
23c0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  nErr++;.    goto
23d0: 20 61 74 74 61 63 68 5f 65 6e 64 3b 0a 20 20 7d   attach_end;.  }
23e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
23f0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
2400: 49 4f 4e 0a 20 20 69 66 28 20 70 41 75 74 68 41  ION.  if( pAuthA
2410: 72 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  rg ){.    char *
2420: 7a 41 75 74 68 41 72 67 20 3d 20 70 41 75 74 68  zAuthArg = pAuth
2430: 41 72 67 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  Arg->u.zToken;. 
2440: 20 20 20 69 66 28 20 7a 41 75 74 68 41 72 67 3d     if( zAuthArg=
2450: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
2460: 20 61 74 74 61 63 68 5f 65 6e 64 3b 0a 20 20 20   attach_end;.   
2470: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
2480: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
2490: 72 73 65 2c 20 74 79 70 65 2c 20 7a 41 75 74 68  rse, type, zAuth
24a0: 41 72 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Arg, 0, 0);.    
24b0: 69 66 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if(rc!=SQLITE_OK
24c0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61   ){.      goto a
24d0: 74 74 61 63 68 5f 65 6e 64 3b 0a 20 20 20 20 7d  ttach_end;.    }
24e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
24f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
2500: 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 20 20  RIZATION */...  
2510: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
2520: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 72 65  be(pParse);.  re
2530: 67 41 72 67 73 20 3d 20 73 71 6c 69 74 65 33 47  gArgs = sqlite3G
2540: 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  etTempRange(pPar
2550: 73 65 2c 20 34 29 3b 0a 20 20 73 71 6c 69 74 65  se, 4);.  sqlite
2560: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2570: 2c 20 70 46 69 6c 65 6e 61 6d 65 2c 20 72 65 67  , pFilename, reg
2580: 41 72 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  Args);.  sqlite3
2590: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
25a0: 20 70 44 62 6e 61 6d 65 2c 20 72 65 67 41 72 67   pDbname, regArg
25b0: 73 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  s+1);.  sqlite3E
25c0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
25d0: 70 4b 65 79 2c 20 72 65 67 41 72 67 73 2b 32 29  pKey, regArgs+2)
25e0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20 7c  ;..  assert( v |
25f0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2600: 65 64 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  ed );.  if( v ){
2610: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
2620: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e  AddOp3(v, OP_Fun
2630: 63 74 69 6f 6e 2c 20 30 2c 20 72 65 67 41 72 67  ction, 0, regArg
2640: 73 2b 33 2d 70 46 75 6e 63 2d 3e 6e 41 72 67 2c  s+3-pFunc->nArg,
2650: 20 72 65 67 41 72 67 73 2b 33 29 3b 0a 20 20 20   regArgs+3);.   
2660: 20 61 73 73 65 72 74 28 20 70 46 75 6e 63 2d 3e   assert( pFunc->
2670: 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 28 70 46 75  nArg==-1 || (pFu
2680: 6e 63 2d 3e 6e 41 72 67 26 30 78 66 66 29 3d 3d  nc->nArg&0xff)==
2690: 70 46 75 6e 63 2d 3e 6e 41 72 67 20 29 3b 0a 20  pFunc->nArg );. 
26a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
26b0: 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29 28 70  angeP5(v, (u8)(p
26c0: 46 75 6e 63 2d 3e 6e 41 72 67 29 29 3b 0a 20 20  Func->nArg));.  
26d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
26e0: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
26f0: 61 72 20 2a 29 70 46 75 6e 63 2c 20 50 34 5f 46  ar *)pFunc, P4_F
2700: 55 4e 43 44 45 46 29 3b 0a 0a 20 20 20 20 2f 2a  UNCDEF);..    /*
2710: 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
2720: 72 65 2e 20 46 6f 72 20 61 6e 20 41 54 54 41 43  re. For an ATTAC
2730: 48 20 73 74 61 74 65 6d 65 6e 74 2c 20 73 65 74  H statement, set
2740: 20 50 31 20 74 6f 20 74 72 75 65 20 28 65 78 70   P1 to true (exp
2750: 69 72 65 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ire this.    ** 
2760: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 6c 79 29 2e  statement only).
2770: 20 46 6f 72 20 44 45 54 41 43 48 2c 20 73 65 74   For DETACH, set
2780: 20 69 74 20 74 6f 20 66 61 6c 73 65 20 28 65 78   it to false (ex
2790: 70 69 72 65 20 61 6c 6c 20 65 78 69 73 74 69 6e  pire all existin
27a0: 67 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  g.    ** stateme
27b0: 6e 74 73 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nts)..    */.   
27c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27d0: 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c  p1(v, OP_Expire,
27e0: 20 28 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 41   (type==SQLITE_A
27f0: 54 54 41 43 48 29 29 3b 0a 20 20 7d 0a 20 20 0a  TTACH));.  }.  .
2800: 61 74 74 61 63 68 5f 65 6e 64 3a 0a 20 20 73 71  attach_end:.  sq
2810: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
2820: 64 62 2c 20 70 46 69 6c 65 6e 61 6d 65 29 3b 0a  db, pFilename);.
2830: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2840: 65 74 65 28 64 62 2c 20 70 44 62 6e 61 6d 65 29  ete(db, pDbname)
2850: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
2860: 65 6c 65 74 65 28 64 62 2c 20 70 4b 65 79 29 3b  elete(db, pKey);
2870: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64  .}../*.** Called
2880: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
2890: 6f 20 63 6f 6d 70 69 6c 65 20 61 20 44 45 54 41  o compile a DETA
28a0: 43 48 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CH statement..**
28b0: 0a 2a 2a 20 20 20 20 20 44 45 54 41 43 48 20 70  .**     DETACH p
28c0: 44 62 6e 61 6d 65 0a 2a 2f 0a 76 6f 69 64 20 73  Dbname.*/.void s
28d0: 71 6c 69 74 65 33 44 65 74 61 63 68 28 50 61 72  qlite3Detach(Par
28e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
28f0: 20 2a 70 44 62 6e 61 6d 65 29 7b 0a 20 20 73 74   *pDbname){.  st
2900: 61 74 69 63 20 46 75 6e 63 44 65 66 20 64 65 74  atic FuncDef det
2910: 61 63 68 5f 66 75 6e 63 20 3d 20 7b 0a 20 20 20  ach_func = {.   
2920: 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2930: 20 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20     /* nArg */.  
2940: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20    SQLITE_UTF8,  
2950: 20 20 20 20 2f 2a 20 69 50 72 65 66 45 6e 63 20      /* iPrefEnc 
2960: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2970: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
2980: 73 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  s */.    0,     
2990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55             /* pU
29a0: 73 65 72 44 61 74 61 20 2a 2f 0a 20 20 20 20 30  serData */.    0
29b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29c0: 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20   /* pNext */.   
29d0: 20 64 65 74 61 63 68 46 75 6e 63 2c 20 20 20 20   detachFunc,    
29e0: 20 20 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20     /* xFunc */. 
29f0: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2a00: 20 20 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f       /* xStep */
2a10: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2a20: 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c         /* xFinal
2a30: 69 7a 65 20 2a 2f 0a 20 20 20 20 22 73 71 6c 69  ize */.    "sqli
2a40: 74 65 5f 64 65 74 61 63 68 22 2c 20 20 2f 2a 20  te_detach",  /* 
2a50: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 20 20  zName */.    0  
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a70: 2a 20 70 48 61 73 68 20 2a 2f 0a 20 20 7d 3b 0a  * pHash */.  };.
2a80: 20 20 63 6f 64 65 41 74 74 61 63 68 28 70 50 61    codeAttach(pPa
2a90: 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 54 41  rse, SQLITE_DETA
2aa0: 43 48 2c 20 26 64 65 74 61 63 68 5f 66 75 6e 63  CH, &detach_func
2ab0: 2c 20 70 44 62 6e 61 6d 65 2c 20 30 2c 20 30 2c  , pDbname, 0, 0,
2ac0: 20 70 44 62 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a   pDbname);.}../*
2ad0: 0a 2a 2a 20 43 61 6c 6c 65 64 20 62 79 20 74 68  .** Called by th
2ae0: 65 20 70 61 72 73 65 72 20 74 6f 20 63 6f 6d 70  e parser to comp
2af0: 69 6c 65 20 61 6e 20 41 54 54 41 43 48 20 73 74  ile an ATTACH st
2b00: 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20  atement..**.**  
2b10: 20 20 20 41 54 54 41 43 48 20 70 20 41 53 20 70     ATTACH p AS p
2b20: 44 62 6e 61 6d 65 20 4b 45 59 20 70 4b 65 79 0a  Dbname KEY pKey.
2b30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
2b40: 74 74 61 63 68 28 50 61 72 73 65 20 2a 70 50 61  ttach(Parse *pPa
2b50: 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20 45 78  rse, Expr *p, Ex
2b60: 70 72 20 2a 70 44 62 6e 61 6d 65 2c 20 45 78 70  pr *pDbname, Exp
2b70: 72 20 2a 70 4b 65 79 29 7b 0a 20 20 73 74 61 74  r *pKey){.  stat
2b80: 69 63 20 46 75 6e 63 44 65 66 20 61 74 74 61 63  ic FuncDef attac
2b90: 68 5f 66 75 6e 63 20 3d 20 7b 0a 20 20 20 20 33  h_func = {.    3
2ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bb0: 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 20 20   /* nArg */.    
2bc0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20 20  SQLITE_UTF8,    
2bd0: 20 20 2f 2a 20 69 50 72 65 66 45 6e 63 20 2a 2f    /* iPrefEnc */
2be0: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2bf0: 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
2c00: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
2c20: 72 44 61 74 61 20 2a 2f 0a 20 20 20 20 30 2c 20  rData */.    0, 
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c40: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 61  * pNext */.    a
2c50: 74 74 61 63 68 46 75 6e 63 2c 20 20 20 20 20 20  ttachFunc,      
2c60: 20 2f 2a 20 78 46 75 6e 63 20 2a 2f 0a 20 20 20   /* xFunc */.   
2c70: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2c80: 20 20 20 2f 2a 20 78 53 74 65 70 20 2a 2f 0a 20     /* xStep */. 
2c90: 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2ca0: 20 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a       /* xFinaliz
2cb0: 65 20 2a 2f 0a 20 20 20 20 22 73 71 6c 69 74 65  e */.    "sqlite
2cc0: 5f 61 74 74 61 63 68 22 2c 20 20 2f 2a 20 7a 4e  _attach",  /* zN
2cd0: 61 6d 65 20 2a 2f 0a 20 20 20 20 30 20 20 20 20  ame */.    0    
2ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cf0: 70 48 61 73 68 20 2a 2f 0a 20 20 7d 3b 0a 20 20  pHash */.  };.  
2d00: 63 6f 64 65 41 74 74 61 63 68 28 70 50 61 72 73  codeAttach(pPars
2d10: 65 2c 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48  e, SQLITE_ATTACH
2d20: 2c 20 26 61 74 74 61 63 68 5f 66 75 6e 63 2c 20  , &attach_func, 
2d30: 70 2c 20 70 2c 20 70 44 62 6e 61 6d 65 2c 20 70  p, p, pDbname, p
2d40: 4b 65 79 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Key);.}.#endif /
2d50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54  * SQLITE_OMIT_AT
2d60: 54 41 43 48 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  TACH */../*.** I
2d70: 6e 69 74 69 61 6c 69 7a 65 20 61 20 44 62 46 69  nitialize a DbFi
2d80: 78 65 72 20 73 74 72 75 63 74 75 72 65 2e 20 20  xer structure.  
2d90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
2da0: 74 20 62 65 20 63 61 6c 6c 65 64 20 70 72 69 6f  t be called prio
2db0: 72 0a 2a 2a 20 74 6f 20 70 61 73 73 69 6e 67 20  r.** to passing 
2dc0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  the structure to
2dd0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 71 6c 69   one of the sqli
2de0: 74 65 46 69 78 41 41 41 41 28 29 20 72 6f 75 74  teFixAAAA() rout
2df0: 69 6e 65 73 20 62 65 6c 6f 77 2e 0a 2a 2a 0a 2a  ines below..**.*
2e00: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2e10: 75 65 20 69 6e 64 69 63 61 74 65 73 20 77 68 65  ue indicates whe
2e20: 74 68 65 72 20 6f 72 20 6e 6f 74 20 66 69 78 61  ther or not fixa
2e30: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2e40: 2e 20 20 54 52 55 45 0a 2a 2a 20 6d 65 61 6e 73  .  TRUE.** means
2e50: 20 77 65 20 64 6f 20 6e 65 65 64 20 74 6f 20 66   we do need to f
2e60: 69 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ix the database 
2e70: 72 65 66 65 72 65 6e 63 65 73 2c 20 46 41 4c 53  references, FALS
2e80: 45 20 6d 65 61 6e 73 20 77 65 20 64 6f 20 6e 6f  E means we do no
2e90: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2ea0: 33 46 69 78 49 6e 69 74 28 0a 20 20 44 62 46 69  3FixInit(.  DbFi
2eb0: 78 65 72 20 2a 70 46 69 78 2c 20 20 20 20 20 20  xer *pFix,      
2ec0: 2f 2a 20 54 68 65 20 66 69 78 65 72 20 74 6f 20  /* The fixer to 
2ed0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  be initialized *
2ee0: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
2ef0: 65 2c 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72  e,      /* Error
2f00: 20 6d 65 73 73 61 67 65 73 20 77 69 6c 6c 20 62   messages will b
2f10: 65 20 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a  e written here *
2f20: 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
2f30: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
2f40: 69 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  is the database 
2f50: 74 68 61 74 20 6d 75 73 74 20 62 65 20 75 73 65  that must be use
2f60: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
2f70: 72 20 2a 7a 54 79 70 65 2c 20 20 2f 2a 20 22 76  r *zType,  /* "v
2f80: 69 65 77 22 2c 20 22 74 72 69 67 67 65 72 22 2c  iew", "trigger",
2f90: 20 6f 72 20 22 69 6e 64 65 78 22 20 2a 2f 0a 20   or "index" */. 
2fa0: 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20 2a 70 4e   const Token *pN
2fb0: 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  ame  /* Name of 
2fc0: 74 68 65 20 76 69 65 77 2c 20 74 72 69 67 67 65  the view, trigge
2fd0: 72 2c 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 29  r, or index */.)
2fe0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2ff0: 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 69 44  ..  if( NEVER(iD
3000: 62 3c 30 29 20 7c 7c 20 69 44 62 3d 3d 31 20 29  b<0) || iDb==1 )
3010: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 20   return 0;.  db 
3020: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
3030: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3e  assert( db->nDb>
3040: 69 44 62 20 29 3b 0a 20 20 70 46 69 78 2d 3e 70  iDb );.  pFix->p
3050: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
3060: 20 20 70 46 69 78 2d 3e 7a 44 62 20 3d 20 64 62    pFix->zDb = db
3070: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
3080: 3b 0a 20 20 70 46 69 78 2d 3e 7a 54 79 70 65 20  ;.  pFix->zType 
3090: 3d 20 7a 54 79 70 65 3b 0a 20 20 70 46 69 78 2d  = zType;.  pFix-
30a0: 3e 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 3b 0a  >pName = pName;.
30b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
30c0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
30d0: 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
30e0: 65 73 20 77 61 6c 6b 20 74 68 72 6f 75 67 68 20  es walk through 
30f0: 74 68 65 20 70 61 72 73 65 20 74 72 65 65 20 61  the parse tree a
3100: 6e 64 20 61 73 73 69 67 6e 0a 2a 2a 20 61 20 73  nd assign.** a s
3110: 70 65 63 69 66 69 63 20 64 61 74 61 62 61 73 65  pecific database
3120: 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65 20 72 65   to all table re
3130: 66 65 72 65 6e 63 65 73 20 77 68 65 72 65 20 74  ferences where t
3140: 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
3150: 0a 2a 2a 20 77 61 73 20 6c 65 66 74 20 75 6e 73  .** was left uns
3160: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
3170: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
3180: 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69  tement.  The pFi
3190: 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 6d  x structure.** m
31a0: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 69 6e  ust have been in
31b0: 69 74 69 61 6c 69 7a 65 64 20 62 79 20 61 20 70  itialized by a p
31c0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
31d0: 69 74 65 33 46 69 78 49 6e 69 74 28 29 2e 0a 2a  ite3FixInit()..*
31e0: 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
31f0: 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  nes are used to 
3200: 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
3210: 6e 20 69 6e 64 65 78 2c 20 74 72 69 67 67 65 72  n index, trigger
3220: 2c 20 6f 72 0a 2a 2a 20 76 69 65 77 20 69 6e 20  , or.** view in 
3230: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 64 6f 65  one database doe
3240: 73 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 6f  s not refer to o
3250: 62 6a 65 63 74 73 20 69 6e 20 61 20 64 69 66 66  bjects in a diff
3260: 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 2e 0a  erent database..
3270: 2a 2a 20 28 45 78 63 65 70 74 69 6f 6e 3a 20 69  ** (Exception: i
3280: 6e 64 69 63 65 73 2c 20 74 72 69 67 67 65 72 73  ndices, triggers
3290: 2c 20 61 6e 64 20 76 69 65 77 73 20 69 6e 20 74  , and views in t
32a0: 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 65  he TEMP database
32b0: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20   are.** allowed 
32c0: 74 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 74  to refer to anyt
32d0: 68 69 6e 67 2e 29 20 20 49 66 20 61 20 72 65 66  hing.)  If a ref
32e0: 65 72 65 6e 63 65 20 69 73 20 65 78 70 6c 69 63  erence is explic
32f0: 69 74 6c 79 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  itly made.** to 
3300: 61 6e 20 6f 62 6a 65 63 74 20 69 6e 20 61 20 64  an object in a d
3310: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
3320: 65 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  e, an error mess
3330: 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 0a  age is added to.
3340: 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d  ** pParse->zErrM
3350: 73 67 20 61 6e 64 20 74 68 65 73 65 20 72 6f 75  sg and these rou
3360: 74 69 6e 65 73 20 72 65 74 75 72 6e 20 6e 6f 6e  tines return non
3370: 2d 7a 65 72 6f 2e 20 20 49 66 20 65 76 65 72 79  -zero.  If every
3380: 74 68 69 6e 67 0a 2a 2a 20 63 68 65 63 6b 73 20  thing.** checks 
3390: 6f 75 74 2c 20 74 68 65 73 65 20 72 6f 75 74 69  out, these routi
33a0: 6e 65 73 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  nes return 0..*/
33b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 78 53  .int sqlite3FixS
33c0: 72 63 4c 69 73 74 28 0a 20 20 44 62 46 69 78 65  rcList(.  DbFixe
33d0: 72 20 2a 70 46 69 78 2c 20 20 20 20 20 20 20 2f  r *pFix,       /
33e0: 2a 20 43 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  * Context of the
33f0: 20 66 69 78 61 74 69 6f 6e 20 2a 2f 0a 20 20 53   fixation */.  S
3400: 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  rcList *pList   
3410: 20 20 20 20 2f 2a 20 54 68 65 20 53 6f 75 72 63      /* The Sourc
3420: 65 20 6c 69 73 74 20 74 6f 20 63 68 65 63 6b 20  e list to check 
3430: 61 6e 64 20 6d 6f 64 69 66 79 20 2a 2f 0a 29 7b  and modify */.){
3440: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
3450: 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 73  t char *zDb;.  s
3460: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
3470: 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20 20 69 66  em *pItem;..  if
3480: 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30  ( NEVER(pList==0
3490: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
34a0: 7a 44 62 20 3d 20 70 46 69 78 2d 3e 7a 44 62 3b  zDb = pFix->zDb;
34b0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65  .  for(i=0, pIte
34c0: 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
34d0: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
34e0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
34f0: 28 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  ( pItem->zDataba
3500: 73 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  se==0 ){.      p
3510: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
3520: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
3530: 70 28 70 46 69 78 2d 3e 70 50 61 72 73 65 2d 3e  p(pFix->pParse->
3540: 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 7d 65  db, zDb);.    }e
3550: 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53  lse if( sqlite3S
3560: 74 72 49 43 6d 70 28 70 49 74 65 6d 2d 3e 7a 44  trICmp(pItem->zD
3570: 61 74 61 62 61 73 65 2c 7a 44 62 29 21 3d 30 20  atabase,zDb)!=0 
3580: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
3590: 45 72 72 6f 72 4d 73 67 28 70 46 69 78 2d 3e 70  ErrorMsg(pFix->p
35a0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
35b0: 22 25 73 20 25 54 20 63 61 6e 6e 6f 74 20 72 65  "%s %T cannot re
35c0: 66 65 72 65 6e 63 65 20 6f 62 6a 65 63 74 73 20  ference objects 
35d0: 69 6e 20 64 61 74 61 62 61 73 65 20 25 73 22 2c  in database %s",
35e0: 0a 20 20 20 20 20 20 20 20 20 70 46 69 78 2d 3e  .         pFix->
35f0: 7a 54 79 70 65 2c 20 70 46 69 78 2d 3e 70 4e 61  zType, pFix->pNa
3600: 6d 65 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  me, pItem->zData
3610: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 72 65 74  base);.      ret
3620: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 23 69 66  urn 1;.    }.#if
3630: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3640: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
3650: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3660: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20 20 20  MIT_TRIGGER).   
3670: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
3680: 65 6c 65 63 74 28 70 46 69 78 2c 20 70 49 74 65  elect(pFix, pIte
3690: 6d 2d 3e 70 53 65 6c 65 63 74 29 20 29 20 72 65  m->pSelect) ) re
36a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
36b0: 73 71 6c 69 74 65 33 46 69 78 45 78 70 72 28 70  sqlite3FixExpr(p
36c0: 46 69 78 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  Fix, pItem->pOn)
36d0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e   ) return 1;.#en
36e0: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
36f0: 20 30 3b 0a 7d 0a 23 69 66 20 21 64 65 66 69 6e   0;.}.#if !defin
3700: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
3710: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
3720: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
3730: 47 47 45 52 29 0a 69 6e 74 20 73 71 6c 69 74 65  GGER).int sqlite
3740: 33 46 69 78 53 65 6c 65 63 74 28 0a 20 20 44 62  3FixSelect(.  Db
3750: 46 69 78 65 72 20 2a 70 46 69 78 2c 20 20 20 20  Fixer *pFix,    
3760: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 66     /* Context of
3770: 20 74 68 65 20 66 69 78 61 74 69 6f 6e 20 2a 2f   the fixation */
3780: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
3790: 63 74 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  ct      /* The S
37a0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
37b0: 74 6f 20 62 65 20 66 69 78 65 64 20 74 6f 20 6f  to be fixed to o
37c0: 6e 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 29  ne database */.)
37d0: 7b 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65  {.  while( pSele
37e0: 63 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  ct ){.    if( sq
37f0: 6c 69 74 65 33 46 69 78 45 78 70 72 4c 69 73 74  lite3FixExprList
3800: 28 70 46 69 78 2c 20 70 53 65 6c 65 63 74 2d 3e  (pFix, pSelect->
3810: 70 45 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  pEList) ){.     
3820: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
3830: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
3840: 46 69 78 53 72 63 4c 69 73 74 28 70 46 69 78 2c  FixSrcList(pFix,
3850: 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 20   pSelect->pSrc) 
3860: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3870: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
3880: 20 73 71 6c 69 74 65 33 46 69 78 45 78 70 72 28   sqlite3FixExpr(
3890: 70 46 69 78 2c 20 70 53 65 6c 65 63 74 2d 3e 70  pFix, pSelect->p
38a0: 57 68 65 72 65 29 20 29 7b 0a 20 20 20 20 20 20  Where) ){.      
38b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
38c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
38d0: 69 78 45 78 70 72 28 70 46 69 78 2c 20 70 53 65  ixExpr(pFix, pSe
38e0: 6c 65 63 74 2d 3e 70 48 61 76 69 6e 67 29 20 29  lect->pHaving) )
38f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
3900: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c  ;.    }.    pSel
3910: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
3920: 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74  Prior;.  }.  ret
3930: 75 72 6e 20 30 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn 0;.}.int sql
3940: 69 74 65 33 46 69 78 45 78 70 72 28 0a 20 20 44  ite3FixExpr(.  D
3950: 62 46 69 78 65 72 20 2a 70 46 69 78 2c 20 20 20  bFixer *pFix,   
3960: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 66 20    /* Context of 
3970: 74 68 65 20 66 69 78 61 74 69 6f 6e 20 2a 2f 0a  the fixation */.
3980: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
3990: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
39a0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 66 69 78  ession to be fix
39b0: 65 64 20 74 6f 20 6f 6e 65 20 64 61 74 61 62 61  ed to one databa
39c0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65  se */.){.  while
39d0: 28 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 69  ( pExpr ){.    i
39e0: 66 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f  f( ExprHasAnyPro
39f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
3a00: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 20 62 72 65  TokenOnly) ) bre
3a10: 61 6b 3b 0a 20 20 20 20 69 66 28 20 45 78 70 72  ak;.    if( Expr
3a20: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
3a30: 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
3a40: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
3a50: 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28 70  lite3FixSelect(p
3a60: 46 69 78 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53  Fix, pExpr->x.pS
3a70: 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e 20  elect) ) return 
3a80: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
3a90: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
3aa0: 69 78 45 78 70 72 4c 69 73 74 28 70 46 69 78 2c  ixExprList(pFix,
3ab0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29   pExpr->x.pList)
3ac0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
3ad0: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
3ae0: 65 33 46 69 78 45 78 70 72 28 70 46 69 78 2c 20  e3FixExpr(pFix, 
3af0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20 29  pExpr->pRight) )
3b00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
3b10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 45 78 70  ;.    }.    pExp
3b20: 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  r = pExpr->pLeft
3b30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
3b40: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  ;.}.int sqlite3F
3b50: 69 78 45 78 70 72 4c 69 73 74 28 0a 20 20 44 62  ixExprList(.  Db
3b60: 46 69 78 65 72 20 2a 70 46 69 78 2c 20 20 20 20  Fixer *pFix,    
3b70: 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 66 20 74   /* Context of t
3b80: 68 65 20 66 69 78 61 74 69 6f 6e 20 2a 2f 0a 20  he fixation */. 
3b90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
3ba0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
3bb0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 66 69 78 65  ssion to be fixe
3bc0: 64 20 74 6f 20 6f 6e 65 20 64 61 74 61 62 61 73  d to one databas
3bd0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
3be0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
3bf0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
3c00: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
3c10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72   return 0;.  for
3c20: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
3c30: 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
3c40: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
3c50: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
3c60: 69 74 65 33 46 69 78 45 78 70 72 28 70 46 69 78  ite3FixExpr(pFix
3c70: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 20  , pItem->pExpr) 
3c80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3c90: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
3ca0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
3cb0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
3cc0: 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 69  E_OMIT_TRIGGER.i
3cd0: 6e 74 20 73 71 6c 69 74 65 33 46 69 78 54 72 69  nt sqlite3FixTri
3ce0: 67 67 65 72 53 74 65 70 28 0a 20 20 44 62 46 69  ggerStep(.  DbFi
3cf0: 78 65 72 20 2a 70 46 69 78 2c 20 20 20 20 20 2f  xer *pFix,     /
3d00: 2a 20 43 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  * Context of the
3d10: 20 66 69 78 61 74 69 6f 6e 20 2a 2f 0a 20 20 54   fixation */.  T
3d20: 72 69 67 67 65 72 53 74 65 70 20 2a 70 53 74 65  riggerStep *pSte
3d30: 70 20 2f 2a 20 54 68 65 20 74 72 69 67 67 65 72  p /* The trigger
3d40: 20 73 74 65 70 20 62 65 20 66 69 78 65 64 20 74   step be fixed t
3d50: 6f 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 2a  o one database *
3d60: 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 53  /.){.  while( pS
3d70: 74 65 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tep ){.    if( s
3d80: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
3d90: 70 46 69 78 2c 20 70 53 74 65 70 2d 3e 70 53 65  pFix, pStep->pSe
3da0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 72  lect) ){.      r
3db0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
3dc0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
3dd0: 78 45 78 70 72 28 70 46 69 78 2c 20 70 53 74 65  xExpr(pFix, pSte
3de0: 70 2d 3e 70 57 68 65 72 65 29 20 29 7b 0a 20 20  p->pWhere) ){.  
3df0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3e00: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
3e10: 74 65 33 46 69 78 45 78 70 72 4c 69 73 74 28 70  te3FixExprList(p
3e20: 46 69 78 2c 20 70 53 74 65 70 2d 3e 70 45 78 70  Fix, pStep->pExp
3e30: 72 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  rList) ){.      
3e40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3e50: 20 20 20 20 70 53 74 65 70 20 3d 20 70 53 74 65      pStep = pSte
3e60: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
3e70: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
3e80: 69 66 0a                                         if.