/ Hex Artifact Content
Login

Artifact 71f5c886004a9740fc6e6033d4e1ce0517ab6574:


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 36 38 20 32 30 30 38 2f 30  .c,v 1.68 2008/0
01e0: 31 2f 31 32 20 31 39 3a 30 33 3a 34 39 20 64 72  1/12 19:03:49 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 45 78    rc = sqlite3Ex
0520: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 70  prResolveNames(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 54 5c 22 22 2c 20 26 70 45 78 70 72 2d  \"%T\"", &pExpr-
05c0: 3e 73 70 61 6e 29 3b 0a 20 20 20 20 20 20 20 20  >span);.        
05d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
05e0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
05f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45   }else{.      pE
0600: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52  xpr->op = TK_STR
0610: 49 4e 47 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ING;.    }.  }. 
0620: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
0630: 2a 0a 2a 2a 20 41 6e 20 53 51 4c 20 75 73 65 72  *.** An SQL user
0640: 2d 66 75 6e 63 74 69 6f 6e 20 72 65 67 69 73 74  -function regist
0650: 65 72 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77  ered to do the w
0660: 6f 72 6b 20 6f 66 20 61 6e 20 41 54 54 41 43 48  ork of an ATTACH
0670: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 65 0a   statement. The.
0680: 2a 2a 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e  ** three argumen
0690: 74 73 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ts to the functi
06a0: 6f 6e 20 63 6f 6d 65 20 64 69 72 65 63 74 6c 79  on come directly
06b0: 20 66 72 6f 6d 20 61 6e 20 61 74 74 61 63 68 20   from an attach 
06c0: 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a  statement:.**.**
06d0: 20 20 20 20 20 41 54 54 41 43 48 20 44 41 54 41       ATTACH DATA
06e0: 42 41 53 45 20 78 20 41 53 20 79 20 4b 45 59 20  BASE x AS y KEY 
06f0: 7a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  z.**.**     SELE
0700: 43 54 20 73 71 6c 69 74 65 5f 61 74 74 61 63 68  CT sqlite_attach
0710: 28 78 2c 20 79 2c 20 7a 29 0a 2a 2a 0a 2a 2a 20  (x, y, z).**.** 
0720: 49 66 20 74 68 65 20 6f 70 74 69 6f 6e 61 6c 20  If the optional 
0730: 22 4b 45 59 20 7a 22 20 73 79 6e 74 61 78 20 69  "KEY z" syntax i
0740: 73 20 6f 6d 69 74 74 65 64 2c 20 61 6e 20 53 51  s omitted, an SQ
0750: 4c 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  L NULL is passed
0760: 20 61 73 20 74 68 65 0a 2a 2a 20 74 68 69 72 64   as the.** third
0770: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
0780: 61 74 69 63 20 76 6f 69 64 20 61 74 74 61 63 68  atic void attach
0790: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
07a0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
07b0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
07c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
07d0: 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  argv.){.  int i;
07e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
07f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
0800: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
0810: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 6f 6e  (context);.  con
0820: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
0830: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
0840: 69 6c 65 3b 0a 20 20 44 62 20 2a 61 4e 65 77 3b  ile;.  Db *aNew;
0850: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 44 79 6e  .  char *zErrDyn
0860: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 45 72   = 0;.  char zEr
0870: 72 5b 31 32 38 5d 3b 0a 0a 20 20 7a 46 69 6c 65  r[128];..  zFile
0880: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
0890: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
08a0: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
08b0: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
08c0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61  har *)sqlite3_va
08d0: 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d  lue_text(argv[1]
08e0: 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d  );.  if( zFile==
08f0: 30 20 29 20 7a 46 69 6c 65 20 3d 20 22 22 3b 0a  0 ) zFile = "";.
0900: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
0910: 20 7a 4e 61 6d 65 20 3d 20 22 22 3b 0a 0a 20 20   zName = "";..  
0920: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 74 68 65  /* Check for the
0930: 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72   following error
0940: 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  s:.  **.  **    
0950: 20 2a 20 54 6f 6f 20 6d 61 6e 79 20 61 74 74 61   * Too many atta
0960: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c 0a  ched databases,.
0970: 20 20 2a 2a 20 20 20 20 20 2a 20 54 72 61 6e 73    **     * Trans
0980: 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
0990: 20 6f 70 65 6e 0a 20 20 2a 2a 20 20 20 20 20 2a   open.  **     *
09a0: 20 53 70 65 63 69 66 69 65 64 20 64 61 74 61 62   Specified datab
09b0: 61 73 65 20 6e 61 6d 65 20 61 6c 72 65 61 64 79  ase name already
09c0: 20 62 65 69 6e 67 20 75 73 65 64 2e 0a 20 20 2a   being used..  *
09d0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3e  /.  if( db->nDb>
09e0: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
09f0: 43 48 45 44 2b 32 20 29 7b 0a 20 20 20 20 73 71  CHED+2 ){.    sq
0a00: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 0a  lite3_snprintf(.
0a10: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 7a 45 72        sizeof(zEr
0a20: 72 29 2c 20 7a 45 72 72 2c 20 22 74 6f 6f 20 6d  r), zErr, "too m
0a30: 61 6e 79 20 61 74 74 61 63 68 65 64 20 64 61 74  any attached dat
0a40: 61 62 61 73 65 73 20 2d 20 6d 61 78 20 25 64 22  abases - max %d"
0a50: 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
0a60: 4d 41 58 5f 41 54 54 41 43 48 45 44 0a 20 20 20  MAX_ATTACHED.   
0a70: 20 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 74 74   );.    goto att
0a80: 61 63 68 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ach_error;.  }. 
0a90: 20 69 66 28 20 21 64 62 2d 3e 61 75 74 6f 43 6f   if( !db->autoCo
0aa0: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
0ab0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
0ac0: 65 6f 66 28 7a 45 72 72 29 2c 20 7a 45 72 72 2c  eof(zErr), zErr,
0ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ae0: 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 41 54        "cannot AT
0af0: 54 41 43 48 20 64 61 74 61 62 61 73 65 20 77 69  TACH database wi
0b00: 74 68 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  thin transaction
0b10: 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 61 74 74  ");.    goto att
0b20: 61 63 68 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  ach_error;.  }. 
0b30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
0b40: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  nDb; i++){.    c
0b50: 68 61 72 20 2a 7a 20 3d 20 64 62 2d 3e 61 44 62  har *z = db->aDb
0b60: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  [i].zName;.    i
0b70: 66 28 20 7a 20 26 26 20 7a 4e 61 6d 65 20 26 26  f( z && zName &&
0b80: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
0b90: 7a 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  z, zName)==0 ){.
0ba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
0bb0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45  printf(sizeof(zE
0bc0: 72 72 29 2c 20 7a 45 72 72 2c 20 0a 20 20 20 20  rr), zErr, .    
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 22 64 61 74 61 62 61 73 65 20 25 73 20     "database %s 
0bf0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73  is already in us
0c00: 65 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  e", zName);.    
0c10: 20 20 67 6f 74 6f 20 61 74 74 61 63 68 5f 65 72    goto attach_er
0c20: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
0c30: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
0c40: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 74  e new entry in t
0c50: 68 65 20 64 62 2d 3e 61 44 62 5b 5d 20 61 72 72  he db->aDb[] arr
0c60: 61 79 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 73  ay and initialis
0c70: 65 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 2a  e the schema.  *
0c80: 2a 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a 20  * hash tables.. 
0c90: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44   */.  if( db->aD
0ca0: 62 3d 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63  b==db->aDbStatic
0cb0: 20 29 7b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73   ){.    aNew = s
0cc0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
0cd0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
0ce0: 29 2a 33 20 29 3b 0a 20 20 20 20 69 66 28 20 61  )*3 );.    if( a
0cf0: 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
0d00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
0d10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75   = 1;.      retu
0d20: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  rn;.    }.    me
0d30: 6d 63 70 79 28 61 4e 65 77 2c 20 64 62 2d 3e 61  mcpy(aNew, db->a
0d40: 44 62 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  Db, sizeof(db->a
0d50: 44 62 5b 30 5d 29 2a 32 29 3b 0a 20 20 7d 65 6c  Db[0])*2);.  }el
0d60: 73 65 7b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73  se{.    aNew = s
0d70: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 64  qlite3_realloc(d
0d80: 62 2d 3e 61 44 62 2c 20 73 69 7a 65 6f 66 28 64  b->aDb, sizeof(d
0d90: 62 2d 3e 61 44 62 5b 30 5d 29 2a 28 64 62 2d 3e  b->aDb[0])*(db->
0da0: 6e 44 62 2b 31 29 20 29 3b 0a 20 20 20 20 69 66  nDb+1) );.    if
0db0: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
0dc0: 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
0dd0: 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  led = 1;.      r
0de0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 20 0a 20 20  eturn;.    } .  
0df0: 7d 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 61 4e  }.  db->aDb = aN
0e00: 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 26 64 62  ew;.  aNew = &db
0e10: 2d 3e 61 44 62 5b 64 62 2d 3e 6e 44 62 2b 2b 5d  ->aDb[db->nDb++]
0e20: 3b 0a 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c  ;.  memset(aNew,
0e30: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 61 4e 65 77   0, sizeof(*aNew
0e40: 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  ));..  /* Open t
0e50: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0e60: 2e 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  . If the btree i
0e70: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
0e80: 70 65 6e 65 64 2c 20 75 73 65 0a 20 20 2a 2a 20  pened, use.  ** 
0e90: 69 74 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  it to obtain the
0ea0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
0eb0: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
0ec0: 74 68 65 20 73 63 68 65 6d 61 20 6d 61 79 0a 20  the schema may. 
0ed0: 20 2a 2a 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62   ** or may not b
0ee0: 65 20 69 6e 69 74 69 61 6c 69 73 65 64 2e 0a 20  e initialised.. 
0ef0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
0f00: 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28 64  e3BtreeFactory(d
0f10: 62 2c 20 7a 46 69 6c 65 2c 20 30 2c 20 53 51 4c  b, zFile, 0, SQL
0f20: 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
0f30: 45 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  E_SIZE,.        
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73     db->openFlags
0f60: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
0f70: 41 49 4e 5f 44 42 2c 0a 20 20 20 20 20 20 20 20  AIN_DB,.        
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f90: 20 20 20 26 61 4e 65 77 2d 3e 70 42 74 29 3b 0a     &aNew->pBt);.
0fa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
0fb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 4e 65 77 2d  _OK ){.    aNew-
0fc0: 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  >pSchema = sqlit
0fd0: 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
0fe0: 61 4e 65 77 2d 3e 70 42 74 29 3b 0a 20 20 20 20  aNew->pBt);.    
0ff0: 69 66 28 20 21 61 4e 65 77 2d 3e 70 53 63 68 65  if( !aNew->pSche
1000: 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ma ){.      rc =
1010: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1020: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 4e 65     }else if( aNe
1030: 77 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65  w->pSchema->file
1040: 5f 66 6f 72 6d 61 74 20 26 26 20 61 4e 65 77 2d  _format && aNew-
1050: 3e 70 53 63 68 65 6d 61 2d 3e 65 6e 63 21 3d 45  >pSchema->enc!=E
1060: 4e 43 28 64 62 29 20 29 7b 0a 20 20 20 20 20 20  NC(db) ){.      
1070: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1080: 28 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20 7a  (sizeof(zErr), z
1090: 45 72 72 2c 20 0a 20 20 20 20 20 20 20 20 22 61  Err, .        "a
10a0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
10b0: 73 20 6d 75 73 74 20 75 73 65 20 74 68 65 20 73  s must use the s
10c0: 61 6d 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ame text encodin
10d0: 67 20 61 73 20 6d 61 69 6e 20 64 61 74 61 62 61  g as main databa
10e0: 73 65 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  se");.      goto
10f0: 20 61 74 74 61 63 68 5f 65 72 72 6f 72 3b 0a 20   attach_error;. 
1100: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1110: 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65  PagerLockingMode
1120: 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1130: 65 72 28 61 4e 65 77 2d 3e 70 42 74 29 2c 20 64  er(aNew->pBt), d
1140: 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 29  b->dfltLockMode)
1150: 3b 0a 20 20 7d 0a 20 20 61 4e 65 77 2d 3e 7a 4e  ;.  }.  aNew->zN
1160: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
1170: 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d 65 29  trDup(db, zName)
1180: 3b 0a 20 20 61 4e 65 77 2d 3e 73 61 66 65 74 79  ;.  aNew->safety
1190: 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 0a 23 69 66  _level = 3;..#if
11a0: 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
11b0: 43 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  C.  {.    extern
11c0: 20 69 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65   int sqlite3Code
11d0: 63 41 74 74 61 63 68 28 73 71 6c 69 74 65 33 2a  cAttach(sqlite3*
11e0: 2c 20 69 6e 74 2c 20 63 6f 6e 73 74 20 76 6f 69  , int, const voi
11f0: 64 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 65 78  d*, int);.    ex
1200: 74 65 72 6e 20 76 6f 69 64 20 73 71 6c 69 74 65  tern void sqlite
1210: 33 43 6f 64 65 63 47 65 74 4b 65 79 28 73 71 6c  3CodecGetKey(sql
1220: 69 74 65 33 2a 2c 20 69 6e 74 2c 20 76 6f 69 64  ite3*, int, void
1230: 2a 2a 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 69  **, int*);.    i
1240: 6e 74 20 6e 4b 65 79 3b 0a 20 20 20 20 63 68 61  nt nKey;.    cha
1250: 72 20 2a 7a 4b 65 79 3b 0a 20 20 20 20 69 6e 74  r *zKey;.    int
1260: 20 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   t = sqlite3_val
1270: 75 65 5f 74 79 70 65 28 61 72 67 76 5b 32 5d 29  ue_type(argv[2])
1280: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 74 20  ;.    switch( t 
1290: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ){.      case SQ
12a0: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 0a 20 20  LITE_INTEGER:.  
12b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
12c0: 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 7a  FLOAT:.        z
12d0: 45 72 72 44 79 6e 20 3d 20 73 71 6c 69 74 65 33  ErrDyn = sqlite3
12e0: 44 62 53 74 72 44 75 70 28 64 62 2c 20 22 49 6e  DbStrDup(db, "In
12f0: 76 61 6c 69 64 20 6b 65 79 20 76 61 6c 75 65 22  valid key value"
1300: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1310: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1330: 20 20 20 20 20 0a 20 20 20 20 20 20 63 61 73 65       .      case
1340: 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20 20   SQLITE_TEXT:.  
1350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1360: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 20 20 6e 4b  BLOB:.        nK
1370: 65 79 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ey = sqlite3_val
1380: 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b 32 5d  ue_bytes(argv[2]
1390: 29 3b 0a 20 20 20 20 20 20 20 20 7a 4b 65 79 20  );.        zKey 
13a0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
13b0: 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67  3_value_blob(arg
13c0: 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  v[2]);.        s
13d0: 71 6c 69 74 65 33 43 6f 64 65 63 41 74 74 61 63  qlite3CodecAttac
13e0: 68 28 64 62 2c 20 64 62 2d 3e 6e 44 62 2d 31 2c  h(db, db->nDb-1,
13f0: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   zKey, nKey);.  
1400: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1410: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1420: 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20 20 2f 2a  NULL:.        /*
1430: 20 4e 6f 20 6b 65 79 20 73 70 65 63 69 66 69 65   No key specifie
1440: 64 2e 20 20 55 73 65 20 74 68 65 20 6b 65 79 20  d.  Use the key 
1450: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61  from the main da
1460: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
1470: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 63 47 65    sqlite3CodecGe
1480: 74 4b 65 79 28 64 62 2c 20 30 2c 20 28 76 6f 69  tKey(db, 0, (voi
1490: 64 2a 2a 29 26 7a 4b 65 79 2c 20 26 6e 4b 65 79  d**)&zKey, &nKey
14a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
14b0: 65 33 43 6f 64 65 63 41 74 74 61 63 68 28 64 62  e3CodecAttach(db
14c0: 2c 20 64 62 2d 3e 6e 44 62 2d 31 2c 20 7a 4b 65  , db->nDb-1, zKe
14d0: 79 2c 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20  y, nKey);.      
14e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
14f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1500: 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
1510: 6f 70 65 6e 65 64 20 73 75 63 63 65 73 73 66 75  opened successfu
1520: 6c 6c 79 2c 20 72 65 61 64 20 74 68 65 20 73 63  lly, read the sc
1530: 68 65 6d 61 20 66 6f 72 20 74 68 65 20 6e 65 77  hema for the new
1540: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2a 20   database..  ** 
1550: 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20 6f  If this fails, o
1560: 72 20 69 66 20 6f 70 65 6e 69 6e 67 20 74 68 65  r if opening the
1570: 20 66 69 6c 65 20 66 61 69 6c 65 64 2c 20 74 68   file failed, th
1580: 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  en close the fil
1590: 65 20 61 6e 64 20 0a 20 20 2a 2a 20 72 65 6d 6f  e and .  ** remo
15a0: 76 65 20 74 68 65 20 65 6e 74 72 79 20 66 72 6f  ve the entry fro
15b0: 6d 20 74 68 65 20 64 62 2d 3e 61 44 62 5b 5d 20  m the db->aDb[] 
15c0: 61 72 72 61 79 2e 20 69 2e 65 2e 20 70 75 74 20  array. i.e. put 
15d0: 65 76 65 72 79 74 68 69 6e 67 20 62 61 63 6b 20  everything back 
15e0: 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 77 65 20  the way.  ** we 
15f0: 66 6f 75 6e 64 20 69 74 2e 0a 20 20 2a 2f 0a 20  found it..  */. 
1600: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1610: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
1620: 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20  3SafetyOn(db);. 
1630: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1640: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 20  nterAll(db);.   
1650: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69   rc = sqlite3Ini
1660: 74 28 64 62 2c 20 26 7a 45 72 72 44 79 6e 29 3b  t(db, &zErrDyn);
1670: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1680: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
1690: 20 20 20 73 71 6c 69 74 65 33 53 61 66 65 74 79     sqlite3Safety
16a0: 4f 66 66 28 64 62 29 3b 0a 20 20 7d 0a 20 20 69  Off(db);.  }.  i
16b0: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 6e 74  f( rc ){.    int
16c0: 20 69 44 62 20 3d 20 64 62 2d 3e 6e 44 62 20 2d   iDb = db->nDb -
16d0: 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   1;.    assert( 
16e0: 69 44 62 3e 3d 32 20 29 3b 0a 20 20 20 20 69 66  iDb>=2 );.    if
16f0: 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
1700: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
1710: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 64 62  te3BtreeClose(db
1720: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 29 3b  ->aDb[iDb].pBt);
1730: 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69  .      db->aDb[i
1740: 44 62 5d 2e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db].pBt = 0;.   
1750: 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
1760: 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20  pSchema = 0;.   
1770: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65   }.    sqlite3Re
1780: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
1790: 61 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 64 62  a(db, 0);.    db
17a0: 2d 3e 6e 44 62 20 3d 20 69 44 62 3b 0a 20 20 20  ->nDb = iDb;.   
17b0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17c0: 4e 4f 4d 45 4d 20 7c 7c 20 72 63 3d 3d 53 51 4c  NOMEM || rc==SQL
17d0: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
17e0: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  ){.      db->mal
17f0: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
1800: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
1810: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72  rintf(sizeof(zEr
1820: 72 29 2c 7a 45 72 72 2c 20 22 6f 75 74 20 6f 66  r),zErr, "out of
1830: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 7d   memory");.    }
1840: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
1850: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1860: 65 6f 66 28 7a 45 72 72 29 2c 7a 45 72 72 2c 20  eof(zErr),zErr, 
1870: 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1880: 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
1890: 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
18a0: 20 67 6f 74 6f 20 61 74 74 61 63 68 5f 65 72 72   goto attach_err
18b0: 6f 72 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74  or;.  }.  .  ret
18c0: 75 72 6e 3b 0a 0a 61 74 74 61 63 68 5f 65 72 72  urn;..attach_err
18d0: 6f 72 3a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  or:.  /* Return 
18e0: 61 6e 20 65 72 72 6f 72 20 69 66 20 77 65 20 67  an error if we g
18f0: 65 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 66 28  et here */.  if(
1900: 20 7a 45 72 72 44 79 6e 20 29 7b 0a 20 20 20 20   zErrDyn ){.    
1910: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
1920: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45  rror(context, zE
1930: 72 72 44 79 6e 2c 20 2d 31 29 3b 0a 20 20 20 20  rrDyn, -1);.    
1940: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
1950: 72 44 79 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rDyn);.  }else{.
1960: 20 20 20 20 7a 45 72 72 5b 73 69 7a 65 6f 66 28      zErr[sizeof(
1970: 7a 45 72 72 29 2d 31 5d 20 3d 20 30 3b 0a 20 20  zErr)-1] = 0;.  
1980: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1990: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
19a0: 7a 45 72 72 2c 20 2d 31 29 3b 0a 20 20 7d 0a 7d  zErr, -1);.  }.}
19b0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 53 51 4c 20 75  ../*.** An SQL u
19c0: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 67  ser-function reg
19d0: 69 73 74 65 72 65 64 20 74 6f 20 64 6f 20 74 68  istered to do th
19e0: 65 20 77 6f 72 6b 20 6f 66 20 61 6e 20 44 45 54  e work of an DET
19f0: 41 43 48 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ACH statement. T
1a00: 68 65 0a 2a 2a 20 74 68 72 65 65 20 61 72 67 75  he.** three argu
1a10: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
1a20: 63 74 69 6f 6e 20 63 6f 6d 65 20 64 69 72 65 63  ction come direc
1a30: 74 6c 79 20 66 72 6f 6d 20 61 20 64 65 74 61 63  tly from a detac
1a40: 68 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a  h statement:.**.
1a50: 2a 2a 20 20 20 20 20 44 45 54 41 43 48 20 44 41  **     DETACH DA
1a60: 54 41 42 41 53 45 20 78 0a 2a 2a 0a 2a 2a 20 20  TABASE x.**.**  
1a70: 20 20 20 53 45 4c 45 43 54 20 73 71 6c 69 74 65     SELECT sqlite
1a80: 5f 64 65 74 61 63 68 28 78 29 0a 2a 2f 0a 73 74  _detach(x).*/.st
1a90: 61 74 69 63 20 76 6f 69 64 20 64 65 74 61 63 68  atic void detach
1aa0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1ab0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1ac0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1ad0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1ae0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
1af0: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
1b00: 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
1b10: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1b20: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69 74  rgv[0]);.  sqlit
1b30: 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33  e3 *db = sqlite3
1b40: 5f 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65  _user_data(conte
1b50: 78 74 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  xt);.  int i;.  
1b60: 44 62 20 2a 70 44 62 20 3d 20 30 3b 0a 20 20 63  Db *pDb = 0;.  c
1b70: 68 61 72 20 7a 45 72 72 5b 31 32 38 5d 3b 0a 0a  har zErr[128];..
1b80: 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
1b90: 20 7a 4e 61 6d 65 20 3d 20 22 22 3b 0a 20 20 66   zName = "";.  f
1ba0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
1bb0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 44 62  b; i++){.    pDb
1bc0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
1bd0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
1be0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1bf0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1c00: 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d  trICmp(pDb->zNam
1c10: 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  e, zName)==0 ) b
1c20: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
1c30: 20 69 3e 3d 64 62 2d 3e 6e 44 62 20 29 7b 0a 20   i>=db->nDb ){. 
1c40: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1c50: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 72 29  ntf(sizeof(zErr)
1c60: 2c 7a 45 72 72 2c 20 22 6e 6f 20 73 75 63 68 20  ,zErr, "no such 
1c70: 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
1c80: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
1c90: 64 65 74 61 63 68 5f 65 72 72 6f 72 3b 0a 20 20  detach_error;.  
1ca0: 7d 0a 20 20 69 66 28 20 69 3c 32 20 29 7b 0a 20  }.  if( i<2 ){. 
1cb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1cc0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 72 29  ntf(sizeof(zErr)
1cd0: 2c 7a 45 72 72 2c 20 22 63 61 6e 6e 6f 74 20 64  ,zErr, "cannot d
1ce0: 65 74 61 63 68 20 64 61 74 61 62 61 73 65 20 25  etach database %
1cf0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
1d00: 67 6f 74 6f 20 64 65 74 61 63 68 5f 65 72 72 6f  goto detach_erro
1d10: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  r;.  }.  if( !db
1d20: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
1d30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1d40: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 72  intf(sizeof(zErr
1d50: 29 2c 20 7a 45 72 72 2c 0a 20 20 20 20 20 20 20  ), zErr,.       
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1d70: 61 6e 6e 6f 74 20 44 45 54 41 43 48 20 64 61 74  annot DETACH dat
1d80: 61 62 61 73 65 20 77 69 74 68 69 6e 20 74 72 61  abase within tra
1d90: 6e 73 61 63 74 69 6f 6e 22 29 3b 0a 20 20 20 20  nsaction");.    
1da0: 67 6f 74 6f 20 64 65 74 61 63 68 5f 65 72 72 6f  goto detach_erro
1db0: 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  r;.  }.  if( sql
1dc0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61  ite3BtreeIsInRea
1dd0: 64 54 72 61 6e 73 28 70 44 62 2d 3e 70 42 74 29  dTrans(pDb->pBt)
1de0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1df0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1e00: 7a 45 72 72 29 2c 7a 45 72 72 2c 20 22 64 61 74  zErr),zErr, "dat
1e10: 61 62 61 73 65 20 25 73 20 69 73 20 6c 6f 63 6b  abase %s is lock
1e20: 65 64 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ed", zName);.   
1e30: 20 67 6f 74 6f 20 64 65 74 61 63 68 5f 65 72 72   goto detach_err
1e40: 6f 72 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  or;.  }..  sqlit
1e50: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
1e60: 2d 3e 70 42 74 29 3b 0a 20 20 70 44 62 2d 3e 70  ->pBt);.  pDb->p
1e70: 42 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 70  Bt = 0;.  pDb->p
1e80: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 73 71  Schema = 0;.  sq
1e90: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
1ea0: 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b  alSchema(db, 0);
1eb0: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 64 65 74 61  .  return;..deta
1ec0: 63 68 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69  ch_error:.  sqli
1ed0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1ee0: 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20  (context, zErr, 
1ef0: 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  -1);.}../*.** Th
1f00: 69 73 20 70 72 6f 63 65 64 75 72 65 20 67 65 6e  is procedure gen
1f10: 65 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65  erates VDBE code
1f20: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 69 6e   for a single in
1f30: 76 6f 63 61 74 69 6f 6e 20 6f 66 20 65 69 74 68  vocation of eith
1f40: 65 72 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  er the.** sqlite
1f50: 5f 64 65 74 61 63 68 28 29 20 6f 72 20 73 71 6c  _detach() or sql
1f60: 69 74 65 5f 61 74 74 61 63 68 28 29 20 53 51 4c  ite_attach() SQL
1f70: 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e   user functions.
1f80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f90: 63 6f 64 65 41 74 74 61 63 68 28 0a 20 20 50 61  codeAttach(.  Pa
1fa0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1fb0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
1fc0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
1fd0: 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  t type,         
1fe0: 20 20 20 2f 2a 20 45 69 74 68 65 72 20 53 51 4c     /* Either SQL
1ff0: 49 54 45 5f 41 54 54 41 43 48 20 6f 72 20 53 51  ITE_ATTACH or SQ
2000: 4c 49 54 45 5f 44 45 54 41 43 48 20 2a 2f 0a 20  LITE_DETACH */. 
2010: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
2020: 6e 63 2c 20 20 20 2f 2a 20 45 69 74 68 65 72 20  nc,   /* Either 
2030: 22 73 71 6c 69 74 65 5f 61 74 74 61 63 68 22 20  "sqlite_attach" 
2040: 6f 72 20 22 73 71 6c 69 74 65 5f 64 65 74 61 63  or "sqlite_detac
2050: 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6e 63  h */.  int nFunc
2060: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
2070: 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 74 6f  umber of args to
2080: 20 70 61 73 73 20 74 6f 20 7a 46 75 6e 63 20 2a   pass to zFunc *
2090: 2f 0a 20 20 45 78 70 72 20 2a 70 41 75 74 68 41  /.  Expr *pAuthA
20a0: 72 67 2c 20 20 20 20 20 20 2f 2a 20 45 78 70 72  rg,      /* Expr
20b0: 65 73 73 69 6f 6e 20 74 6f 20 70 61 73 73 20 74  ession to pass t
20c0: 6f 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  o authorization 
20d0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 45 78  callback */.  Ex
20e0: 70 72 20 2a 70 46 69 6c 65 6e 61 6d 65 2c 20 20  pr *pFilename,  
20f0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 64 61     /* Name of da
2100: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2110: 20 45 78 70 72 20 2a 70 44 62 6e 61 6d 65 2c 20   Expr *pDbname, 
2120: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2130: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
2140: 20 75 73 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20   use internally 
2150: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4b 65 79 20  */.  Expr *pKey 
2160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
2170: 61 62 61 73 65 20 6b 65 79 20 66 6f 72 20 65 6e  abase key for en
2180: 63 72 79 70 74 69 6f 6e 20 65 78 74 65 6e 73 69  cryption extensi
2190: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  on */.){.  int r
21a0: 63 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  c;.  NameContext
21b0: 20 73 4e 61 6d 65 3b 0a 20 20 56 64 62 65 20 2a   sName;.  Vdbe *
21c0: 76 3b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 46  v;.  FuncDef *pF
21d0: 75 6e 63 3b 0a 20 20 73 71 6c 69 74 65 33 2a 20  unc;.  sqlite3* 
21e0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
21f0: 0a 20 20 69 6e 74 20 72 65 67 41 72 67 73 3b 0a  .  int regArgs;.
2200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2210: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
2220: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d  ON.  assert( db-
2230: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
2240: 20 70 41 75 74 68 41 72 67 20 29 3b 0a 20 20 69   pAuthArg );.  i
2250: 66 28 20 70 41 75 74 68 41 72 67 20 29 7b 0a 20  f( pAuthArg ){. 
2260: 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 41 72     char *zAuthAr
2270: 67 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  g = sqlite3NameF
2280: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 26 70 41  romToken(db, &pA
2290: 75 74 68 41 72 67 2d 3e 73 70 61 6e 29 3b 0a 20  uthArg->span);. 
22a0: 20 20 20 69 66 28 20 21 7a 41 75 74 68 41 72 67     if( !zAuthArg
22b0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61   ){.      goto a
22c0: 74 74 61 63 68 5f 65 6e 64 3b 0a 20 20 20 20 7d  ttach_end;.    }
22d0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
22e0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
22f0: 65 2c 20 74 79 70 65 2c 20 7a 41 75 74 68 41 72  e, type, zAuthAr
2300: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  g, 0, 0);.    sq
2310: 6c 69 74 65 33 5f 66 72 65 65 28 7a 41 75 74 68  lite3_free(zAuth
2320: 41 72 67 29 3b 0a 20 20 20 20 69 66 28 72 63 21  Arg);.    if(rc!
2330: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2340: 20 20 20 20 67 6f 74 6f 20 61 74 74 61 63 68 5f      goto attach_
2350: 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  end;.    }.  }.#
2360: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2370: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
2380: 4f 4e 20 2a 2f 0a 0a 20 20 6d 65 6d 73 65 74 28  ON */..  memset(
2390: 26 73 4e 61 6d 65 2c 20 30 2c 20 73 69 7a 65 6f  &sName, 0, sizeo
23a0: 66 28 4e 61 6d 65 43 6f 6e 74 65 78 74 29 29 3b  f(NameContext));
23b0: 0a 20 20 73 4e 61 6d 65 2e 70 50 61 72 73 65 20  .  sName.pParse 
23c0: 3d 20 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  = pParse;..  if(
23d0: 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f   .      SQLITE_O
23e0: 4b 21 3d 28 72 63 20 3d 20 72 65 73 6f 6c 76 65  K!=(rc = resolve
23f0: 41 74 74 61 63 68 45 78 70 72 28 26 73 4e 61 6d  AttachExpr(&sNam
2400: 65 2c 20 70 46 69 6c 65 6e 61 6d 65 29 29 20 7c  e, pFilename)) |
2410: 7c 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f  |.      SQLITE_O
2420: 4b 21 3d 28 72 63 20 3d 20 72 65 73 6f 6c 76 65  K!=(rc = resolve
2430: 41 74 74 61 63 68 45 78 70 72 28 26 73 4e 61 6d  AttachExpr(&sNam
2440: 65 2c 20 70 44 62 6e 61 6d 65 29 29 20 7c 7c 0a  e, pDbname)) ||.
2450: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21        SQLITE_OK!
2460: 3d 28 72 63 20 3d 20 72 65 73 6f 6c 76 65 41 74  =(rc = resolveAt
2470: 74 61 63 68 45 78 70 72 28 26 73 4e 61 6d 65 2c  tachExpr(&sName,
2480: 20 70 4b 65 79 29 29 0a 20 20 29 7b 0a 20 20 20   pKey)).  ){.   
2490: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
24a0: 0a 20 20 20 20 67 6f 74 6f 20 61 74 74 61 63 68  .    goto attach
24b0: 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  _end;.  }..  v =
24c0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
24d0: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 41 72  pParse);.  regAr
24e0: 67 73 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  gs = sqlite3GetT
24f0: 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c  empRange(pParse,
2500: 20 6e 46 75 6e 63 29 3b 0a 20 20 73 71 6c 69 74   nFunc);.  sqlit
2510: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2520: 65 2c 20 70 46 69 6c 65 6e 61 6d 65 2c 20 72 65  e, pFilename, re
2530: 67 41 72 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  gArgs);.  sqlite
2540: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2550: 2c 20 70 44 62 6e 61 6d 65 2c 20 72 65 67 41 72  , pDbname, regAr
2560: 67 73 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  gs+1);.  sqlite3
2570: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2580: 20 70 4b 65 79 2c 20 72 65 67 41 72 67 73 2b 32   pKey, regArgs+2
2590: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  );..  assert( v 
25a0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
25b0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 76 20 29  led );.  if( v )
25c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
25d0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 46 75  eAddOp3(v, OP_Fu
25e0: 6e 63 74 69 6f 6e 2c 20 30 2c 20 72 65 67 41 72  nction, 0, regAr
25f0: 67 73 2b 33 2d 6e 46 75 6e 63 2c 20 72 65 67 41  gs+3-nFunc, regA
2600: 72 67 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rgs);.    sqlite
2610: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
2620: 20 6e 46 75 6e 63 29 3b 0a 20 20 20 20 70 46 75   nFunc);.    pFu
2630: 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
2640: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75  Function(db, zFu
2650: 6e 63 2c 20 73 74 72 6c 65 6e 28 7a 46 75 6e 63  nc, strlen(zFunc
2660: 29 2c 20 6e 46 75 6e 63 2c 20 53 51 4c 49 54 45  ), nFunc, SQLITE
2670: 5f 55 54 46 38 2c 30 29 3b 0a 20 20 20 20 73 71  _UTF8,0);.    sq
2680: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
2690: 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20 2a  4(v, -1, (char *
26a0: 29 70 46 75 6e 63 2c 20 50 34 5f 46 55 4e 43 44  )pFunc, P4_FUNCD
26b0: 45 46 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 64  EF);..    /* Cod
26c0: 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 2e 20  e an OP_Expire. 
26d0: 46 6f 72 20 61 6e 20 41 54 54 41 43 48 20 73 74  For an ATTACH st
26e0: 61 74 65 6d 65 6e 74 2c 20 73 65 74 20 50 31 20  atement, set P1 
26f0: 74 6f 20 74 72 75 65 20 28 65 78 70 69 72 65 20  to true (expire 
2700: 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 74 61 74  this.    ** stat
2710: 65 6d 65 6e 74 20 6f 6e 6c 79 29 2e 20 46 6f 72  ement only). For
2720: 20 44 45 54 41 43 48 2c 20 73 65 74 20 69 74 20   DETACH, set it 
2730: 74 6f 20 66 61 6c 73 65 20 28 65 78 70 69 72 65  to false (expire
2740: 20 61 6c 6c 20 65 78 69 73 74 69 6e 67 0a 20 20   all existing.  
2750: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 29    ** statements)
2760: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
2770: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
2780: 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 28 74 79  , OP_Expire, (ty
2790: 70 65 3d 3d 53 51 4c 49 54 45 5f 41 54 54 41 43  pe==SQLITE_ATTAC
27a0: 48 29 29 3b 0a 20 20 7d 0a 20 20 0a 61 74 74 61  H));.  }.  .atta
27b0: 63 68 5f 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65  ch_end:.  sqlite
27c0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 46 69 6c  3ExprDelete(pFil
27d0: 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  ename);.  sqlite
27e0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 44 62 6e  3ExprDelete(pDbn
27f0: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ame);.  sqlite3E
2800: 78 70 72 44 65 6c 65 74 65 28 70 4b 65 79 29 3b  xprDelete(pKey);
2810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64  .}../*.** Called
2820: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
2830: 6f 20 63 6f 6d 70 69 6c 65 20 61 20 44 45 54 41  o compile a DETA
2840: 43 48 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  CH statement..**
2850: 0a 2a 2a 20 20 20 20 20 44 45 54 41 43 48 20 70  .**     DETACH p
2860: 44 62 6e 61 6d 65 0a 2a 2f 0a 76 6f 69 64 20 73  Dbname.*/.void s
2870: 71 6c 69 74 65 33 44 65 74 61 63 68 28 50 61 72  qlite3Detach(Par
2880: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
2890: 20 2a 70 44 62 6e 61 6d 65 29 7b 0a 20 20 63 6f   *pDbname){.  co
28a0: 64 65 41 74 74 61 63 68 28 70 50 61 72 73 65 2c  deAttach(pParse,
28b0: 20 53 51 4c 49 54 45 5f 44 45 54 41 43 48 2c 20   SQLITE_DETACH, 
28c0: 22 73 71 6c 69 74 65 5f 64 65 74 61 63 68 22 2c  "sqlite_detach",
28d0: 20 31 2c 20 70 44 62 6e 61 6d 65 2c 20 30 2c 20   1, pDbname, 0, 
28e0: 30 2c 20 70 44 62 6e 61 6d 65 29 3b 0a 7d 0a 0a  0, pDbname);.}..
28f0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 62 79 20  /*.** Called by 
2900: 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 63 6f  the parser to co
2910: 6d 70 69 6c 65 20 61 6e 20 41 54 54 41 43 48 20  mpile an ATTACH 
2920: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
2930: 20 20 20 20 20 41 54 54 41 43 48 20 70 20 41 53       ATTACH p AS
2940: 20 70 44 62 6e 61 6d 65 20 4b 45 59 20 70 4b 65   pDbname KEY pKe
2950: 79 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  y.*/.void sqlite
2960: 33 41 74 74 61 63 68 28 50 61 72 73 65 20 2a 70  3Attach(Parse *p
2970: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c 20  Parse, Expr *p, 
2980: 45 78 70 72 20 2a 70 44 62 6e 61 6d 65 2c 20 45  Expr *pDbname, E
2990: 78 70 72 20 2a 70 4b 65 79 29 7b 0a 20 20 63 6f  xpr *pKey){.  co
29a0: 64 65 41 74 74 61 63 68 28 70 50 61 72 73 65 2c  deAttach(pParse,
29b0: 20 53 51 4c 49 54 45 5f 41 54 54 41 43 48 2c 20   SQLITE_ATTACH, 
29c0: 22 73 71 6c 69 74 65 5f 61 74 74 61 63 68 22 2c  "sqlite_attach",
29d0: 20 33 2c 20 70 2c 20 70 2c 20 70 44 62 6e 61 6d   3, p, p, pDbnam
29e0: 65 2c 20 70 4b 65 79 29 3b 0a 7d 0a 23 65 6e 64  e, pKey);.}.#end
29f0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2a00: 54 5f 41 54 54 41 43 48 20 2a 2f 0a 0a 2f 2a 0a  T_ATTACH */../*.
2a10: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
2a20: 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65  functions sqlite
2a30: 5f 61 74 74 61 63 68 20 61 6e 64 20 73 71 6c 69  _attach and sqli
2a40: 74 65 5f 64 65 74 61 63 68 2e 0a 2a 2f 0a 76 6f  te_detach..*/.vo
2a50: 69 64 20 73 71 6c 69 74 65 33 41 74 74 61 63 68  id sqlite3Attach
2a60: 46 75 6e 63 74 69 6f 6e 73 28 73 71 6c 69 74 65  Functions(sqlite
2a70: 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64 65 66 20  3 *db){.#ifndef 
2a80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41  SQLITE_OMIT_ATTA
2a90: 43 48 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  CH.  static cons
2aa0: 74 20 69 6e 74 20 65 6e 63 20 3d 20 53 51 4c 49  t int enc = SQLI
2ab0: 54 45 5f 55 54 46 38 3b 0a 20 20 73 71 6c 69 74  TE_UTF8;.  sqlit
2ac0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
2ad0: 20 22 73 71 6c 69 74 65 5f 61 74 74 61 63 68 22   "sqlite_attach"
2ae0: 2c 20 33 2c 20 65 6e 63 2c 20 64 62 2c 20 61 74  , 3, enc, db, at
2af0: 74 61 63 68 46 75 6e 63 2c 20 30 2c 20 30 29 3b  tachFunc, 0, 0);
2b00: 0a 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  .  sqlite3Create
2b10: 46 75 6e 63 28 64 62 2c 20 22 73 71 6c 69 74 65  Func(db, "sqlite
2b20: 5f 64 65 74 61 63 68 22 2c 20 31 2c 20 65 6e 63  _detach", 1, enc
2b30: 2c 20 64 62 2c 20 64 65 74 61 63 68 46 75 6e 63  , db, detachFunc
2b40: 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
2b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2b60: 69 7a 65 20 61 20 44 62 46 69 78 65 72 20 73 74  ize a DbFixer st
2b70: 72 75 63 74 75 72 65 2e 20 20 54 68 69 73 20 72  ructure.  This r
2b80: 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
2b90: 61 6c 6c 65 64 20 70 72 69 6f 72 0a 2a 2a 20 74  alled prior.** t
2ba0: 6f 20 70 61 73 73 69 6e 67 20 74 68 65 20 73 74  o passing the st
2bb0: 72 75 63 74 75 72 65 20 74 6f 20 6f 6e 65 20 6f  ructure to one o
2bc0: 66 20 74 68 65 20 73 71 6c 69 74 65 46 69 78 41  f the sqliteFixA
2bd0: 41 41 41 28 29 20 72 6f 75 74 69 6e 65 73 20 62  AAA() routines b
2be0: 65 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  elow..**.** The 
2bf0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
2c00: 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 6f  icates whether o
2c10: 72 20 6e 6f 74 20 66 69 78 61 74 69 6f 6e 20 69  r not fixation i
2c20: 73 20 72 65 71 75 69 72 65 64 2e 20 20 54 52 55  s required.  TRU
2c30: 45 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 64 6f  E.** means we do
2c40: 20 6e 65 65 64 20 74 6f 20 66 69 78 20 74 68 65   need to fix the
2c50: 20 64 61 74 61 62 61 73 65 20 72 65 66 65 72 65   database refere
2c60: 6e 63 65 73 2c 20 46 41 4c 53 45 20 6d 65 61 6e  nces, FALSE mean
2c70: 73 20 77 65 20 64 6f 20 6e 6f 74 2e 0a 2a 2f 0a  s we do not..*/.
2c80: 69 6e 74 20 73 71 6c 69 74 65 33 46 69 78 49 6e  int sqlite3FixIn
2c90: 69 74 28 0a 20 20 44 62 46 69 78 65 72 20 2a 70  it(.  DbFixer *p
2ca0: 46 69 78 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  Fix,      /* The
2cb0: 20 66 69 78 65 72 20 74 6f 20 62 65 20 69 6e 69   fixer to be ini
2cc0: 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61  tialized */.  Pa
2cd0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
2ce0: 20 20 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61    /* Error messa
2cf0: 67 65 73 20 77 69 6c 6c 20 62 65 20 77 72 69 74  ges will be writ
2d00: 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ten here */.  in
2d10: 74 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20  t iDb,          
2d20: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65    /* This is the
2d30: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6d   database that m
2d40: 75 73 74 20 62 65 20 75 73 65 64 20 2a 2f 0a 20  ust be used */. 
2d50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
2d60: 70 65 2c 20 20 2f 2a 20 22 76 69 65 77 22 2c 20  pe,  /* "view", 
2d70: 22 74 72 69 67 67 65 72 22 2c 20 6f 72 20 22 69  "trigger", or "i
2d80: 6e 64 65 78 22 20 2a 2f 0a 20 20 63 6f 6e 73 74  ndex" */.  const
2d90: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 2f   Token *pName  /
2da0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  * Name of the vi
2db0: 65 77 2c 20 74 72 69 67 67 65 72 2c 20 6f 72 20  ew, trigger, or 
2dc0: 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 73 71  index */.){.  sq
2dd0: 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
2de0: 28 20 69 44 62 3c 30 20 7c 7c 20 69 44 62 3d 3d  ( iDb<0 || iDb==
2df0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
2e00: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
2e10: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
2e20: 44 62 3e 69 44 62 20 29 3b 0a 20 20 70 46 69 78  Db>iDb );.  pFix
2e30: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
2e40: 65 3b 0a 20 20 70 46 69 78 2d 3e 7a 44 62 20 3d  e;.  pFix->zDb =
2e50: 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
2e60: 61 6d 65 3b 0a 20 20 70 46 69 78 2d 3e 7a 54 79  ame;.  pFix->zTy
2e70: 70 65 20 3d 20 7a 54 79 70 65 3b 0a 20 20 70 46  pe = zType;.  pF
2e80: 69 78 2d 3e 70 4e 61 6d 65 20 3d 20 70 4e 61 6d  ix->pName = pNam
2e90: 65 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  e;.  return 1;.}
2ea0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2eb0: 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
2ec0: 74 69 6e 65 73 20 77 61 6c 6b 20 74 68 72 6f 75  tines walk throu
2ed0: 67 68 20 74 68 65 20 70 61 72 73 65 20 74 72 65  gh the parse tre
2ee0: 65 20 61 6e 64 20 61 73 73 69 67 6e 0a 2a 2a 20  e and assign.** 
2ef0: 61 20 73 70 65 63 69 66 69 63 20 64 61 74 61 62  a specific datab
2f00: 61 73 65 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ase to all table
2f10: 20 72 65 66 65 72 65 6e 63 65 73 20 77 68 65 72   references wher
2f20: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  e the database n
2f30: 61 6d 65 0a 2a 2a 20 77 61 73 20 6c 65 66 74 20  ame.** was left 
2f40: 75 6e 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  unspecified in t
2f50: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
2f60: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
2f70: 70 46 69 78 20 73 74 72 75 63 74 75 72 65 0a 2a  pFix structure.*
2f80: 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  * must have been
2f90: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
2fa0: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
2fb0: 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 29  sqlite3FixInit()
2fc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f  ..**.** These ro
2fd0: 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20  utines are used 
2fe0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
2ff0: 74 20 61 6e 20 69 6e 64 65 78 2c 20 74 72 69 67  t an index, trig
3000: 67 65 72 2c 20 6f 72 0a 2a 2a 20 76 69 65 77 20  ger, or.** view 
3010: 69 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  in one database 
3020: 64 6f 65 73 20 6e 6f 74 20 72 65 66 65 72 20 74  does not refer t
3030: 6f 20 6f 62 6a 65 63 74 73 20 69 6e 20 61 20 64  o objects in a d
3040: 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
3050: 65 2e 0a 2a 2a 20 28 45 78 63 65 70 74 69 6f 6e  e..** (Exception
3060: 3a 20 69 6e 64 69 63 65 73 2c 20 74 72 69 67 67  : indices, trigg
3070: 65 72 73 2c 20 61 6e 64 20 76 69 65 77 73 20 69  ers, and views i
3080: 6e 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62  n the TEMP datab
3090: 61 73 65 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 77  ase are.** allow
30a0: 65 64 20 74 6f 20 72 65 66 65 72 20 74 6f 20 61  ed to refer to a
30b0: 6e 79 74 68 69 6e 67 2e 29 20 20 49 66 20 61 20  nything.)  If a 
30c0: 72 65 66 65 72 65 6e 63 65 20 69 73 20 65 78 70  reference is exp
30d0: 6c 69 63 69 74 6c 79 20 6d 61 64 65 0a 2a 2a 20  licitly made.** 
30e0: 74 6f 20 61 6e 20 6f 62 6a 65 63 74 20 69 6e 20  to an object in 
30f0: 61 20 64 69 66 66 65 72 65 6e 74 20 64 61 74 61  a different data
3100: 62 61 73 65 2c 20 61 6e 20 65 72 72 6f 72 20 6d  base, an error m
3110: 65 73 73 61 67 65 20 69 73 20 61 64 64 65 64 20  essage is added 
3120: 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 7a 45  to.** pParse->zE
3130: 72 72 4d 73 67 20 61 6e 64 20 74 68 65 73 65 20  rrMsg and these 
3140: 72 6f 75 74 69 6e 65 73 20 72 65 74 75 72 6e 20  routines return 
3150: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 65 76  non-zero.  If ev
3160: 65 72 79 74 68 69 6e 67 0a 2a 2a 20 63 68 65 63  erything.** chec
3170: 6b 73 20 6f 75 74 2c 20 74 68 65 73 65 20 72 6f  ks out, these ro
3180: 75 74 69 6e 65 73 20 72 65 74 75 72 6e 20 30 2e  utines return 0.
3190: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
31a0: 69 78 53 72 63 4c 69 73 74 28 0a 20 20 44 62 46  ixSrcList(.  DbF
31b0: 69 78 65 72 20 2a 70 46 69 78 2c 20 20 20 20 20  ixer *pFix,     
31c0: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 66 20    /* Context of 
31d0: 74 68 65 20 66 69 78 61 74 69 6f 6e 20 2a 2f 0a  the fixation */.
31e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
31f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 6f         /* The So
3200: 75 72 63 65 20 6c 69 73 74 20 74 6f 20 63 68 65  urce list to che
3210: 63 6b 20 61 6e 64 20 6d 6f 64 69 66 79 20 2a 2f  ck and modify */
3220: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  .){.  int i;.  c
3230: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
3240: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3250: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a 20  _item *pItem;.. 
3260: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
3270: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 44 62 20  return 0;.  zDb 
3280: 3d 20 70 46 69 78 2d 3e 7a 44 62 3b 0a 20 20 66  = pFix->zDb;.  f
3290: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
32a0: 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
32b0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
32c0: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
32d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d  tem->zDatabase==
32e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 6d  0 ){.      pItem
32f0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
3300: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 46  lite3DbStrDup(pF
3310: 69 78 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2c 20  ix->pParse->db, 
3320: 7a 44 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  zDb);.    }else 
3330: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
3340: 6d 70 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  mp(pItem->zDatab
3350: 61 73 65 2c 7a 44 62 29 21 3d 30 20 29 7b 0a 20  ase,zDb)!=0 ){. 
3360: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
3370: 72 4d 73 67 28 70 46 69 78 2d 3e 70 50 61 72 73  rMsg(pFix->pPars
3380: 65 2c 0a 20 20 20 20 20 20 20 20 20 22 25 73 20  e,.         "%s 
3390: 25 54 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 65  %T cannot refere
33a0: 6e 63 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 64  nce objects in d
33b0: 61 74 61 62 61 73 65 20 25 73 22 2c 0a 20 20 20  atabase %s",.   
33c0: 20 20 20 20 20 20 70 46 69 78 2d 3e 7a 54 79 70        pFix->zTyp
33d0: 65 2c 20 70 46 69 78 2d 3e 70 4e 61 6d 65 2c 20  e, pFix->pName, 
33e0: 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
33f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3400: 31 3b 0a 20 20 20 20 7d 0a 23 69 66 20 21 64 65  1;.    }.#if !de
3410: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3420: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
3430: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3440: 54 52 49 47 47 45 52 29 0a 20 20 20 20 69 66 28  TRIGGER).    if(
3450: 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
3460: 74 28 70 46 69 78 2c 20 70 49 74 65 6d 2d 3e 70  t(pFix, pItem->p
3470: 53 65 6c 65 63 74 29 20 29 20 72 65 74 75 72 6e  Select) ) return
3480: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
3490: 74 65 33 46 69 78 45 78 70 72 28 70 46 69 78 2c  te3FixExpr(pFix,
34a0: 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 20 29 20 72   pItem->pOn) ) r
34b0: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
34c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
34d0: 7d 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  }.#if !defined(S
34e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
34f0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
3500: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
3510: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 78  ).int sqlite3Fix
3520: 53 65 6c 65 63 74 28 0a 20 20 44 62 46 69 78 65  Select(.  DbFixe
3530: 72 20 2a 70 46 69 78 2c 20 20 20 20 20 20 20 2f  r *pFix,       /
3540: 2a 20 43 6f 6e 74 65 78 74 20 6f 66 20 74 68 65  * Context of the
3550: 20 66 69 78 61 74 69 6f 6e 20 2a 2f 0a 20 20 53   fixation */.  S
3560: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20  elect *pSelect  
3570: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
3580: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 62  T statement to b
3590: 65 20 66 69 78 65 64 20 74 6f 20 6f 6e 65 20 64  e fixed to one d
35a0: 61 74 61 62 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  atabase */.){.  
35b0: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20 29  while( pSelect )
35c0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
35d0: 33 46 69 78 45 78 70 72 4c 69 73 74 28 70 46 69  3FixExprList(pFi
35e0: 78 2c 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  x, pSelect->pELi
35f0: 73 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  st) ){.      ret
3600: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
3610: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53   if( sqlite3FixS
3620: 72 63 4c 69 73 74 28 70 46 69 78 2c 20 70 53 65  rcList(pFix, pSe
3630: 6c 65 63 74 2d 3e 70 53 72 63 29 20 29 7b 0a 20  lect->pSrc) ){. 
3640: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3650: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
3660: 69 74 65 33 46 69 78 45 78 70 72 28 70 46 69 78  ite3FixExpr(pFix
3670: 2c 20 70 53 65 6c 65 63 74 2d 3e 70 57 68 65 72  , pSelect->pWher
3680: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
3690: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
36a0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 45 78  if( sqlite3FixEx
36b0: 70 72 28 70 46 69 78 2c 20 70 53 65 6c 65 63 74  pr(pFix, pSelect
36c0: 2d 3e 70 48 61 76 69 6e 67 29 20 29 7b 0a 20 20  ->pHaving) ){.  
36d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
36e0: 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20    }.    pSelect 
36f0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
3700: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
3710: 30 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  0;.}.int sqlite3
3720: 46 69 78 45 78 70 72 28 0a 20 20 44 62 46 69 78  FixExpr(.  DbFix
3730: 65 72 20 2a 70 46 69 78 2c 20 20 20 20 20 2f 2a  er *pFix,     /*
3740: 20 43 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   Context of the 
3750: 66 69 78 61 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  fixation */.  Ex
3760: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
3770: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
3780: 6f 6e 20 74 6f 20 62 65 20 66 69 78 65 64 20 74  on to be fixed t
3790: 6f 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 2a  o one database *
37a0: 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45  /.){.  while( pE
37b0: 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 73  xpr ){.    if( s
37c0: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
37d0: 70 46 69 78 2c 20 70 45 78 70 72 2d 3e 70 53 65  pFix, pExpr->pSe
37e0: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 72  lect) ){.      r
37f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
3800: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
3810: 78 45 78 70 72 4c 69 73 74 28 70 46 69 78 2c 20  xExprList(pFix, 
3820: 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 20 29 7b  pExpr->pList) ){
3830: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3840: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
3850: 71 6c 69 74 65 33 46 69 78 45 78 70 72 28 70 46  qlite3FixExpr(pF
3860: 69 78 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ix, pExpr->pRigh
3870: 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
3880: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
3890: 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e 70  pExpr = pExpr->p
38a0: 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Left;.  }.  retu
38b0: 72 6e 20 30 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  rn 0;.}.int sqli
38c0: 74 65 33 46 69 78 45 78 70 72 4c 69 73 74 28 0a  te3FixExprList(.
38d0: 20 20 44 62 46 69 78 65 72 20 2a 70 46 69 78 2c    DbFixer *pFix,
38e0: 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20       /* Context 
38f0: 6f 66 20 74 68 65 20 66 69 78 61 74 69 6f 6e 20  of the fixation 
3900: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
3910: 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65  List    /* The e
3920: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20  xpression to be 
3930: 66 69 78 65 64 20 74 6f 20 6f 6e 65 20 64 61 74  fixed to one dat
3940: 61 62 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  abase */.){.  in
3950: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45 78  t i;.  struct Ex
3960: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
3970: 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
3980: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3990: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
39a0: 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73  pList->a; i<pLis
39b0: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
39c0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Item++){.    if(
39d0: 20 73 71 6c 69 74 65 33 46 69 78 45 78 70 72 28   sqlite3FixExpr(
39e0: 70 46 69 78 2c 20 70 49 74 65 6d 2d 3e 70 45 78  pFix, pItem->pEx
39f0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  pr) ){.      ret
3a00: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
3a10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
3a20: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
3a30: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3a40: 45 52 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  ER.int sqlite3Fi
3a50: 78 54 72 69 67 67 65 72 53 74 65 70 28 0a 20 20  xTriggerStep(.  
3a60: 44 62 46 69 78 65 72 20 2a 70 46 69 78 2c 20 20  DbFixer *pFix,  
3a70: 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f 66     /* Context of
3a80: 20 74 68 65 20 66 69 78 61 74 69 6f 6e 20 2a 2f   the fixation */
3a90: 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20 2a  .  TriggerStep *
3aa0: 70 53 74 65 70 20 2f 2a 20 54 68 65 20 74 72 69  pStep /* The tri
3ab0: 67 67 65 72 20 73 74 65 70 20 62 65 20 66 69 78  gger step be fix
3ac0: 65 64 20 74 6f 20 6f 6e 65 20 64 61 74 61 62 61  ed to one databa
3ad0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65  se */.){.  while
3ae0: 28 20 70 53 74 65 70 20 29 7b 0a 20 20 20 20 69  ( pStep ){.    i
3af0: 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  f( sqlite3FixSel
3b00: 65 63 74 28 70 46 69 78 2c 20 70 53 74 65 70 2d  ect(pFix, pStep-
3b10: 3e 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  >pSelect) ){.   
3b20: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3b30: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
3b40: 65 33 46 69 78 45 78 70 72 28 70 46 69 78 2c 20  e3FixExpr(pFix, 
3b50: 70 53 74 65 70 2d 3e 70 57 68 65 72 65 29 20 29  pStep->pWhere) )
3b60: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
3b70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3b80: 73 71 6c 69 74 65 33 46 69 78 45 78 70 72 4c 69  sqlite3FixExprLi
3b90: 73 74 28 70 46 69 78 2c 20 70 53 74 65 70 2d 3e  st(pFix, pStep->
3ba0: 70 45 78 70 72 4c 69 73 74 29 20 29 7b 0a 20 20  pExprList) ){.  
3bb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3bc0: 20 20 7d 0a 20 20 20 20 70 53 74 65 70 20 3d 20    }.    pStep = 
3bd0: 70 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  pStep->pNext;.  
3be0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3bf0: 23 65 6e 64 69 66 0a                             #endif.