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

Artifact 4a3138bd771d5426ae4344d8d5e900440af29fabc5ec2f39f69a45010dfbccd7:


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: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
01d0: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 6e 64 65  teInt.h"..#ifnde
01e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54  f SQLITE_OMIT_AT
01f0: 54 41 43 48 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  TACH./*.** Resol
0200: 76 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ve an expression
0210: 20 74 68 61 74 20 77 61 73 20 70 61 72 74 20 6f   that was part o
0220: 66 20 61 6e 20 41 54 54 41 43 48 20 6f 72 20 44  f an ATTACH or D
0230: 45 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 2e  ETACH statement.
0240: 20 54 68 69 73 0a 2a 2a 20 69 73 20 73 6c 69 67   This.** is slig
0250: 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 20 66  htly different f
0260: 72 6f 6d 20 72 65 73 6f 6c 76 69 6e 67 20 61 20  rom resolving a 
0270: 6e 6f 72 6d 61 6c 20 53 51 4c 20 65 78 70 72 65  normal SQL expre
0280: 73 73 69 6f 6e 2c 20 62 65 63 61 75 73 65 20 73  ssion, because s
0290: 69 6d 70 6c 65 0a 2a 2a 20 69 64 65 6e 74 69 66  imple.** identif
02a0: 69 65 72 73 20 61 72 65 20 74 72 65 61 74 65 64  iers are treated
02b0: 20 61 73 20 73 74 72 69 6e 67 73 2c 20 6e 6f 74   as strings, not
02c0: 20 70 6f 73 73 69 62 6c 65 20 63 6f 6c 75 6d 6e   possible column
02d0: 20 6e 61 6d 65 73 20 6f 72 20 61 6c 69 61 73 65   names or aliase
02e0: 73 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20 69 66  s..**.** i.e. if
02f0: 20 74 68 65 20 70 61 72 73 65 72 20 73 65 65 73   the parser sees
0300: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 54 54 41  :.**.**     ATTA
0310: 43 48 20 44 41 54 41 42 41 53 45 20 61 62 63 20  CH DATABASE abc 
0320: 41 53 20 64 65 66 0a 2a 2a 0a 2a 2a 20 69 74 20  AS def.**.** it 
0330: 74 72 65 61 74 73 20 74 68 65 20 74 77 6f 20 65  treats the two e
0340: 78 70 72 65 73 73 69 6f 6e 73 20 61 73 20 6c 69  xpressions as li
0350: 74 65 72 61 6c 20 73 74 72 69 6e 67 73 20 27 61  teral strings 'a
0360: 62 63 27 20 61 6e 64 20 27 64 65 66 27 20 69 6e  bc' and 'def' in
0370: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 6c 6f 6f 6b  stead of.** look
0380: 69 6e 67 20 66 6f 72 20 63 6f 6c 75 6d 6e 73 20  ing for columns 
0390: 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
03a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6f 6e 6c  ..**.** This onl
03b0: 79 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65  y applies to the
03c0: 20 72 6f 6f 74 20 6e 6f 64 65 20 6f 66 20 70 45   root node of pE
03d0: 78 70 72 2c 20 73 6f 20 74 68 65 20 73 74 61 74  xpr, so the stat
03e0: 65 6d 65 6e 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ement:.**.**    
03f0: 20 41 54 54 41 43 48 20 44 41 54 41 42 41 53 45   ATTACH DATABASE
0400: 20 61 62 63 7c 7c 64 65 66 20 41 53 20 27 64 62   abc||def AS 'db
0410: 32 27 0a 2a 2a 0a 2a 2a 20 77 69 6c 6c 20 66 61  2'.**.** will fa
0420: 69 6c 20 62 65 63 61 75 73 65 20 6e 65 69 74 68  il because neith
0430: 65 72 20 61 62 63 20 6f 72 20 64 65 66 20 63 61  er abc or def ca
0440: 6e 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  n be resolved..*
0450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
0460: 6f 6c 76 65 41 74 74 61 63 68 45 78 70 72 28 4e  olveAttachExpr(N
0470: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 61 6d  ameContext *pNam
0480: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 0a  e, Expr *pExpr).
0490: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
04a0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 45  ITE_OK;.  if( pE
04b0: 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  xpr ){.    if( p
04c0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 44 20  Expr->op!=TK_ID 
04d0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
04e0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
04f0: 4e 61 6d 65 73 28 70 4e 61 6d 65 2c 20 70 45 78  Names(pName, pEx
0500: 70 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  pr);.    }else{.
0510: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
0520: 3d 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20  = TK_STRING;.   
0530: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
0540: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  rc;.}../*.** An 
0550: 53 51 4c 20 75 73 65 72 2d 66 75 6e 63 74 69 6f  SQL user-functio
0560: 6e 20 72 65 67 69 73 74 65 72 65 64 20 74 6f 20  n registered to 
0570: 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61  do the work of a
0580: 6e 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65  n ATTACH stateme
0590: 6e 74 2e 20 54 68 65 0a 2a 2a 20 74 68 72 65 65  nt. The.** three
05a0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68   arguments to th
05b0: 65 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 65 20  e function come 
05c0: 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 61 6e  directly from an
05d0: 20 61 74 74 61 63 68 20 73 74 61 74 65 6d 65 6e   attach statemen
05e0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 41 54 54  t:.**.**     ATT
05f0: 41 43 48 20 44 41 54 41 42 41 53 45 20 78 20 41  ACH DATABASE x A
0600: 53 20 79 20 4b 45 59 20 7a 0a 2a 2a 0a 2a 2a 20  S y KEY z.**.** 
0610: 20 20 20 20 53 45 4c 45 43 54 20 73 71 6c 69 74      SELECT sqlit
0620: 65 5f 61 74 74 61 63 68 28 78 2c 20 79 2c 20 7a  e_attach(x, y, z
0630: 29 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ).**.** If the o
0640: 70 74 69 6f 6e 61 6c 20 22 4b 45 59 20 7a 22 20  ptional "KEY z" 
0650: 73 79 6e 74 61 78 20 69 73 20 6f 6d 69 74 74 65  syntax is omitte
0660: 64 2c 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  d, an SQL NULL i
0670: 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 0a  s passed as the.
0680: 2a 2a 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  ** third argumen
0690: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
06a0: 64 62 2d 3e 69 6e 69 74 2e 72 65 6f 70 65 6e 4d  db->init.reopenM
06b0: 65 6d 64 62 20 66 6c 61 67 73 20 69 73 20 73 65  emdb flags is se
06c0: 74 2c 20 74 68 65 6e 20 69 6e 73 74 65 61 64 20  t, then instead 
06d0: 6f 66 20 61 74 74 61 63 68 69 6e 67 20 61 0a 2a  of attaching a.*
06e0: 2a 20 6e 65 77 20 64 61 74 61 62 61 73 65 2c 20  * new database, 
06f0: 63 6c 6f 73 65 20 74 68 65 20 64 61 74 61 62 61  close the databa
0700: 73 65 20 6f 6e 20 64 62 2d 3e 69 6e 69 74 2e 69  se on db->init.i
0710: 44 62 20 61 6e 64 20 72 65 6f 70 65 6e 20 69 74  Db and reopen it
0720: 20 61 73 20 61 6e 0a 2a 2a 20 65 6d 70 74 79 20   as an.** empty 
0730: 4d 65 6d 44 42 2e 0a 2a 2f 0a 73 74 61 74 69 63  MemDB..*/.static
0740: 20 76 6f 69 64 20 61 74 74 61 63 68 46 75 6e 63   void attachFunc
0750: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
0760: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20  ext *context,.  
0770: 69 6e 74 20 4e 6f 74 55 73 65 64 2c 0a 20 20 73  int NotUsed,.  s
0780: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
0790: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
07a0: 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
07b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
07c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
07d0: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
07e0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
07f0: 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  zName;.  const c
0800: 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68  har *zFile;.  ch
0810: 61 72 20 2a 7a 50 61 74 68 20 3d 20 30 3b 0a 20  ar *zPath = 0;. 
0820: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
0830: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
0840: 66 6c 61 67 73 3b 0a 20 20 44 62 20 2a 61 4e 65  flags;.  Db *aNe
0850: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
0860: 20 20 20 2f 2a 20 4e 65 77 20 61 72 72 61 79 20     /* New array 
0870: 6f 66 20 44 62 20 70 6f 69 6e 74 65 72 73 20 2a  of Db pointers *
0880: 2f 0a 20 20 44 62 20 2a 70 4e 65 77 3b 20 20 20  /.  Db *pNew;   
0890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
08a0: 20 44 62 20 6f 62 6a 65 63 74 20 66 6f 72 20 74   Db object for t
08b0: 68 65 20 6e 65 77 6c 79 20 61 74 74 61 63 68 65  he newly attache
08c0: 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
08d0: 63 68 61 72 20 2a 7a 45 72 72 44 79 6e 20 3d 20  char *zErrDyn = 
08e0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  0;.  sqlite3_vfs
08f0: 20 2a 70 56 66 73 3b 0a 0a 20 20 55 4e 55 53 45   *pVfs;..  UNUSE
0900: 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
0910: 73 65 64 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20  sed);.  zFile = 
0920: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
0930: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
0940: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 4e 61  (argv[0]);.  zNa
0950: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
0960: 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   *)sqlite3_value
0970: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
0980: 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29    if( zFile==0 )
0990: 20 7a 46 69 6c 65 20 3d 20 22 22 3b 0a 20 20 69   zFile = "";.  i
09a0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e  f( zName==0 ) zN
09b0: 61 6d 65 20 3d 20 22 22 3b 0a 0a 23 69 66 64 65  ame = "";..#ifde
09c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
09d0: 44 45 53 45 52 49 41 4c 49 5a 45 0a 23 20 64 65  DESERIALIZE.# de
09e0: 66 69 6e 65 20 52 45 4f 50 45 4e 5f 41 53 5f 4d  fine REOPEN_AS_M
09f0: 45 4d 44 42 28 64 62 29 20 20 28 64 62 2d 3e 69  EMDB(db)  (db->i
0a00: 6e 69 74 2e 72 65 6f 70 65 6e 4d 65 6d 64 62 29  nit.reopenMemdb)
0a10: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
0a20: 52 45 4f 50 45 4e 5f 41 53 5f 4d 45 4d 44 42 28  REOPEN_AS_MEMDB(
0a30: 64 62 29 20 20 28 30 29 0a 23 65 6e 64 69 66 0a  db)  (0).#endif.
0a40: 0a 20 20 69 66 28 20 52 45 4f 50 45 4e 5f 41 53  .  if( REOPEN_AS
0a50: 5f 4d 45 4d 44 42 28 64 62 29 20 29 7b 0a 20 20  _MEMDB(db) ){.  
0a60: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    /* This is not
0a70: 20 61 20 72 65 61 6c 20 41 54 54 41 43 48 2e 20   a real ATTACH. 
0a80: 20 49 6e 73 74 65 61 64 2c 20 74 68 69 73 20 72   Instead, this r
0a90: 6f 75 74 69 6e 65 20 69 73 20 62 65 69 6e 67 20  outine is being 
0aa0: 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 66 72  called.    ** fr
0ab0: 6f 6d 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72  om sqlite3_deser
0ac0: 69 61 6c 69 7a 65 28 29 20 74 6f 20 63 6c 6f 73  ialize() to clos
0ad0: 65 20 64 61 74 61 62 61 73 65 20 64 62 2d 3e 69  e database db->i
0ae0: 6e 69 74 2e 69 44 62 20 61 6e 64 0a 20 20 20 20  nit.iDb and.    
0af0: 2a 2a 20 72 65 6f 70 65 6e 20 69 74 20 61 73 20  ** reopen it as 
0b00: 61 20 4d 65 6d 44 42 20 2a 2f 0a 20 20 20 20 70  a MemDB */.    p
0b10: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
0b20: 73 5f 66 69 6e 64 28 22 6d 65 6d 64 62 22 29 3b  s_find("memdb");
0b30: 0a 20 20 20 20 69 66 28 20 70 56 66 73 3d 3d 30  .    if( pVfs==0
0b40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
0b50: 4e 65 77 20 3d 20 26 64 62 2d 3e 61 44 62 5b 64  New = &db->aDb[d
0b60: 62 2d 3e 69 6e 69 74 2e 69 44 62 5d 3b 0a 20 20  b->init.iDb];.  
0b70: 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 42 74 20    if( pNew->pBt 
0b80: 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  ) sqlite3BtreeCl
0b90: 6f 73 65 28 70 4e 65 77 2d 3e 70 42 74 29 3b 0a  ose(pNew->pBt);.
0ba0: 20 20 20 20 70 4e 65 77 2d 3e 70 42 74 20 3d 20      pNew->pBt = 
0bb0: 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 53 63  0;.    pNew->pSc
0bc0: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 72 63  hema = 0;.    rc
0bd0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
0be0: 70 65 6e 28 70 56 66 73 2c 20 22 78 22 2c 20 64  pen(pVfs, "x", d
0bf0: 62 2c 20 26 70 4e 65 77 2d 3e 70 42 74 2c 20 30  b, &pNew->pBt, 0
0c00: 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  , SQLITE_OPEN_MA
0c10: 49 4e 5f 44 42 29 3b 0a 20 20 7d 65 6c 73 65 7b  IN_DB);.  }else{
0c20: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
0c30: 61 20 72 65 61 6c 20 41 54 54 41 43 48 0a 20 20  a real ATTACH.  
0c40: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63    **.    ** Chec
0c50: 6b 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77  k for the follow
0c60: 69 6e 67 20 65 72 72 6f 72 73 3a 0a 20 20 20 20  ing errors:.    
0c70: 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 2a 20  **.    **     * 
0c80: 54 6f 6f 20 6d 61 6e 79 20 61 74 74 61 63 68 65  Too many attache
0c90: 64 20 64 61 74 61 62 61 73 65 73 2c 0a 20 20 20  d databases,.   
0ca0: 20 2a 2a 20 20 20 20 20 2a 20 54 72 61 6e 73 61   **     * Transa
0cb0: 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20  ction currently 
0cc0: 6f 70 65 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20  open.    **     
0cd0: 2a 20 53 70 65 63 69 66 69 65 64 20 64 61 74 61  * Specified data
0ce0: 62 61 73 65 20 6e 61 6d 65 20 61 6c 72 65 61 64  base name alread
0cf0: 79 20 62 65 69 6e 67 20 75 73 65 64 2e 0a 20 20  y being used..  
0d00: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 62 2d    */.    if( db-
0d10: 3e 6e 44 62 3e 3d 64 62 2d 3e 61 4c 69 6d 69 74  >nDb>=db->aLimit
0d20: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54  [SQLITE_LIMIT_AT
0d30: 54 41 43 48 45 44 5d 2b 32 20 29 7b 0a 20 20 20  TACHED]+2 ){.   
0d40: 20 20 20 7a 45 72 72 44 79 6e 20 3d 20 73 71 6c     zErrDyn = sql
0d50: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
0d60: 22 74 6f 6f 20 6d 61 6e 79 20 61 74 74 61 63 68  "too many attach
0d70: 65 64 20 64 61 74 61 62 61 73 65 73 20 2d 20 6d  ed databases - m
0d80: 61 78 20 25 64 22 2c 20 0a 20 20 20 20 20 20 20  ax %d", .       
0d90: 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
0da0: 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45  TE_LIMIT_ATTACHE
0db0: 44 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  D].      );.    
0dc0: 20 20 67 6f 74 6f 20 61 74 74 61 63 68 5f 65 72    goto attach_er
0dd0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ror;.    }.    f
0de0: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
0df0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  b; i++){.      c
0e00: 68 61 72 20 2a 7a 20 3d 20 64 62 2d 3e 61 44 62  har *z = db->aDb
0e10: 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65 3b 0a 20 20  [i].zDbSName;.  
0e20: 20 20 20 20 61 73 73 65 72 74 28 20 7a 20 26 26      assert( z &&
0e30: 20 7a 4e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20   zName );.      
0e40: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
0e50: 6d 70 28 7a 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20  mp(z, zName)==0 
0e60: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 44  ){.        zErrD
0e70: 79 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  yn = sqlite3MPri
0e80: 6e 74 66 28 64 62 2c 20 22 64 61 74 61 62 61 73  ntf(db, "databas
0e90: 65 20 25 73 20 69 73 20 61 6c 72 65 61 64 79 20  e %s is already 
0ea0: 69 6e 20 75 73 65 22 2c 20 7a 4e 61 6d 65 29 3b  in use", zName);
0eb0: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 74  .        goto at
0ec0: 74 61 63 68 5f 65 72 72 6f 72 3b 0a 20 20 20 20  tach_error;.    
0ed0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
0ee0: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   /* Allocate the
0ef0: 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 74 68   new entry in th
0f00: 65 20 64 62 2d 3e 61 44 62 5b 5d 20 61 72 72 61  e db->aDb[] arra
0f10: 79 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  y and initialize
0f20: 20 74 68 65 20 73 63 68 65 6d 61 0a 20 20 20 20   the schema.    
0f30: 2a 2a 20 68 61 73 68 20 74 61 62 6c 65 73 2e 0a  ** hash tables..
0f40: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64      */.    if( d
0f50: 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53  b->aDb==db->aDbS
0f60: 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20 20 61  tatic ){.      a
0f70: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  New = sqlite3DbM
0f80: 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73  allocRawNN(db, s
0f90: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
0fa0: 29 2a 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  )*3 );.      if(
0fb0: 20 61 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   aNew==0 ) retur
0fc0: 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  n;.      memcpy(
0fd0: 61 4e 65 77 2c 20 64 62 2d 3e 61 44 62 2c 20 73  aNew, db->aDb, s
0fe0: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d  izeof(db->aDb[0]
0ff0: 29 2a 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  )*2);.    }else{
1000: 0a 20 20 20 20 20 20 61 4e 65 77 20 3d 20 73 71  .      aNew = sq
1010: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1020: 62 2c 20 64 62 2d 3e 61 44 62 2c 20 73 69 7a 65  b, db->aDb, size
1030: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 2a 28  of(db->aDb[0])*(
1040: 64 62 2d 3e 6e 44 62 2b 31 29 20 29 3b 0a 20 20  db->nDb+1) );.  
1050: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
1060: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
1070: 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 61 4e      db->aDb = aN
1080: 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 26  ew;.    pNew = &
1090: 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 6e 44 62 5d  db->aDb[db->nDb]
10a0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4e 65  ;.    memset(pNe
10b0: 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, 0, sizeof(*pN
10c0: 65 77 29 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  ew));.  .    /* 
10d0: 4f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  Open the databas
10e0: 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 62  e file. If the b
10f0: 74 72 65 65 20 69 73 20 73 75 63 63 65 73 73 66  tree is successf
1100: 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 75 73 65  ully opened, use
1110: 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20 6f 62  .    ** it to ob
1120: 74 61 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  tain the databas
1130: 65 20 73 63 68 65 6d 61 2e 20 41 74 20 74 68 69  e schema. At thi
1140: 73 20 70 6f 69 6e 74 20 74 68 65 20 73 63 68 65  s point the sche
1150: 6d 61 20 6d 61 79 0a 20 20 20 20 2a 2a 20 6f 72  ma may.    ** or
1160: 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 69 74   may not be init
1170: 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a  ialized..    */.
1180: 20 20 20 20 66 6c 61 67 73 20 3d 20 64 62 2d 3e      flags = db->
1190: 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 20 20 72  openFlags;.    r
11a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65  c = sqlite3Parse
11b0: 55 72 69 28 64 62 2d 3e 70 56 66 73 2d 3e 7a 4e  Uri(db->pVfs->zN
11c0: 61 6d 65 2c 20 7a 46 69 6c 65 2c 20 26 66 6c 61  ame, zFile, &fla
11d0: 67 73 2c 20 26 70 56 66 73 2c 20 26 7a 50 61 74  gs, &pVfs, &zPat
11e0: 68 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  h, &zErr);.    i
11f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1200: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63   ){.      if( rc
1210: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
1220: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
1230: 28 64 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (db);.      sqli
1240: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
1250: 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20  (context, zErr, 
1260: 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
1270: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
1280: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1290: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
12a0: 56 66 73 20 29 3b 0a 20 20 20 20 66 6c 61 67 73  Vfs );.    flags
12b0: 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
12c0: 4d 41 49 4e 5f 44 42 3b 0a 20 20 20 20 72 63 20  MAIN_DB;.    rc 
12d0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70  = sqlite3BtreeOp
12e0: 65 6e 28 70 56 66 73 2c 20 7a 50 61 74 68 2c 20  en(pVfs, zPath, 
12f0: 64 62 2c 20 26 70 4e 65 77 2d 3e 70 42 74 2c 20  db, &pNew->pBt, 
1300: 30 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 73  0, flags);.    s
1310: 71 6c 69 74 65 33 5f 66 72 65 65 28 20 7a 50 61  qlite3_free( zPa
1320: 74 68 20 29 3b 0a 20 20 20 20 64 62 2d 3e 6e 44  th );.    db->nD
1330: 62 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e  b++;.  }.  db->n
1340: 6f 53 68 61 72 65 64 43 61 63 68 65 20 3d 20 30  oSharedCache = 0
1350: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1360: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
1370: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1380: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7a 45 72 72  _ERROR;.    zErr
1390: 44 79 6e 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Dyn = sqlite3MPr
13a0: 69 6e 74 66 28 64 62 2c 20 22 64 61 74 61 62 61  intf(db, "databa
13b0: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  se is already at
13c0: 74 61 63 68 65 64 22 29 3b 0a 20 20 7d 65 6c 73  tached");.  }els
13d0: 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
13e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 50 61 67 65 72  _OK ){.    Pager
13f0: 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 4e   *pPager;.    pN
1400: 65 77 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71  ew->pSchema = sq
1410: 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
1420: 62 2c 20 70 4e 65 77 2d 3e 70 42 74 29 3b 0a 20  b, pNew->pBt);. 
1430: 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 70 53     if( !pNew->pS
1440: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72  chema ){.      r
1450: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1460: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
1470: 20 69 66 28 20 70 4e 65 77 2d 3e 70 53 63 68 65   if( pNew->pSche
1480: 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 20  ma->file_format 
1490: 26 26 20 70 4e 65 77 2d 3e 70 53 63 68 65 6d 61  && pNew->pSchema
14a0: 2d 3e 65 6e 63 21 3d 45 4e 43 28 64 62 29 20 29  ->enc!=ENC(db) )
14b0: 7b 0a 20 20 20 20 20 20 7a 45 72 72 44 79 6e 20  {.      zErrDyn 
14c0: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
14d0: 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 22 61  (db, .        "a
14e0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
14f0: 73 20 6d 75 73 74 20 75 73 65 20 74 68 65 20 73  s must use the s
1500: 61 6d 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ame text encodin
1510: 67 20 61 73 20 6d 61 69 6e 20 64 61 74 61 62 61  g as main databa
1520: 73 65 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  se");.      rc =
1530: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1540: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1550: 42 74 72 65 65 45 6e 74 65 72 28 70 4e 65 77 2d  BtreeEnter(pNew-
1560: 3e 70 42 74 29 3b 0a 20 20 20 20 70 50 61 67 65  >pBt);.    pPage
1570: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
1580: 50 61 67 65 72 28 70 4e 65 77 2d 3e 70 42 74 29  Pager(pNew->pBt)
1590: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
15a0: 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 50  erLockingMode(pP
15b0: 61 67 65 72 2c 20 64 62 2d 3e 64 66 6c 74 4c 6f  ager, db->dfltLo
15c0: 63 6b 4d 6f 64 65 29 3b 0a 20 20 20 20 73 71 6c  ckMode);.    sql
15d0: 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65 44  ite3BtreeSecureD
15e0: 65 6c 65 74 65 28 70 4e 65 77 2d 3e 70 42 74 2c  elete(pNew->pBt,
15f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1610: 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72 65  lite3BtreeSecure
1620: 44 65 6c 65 74 65 28 64 62 2d 3e 61 44 62 5b 30  Delete(db->aDb[0
1630: 5d 2e 70 42 74 2c 2d 31 29 20 29 3b 0a 23 69 66  ].pBt,-1) );.#if
1640: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1650: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 20  _PAGER_PRAGMAS. 
1660: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53     sqlite3BtreeS
1670: 65 74 50 61 67 65 72 46 6c 61 67 73 28 70 4e 65  etPagerFlags(pNe
1680: 77 2d 3e 70 42 74 2c 0a 20 20 20 20 20 20 20 20  w->pBt,.        
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
16a0: 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f  GER_SYNCHRONOUS_
16b0: 46 55 4c 4c 20 7c 20 28 64 62 2d 3e 66 6c 61 67  FULL | (db->flag
16c0: 73 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f  s & PAGER_FLAGS_
16d0: 4d 41 53 4b 29 29 3b 0a 23 65 6e 64 69 66 0a 20  MASK));.#endif. 
16e0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
16f0: 65 61 76 65 28 70 4e 65 77 2d 3e 70 42 74 29 3b  eave(pNew->pBt);
1700: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 61 66  .  }.  pNew->saf
1710: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49  ety_level = SQLI
1720: 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43 48  TE_DEFAULT_SYNCH
1730: 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 69 66 28 20  RONOUS+1;.  if( 
1740: 21 52 45 4f 50 45 4e 5f 41 53 5f 4d 45 4d 44 42  !REOPEN_AS_MEMDB
1750: 28 64 62 29 20 29 20 70 4e 65 77 2d 3e 7a 44 62  (db) ) pNew->zDb
1760: 53 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  SName = sqlite3D
1770: 62 53 74 72 44 75 70 28 64 62 2c 20 7a 4e 61 6d  bStrDup(db, zNam
1780: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
1790: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d  LITE_OK && pNew-
17a0: 3e 7a 44 62 53 4e 61 6d 65 3d 3d 30 20 29 7b 0a  >zDbSName==0 ){.
17b0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17c0: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
17d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
17e0: 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
17f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1800: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
1810: 73 71 6c 69 74 65 33 43 6f 64 65 63 41 74 74 61  sqlite3CodecAtta
1820: 63 68 28 73 71 6c 69 74 65 33 2a 2c 20 69 6e 74  ch(sqlite3*, int
1830: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 20 69  , const void*, i
1840: 6e 74 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20  nt);.    extern 
1850: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
1860: 63 47 65 74 4b 65 79 28 73 71 6c 69 74 65 33 2a  cGetKey(sqlite3*
1870: 2c 20 69 6e 74 2c 20 76 6f 69 64 2a 2a 2c 20 69  , int, void**, i
1880: 6e 74 2a 29 3b 0a 20 20 20 20 69 6e 74 20 6e 4b  nt*);.    int nK
1890: 65 79 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4b  ey;.    char *zK
18a0: 65 79 3b 0a 20 20 20 20 69 6e 74 20 74 20 3d 20  ey;.    int t = 
18b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
18c0: 70 65 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  pe(argv[2]);.   
18d0: 20 73 77 69 74 63 68 28 20 74 20 29 7b 0a 20 20   switch( t ){.  
18e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18f0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 63  INTEGER:.      c
1900: 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54  ase SQLITE_FLOAT
1910: 3a 0a 20 20 20 20 20 20 20 20 7a 45 72 72 44 79  :.        zErrDy
1920: 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  n = sqlite3DbStr
1930: 44 75 70 28 64 62 2c 20 22 49 6e 76 61 6c 69 64  Dup(db, "Invalid
1940: 20 6b 65 79 20 76 61 6c 75 65 22 29 3b 0a 20 20   key value");.  
1950: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1960: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
1970: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1980: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
1990: 54 45 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 63  TE_TEXT:.      c
19a0: 61 73 65 20 53 51 4c 49 54 45 5f 42 4c 4f 42 3a  ase SQLITE_BLOB:
19b0: 0a 20 20 20 20 20 20 20 20 6e 4b 65 79 20 3d 20  .        nKey = 
19c0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
19d0: 74 65 73 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  tes(argv[2]);.  
19e0: 20 20 20 20 20 20 7a 4b 65 79 20 3d 20 28 63 68        zKey = (ch
19f0: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
1a00: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 32 5d 29  ue_blob(argv[2])
1a10: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1a20: 71 6c 69 74 65 33 43 6f 64 65 63 41 74 74 61 63  qlite3CodecAttac
1a30: 68 28 64 62 2c 20 64 62 2d 3e 6e 44 62 2d 31 2c  h(db, db->nDb-1,
1a40: 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20 20   zKey, nKey);.  
1a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1a60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a70: 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20 20 2f 2a  NULL:.        /*
1a80: 20 4e 6f 20 6b 65 79 20 73 70 65 63 69 66 69 65   No key specifie
1a90: 64 2e 20 20 55 73 65 20 74 68 65 20 6b 65 79 20  d.  Use the key 
1aa0: 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 64 61  from the main da
1ab0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
1ac0: 20 20 73 71 6c 69 74 65 33 43 6f 64 65 63 47 65    sqlite3CodecGe
1ad0: 74 4b 65 79 28 64 62 2c 20 30 2c 20 28 76 6f 69  tKey(db, 0, (voi
1ae0: 64 2a 2a 29 26 7a 4b 65 79 2c 20 26 6e 4b 65 79  d**)&zKey, &nKey
1af0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1b00: 4b 65 79 20 7c 7c 20 73 71 6c 69 74 65 33 42 74  Key || sqlite3Bt
1b10: 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73  reeGetOptimalRes
1b20: 65 72 76 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  erve(db->aDb[0].
1b30: 70 42 74 29 3e 30 20 29 7b 0a 20 20 20 20 20 20  pBt)>0 ){.      
1b40: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b50: 43 6f 64 65 63 41 74 74 61 63 68 28 64 62 2c 20  CodecAttach(db, 
1b60: 64 62 2d 3e 6e 44 62 2d 31 2c 20 7a 4b 65 79 2c  db->nDb-1, zKey,
1b70: 20 6e 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   nKey);.        
1b80: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1b90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1ba0: 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66  f..  /* If the f
1bb0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 73  ile was opened s
1bc0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65 61  uccessfully, rea
1bd0: 64 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  d the schema for
1be0: 20 74 68 65 20 6e 65 77 20 64 61 74 61 62 61 73   the new databas
1bf0: 65 2e 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  e..  ** If this 
1c00: 66 61 69 6c 73 2c 20 6f 72 20 69 66 20 6f 70 65  fails, or if ope
1c10: 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 66 61  ning the file fa
1c20: 69 6c 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65  iled, then close
1c30: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 20   the file and . 
1c40: 20 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 65   ** remove the e
1c50: 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 64 62  ntry from the db
1c60: 2d 3e 61 44 62 5b 5d 20 61 72 72 61 79 2e 20 69  ->aDb[] array. i
1c70: 2e 65 2e 20 70 75 74 20 65 76 65 72 79 74 68 69  .e. put everythi
1c80: 6e 67 20 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  ng back the.  **
1c90: 20 77 61 79 20 77 65 20 66 6f 75 6e 64 20 69 74   way we found it
1ca0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
1cb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cc0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1cd0: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20  terAll(db);.    
1ce0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 20 3d 20 30  db->init.iDb = 0
1cf0: 3b 0a 20 20 20 20 64 62 2d 3e 6d 44 62 46 6c 61  ;.    db->mDbFla
1d00: 67 73 20 26 3d 20 7e 28 44 42 46 4c 41 47 5f 53  gs &= ~(DBFLAG_S
1d10: 63 68 65 6d 61 4b 6e 6f 77 6e 4f 6b 29 3b 0a 20  chemaKnownOk);. 
1d20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
1d30: 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 44 79 6e  nit(db, &zErrDyn
1d40: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
1d50: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
1d60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 45 72  .    assert( zEr
1d70: 72 44 79 6e 3d 3d 30 20 7c 7c 20 72 63 21 3d 53  rDyn==0 || rc!=S
1d80: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a  QLITE_OK );.  }.
1d90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53  #ifdef SQLITE_US
1da0: 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f  ER_AUTHENTICATIO
1db0: 4e 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  N.  if( rc==SQLI
1dc0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 38 20  TE_OK ){.    u8 
1dd0: 6e 65 77 41 75 74 68 20 3d 20 30 3b 0a 20 20 20  newAuth = 0;.   
1de0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 55 73 65   rc = sqlite3Use
1df0: 72 41 75 74 68 43 68 65 63 6b 4c 6f 67 69 6e 28  rAuthCheckLogin(
1e00: 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 6e 65 77 41  db, zName, &newA
1e10: 75 74 68 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  uth);.    if( ne
1e20: 77 41 75 74 68 3c 64 62 2d 3e 61 75 74 68 2e 61  wAuth<db->auth.a
1e30: 75 74 68 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20  uthLevel ){.    
1e40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 55    rc = SQLITE_AU
1e50: 54 48 5f 55 53 45 52 3b 0a 20 20 20 20 7d 0a 20  TH_USER;.    }. 
1e60: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
1e70: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 52  rc ){.    if( !R
1e80: 45 4f 50 45 4e 5f 41 53 5f 4d 45 4d 44 42 28 64  EOPEN_AS_MEMDB(d
1e90: 62 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  b) ){.      int 
1ea0: 69 44 62 20 3d 20 64 62 2d 3e 6e 44 62 20 2d 20  iDb = db->nDb - 
1eb0: 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  1;.      assert(
1ec0: 20 69 44 62 3e 3d 32 20 29 3b 0a 20 20 20 20 20   iDb>=2 );.     
1ed0: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 44 62   if( db->aDb[iDb
1ee0: 5d 2e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ].pBt ){.       
1ef0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
1f00: 73 65 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  se(db->aDb[iDb].
1f10: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 64 62  pBt);.        db
1f20: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 20 3d  ->aDb[iDb].pBt =
1f30: 20 30 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e   0;.        db->
1f40: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
1f50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1f60: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65 74      sqlite3Reset
1f70: 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e  AllSchemasOfConn
1f80: 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 20 20  ection(db);.    
1f90: 20 20 64 62 2d 3e 6e 44 62 20 3d 20 69 44 62 3b    db->nDb = iDb;
1fa0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1fb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 72  QLITE_NOMEM || r
1fc0: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
1fd0: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20  NOMEM ){.       
1fe0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
1ff0: 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71  (db);.        sq
2000: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2010: 7a 45 72 72 44 79 6e 29 3b 0a 20 20 20 20 20 20  zErrDyn);.      
2020: 20 20 7a 45 72 72 44 79 6e 20 3d 20 73 71 6c 69    zErrDyn = sqli
2030: 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
2040: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b  out of memory");
2050: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2060: 20 7a 45 72 72 44 79 6e 3d 3d 30 20 29 7b 0a 20   zErrDyn==0 ){. 
2070: 20 20 20 20 20 20 20 7a 45 72 72 44 79 6e 20 3d         zErrDyn =
2080: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
2090: 64 62 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f  db, "unable to o
20a0: 70 65 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73  pen database: %s
20b0: 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
20c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74   }.    }.    got
20d0: 6f 20 61 74 74 61 63 68 5f 65 72 72 6f 72 3b 0a  o attach_error;.
20e0: 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 3b    }.  .  return;
20f0: 0a 0a 61 74 74 61 63 68 5f 65 72 72 6f 72 3a 0a  ..attach_error:.
2100: 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 65    /* Return an e
2110: 72 72 6f 72 20 69 66 20 77 65 20 67 65 74 20 68  rror if we get h
2120: 65 72 65 20 2a 2f 0a 20 20 69 66 28 20 7a 45 72  ere */.  if( zEr
2130: 72 44 79 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  rDyn ){.    sqli
2140: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2150: 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 44 79  (context, zErrDy
2160: 6e 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  n, -1);.    sqli
2170: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45  te3DbFree(db, zE
2180: 72 72 44 79 6e 29 3b 0a 20 20 7d 0a 20 20 69 66  rrDyn);.  }.  if
2190: 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 5f 72  ( rc ) sqlite3_r
21a0: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
21b0: 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 7d  (context, rc);.}
21c0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 53 51 4c 20 75  ../*.** An SQL u
21d0: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 72 65 67  ser-function reg
21e0: 69 73 74 65 72 65 64 20 74 6f 20 64 6f 20 74 68  istered to do th
21f0: 65 20 77 6f 72 6b 20 6f 66 20 61 6e 20 44 45 54  e work of an DET
2200: 41 43 48 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  ACH statement. T
2210: 68 65 0a 2a 2a 20 74 68 72 65 65 20 61 72 67 75  he.** three argu
2220: 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 66 75 6e  ments to the fun
2230: 63 74 69 6f 6e 20 63 6f 6d 65 20 64 69 72 65 63  ction come direc
2240: 74 6c 79 20 66 72 6f 6d 20 61 20 64 65 74 61 63  tly from a detac
2250: 68 20 73 74 61 74 65 6d 65 6e 74 3a 0a 2a 2a 0a  h statement:.**.
2260: 2a 2a 20 20 20 20 20 44 45 54 41 43 48 20 44 41  **     DETACH DA
2270: 54 41 42 41 53 45 20 78 0a 2a 2a 0a 2a 2a 20 20  TABASE x.**.**  
2280: 20 20 20 53 45 4c 45 43 54 20 73 71 6c 69 74 65     SELECT sqlite
2290: 5f 64 65 74 61 63 68 28 78 29 0a 2a 2f 0a 73 74  _detach(x).*/.st
22a0: 61 74 69 63 20 76 6f 69 64 20 64 65 74 61 63 68  atic void detach
22b0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
22c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
22d0: 2c 0a 20 20 69 6e 74 20 4e 6f 74 55 73 65 64 2c  ,.  int NotUsed,
22e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
22f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e   **argv.){.  con
2300: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2310: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
2320: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
2330: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71  t(argv[0]);.  sq
2340: 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
2350: 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
2360: 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a  andle(context);.
2370: 20 20 69 6e 74 20 69 3b 0a 20 20 44 62 20 2a 70    int i;.  Db *p
2380: 44 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  Db = 0;.  char z
2390: 45 72 72 5b 31 32 38 5d 3b 0a 0a 20 20 55 4e 55  Err[128];..  UNU
23a0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
23b0: 74 55 73 65 64 29 3b 0a 0a 20 20 69 66 28 20 7a  tUsed);..  if( z
23c0: 4e 61 6d 65 3d 3d 30 20 29 20 7a 4e 61 6d 65 20  Name==0 ) zName 
23d0: 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  = "";.  for(i=0;
23e0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
23f0: 7b 0a 20 20 20 20 70 44 62 20 3d 20 26 64 62 2d  {.    pDb = &db-
2400: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
2410: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 20 63   pDb->pBt==0 ) c
2420: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2430: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2440: 70 44 62 2d 3e 7a 44 62 53 4e 61 6d 65 2c 20 7a  pDb->zDbSName, z
2450: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
2460: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 3e 3d  ;.  }..  if( i>=
2470: 64 62 2d 3e 6e 44 62 20 29 7b 0a 20 20 20 20 73  db->nDb ){.    s
2480: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2490: 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 7a 45 72  sizeof(zErr),zEr
24a0: 72 2c 20 22 6e 6f 20 73 75 63 68 20 64 61 74 61  r, "no such data
24b0: 62 61 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65  base: %s", zName
24c0: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 64 65 74 61  );.    goto deta
24d0: 63 68 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ch_error;.  }.  
24e0: 69 66 28 20 69 3c 32 20 29 7b 0a 20 20 20 20 73  if( i<2 ){.    s
24f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2500: 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 7a 45 72  sizeof(zErr),zEr
2510: 72 2c 20 22 63 61 6e 6e 6f 74 20 64 65 74 61 63  r, "cannot detac
2520: 68 20 64 61 74 61 62 61 73 65 20 25 73 22 2c 20  h database %s", 
2530: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
2540: 20 64 65 74 61 63 68 5f 65 72 72 6f 72 3b 0a 20   detach_error;. 
2550: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
2560: 42 74 72 65 65 49 73 49 6e 52 65 61 64 54 72 61  BtreeIsInReadTra
2570: 6e 73 28 70 44 62 2d 3e 70 42 74 29 20 7c 7c 20  ns(pDb->pBt) || 
2580: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
2590: 42 61 63 6b 75 70 28 70 44 62 2d 3e 70 42 74 29  Backup(pDb->pBt)
25a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
25b0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
25c0: 7a 45 72 72 29 2c 7a 45 72 72 2c 20 22 64 61 74  zErr),zErr, "dat
25d0: 61 62 61 73 65 20 25 73 20 69 73 20 6c 6f 63 6b  abase %s is lock
25e0: 65 64 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ed", zName);.   
25f0: 20 67 6f 74 6f 20 64 65 74 61 63 68 5f 65 72 72   goto detach_err
2600: 6f 72 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  or;.  }..  sqlit
2610: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
2620: 2d 3e 70 42 74 29 3b 0a 20 20 70 44 62 2d 3e 70  ->pBt);.  pDb->p
2630: 42 74 20 3d 20 30 3b 0a 20 20 70 44 62 2d 3e 70  Bt = 0;.  pDb->p
2640: 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 73 71  Schema = 0;.  sq
2650: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
2660: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
2670: 20 20 72 65 74 75 72 6e 3b 0a 0a 64 65 74 61 63    return;..detac
2680: 68 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74  h_error:.  sqlit
2690: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
26a0: 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 2c 20 2d  context, zErr, -
26b0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  1);.}../*.** Thi
26c0: 73 20 70 72 6f 63 65 64 75 72 65 20 67 65 6e 65  s procedure gene
26d0: 72 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20  rates VDBE code 
26e0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 69 6e 76  for a single inv
26f0: 6f 63 61 74 69 6f 6e 20 6f 66 20 65 69 74 68 65  ocation of eithe
2700: 72 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f  r the.** sqlite_
2710: 64 65 74 61 63 68 28 29 20 6f 72 20 73 71 6c 69  detach() or sqli
2720: 74 65 5f 61 74 74 61 63 68 28 29 20 53 51 4c 20  te_attach() SQL 
2730: 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  user functions..
2740: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2750: 6f 64 65 41 74 74 61 63 68 28 0a 20 20 50 61 72  odeAttach(.  Par
2760: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
2770: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2780: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
2790: 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20   type,          
27a0: 20 20 2f 2a 20 45 69 74 68 65 72 20 53 51 4c 49    /* Either SQLI
27b0: 54 45 5f 41 54 54 41 43 48 20 6f 72 20 53 51 4c  TE_ATTACH or SQL
27c0: 49 54 45 5f 44 45 54 41 43 48 20 2a 2f 0a 20 20  ITE_DETACH */.  
27d0: 46 75 6e 63 44 65 66 20 63 6f 6e 73 74 20 2a 70  FuncDef const *p
27e0: 46 75 6e 63 2c 2f 2a 20 46 75 6e 63 44 65 66 20  Func,/* FuncDef 
27f0: 77 72 61 70 70 65 72 20 66 6f 72 20 64 65 74 61  wrapper for deta
2800: 63 68 46 75 6e 63 28 29 20 6f 72 20 61 74 74 61  chFunc() or atta
2810: 63 68 46 75 6e 63 28 29 20 2a 2f 0a 20 20 45 78  chFunc() */.  Ex
2820: 70 72 20 2a 70 41 75 74 68 41 72 67 2c 20 20 20  pr *pAuthArg,   
2830: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
2840: 20 74 6f 20 70 61 73 73 20 74 6f 20 61 75 74 68   to pass to auth
2850: 6f 72 69 7a 61 74 69 6f 6e 20 63 61 6c 6c 62 61  orization callba
2860: 63 6b 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 46  ck */.  Expr *pF
2870: 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20  ilename,     /* 
2880: 4e 61 6d 65 20 6f 66 20 64 61 74 61 62 61 73 65  Name of database
2890: 20 66 69 6c 65 20 2a 2f 0a 20 20 45 78 70 72 20   file */.  Expr 
28a0: 2a 70 44 62 6e 61 6d 65 2c 20 20 20 20 20 20 20  *pDbname,       
28b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
28c0: 61 74 61 62 61 73 65 20 74 6f 20 75 73 65 20 69  atabase to use i
28d0: 6e 74 65 72 6e 61 6c 6c 79 20 2a 2f 0a 20 20 45  nternally */.  E
28e0: 78 70 72 20 2a 70 4b 65 79 20 20 20 20 20 20 20  xpr *pKey       
28f0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2900: 6b 65 79 20 66 6f 72 20 65 6e 63 72 79 70 74 69  key for encrypti
2910: 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a  on extension */.
2920: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4e  ){.  int rc;.  N
2930: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 61 6d 65  ameContext sName
2940: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
2950: 71 6c 69 74 65 33 2a 20 64 62 20 3d 20 70 50 61  qlite3* db = pPa
2960: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  rse->db;.  int r
2970: 65 67 41 72 67 73 3b 0a 0a 20 20 69 66 28 20 70  egArgs;..  if( p
2980: 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f  Parse->nErr ) go
2990: 74 6f 20 61 74 74 61 63 68 5f 65 6e 64 3b 0a 20  to attach_end;. 
29a0: 20 6d 65 6d 73 65 74 28 26 73 4e 61 6d 65 2c 20   memset(&sName, 
29b0: 30 2c 20 73 69 7a 65 6f 66 28 4e 61 6d 65 43 6f  0, sizeof(NameCo
29c0: 6e 74 65 78 74 29 29 3b 0a 20 20 73 4e 61 6d 65  ntext));.  sName
29d0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
29e0: 3b 0a 0a 20 20 69 66 28 20 0a 20 20 20 20 20 20  ;..  if( .      
29f0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2a00: 20 72 65 73 6f 6c 76 65 41 74 74 61 63 68 45 78   resolveAttachEx
2a10: 70 72 28 26 73 4e 61 6d 65 2c 20 70 46 69 6c 65  pr(&sName, pFile
2a20: 6e 61 6d 65 29 29 20 7c 7c 0a 20 20 20 20 20 20  name)) ||.      
2a30: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2a40: 20 72 65 73 6f 6c 76 65 41 74 74 61 63 68 45 78   resolveAttachEx
2a50: 70 72 28 26 73 4e 61 6d 65 2c 20 70 44 62 6e 61  pr(&sName, pDbna
2a60: 6d 65 29 29 20 7c 7c 0a 20 20 20 20 20 20 53 51  me)) ||.      SQ
2a70: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
2a80: 65 73 6f 6c 76 65 41 74 74 61 63 68 45 78 70 72  esolveAttachExpr
2a90: 28 26 73 4e 61 6d 65 2c 20 70 4b 65 79 29 29 0a  (&sName, pKey)).
2aa0: 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 74    ){.    goto at
2ab0: 74 61 63 68 5f 65 6e 64 3b 0a 20 20 7d 0a 0a 23  tach_end;.  }..#
2ac0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2ad0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
2ae0: 0a 20 20 69 66 28 20 70 41 75 74 68 41 72 67 20  .  if( pAuthArg 
2af0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 41 75  ){.    char *zAu
2b00: 74 68 41 72 67 3b 0a 20 20 20 20 69 66 28 20 70  thArg;.    if( p
2b10: 41 75 74 68 41 72 67 2d 3e 6f 70 3d 3d 54 4b 5f  AuthArg->op==TK_
2b20: 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 20 20  STRING ){.      
2b30: 7a 41 75 74 68 41 72 67 20 3d 20 70 41 75 74 68  zAuthArg = pAuth
2b40: 41 72 67 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20  Arg->u.zToken;. 
2b50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b60: 7a 41 75 74 68 41 72 67 20 3d 20 30 3b 0a 20 20  zAuthArg = 0;.  
2b70: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
2b80: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
2b90: 61 72 73 65 2c 20 74 79 70 65 2c 20 7a 41 75 74  arse, type, zAut
2ba0: 68 41 72 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  hArg, 0, 0);.   
2bb0: 20 69 66 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f   if(rc!=SQLITE_O
2bc0: 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
2bd0: 61 74 74 61 63 68 5f 65 6e 64 3b 0a 20 20 20 20  attach_end;.    
2be0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
2bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
2c00: 4f 52 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 20  ORIZATION */... 
2c10: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
2c20: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 72  dbe(pParse);.  r
2c30: 65 67 41 72 67 73 20 3d 20 73 71 6c 69 74 65 33  egArgs = sqlite3
2c40: 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70 50 61  GetTempRange(pPa
2c50: 72 73 65 2c 20 34 29 3b 0a 20 20 73 71 6c 69 74  rse, 4);.  sqlit
2c60: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
2c70: 65 2c 20 70 46 69 6c 65 6e 61 6d 65 2c 20 72 65  e, pFilename, re
2c80: 67 41 72 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  gArgs);.  sqlite
2c90: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
2ca0: 2c 20 70 44 62 6e 61 6d 65 2c 20 72 65 67 41 72  , pDbname, regAr
2cb0: 67 73 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  gs+1);.  sqlite3
2cc0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
2cd0: 20 70 4b 65 79 2c 20 72 65 67 41 72 67 73 2b 32   pKey, regArgs+2
2ce0: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 76 20  );..  assert( v 
2cf0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
2d00: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 76 20 29  led );.  if( v )
2d10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
2d20: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75  eAddOp4(v, OP_Fu
2d30: 6e 63 74 69 6f 6e 30 2c 20 30 2c 20 72 65 67 41  nction0, 0, regA
2d40: 72 67 73 2b 33 2d 70 46 75 6e 63 2d 3e 6e 41 72  rgs+3-pFunc->nAr
2d50: 67 2c 20 72 65 67 41 72 67 73 2b 33 2c 0a 20 20  g, regArgs+3,.  
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 28 63 68 61 72 20 2a 29 70 46 75 6e      (char *)pFun
2d80: 63 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a  c, P4_FUNCDEF);.
2d90: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 75 6e      assert( pFun
2da0: 63 2d 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 28  c->nArg==-1 || (
2db0: 70 46 75 6e 63 2d 3e 6e 41 72 67 26 30 78 66 66  pFunc->nArg&0xff
2dc0: 29 3d 3d 70 46 75 6e 63 2d 3e 6e 41 72 67 20 29  )==pFunc->nArg )
2dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
2de0: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38  eChangeP5(v, (u8
2df0: 29 28 70 46 75 6e 63 2d 3e 6e 41 72 67 29 29 3b  )(pFunc->nArg));
2e00: 0a 20 0a 20 20 20 20 2f 2a 20 43 6f 64 65 20 61  . .    /* Code a
2e10: 6e 20 4f 50 5f 45 78 70 69 72 65 2e 20 46 6f 72  n OP_Expire. For
2e20: 20 61 6e 20 41 54 54 41 43 48 20 73 74 61 74 65   an ATTACH state
2e30: 6d 65 6e 74 2c 20 73 65 74 20 50 31 20 74 6f 20  ment, set P1 to 
2e40: 74 72 75 65 20 28 65 78 70 69 72 65 20 74 68 69  true (expire thi
2e50: 73 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  s.    ** stateme
2e60: 6e 74 20 6f 6e 6c 79 29 2e 20 46 6f 72 20 44 45  nt only). For DE
2e70: 54 41 43 48 2c 20 73 65 74 20 69 74 20 74 6f 20  TACH, set it to 
2e80: 66 61 6c 73 65 20 28 65 78 70 69 72 65 20 61 6c  false (expire al
2e90: 6c 20 65 78 69 73 74 69 6e 67 0a 20 20 20 20 2a  l existing.    *
2ea0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 29 2e 0a 20  * statements).. 
2eb0: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2ec0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
2ed0: 50 5f 45 78 70 69 72 65 2c 20 28 74 79 70 65 3d  P_Expire, (type=
2ee0: 3d 53 51 4c 49 54 45 5f 41 54 54 41 43 48 29 29  =SQLITE_ATTACH))
2ef0: 3b 0a 20 20 7d 0a 20 20 0a 61 74 74 61 63 68 5f  ;.  }.  .attach_
2f00: 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  end:.  sqlite3Ex
2f10: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 46 69  prDelete(db, pFi
2f20: 6c 65 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  lename);.  sqlit
2f30: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
2f40: 20 70 44 62 6e 61 6d 65 29 3b 0a 20 20 73 71 6c   pDbname);.  sql
2f50: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
2f60: 62 2c 20 70 4b 65 79 29 3b 0a 7d 0a 0a 2f 2a 0a  b, pKey);.}../*.
2f70: 2a 2a 20 43 61 6c 6c 65 64 20 62 79 20 74 68 65  ** Called by the
2f80: 20 70 61 72 73 65 72 20 74 6f 20 63 6f 6d 70 69   parser to compi
2f90: 6c 65 20 61 20 44 45 54 41 43 48 20 73 74 61 74  le a DETACH stat
2fa0: 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ement..**.**    
2fb0: 20 44 45 54 41 43 48 20 70 44 62 6e 61 6d 65 0a   DETACH pDbname.
2fc0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
2fd0: 65 74 61 63 68 28 50 61 72 73 65 20 2a 70 50 61  etach(Parse *pPa
2fe0: 72 73 65 2c 20 45 78 70 72 20 2a 70 44 62 6e 61  rse, Expr *pDbna
2ff0: 6d 65 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  me){.  static co
3000: 6e 73 74 20 46 75 6e 63 44 65 66 20 64 65 74 61  nst FuncDef deta
3010: 63 68 5f 66 75 6e 63 20 3d 20 7b 0a 20 20 20 20  ch_func = {.    
3020: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
3030: 20 20 2f 2a 20 6e 41 72 67 20 2a 2f 0a 20 20 20    /* nArg */.   
3040: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 20 20   SQLITE_UTF8,   
3050: 20 20 20 2f 2a 20 66 75 6e 63 46 6c 61 67 73 20     /* funcFlags 
3060: 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
3070: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 55 73 65           /* pUse
3080: 72 44 61 74 61 20 2a 2f 0a 20 20 20 20 30 2c 20  rData */.    0, 
3090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
30a0: 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 64  * pNext */.    d
30b0: 65 74 61 63 68 46 75 6e 63 2c 20 20 20 20 20 20  etachFunc,      
30c0: 20 2f 2a 20 78 53 46 75 6e 63 20 2a 2f 0a 20 20   /* xSFunc */.  
30d0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
30e0: 20 20 20 20 2f 2a 20 78 46 69 6e 61 6c 69 7a 65      /* xFinalize
30f0: 20 2a 2f 0a 20 20 20 20 22 73 71 6c 69 74 65 5f   */.    "sqlite_
3100: 64 65 74 61 63 68 22 2c 20 20 2f 2a 20 7a 4e 61  detach",  /* zNa
3110: 6d 65 20 2a 2f 0a 20 20 20 20 7b 30 7d 0a 20 20  me */.    {0}.  
3120: 7d 3b 0a 20 20 63 6f 64 65 41 74 74 61 63 68 28  };.  codeAttach(
3130: 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44  pParse, SQLITE_D
3140: 45 54 41 43 48 2c 20 26 64 65 74 61 63 68 5f 66  ETACH, &detach_f
3150: 75 6e 63 2c 20 70 44 62 6e 61 6d 65 2c 20 30 2c  unc, pDbname, 0,
3160: 20 30 2c 20 70 44 62 6e 61 6d 65 29 3b 0a 7d 0a   0, pDbname);.}.
3170: 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 62 79  ./*.** Called by
3180: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 63   the parser to c
3190: 6f 6d 70 69 6c 65 20 61 6e 20 41 54 54 41 43 48  ompile an ATTACH
31a0: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
31b0: 2a 20 20 20 20 20 41 54 54 41 43 48 20 70 20 41  *     ATTACH p A
31c0: 53 20 70 44 62 6e 61 6d 65 20 4b 45 59 20 70 4b  S pDbname KEY pK
31d0: 65 79 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ey.*/.void sqlit
31e0: 65 33 41 74 74 61 63 68 28 50 61 72 73 65 20 2a  e3Attach(Parse *
31f0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 2c  pParse, Expr *p,
3200: 20 45 78 70 72 20 2a 70 44 62 6e 61 6d 65 2c 20   Expr *pDbname, 
3210: 45 78 70 72 20 2a 70 4b 65 79 29 7b 0a 20 20 73  Expr *pKey){.  s
3220: 74 61 74 69 63 20 63 6f 6e 73 74 20 46 75 6e 63  tatic const Func
3230: 44 65 66 20 61 74 74 61 63 68 5f 66 75 6e 63 20  Def attach_func 
3240: 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
3250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 41 72            /* nAr
3260: 67 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f  g */.    SQLITE_
3270: 55 54 46 38 2c 20 20 20 20 20 20 2f 2a 20 66 75  UTF8,      /* fu
3280: 6e 63 46 6c 61 67 73 20 2a 2f 0a 20 20 20 20 30  ncFlags */.    0
3290: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32a0: 20 2f 2a 20 70 55 73 65 72 44 61 74 61 20 2a 2f   /* pUserData */
32b0: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
32c0: 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
32d0: 2a 2f 0a 20 20 20 20 61 74 74 61 63 68 46 75 6e  */.    attachFun
32e0: 63 2c 20 20 20 20 20 20 20 2f 2a 20 78 53 46 75  c,       /* xSFu
32f0: 6e 63 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  nc */.    0,    
3300: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
3310: 46 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 20 20  Finalize */.    
3320: 22 73 71 6c 69 74 65 5f 61 74 74 61 63 68 22 2c  "sqlite_attach",
3330: 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
3340: 20 20 7b 30 7d 0a 20 20 7d 3b 0a 20 20 63 6f 64    {0}.  };.  cod
3350: 65 41 74 74 61 63 68 28 70 50 61 72 73 65 2c 20  eAttach(pParse, 
3360: 53 51 4c 49 54 45 5f 41 54 54 41 43 48 2c 20 26  SQLITE_ATTACH, &
3370: 61 74 74 61 63 68 5f 66 75 6e 63 2c 20 70 2c 20  attach_func, p, 
3380: 70 2c 20 70 44 62 6e 61 6d 65 2c 20 70 4b 65 79  p, pDbname, pKey
3390: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
33a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 54 54 41 43  QLITE_OMIT_ATTAC
33b0: 48 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  H */../*.** Init
33c0: 69 61 6c 69 7a 65 20 61 20 44 62 46 69 78 65 72  ialize a DbFixer
33d0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 69   structure.  Thi
33e0: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
33f0: 65 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 0a 2a  e called prior.*
3400: 2a 20 74 6f 20 70 61 73 73 69 6e 67 20 74 68 65  * to passing the
3410: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 6f 6e   structure to on
3420: 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 46  e of the sqliteF
3430: 69 78 41 41 41 41 28 29 20 72 6f 75 74 69 6e 65  ixAAAA() routine
3440: 73 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 76 6f 69 64  s below..*/.void
3450: 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28   sqlite3FixInit(
3460: 0a 20 20 44 62 46 69 78 65 72 20 2a 70 46 69 78  .  DbFixer *pFix
3470: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  ,      /* The fi
3480: 78 65 72 20 74 6f 20 62 65 20 69 6e 69 74 69 61  xer to be initia
3490: 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72 73 65  lized */.  Parse
34a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
34b0: 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 73  * Error messages
34c0: 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e   will be written
34d0: 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 69   here */.  int i
34e0: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db,            /
34f0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64 61  * This is the da
3500: 74 61 62 61 73 65 20 74 68 61 74 20 6d 75 73 74  tabase that must
3510: 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f   be used */.  co
3520: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
3530: 20 20 2f 2a 20 22 76 69 65 77 22 2c 20 22 74 72    /* "view", "tr
3540: 69 67 67 65 72 22 2c 20 6f 72 20 22 69 6e 64 65  igger", or "inde
3550: 78 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  x" */.  const To
3560: 6b 65 6e 20 2a 70 4e 61 6d 65 20 20 2f 2a 20 4e  ken *pName  /* N
3570: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 2c  ame of the view,
3580: 20 74 72 69 67 67 65 72 2c 20 6f 72 20 69 6e 64   trigger, or ind
3590: 65 78 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ex */.){.  sqlit
35a0: 65 33 20 2a 64 62 3b 0a 0a 20 20 64 62 20 3d 20  e3 *db;..  db = 
35b0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
35c0: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3e 69 44  sert( db->nDb>iD
35d0: 62 20 29 3b 0a 20 20 70 46 69 78 2d 3e 70 50 61  b );.  pFix->pPa
35e0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
35f0: 70 46 69 78 2d 3e 7a 44 62 20 3d 20 64 62 2d 3e  pFix->zDb = db->
3600: 61 44 62 5b 69 44 62 5d 2e 7a 44 62 53 4e 61 6d  aDb[iDb].zDbSNam
3610: 65 3b 0a 20 20 70 46 69 78 2d 3e 70 53 63 68 65  e;.  pFix->pSche
3620: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
3630: 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 46 69  ].pSchema;.  pFi
3640: 78 2d 3e 7a 54 79 70 65 20 3d 20 7a 54 79 70 65  x->zType = zType
3650: 3b 0a 20 20 70 46 69 78 2d 3e 70 4e 61 6d 65 20  ;.  pFix->pName 
3660: 3d 20 70 4e 61 6d 65 3b 0a 20 20 70 46 69 78 2d  = pName;.  pFix-
3670: 3e 62 56 61 72 4f 6e 6c 79 20 3d 20 28 69 44 62  >bVarOnly = (iDb
3680: 3d 3d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ==1);.}../*.** T
3690: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74  he following set
36a0: 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 77 61 6c   of routines wal
36b0: 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 61  k through the pa
36c0: 72 73 65 20 74 72 65 65 20 61 6e 64 20 61 73 73  rse tree and ass
36d0: 69 67 6e 0a 2a 2a 20 61 20 73 70 65 63 69 66 69  ign.** a specifi
36e0: 63 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 6c  c database to al
36f0: 6c 20 74 61 62 6c 65 20 72 65 66 65 72 65 6e 63  l table referenc
3700: 65 73 20 77 68 65 72 65 20 74 68 65 20 64 61 74  es where the dat
3710: 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 77 61  abase name.** wa
3720: 73 20 6c 65 66 74 20 75 6e 73 70 65 63 69 66 69  s left unspecifi
3730: 65 64 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e  ed in the origin
3740: 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  al SQL statement
3750: 2e 20 20 54 68 65 20 70 46 69 78 20 73 74 72 75  .  The pFix stru
3760: 63 74 75 72 65 0a 2a 2a 20 6d 75 73 74 20 68 61  cture.** must ha
3770: 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ve been initiali
3780: 7a 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63  zed by a prior c
3790: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 69  all to sqlite3Fi
37a0: 78 49 6e 69 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  xInit()..**.** T
37b0: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
37c0: 65 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73  e used to make s
37d0: 75 72 65 20 74 68 61 74 20 61 6e 20 69 6e 64 65  ure that an inde
37e0: 78 2c 20 74 72 69 67 67 65 72 2c 20 6f 72 0a 2a  x, trigger, or.*
37f0: 2a 20 76 69 65 77 20 69 6e 20 6f 6e 65 20 64 61  * view in one da
3800: 74 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20  tabase does not 
3810: 72 65 66 65 72 20 74 6f 20 6f 62 6a 65 63 74 73  refer to objects
3820: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
3830: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 28 45 78  database..** (Ex
3840: 63 65 70 74 69 6f 6e 3a 20 69 6e 64 69 63 65 73  ception: indices
3850: 2c 20 74 72 69 67 67 65 72 73 2c 20 61 6e 64 20  , triggers, and 
3860: 76 69 65 77 73 20 69 6e 20 74 68 65 20 54 45 4d  views in the TEM
3870: 50 20 64 61 74 61 62 61 73 65 20 61 72 65 0a 2a  P database are.*
3880: 2a 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66  * allowed to ref
3890: 65 72 20 74 6f 20 61 6e 79 74 68 69 6e 67 2e 29  er to anything.)
38a0: 20 20 49 66 20 61 20 72 65 66 65 72 65 6e 63 65    If a reference
38b0: 20 69 73 20 65 78 70 6c 69 63 69 74 6c 79 20 6d   is explicitly m
38c0: 61 64 65 0a 2a 2a 20 74 6f 20 61 6e 20 6f 62 6a  ade.** to an obj
38d0: 65 63 74 20 69 6e 20 61 20 64 69 66 66 65 72 65  ect in a differe
38e0: 6e 74 20 64 61 74 61 62 61 73 65 2c 20 61 6e 20  nt database, an 
38f0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
3900: 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 70 50 61   added to.** pPa
3910: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 61 6e 64  rse->zErrMsg and
3920: 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   these routines 
3930: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
3940: 20 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 0a    If everything.
3950: 2a 2a 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74  ** checks out, t
3960: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 72 65  hese routines re
3970: 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  turn 0..*/.int s
3980: 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
3990: 28 0a 20 20 44 62 46 69 78 65 72 20 2a 70 46 69  (.  DbFixer *pFi
39a0: 78 2c 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  x,       /* Cont
39b0: 65 78 74 20 6f 66 20 74 68 65 20 66 69 78 61 74  ext of the fixat
39c0: 69 6f 6e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ion */.  SrcList
39d0: 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20 2f 2a   *pList       /*
39e0: 20 54 68 65 20 53 6f 75 72 63 65 20 6c 69 73 74   The Source list
39f0: 20 74 6f 20 63 68 65 63 6b 20 61 6e 64 20 6d 6f   to check and mo
3a00: 64 69 66 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  dify */.){.  int
3a10: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
3a20: 20 2a 7a 44 62 3b 0a 20 20 73 74 72 75 63 74 20   *zDb;.  struct 
3a30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
3a40: 74 65 6d 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45  tem;..  if( NEVE
3a50: 52 28 70 4c 69 73 74 3d 3d 30 29 20 29 20 72 65  R(pList==0) ) re
3a60: 74 75 72 6e 20 30 3b 0a 20 20 7a 44 62 20 3d 20  turn 0;.  zDb = 
3a70: 70 46 69 78 2d 3e 7a 44 62 3b 0a 20 20 66 6f 72  pFix->zDb;.  for
3a80: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73  (i=0, pItem=pLis
3a90: 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  t->a; i<pList->n
3aa0: 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
3ab0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 78  +){.    if( pFix
3ac0: 2d 3e 62 56 61 72 4f 6e 6c 79 3d 3d 30 20 29 7b  ->bVarOnly==0 ){
3ad0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
3ae0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 26 26 20 73  ->zDatabase && s
3af0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 49  qlite3StrICmp(pI
3b00: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 2c 20  tem->zDatabase, 
3b10: 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20  zDb) ){.        
3b20: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
3b30: 70 46 69 78 2d 3e 70 50 61 72 73 65 2c 0a 20 20  pFix->pParse,.  
3b40: 20 20 20 20 20 20 20 20 20 20 22 25 73 20 25 54            "%s %T
3b50: 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 65 6e 63   cannot referenc
3b60: 65 20 6f 62 6a 65 63 74 73 20 69 6e 20 64 61 74  e objects in dat
3b70: 61 62 61 73 65 20 25 73 22 2c 0a 20 20 20 20 20  abase %s",.     
3b80: 20 20 20 20 20 20 20 70 46 69 78 2d 3e 7a 54 79         pFix->zTy
3b90: 70 65 2c 20 70 46 69 78 2d 3e 70 4e 61 6d 65 2c  pe, pFix->pName,
3ba0: 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73   pItem->zDatabas
3bb0: 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
3bc0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
3bd0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3be0: 65 28 70 46 69 78 2d 3e 70 50 61 72 73 65 2d 3e  e(pFix->pParse->
3bf0: 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61  db, pItem->zData
3c00: 62 61 73 65 29 3b 0a 20 20 20 20 20 20 70 49 74  base);.      pIt
3c10: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
3c20: 30 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  0;.      pItem->
3c30: 70 53 63 68 65 6d 61 20 3d 20 70 46 69 78 2d 3e  pSchema = pFix->
3c40: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 7d 0a 23  pSchema;.    }.#
3c50: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
3c60: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
3c70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3c80: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 20  _OMIT_TRIGGER). 
3c90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
3ca0: 78 53 65 6c 65 63 74 28 70 46 69 78 2c 20 70 49  xSelect(pFix, pI
3cb0: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 20 29 20  tem->pSelect) ) 
3cc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
3cd0: 28 20 73 71 6c 69 74 65 33 46 69 78 45 78 70 72  ( sqlite3FixExpr
3ce0: 28 70 46 69 78 2c 20 70 49 74 65 6d 2d 3e 70 4f  (pFix, pItem->pO
3cf0: 6e 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 23  n) ) return 1;.#
3d00: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 49  endif.    if( pI
3d10: 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e  tem->fg.isTabFun
3d20: 63 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 45  c && sqlite3FixE
3d30: 78 70 72 4c 69 73 74 28 70 46 69 78 2c 20 70 49  xprList(pFix, pI
3d40: 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67  tem->u1.pFuncArg
3d50: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
3d60: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
3d70: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 69 66   return 0;.}.#if
3d80: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3d90: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
3da0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3db0: 4d 49 54 5f 54 52 49 47 47 45 52 29 0a 69 6e 74  MIT_TRIGGER).int
3dc0: 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
3dd0: 74 28 0a 20 20 44 62 46 69 78 65 72 20 2a 70 46  t(.  DbFixer *pF
3de0: 69 78 2c 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  ix,       /* Con
3df0: 74 65 78 74 20 6f 66 20 74 68 65 20 66 69 78 61  text of the fixa
3e00: 74 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74  tion */.  Select
3e10: 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20 2f   *pSelect      /
3e20: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
3e30: 74 65 6d 65 6e 74 20 74 6f 20 62 65 20 66 69 78  tement to be fix
3e40: 65 64 20 74 6f 20 6f 6e 65 20 64 61 74 61 62 61  ed to one databa
3e50: 73 65 20 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c 65  se */.){.  while
3e60: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
3e70: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 45   if( sqlite3FixE
3e80: 78 70 72 4c 69 73 74 28 70 46 69 78 2c 20 70 53  xprList(pFix, pS
3e90: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 29 20 29  elect->pEList) )
3ea0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
3eb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
3ec0: 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
3ed0: 74 28 70 46 69 78 2c 20 70 53 65 6c 65 63 74 2d  t(pFix, pSelect-
3ee0: 3e 70 53 72 63 29 20 29 7b 0a 20 20 20 20 20 20  >pSrc) ){.      
3ef0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
3f00: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
3f10: 69 78 45 78 70 72 28 70 46 69 78 2c 20 70 53 65  ixExpr(pFix, pSe
3f20: 6c 65 63 74 2d 3e 70 57 68 65 72 65 29 20 29 7b  lect->pWhere) ){
3f30: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
3f40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
3f50: 71 6c 69 74 65 33 46 69 78 45 78 70 72 4c 69 73  qlite3FixExprLis
3f60: 74 28 70 46 69 78 2c 20 70 53 65 6c 65 63 74 2d  t(pFix, pSelect-
3f70: 3e 70 47 72 6f 75 70 42 79 29 20 29 7b 0a 20 20  >pGroupBy) ){.  
3f80: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3f90: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
3fa0: 74 65 33 46 69 78 45 78 70 72 28 70 46 69 78 2c  te3FixExpr(pFix,
3fb0: 20 70 53 65 6c 65 63 74 2d 3e 70 48 61 76 69 6e   pSelect->pHavin
3fc0: 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  g) ){.      retu
3fd0: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
3fe0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 45 78  if( sqlite3FixEx
3ff0: 70 72 4c 69 73 74 28 70 46 69 78 2c 20 70 53 65  prList(pFix, pSe
4000: 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 29 20  lect->pOrderBy) 
4010: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4020: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
4030: 20 73 71 6c 69 74 65 33 46 69 78 45 78 70 72 28   sqlite3FixExpr(
4040: 70 46 69 78 2c 20 70 53 65 6c 65 63 74 2d 3e 70  pFix, pSelect->p
4050: 4c 69 6d 69 74 29 20 29 7b 0a 20 20 20 20 20 20  Limit) ){.      
4060: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
4070: 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d      if( pSelect-
4080: 3e 70 57 69 74 68 20 29 7b 0a 20 20 20 20 20 20  >pWith ){.      
4090: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
40a0: 28 69 3d 30 3b 20 69 3c 70 53 65 6c 65 63 74 2d  (i=0; i<pSelect-
40b0: 3e 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b  >pWith->nCte; i+
40c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
40d0: 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74  sqlite3FixSelect
40e0: 28 70 46 69 78 2c 20 70 53 65 6c 65 63 74 2d 3e  (pFix, pSelect->
40f0: 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 70 53 65 6c  pWith->a[i].pSel
4100: 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
4110: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
4120: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4130: 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63 74 20    }.    pSelect 
4140: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f  = pSelect->pPrio
4150: 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
4160: 30 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  0;.}.int sqlite3
4170: 46 69 78 45 78 70 72 28 0a 20 20 44 62 46 69 78  FixExpr(.  DbFix
4180: 65 72 20 2a 70 46 69 78 2c 20 20 20 20 20 2f 2a  er *pFix,     /*
4190: 20 43 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20   Context of the 
41a0: 66 69 78 61 74 69 6f 6e 20 2a 2f 0a 20 20 45 78  fixation */.  Ex
41b0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
41c0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
41d0: 6f 6e 20 74 6f 20 62 65 20 66 69 78 65 64 20 74  on to be fixed t
41e0: 6f 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 2a  o one database *
41f0: 2f 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 45  /.){.  while( pE
4200: 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  xpr ){.    if( p
4210: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  Expr->op==TK_VAR
4220: 49 41 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 69  IABLE ){.      i
4230: 66 28 20 70 46 69 78 2d 3e 70 50 61 72 73 65 2d  f( pFix->pParse-
4240: 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  >db->init.busy )
4250: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
4260: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
4270: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
4280: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4290: 4d 73 67 28 70 46 69 78 2d 3e 70 50 61 72 73 65  Msg(pFix->pParse
42a0: 2c 20 22 25 73 20 63 61 6e 6e 6f 74 20 75 73 65  , "%s cannot use
42b0: 20 76 61 72 69 61 62 6c 65 73 22 2c 20 70 46 69   variables", pFi
42c0: 78 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20  x->zType);.     
42d0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
42e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
42f0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
4300: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b  ty(pExpr, EP_Tok
4310: 65 6e 4f 6e 6c 79 7c 45 50 5f 4c 65 61 66 29 20  enOnly|EP_Leaf) 
4320: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
4330: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4340: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
4350: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 69  lect) ){.      i
4360: 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c  f( sqlite3FixSel
4370: 65 63 74 28 70 46 69 78 2c 20 70 45 78 70 72 2d  ect(pFix, pExpr-
4380: 3e 78 2e 70 53 65 6c 65 63 74 29 20 29 20 72 65  >x.pSelect) ) re
4390: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 65 6c 73  turn 1;.    }els
43a0: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  e{.      if( sql
43b0: 69 74 65 33 46 69 78 45 78 70 72 4c 69 73 74 28  ite3FixExprList(
43c0: 70 46 69 78 2c 20 70 45 78 70 72 2d 3e 78 2e 70  pFix, pExpr->x.p
43d0: 4c 69 73 74 29 20 29 20 72 65 74 75 72 6e 20 31  List) ) return 1
43e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
43f0: 73 71 6c 69 74 65 33 46 69 78 45 78 70 72 28 70  sqlite3FixExpr(p
4400: 46 69 78 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Fix, pExpr->pRig
4410: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ht) ){.      ret
4420: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
4430: 20 70 45 78 70 72 20 3d 20 70 45 78 70 72 2d 3e   pExpr = pExpr->
4440: 70 4c 65 66 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pLeft;.  }.  ret
4450: 75 72 6e 20 30 3b 0a 7d 0a 69 6e 74 20 73 71 6c  urn 0;.}.int sql
4460: 69 74 65 33 46 69 78 45 78 70 72 4c 69 73 74 28  ite3FixExprList(
4470: 0a 20 20 44 62 46 69 78 65 72 20 2a 70 46 69 78  .  DbFixer *pFix
4480: 2c 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74  ,     /* Context
4490: 20 6f 66 20 74 68 65 20 66 69 78 61 74 69 6f 6e   of the fixation
44a0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
44b0: 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20  pList    /* The 
44c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
44d0: 20 66 69 78 65 64 20 74 6f 20 6f 6e 65 20 64 61   fixed to one da
44e0: 74 61 62 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 69  tabase */.){.  i
44f0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
4500: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
4510: 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
4520: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
4530: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
4540: 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69  =pList->a; i<pLi
4550: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  st->nExpr; i++, 
4560: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66  pItem++){.    if
4570: 28 20 73 71 6c 69 74 65 33 46 69 78 45 78 70 72  ( sqlite3FixExpr
4580: 28 70 46 69 78 2c 20 70 49 74 65 6d 2d 3e 70 45  (pFix, pItem->pE
4590: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  xpr) ){.      re
45a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
45b0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
45c0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
45d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
45e0: 47 45 52 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  GER.int sqlite3F
45f0: 69 78 54 72 69 67 67 65 72 53 74 65 70 28 0a 20  ixTriggerStep(. 
4600: 20 44 62 46 69 78 65 72 20 2a 70 46 69 78 2c 20   DbFixer *pFix, 
4610: 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 6f      /* Context o
4620: 66 20 74 68 65 20 66 69 78 61 74 69 6f 6e 20 2a  f the fixation *
4630: 2f 0a 20 20 54 72 69 67 67 65 72 53 74 65 70 20  /.  TriggerStep 
4640: 2a 70 53 74 65 70 20 2f 2a 20 54 68 65 20 74 72  *pStep /* The tr
4650: 69 67 67 65 72 20 73 74 65 70 20 62 65 20 66 69  igger step be fi
4660: 78 65 64 20 74 6f 20 6f 6e 65 20 64 61 74 61 62  xed to one datab
4670: 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 77 68 69 6c  ase */.){.  whil
4680: 65 28 20 70 53 74 65 70 20 29 7b 0a 20 20 20 20  e( pStep ){.    
4690: 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 65  if( sqlite3FixSe
46a0: 6c 65 63 74 28 70 46 69 78 2c 20 70 53 74 65 70  lect(pFix, pStep
46b0: 2d 3e 70 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  ->pSelect) ){.  
46c0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
46d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
46e0: 74 65 33 46 69 78 45 78 70 72 28 70 46 69 78 2c  te3FixExpr(pFix,
46f0: 20 70 53 74 65 70 2d 3e 70 57 68 65 72 65 29 20   pStep->pWhere) 
4700: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
4710: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
4720: 20 73 71 6c 69 74 65 33 46 69 78 45 78 70 72 4c   sqlite3FixExprL
4730: 69 73 74 28 70 46 69 78 2c 20 70 53 74 65 70 2d  ist(pFix, pStep-
4740: 3e 70 45 78 70 72 4c 69 73 74 29 20 29 7b 0a 20  >pExprList) ){. 
4750: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
4760: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
4770: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 0a  ITE_OMIT_UPSERT.
4780: 20 20 20 20 69 66 28 20 70 53 74 65 70 2d 3e 70      if( pStep->p
4790: 55 70 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20  Upsert ){.      
47a0: 55 70 73 65 72 74 20 2a 70 55 70 20 3d 20 70 53  Upsert *pUp = pS
47b0: 74 65 70 2d 3e 70 55 70 73 65 72 74 3b 0a 20 20  tep->pUpsert;.  
47c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
47d0: 69 78 45 78 70 72 4c 69 73 74 28 70 46 69 78 2c  ixExprList(pFix,
47e0: 20 70 55 70 2d 3e 70 55 70 73 65 72 74 54 61 72   pUp->pUpsertTar
47f0: 67 65 74 29 0a 20 20 20 20 20 20 20 7c 7c 20 73  get).       || s
4800: 71 6c 69 74 65 33 46 69 78 45 78 70 72 28 70 46  qlite3FixExpr(pF
4810: 69 78 2c 20 70 55 70 2d 3e 70 55 70 73 65 72 74  ix, pUp->pUpsert
4820: 54 61 72 67 65 74 57 68 65 72 65 29 0a 20 20 20  TargetWhere).   
4830: 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 46 69      || sqlite3Fi
4840: 78 45 78 70 72 4c 69 73 74 28 70 46 69 78 2c 20  xExprList(pFix, 
4850: 70 55 70 2d 3e 70 55 70 73 65 72 74 53 65 74 29  pUp->pUpsertSet)
4860: 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74  .       || sqlit
4870: 65 33 46 69 78 45 78 70 72 28 70 46 69 78 2c 20  e3FixExpr(pFix, 
4880: 70 55 70 2d 3e 70 55 70 73 65 72 74 57 68 65 72  pUp->pUpsertWher
4890: 65 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  e).      ){.    
48a0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
48b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
48c0: 69 66 0a 20 20 20 20 70 53 74 65 70 20 3d 20 70  if.    pStep = p
48d0: 53 74 65 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  Step->pNext;.  }
48e0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
48f0: 65 6e 64 69 66 0a                                endif.