/ Hex Artifact Content
Login

Artifact fa70bc0fb02e4d08202dd6a752ab5f5df5676e50:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 34 37 34 20 32 30 30 38 2f 30 33 2f 30 36  1.474 2008/03/06
02f0: 20 30 39 3a 35 38 3a 35 30 20 6d 6c 63 72 65 65   09:58:50 mlcree
0300: 63 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63  ch Exp $.*/.#inc
0310: 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e  lude "sqliteInt.
0320: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74 79  h".#include <cty
0330: 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  pe.h>../*.** Thi
0340: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0350: 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 53  led when a new S
0360: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  QL statement is 
0370: 62 65 67 69 6e 6e 69 6e 67 20 74 6f 0a 2a 2a 20  beginning to.** 
0380: 62 65 20 70 61 72 73 65 64 2e 20 20 49 6e 69 74  be parsed.  Init
0390: 69 61 6c 69 7a 65 20 74 68 65 20 70 50 61 72 73  ialize the pPars
03a0: 65 20 73 74 72 75 63 74 75 72 65 20 61 73 20 6e  e structure as n
03b0: 65 65 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  eeded..*/.void s
03c0: 71 6c 69 74 65 33 42 65 67 69 6e 50 61 72 73 65  qlite3BeginParse
03d0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
03e0: 69 6e 74 20 65 78 70 6c 61 69 6e 46 6c 61 67 29  int explainFlag)
03f0: 7b 0a 20 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  {.  pParse->expl
0400: 61 69 6e 20 3d 20 65 78 70 6c 61 69 6e 46 6c 61  ain = explainFla
0410: 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  g;.  pParse->nVa
0420: 72 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  r = 0;.}..#ifnde
0430: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
0440: 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
0450: 20 54 68 65 20 54 61 62 6c 65 4c 6f 63 6b 20 73   The TableLock s
0460: 74 72 75 63 74 75 72 65 20 69 73 20 6f 6e 6c 79  tructure is only
0470: 20 75 73 65 64 20 62 79 20 74 68 65 20 73 71 6c   used by the sql
0480: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 29 20  ite3TableLock() 
0490: 61 6e 64 0a 2a 2a 20 63 6f 64 65 54 61 62 6c 65  and.** codeTable
04a0: 4c 6f 63 6b 73 28 29 20 66 75 6e 63 74 69 6f 6e  Locks() function
04b0: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 54 61 62  s..*/.struct Tab
04c0: 6c 65 4c 6f 63 6b 20 7b 0a 20 20 69 6e 74 20 69  leLock {.  int i
04d0: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
04e0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
04f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
0500: 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  able to be locke
0510: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 3b  d */.  int iTab;
0520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0530: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
0540: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
0550: 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 38 20 69  locked */.  u8 i
0560: 73 57 72 69 74 65 4c 6f 63 6b 3b 20 20 20 20 20  sWriteLock;     
0570: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 77 72 69   /* True for wri
0580: 74 65 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20  te lock.  False 
0590: 66 6f 72 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  for a read lock 
05a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
05b0: 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d  *zName;   /* Nam
05c0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
05d0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f  /.};../*.** Reco
05e0: 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
05f0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 6f 63 6b   we want to lock
0600: 20 61 20 74 61 62 6c 65 20 61 74 20 72 75 6e 2d   a table at run-
0610: 74 69 6d 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  time.  .**.** Th
0620: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f  e table to be lo
0630: 63 6b 65 64 20 68 61 73 20 72 6f 6f 74 20 70 61  cked has root pa
0640: 67 65 20 69 54 61 62 20 61 6e 64 20 69 73 20 66  ge iTab and is f
0650: 6f 75 6e 64 20 69 6e 20 64 61 74 61 62 61 73 65  ound in database
0660: 20 69 44 62 2e 0a 2a 2a 20 41 20 72 65 61 64 20   iDb..** A read 
0670: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0680: 63 61 6e 20 62 65 20 74 61 6b 65 6e 20 64 65 70  can be taken dep
0690: 65 6e 64 69 6e 67 20 6f 6e 20 69 73 57 72 69 74  ending on isWrit
06a0: 65 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  elock..**.** Thi
06b0: 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 72  s routine just r
06c0: 65 63 6f 72 64 73 20 74 68 65 20 66 61 63 74 20  ecords the fact 
06d0: 74 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 69 73  that the lock is
06e0: 20 64 65 73 69 72 65 64 2e 20 20 54 68 65 0a 2a   desired.  The.*
06f0: 2a 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 74  * code to make t
0700: 68 65 20 6c 6f 63 6b 20 6f 63 63 75 72 20 69 73  he lock occur is
0710: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 20   generated by a 
0720: 6c 61 74 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  later call to.**
0730: 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28   codeTableLocks(
0740: 29 20 77 68 69 63 68 20 6f 63 63 75 72 73 20 64  ) which occurs d
0750: 75 72 69 6e 67 20 73 71 6c 69 74 65 33 46 69 6e  uring sqlite3Fin
0760: 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a  ishCoding()..*/.
0770: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 61 62 6c  void sqlite3Tabl
0780: 65 4c 6f 63 6b 28 0a 20 20 50 61 72 73 65 20 2a  eLock(.  Parse *
0790: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
07a0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
07b0: 2f 0a 20 20 69 6e 74 20 69 44 62 2c 20 20 20 20  /.  int iDb,    
07c0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
07d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
07e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
07f0: 61 62 6c 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  able to lock */.
0800: 20 20 69 6e 74 20 69 54 61 62 2c 20 20 20 20 20    int iTab,     
0810: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
0820: 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
0830: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0840: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0850: 74 65 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 54 72  teLock,    /* Tr
0860: 75 65 20 66 6f 72 20 61 20 77 72 69 74 65 20 6c  ue for a write l
0870: 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ock */.  const c
0880: 68 61 72 20 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e  har *zName  /* N
0890: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
08a0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
08b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
08c0: 6e 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62  nt nBytes;.  Tab
08d0: 6c 65 4c 6f 63 6b 20 2a 70 3b 0a 0a 20 20 69 66  leLock *p;..  if
08e0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
08f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
0900: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
0910: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b  >nTableLock; i++
0920: 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 50 61 72  ){.    p = &pPar
0930: 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69  se->aTableLock[i
0940: 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 44  ];.    if( p->iD
0950: 62 3d 3d 69 44 62 20 26 26 20 70 2d 3e 69 54 61  b==iDb && p->iTa
0960: 62 3d 3d 69 54 61 62 20 29 7b 0a 20 20 20 20 20  b==iTab ){.     
0970: 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20   p->isWriteLock 
0980: 3d 20 28 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63  = (p->isWriteLoc
0990: 6b 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b  k || isWriteLock
09a0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
09b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42  .    }.  }..  nB
09c0: 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 54 61  ytes = sizeof(Ta
09d0: 62 6c 65 4c 6f 63 6b 29 20 2a 20 28 70 50 61 72  bleLock) * (pPar
09e0: 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31  se->nTableLock+1
09f0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 54 61  );.  pParse->aTa
0a00: 62 6c 65 4c 6f 63 6b 20 3d 20 0a 20 20 20 20 20  bleLock = .     
0a10: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
0a20: 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
0a30: 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 54 61 62  db, pParse->aTab
0a40: 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74 65 73 29 3b  leLock, nBytes);
0a50: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
0a60: 54 61 62 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  TableLock ){.   
0a70: 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54   p = &pParse->aT
0a80: 61 62 6c 65 4c 6f 63 6b 5b 70 50 61 72 73 65 2d  ableLock[pParse-
0a90: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a  >nTableLock++];.
0aa0: 20 20 20 20 70 2d 3e 69 44 62 20 3d 20 69 44 62      p->iDb = iDb
0ab0: 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 20 3d 20  ;.    p->iTab = 
0ac0: 69 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57  iTab;.    p->isW
0ad0: 72 69 74 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69  riteLock = isWri
0ae0: 74 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a  teLock;.    p->z
0af0: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
0b00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73  }else{.    pPars
0b10: 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20  e->nTableLock = 
0b20: 30 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  0;.    pParse->d
0b30: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
0b40: 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
0b50: 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54 61 62  * Code an OP_Tab
0b60: 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75 63 74 69  leLock instructi
0b70: 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c  on for each tabl
0b80: 65 20 6c 6f 63 6b 65 64 20 62 79 20 74 68 65 0a  e locked by the.
0b90: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 63 6f  ** statement (co
0ba0: 6e 66 69 67 75 72 65 64 20 62 79 20 63 61 6c 6c  nfigured by call
0bb0: 73 20 74 6f 20 73 71 6c 69 74 65 33 54 61 62 6c  s to sqlite3Tabl
0bc0: 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61  eLock())..*/.sta
0bd0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 54 61 62  tic void codeTab
0be0: 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65 20 2a 70  leLocks(Parse *p
0bf0: 50 61 72 73 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Parse){.  int i;
0c00: 0a 20 20 56 64 62 65 20 2a 70 56 64 62 65 3b 20  .  Vdbe *pVdbe; 
0c10: 0a 0a 20 20 69 66 28 20 30 3d 3d 28 70 56 64 62  ..  if( 0==(pVdb
0c20: 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  e = sqlite3GetVd
0c30: 62 65 28 70 50 61 72 73 65 29 29 20 29 7b 0a 20  be(pParse)) ){. 
0c40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
0c50: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
0c60: 72 73 65 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b  rse->nTableLock;
0c70: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65   i++){.    Table
0c80: 4c 6f 63 6b 20 2a 70 20 3d 20 26 70 50 61 72 73  Lock *p = &pPars
0c90: 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d  e->aTableLock[i]
0ca0: 3b 0a 20 20 20 20 69 6e 74 20 70 31 20 3d 20 70  ;.    int p1 = p
0cb0: 2d 3e 69 44 62 3b 0a 20 20 20 20 69 66 28 20 70  ->iDb;.    if( p
0cc0: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 29 7b  ->isWriteLock ){
0cd0: 0a 20 20 20 20 20 20 70 31 20 3d 20 2d 31 2a 28  .      p1 = -1*(
0ce0: 70 31 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p1+1);.    }.   
0cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
0d00: 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61 62  p4(pVdbe, OP_Tab
0d10: 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e 69  leLock, p1, p->i
0d20: 54 61 62 2c 20 30 2c 20 70 2d 3e 7a 4e 61 6d 65  Tab, 0, p->zName
0d30: 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
0d40: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
0d50: 69 6e 65 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63  ine codeTableLoc
0d60: 6b 73 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ks(x).#endif../*
0d70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
0d80: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
0d90: 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 73 74   a single SQL st
0da0: 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  atement has been
0db0: 0a 2a 2a 20 70 61 72 73 65 64 20 61 6e 64 20 61  .** parsed and a
0dc0: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 74 6f   VDBE program to
0dd0: 20 65 78 65 63 75 74 65 20 74 68 61 74 20 73 74   execute that st
0de0: 61 74 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  atement has been
0df0: 0a 2a 2a 20 70 72 65 70 61 72 65 64 2e 20 20 54  .** prepared.  T
0e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 70 75 74 73  his routine puts
0e10: 20 74 68 65 20 66 69 6e 69 73 68 69 6e 67 20 74   the finishing t
0e20: 6f 75 63 68 65 73 20 6f 6e 20 74 68 65 0a 2a 2a  ouches on the.**
0e30: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 20 61 6e   VDBE program an
0e40: 64 20 72 65 73 65 74 73 20 74 68 65 20 70 50 61  d resets the pPa
0e50: 72 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f  rse structure fo
0e60: 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a 20 70 61  r the next.** pa
0e70: 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  rse..**.** Note 
0e80: 74 68 61 74 20 69 66 20 61 6e 20 65 72 72 6f 72  that if an error
0e90: 20 6f 63 63 75 72 72 65 64 2c 20 69 74 20 6d 69   occurred, it mi
0ea0: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
0eb0: 74 68 61 74 0a 2a 2a 20 6e 6f 20 56 44 42 45 20  that.** no VDBE 
0ec0: 63 6f 64 65 20 77 61 73 20 67 65 6e 65 72 61 74  code was generat
0ed0: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
0ee0: 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
0ef0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
0f00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
0f10: 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 64 62 20   Vdbe *v;..  db 
0f20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0f30: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
0f40: 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
0f50: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 65 73   if( pParse->nes
0f60: 74 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ted ) return;.  
0f70: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
0f80: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
0f90: 20 21 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20   !pParse->pVdbe 
0fa0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73  ){.    if( pPars
0fb0: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
0fc0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   && pParse->nErr
0fd0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
0fe0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  ->rc = SQLITE_ER
0ff0: 52 4f 52 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ROR;.      retur
1000: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
1010: 2f 2a 20 42 65 67 69 6e 20 62 79 20 67 65 6e 65  /* Begin by gene
1020: 72 61 74 69 6e 67 20 73 6f 6d 65 20 74 65 72 6d  rating some term
1030: 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20 61 74 20  ination code at 
1040: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 20  the end of the. 
1050: 20 2a 2a 20 76 64 62 65 20 70 72 6f 67 72 61 6d   ** vdbe program
1060: 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  .  */.  v = sqli
1070: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1080: 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
1090: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10a0: 64 4f 70 30 28 76 2c 20 4f 50 5f 48 61 6c 74 29  dOp0(v, OP_Halt)
10b0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
10c0: 6f 6b 69 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69  okie mask contai
10d0: 6e 73 20 6f 6e 65 20 62 69 74 20 66 6f 72 20 65  ns one bit for e
10e0: 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ach database fil
10f0: 65 20 6f 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28  e open..    ** (
1100: 42 69 74 20 30 20 69 73 20 66 6f 72 20 6d 61 69  Bit 0 is for mai
1110: 6e 2c 20 62 69 74 20 31 20 69 73 20 66 6f 72 20  n, bit 1 is for 
1120: 74 65 6d 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72  temp, and so for
1130: 74 68 2e 29 20 20 42 69 74 73 20 61 72 65 0a 20  th.)  Bits are. 
1140: 20 20 20 2a 2a 20 73 65 74 20 66 6f 72 20 65 61     ** set for ea
1150: 63 68 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ch database that
1160: 20 69 73 20 75 73 65 64 2e 20 20 47 65 6e 65 72   is used.  Gener
1170: 61 74 65 20 63 6f 64 65 20 74 6f 20 73 74 61 72  ate code to star
1180: 74 20 61 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  t a.    ** trans
1190: 61 63 74 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75  action on each u
11a0: 73 65 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  sed database and
11b0: 20 74 6f 20 76 65 72 69 66 79 20 74 68 65 20 73   to verify the s
11c0: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20  chema cookie.   
11d0: 20 2a 2a 20 6f 6e 20 65 61 63 68 20 75 73 65 64   ** on each used
11e0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a   database..    *
11f0: 2f 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  /.    if( pParse
1200: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3e 30 20 29  ->cookieGoto>0 )
1210: 7b 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b  {.      u32 mask
1220: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b  ;.      int iDb;
1230: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1240: 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 50  beJumpHere(v, pP
1250: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1260: 2d 31 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  -1);.      for(i
1270: 44 62 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 69 44  Db=0, mask=1; iD
1280: 62 3c 64 62 2d 3e 6e 44 62 3b 20 6d 61 73 6b 3c  b<db->nDb; mask<
1290: 3c 3d 31 2c 20 69 44 62 2b 2b 29 7b 0a 20 20 20  <=1, iDb++){.   
12a0: 20 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26       if( (mask &
12b0: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
12c0: 61 73 6b 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ask)==0 ) contin
12d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ue;.        sqli
12e0: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
12f0: 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  (v, iDb);.      
1300: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1310: 4f 70 32 28 76 2c 4f 50 5f 54 72 61 6e 73 61 63  Op2(v,OP_Transac
1320: 74 69 6f 6e 2c 20 69 44 62 2c 20 28 6d 61 73 6b  tion, iDb, (mask
1330: 20 26 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65   & pParse->write
1340: 4d 61 73 6b 29 21 3d 30 29 3b 0a 20 20 20 20 20  Mask)!=0);.     
1350: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1360: 64 4f 70 32 28 76 2c 4f 50 5f 56 65 72 69 66 79  dOp2(v,OP_Verify
1370: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 70 50 61  Cookie, iDb, pPa
1380: 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65  rse->cookieValue
1390: 5b 69 44 62 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  [iDb]);.      }.
13a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13c0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
13d0: 65 2d 3e 70 56 69 72 74 75 61 6c 4c 6f 63 6b 20  e->pVirtualLock 
13e0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
13f0: 2a 76 74 61 62 20 3d 20 28 63 68 61 72 20 2a 29  *vtab = (char *)
1400: 70 50 61 72 73 65 2d 3e 70 56 69 72 74 75 61 6c  pParse->pVirtual
1410: 4c 6f 63 6b 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Lock->pVtab;.   
1420: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1430: 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65  AddOp4(v, OP_VBe
1440: 67 69 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74  gin, 0, 0, 0, vt
1450: 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
1460: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1470: 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c 6c 20      /* Once all 
1480: 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61 76 65  the cookies have
1490: 20 62 65 65 6e 20 76 65 72 69 66 69 65 64 20 61   been verified a
14a0: 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nd transactions 
14b0: 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20 20 2a  opened, .      *
14c0: 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72 65 71  * obtain the req
14d0: 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f 63 6b  uired table-lock
14e0: 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  s. This is a no-
14f0: 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20 0a 20  op unless the . 
1500: 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64 2d 63       ** shared-c
1510: 61 63 68 65 20 66 65 61 74 75 72 65 20 69 73 20  ache feature is 
1520: 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20 20 2a  enabled..      *
1530: 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61 62 6c  /.      codeTabl
1540: 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29 3b 0a  eLocks(pParse);.
1550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1560: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f  eAddOp2(v, OP_Go
1570: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 63  to, 0, pParse->c
1580: 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20 20 20  ookieGoto);.    
1590: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15a0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20  E_OMIT_TRACE.   
15b0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
15c0: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  usy ){.      /* 
15d0: 43 68 61 6e 67 65 20 74 68 65 20 50 34 20 61 72  Change the P4 ar
15e0: 67 75 6d 65 6e 74 20 6f 66 20 74 68 65 20 66 69  gument of the fi
15f0: 72 73 74 20 6f 70 63 6f 64 65 20 28 77 68 69 63  rst opcode (whic
1600: 68 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  h will always be
1610: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 4f 50 5f  .      ** an OP_
1620: 54 72 61 63 65 29 20 74 6f 20 62 65 20 74 68 65  Trace) to be the
1630: 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
1640: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 53 51  f the current SQ
1650: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20  L statement..   
1660: 20 20 20 2a 2f 0a 20 20 20 20 20 20 56 64 62 65     */.      Vdbe
1670: 4f 70 20 2a 70 4f 70 20 3d 20 73 71 6c 69 74 65  Op *pOp = sqlite
1680: 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20 30 29  3VdbeGetOp(v, 0)
1690: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 20  ;.      if( pOp 
16a0: 26 26 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  && pOp->opcode==
16b0: 4f 50 5f 54 72 61 63 65 20 29 7b 0a 20 20 20 20  OP_Trace ){.    
16c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
16d0: 68 61 6e 67 65 50 34 28 76 2c 20 30 2c 20 70 50  hangeP4(v, 0, pP
16e0: 61 72 73 65 2d 3e 7a 53 71 6c 2c 20 70 50 61 72  arse->zSql, pPar
16f0: 73 65 2d 3e 7a 54 61 69 6c 2d 70 50 61 72 73 65  se->zTail-pParse
1700: 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7d  ->zSql);.      }
1710: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1730: 43 45 20 2a 2f 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  CE */.  }...  /*
1740: 20 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72   Get the VDBE pr
1750: 6f 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20  ogram ready for 
1760: 65 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20  execution.  */. 
1770: 20 69 66 28 20 76 20 26 26 20 70 50 61 72 73 65   if( v && pParse
1780: 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62  ->nErr==0 && !db
1790: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17a0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
17b0: 44 45 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a  DEBUG.    FILE *
17c0: 74 72 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61  trace = (db->fla
17d0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
17e0: 54 72 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f  Trace)!=0 ? stdo
17f0: 75 74 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69  ut : 0;.    sqli
1800: 74 65 33 56 64 62 65 54 72 61 63 65 28 76 2c 20  te3VdbeTrace(v, 
1810: 74 72 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20  trace);.#endif. 
1820: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61     sqlite3VdbeMa
1830: 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61 72 73  keReady(v, pPars
1840: 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73 65 2d  e->nVar, pParse-
1850: 3e 6e 4d 65 6d 2b 33 2c 0a 20 20 20 20 20 20 20  >nMem+3,.       
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 33    pParse->nTab+3
1880: 2c 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  , pParse->explai
1890: 6e 29 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e  n);.    pParse->
18a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
18b0: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  ;.    pParse->co
18c0: 6c 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20  lNamesSet = 0;. 
18d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 72 73   }else if( pPars
18e0: 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e->rc==SQLITE_OK
18f0: 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e   ){.    pParse->
1900: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
1910: 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d  R;.  }.  pParse-
1920: 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61  >nTab = 0;.  pPa
1930: 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20  rse->nMem = 0;. 
1940: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20   pParse->nSet = 
1950: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61  0;.  pParse->nVa
1960: 72 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  r = 0;.  pParse-
1970: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b  >cookieMask = 0;
1980: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
1990: 65 47 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  eGoto = 0;.}../*
19a0: 0a 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73  .** Run the pars
19b0: 65 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  er and code gene
19c0: 72 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c  rator recursivel
19d0: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  y in order to ge
19e0: 6e 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66  nerate.** code f
19f0: 6f 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  or the SQL state
1a00: 6d 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20  ment given onto 
1a10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
1a20: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a  Parse context.**
1a30: 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
1a40: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
1a50: 57 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20  When the parser 
1a60: 69 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65  is run recursive
1a70: 6c 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20  ly.** this way, 
1a80: 74 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c  the final OP_Hal
1a90: 74 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65  t is not appende
1aa0: 64 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74  d and other init
1ab0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e  ialization.** an
1ac0: 64 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73  d finalization s
1ad0: 74 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64  teps are omitted
1ae0: 20 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61   because those a
1af0: 72 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74  re handling by t
1b00: 68 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20  he.** outermost 
1b10: 70 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  parser..**.** No
1b20: 74 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  t everything is 
1b30: 6e 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20  nestable.  This 
1b40: 66 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69  facility is desi
1b50: 67 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a  gned to permit.*
1b60: 2a 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  * INSERT, UPDATE
1b70: 2c 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65  , and DELETE ope
1b80: 72 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20  rations against 
1b90: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20  SQLITE_MASTER.  
1ba0: 55 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79  Use.** care if y
1bb0: 6f 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79  ou decide to try
1bc0: 20 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75   to use this rou
1bd0: 74 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74  tine for some ot
1be0: 68 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f  her purposes..*/
1bf0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73  .void sqlite3Nes
1c00: 74 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a  tedParse(Parse *
1c10: 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68  pParse, const ch
1c20: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
1c30: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
1c40: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 23  .  char *zSql;.#
1c50: 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20   define SAVE_SZ 
1c60: 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20   (sizeof(Parse) 
1c70: 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65  - offsetof(Parse
1c80: 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20 73  ,nVar)).  char s
1c90: 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b  aveBuf[SAVE_SZ];
1ca0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
1cb0: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
1cc0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1cd0: 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f  >nested<10 );  /
1ce0: 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64  * Nesting should
1cf0: 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69   only be of limi
1d00: 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76  ted depth */.  v
1d10: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
1d20: 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  mat);.  zSql = s
1d30: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
1d40: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 46 6f 72 6d  Parse->db, zForm
1d50: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1d60: 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71  d(ap);.  if( zSq
1d70: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72  l==0 ){.    pPar
1d80: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
1d90: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
1da0: 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61 6c  turn;   /* A mal
1db0: 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
1dc0: 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70 50  iled */.  }.  pP
1dd0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a  arse->nested++;.
1de0: 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75 66    memcpy(saveBuf
1df0: 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c  , &pParse->nVar,
1e00: 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d   SAVE_SZ);.  mem
1e10: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  set(&pParse->nVa
1e20: 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  r, 0, SAVE_SZ);.
1e30: 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72 73    sqlite3RunPars
1e40: 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c 2c  er(pParse, zSql,
1e50: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
1e60: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d  ree(zSql);.  mem
1e70: 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  cpy(&pParse->nVa
1e80: 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45  r, saveBuf, SAVE
1e90: 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  _SZ);.  pParse->
1ea0: 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a  nested--;.}../*.
1eb0: 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e  ** Locate the in
1ec0: 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72  -memory structur
1ed0: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
1ee0: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
1ef0: 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20  tabase.** table 
1f00: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
1f10: 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64  f that table and
1f20: 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68   (optionally) th
1f30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1f40: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1f50: 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ning the table. 
1f60: 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1f70: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a  not found..**.**
1f80: 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73   If zDatabase is
1f90: 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65   0, all database
1fa0: 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66  s are searched f
1fb0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  or the table and
1fc0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61   the.** first ma
1fd0: 74 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20  tching table is 
1fe0: 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63  returned.  (No c
1ff0: 68 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c  hecking for dupl
2000: 69 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e  icate table.** n
2010: 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20  ames is done.)  
2020: 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72  The search order
2030: 20 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20   is TEMP first, 
2040: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
2050: 61 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79  any.** auxiliary
2060: 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64   databases added
2070: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
2080: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  H command..**.**
2090: 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
20a0: 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a  3LocateTable()..
20b0: 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65  */.Table *sqlite
20c0: 33 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74  3FindTable(sqlit
20d0: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
20e0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
20f0: 20 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65   char *zDatabase
2100: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20  ){.  Table *p = 
2110: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73  0;.  int i;.  as
2120: 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20 29  sert( zName!=0 )
2130: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
2140: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
2150: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
2160: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
2170: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
2180: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
2190: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
21a0: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
21b0: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
21c0: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
21d0: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
21e0: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
21f0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2200: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2210: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
2220: 2c 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b  , strlen(zName)+
2230: 31 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20  1);.    if( p ) 
2240: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
2250: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2260: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2270: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2280: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 61 20  hat describes a 
2290: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
22a0: 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76  ase.** table giv
22b0: 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  en the name of t
22c0: 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f  hat table and (o
22d0: 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e  ptionally) the n
22e0: 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ame of the.** da
22f0: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
2300: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  g the table.  Re
2310: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
2320: 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65   found.  Also le
2330: 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20  ave an.** error 
2340: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
2350: 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a  e->zErrMsg..**.*
2360: 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
2370: 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
2380: 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69 74 65  utine and sqlite
2390: 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69 73 20  3FindTable() is 
23a0: 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75  that this.** rou
23b0: 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e 20 65  tine leaves an e
23c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
23d0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20  pParse->zErrMsg 
23e0: 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33  where.** sqlite3
23f0: 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f 65 73  FindTable() does
2400: 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a   not..*/.Table *
2410: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2420: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
2430: 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rse,         /* 
2440: 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69 63 68  context in which
2450: 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72   to report error
2460: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65  s */.  int isVie
2470: 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  w,            /*
2480: 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67   True if looking
2490: 20 66 6f 72 20 61 20 56 49 45 57 20 72 61 74 68   for a VIEW rath
24a0: 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c 45 20  er than a TABLE 
24b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
24c0: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  *zName,     /* N
24d0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
24e0: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
24f0: 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  for */.  const c
2500: 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20 20 20  har *zDbase     
2510: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2520: 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68 74 20  atabase.  Might 
2530: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  be NULL */.){.  
2540: 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20  Table *p;..  /* 
2550: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
2560: 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20  e schema. If an 
2570: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65  error occurs, le
2580: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
2590: 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f  sage.  ** and co
25a0: 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  de in pParse and
25b0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f   return NULL. */
25c0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
25d0: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
25e0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
25f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2600: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
2610: 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2d  indTable(pParse-
2620: 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61  >db, zName, zDba
2630: 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
2640: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2650: 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69 65 77  r *zMsg = isView
2660: 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69 65 77   ? "no such view
2670: 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74 61 62  " : "no such tab
2680: 6c 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  le";.    if( zDb
2690: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
26a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
26b0: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
26c0: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
26d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
26e0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
26f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
2700: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
2710: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
2720: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
2730: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
2740: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2750: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2760: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2770: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2780: 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75  es .** a particu
2790: 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20  lar index given 
27a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
27b0: 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68   index.** and th
27c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
27d0: 74 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74  tabase that cont
27e0: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a  ains the index..
27f0: 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  ** Return NULL i
2800: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a  f not found..**.
2810: 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20  ** If zDatabase 
2820: 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61  is 0, all databa
2830: 73 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64  ses are searched
2840: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c   for the.** tabl
2850: 65 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  e and the first 
2860: 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69  matching index i
2870: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f  s returned.  (No
2880: 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72   checking.** for
2890: 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78   duplicate index
28a0: 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29   names is done.)
28b0: 20 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64    The search ord
28c0: 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69  er is.** TEMP fi
28d0: 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20  rst, then MAIN, 
28e0: 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61  then any auxilia
28f0: 72 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64  ry databases add
2900: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ed.** using the 
2910: 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a  ATTACH command..
2920: 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65  */.Index *sqlite
2930: 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74  3FindIndex(sqlit
2940: 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
2950: 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74  ar *zName, const
2960: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49   char *zDb){.  I
2970: 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69  ndex *p = 0;.  i
2980: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  nt i;.  for(i=OM
2990: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
29a0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
29b0: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
29c0: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
29d0: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
29e0: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
29f0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
2a00: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2a10: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
2a20: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2a30: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
2a40: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2a50: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2a60: 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20  Schema || (j==1 
2a70: 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  && !db->aDb[1].p
2a80: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
2a90: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2aa0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2ab0: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2ac0: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 73 74  xHash, zName, st
2ad0: 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 29 3b 0a  rlen(zName)+1);.
2ae0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 20      }.    if( p 
2af0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2b00: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2b10: 2a 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d 65  * Reclaim the me
2b20: 6d 6f 72 79 20 75 73 65 64 20 62 79 20 61 6e 20  mory used by an 
2b30: 69 6e 64 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20  index.*/.static 
2b40: 76 6f 69 64 20 66 72 65 65 49 6e 64 65 78 28 49  void freeIndex(I
2b50: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 73 71 6c 69  ndex *p){.  sqli
2b60: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 43 6f 6c  te3_free(p->zCol
2b70: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Aff);.  sqlite3_
2b80: 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  free(p);.}../*.*
2b90: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76  * Remove the giv
2ba0: 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68  en index from th
2bb0: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
2bc0: 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20  le, and free.** 
2bd0: 69 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  its memory struc
2be0: 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  tures..**.** The
2bf0: 20 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65   index is remove
2c00: 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  d from the datab
2c10: 61 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20  ase hash tables 
2c20: 62 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  but.** it is not
2c30: 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74   unlinked from t
2c40: 68 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74  he Table that it
2c50: 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c   indexes..** Unl
2c60: 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  inking from the 
2c70: 54 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f  Table must be do
2c80: 6e 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ne by the callin
2c90: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
2ca0: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
2cb0: 65 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64  eDeleteIndex(Ind
2cc0: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
2cd0: 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  *pOld;.  const c
2ce0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e  har *zName = p->
2cf0: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d  zName;..  pOld =
2d00: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2d10: 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
2d20: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  idxHash, zName, 
2d30: 73 74 72 6c 65 6e 28 20 7a 4e 61 6d 65 29 2b 31  strlen( zName)+1
2d40: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
2d50: 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f 6c 64 3d  pOld==0 || pOld=
2d60: 3d 70 20 29 3b 0a 20 20 66 72 65 65 49 6e 64 65  =p );.  freeInde
2d70: 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  x(p);.}../*.** F
2d80: 6f 72 20 74 68 65 20 69 6e 64 65 78 20 63 61 6c  or the index cal
2d90: 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20 77 68 69  led zIdxName whi
2da0: 63 68 20 69 73 20 66 6f 75 6e 64 20 69 6e 20 74  ch is found in t
2db0: 68 65 20 64 61 74 61 62 61 73 65 20 69 44 62 2c  he database iDb,
2dc0: 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68 61 74 20  .** unlike that 
2dd0: 69 6e 64 65 78 20 66 72 6f 6d 20 69 74 73 20 54  index from its T
2de0: 61 62 6c 65 20 74 68 65 6e 20 72 65 6d 6f 76 65  able then remove
2df0: 20 74 68 65 20 69 6e 64 65 78 20 66 72 6f 6d 0a   the index from.
2e00: 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 68 61 73  ** the index has
2e10: 68 20 74 61 62 6c 65 20 61 6e 64 20 66 72 65 65  h table and free
2e20: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73 74 72 75   all memory stru
2e30: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
2e40: 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 69 6e  d.** with the in
2e50: 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  dex..*/.void sql
2e60: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
2e70: 65 74 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  eteIndex(sqlite3
2e80: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
2e90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 4e  onst char *zIdxN
2ea0: 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ame){.  Index *p
2eb0: 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20 6c 65 6e  Index;.  int len
2ec0: 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68 20  ;.  Hash *pHash 
2ed0: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  = &db->aDb[iDb].
2ee0: 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
2ef0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
2f00: 6e 28 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70  n(zIdxName);.  p
2f10: 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48  Index = sqlite3H
2f20: 61 73 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c  ashInsert(pHash,
2f30: 20 7a 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31   zIdxName, len+1
2f40: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  , 0);.  if( pInd
2f50: 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  ex ){.    if( pI
2f60: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2f70: 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a  ndex==pIndex ){.
2f80: 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54        pIndex->pT
2f90: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70  able->pIndex = p
2fa0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
2fb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49    }else{.      I
2fc0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66  ndex *p;.      f
2fd0: 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61  or(p=pIndex->pTa
2fe0: 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26  ble->pIndex; p &
2ff0: 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64  & p->pNext!=pInd
3000: 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b  ex; p=p->pNext){
3010: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20 26 26  }.      if( p &&
3020: 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65   p->pNext==pInde
3030: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  x ){.        p->
3040: 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e  pNext = pIndex->
3050: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
3060: 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64     }.    freeInd
3070: 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  ex(pIndex);.  }.
3080: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
3090: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
30a0: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  ges;.}../*.** Er
30b0: 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69  ase all schema i
30c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
30d0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
30e0: 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20  sh tables of.** 
30f0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
3100: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
3110: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
3120: 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20  claim memory.** 
3130: 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 62  before the datab
3140: 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20  ase closes.  It 
3150: 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64  is also called d
3160: 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b  uring a rollback
3170: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77 65 72  .** if there wer
3180: 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73  e schema changes
3190: 20 64 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e   during the tran
31a0: 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a  saction or if a.
31b0: 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65  ** schema-cookie
31c0: 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73   mismatch occurs
31d0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 3d  ..**.** If iDb<=
31e0: 30 20 74 68 65 6e 20 72 65 73 65 74 20 74 68 65  0 then reset the
31f0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
3200: 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20   tables for all 
3210: 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
3220: 73 2e 20 20 49 66 20 69 44 62 3e 3d 32 20 74 68  s.  If iDb>=2 th
3230: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
3240: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72  ernal schema for
3250: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e   only the.** sin
3260: 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74  gle file indicat
3270: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
3280: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
3290: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
32a0: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
32b0: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65  int i, j;.  asse
32c0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
32d0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
32e0: 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20  if( iDb==0 ){.  
32f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
3300: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a  terAll(db);.  }.
3310: 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64    for(i=iDb; i<d
3320: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
3330: 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d    Db *pDb = &db-
3340: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28  >aDb[i];.    if(
3350: 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b   pDb->pSchema ){
3360: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 69 3d  .      assert(i=
3370: 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20  =1 || (pDb->pBt 
3380: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  && sqlite3BtreeH
3390: 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d 3e 70  oldsMutex(pDb->p
33a0: 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  Bt)));.      sql
33b0: 69 74 65 33 53 63 68 65 6d 61 46 72 65 65 28 70  ite3SchemaFree(p
33c0: 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Db->pSchema);.  
33d0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e    }.    if( iDb>
33e0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a  0 ) return;.  }.
33f0: 20 20 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30    assert( iDb==0
3400: 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20   );.  db->flags 
3410: 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72  &= ~SQLITE_Inter
3420: 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69  nChanges;.  sqli
3430: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
3440: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f  (db);..  /* If o
3450: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
3460: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
3470: 62 61 73 65 20 66 69 6c 65 73 20 68 61 73 20 62  base files has b
3480: 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a  een closed,.  **
3490: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65   then remove the
34a0: 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c  m from the auxil
34b0: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 6c 69  iary database li
34c0: 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65  st.  We take the
34d0: 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  .  ** opportunit
34e0: 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72  y to do this her
34f0: 65 20 73 69 6e 63 65 20 77 65 20 68 61 76 65 20  e since we have 
3500: 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c  just deleted all
3510: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68   of the.  ** sch
3520: 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65 73 20  ema hash tables 
3530: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f  and therefore do
3540: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b   not have to mak
3550: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20  e any changes.  
3560: 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f  ** to any of tho
3570: 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  se tables..  */.
3580: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
3590: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
35a0: 73 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d  struct Db *pDb =
35b0: 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20   &db->aDb[i];.  
35c0: 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d    if( pDb->pBt==
35d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
35e0: 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d  Db->pAux && pDb-
35f0: 3e 78 46 72 65 65 41 75 78 20 29 20 70 44 62 2d  >xFreeAux ) pDb-
3600: 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70  >xFreeAux(pDb->p
3610: 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d  Aux);.      pDb-
3620: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d  >pAux = 0;.    }
3630: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  .  }.  for(i=j=2
3640: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3650: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3660: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3670: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3680: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3690: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
36a0: 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  Db->zName);.    
36b0: 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20 30    pDb->zName = 0
36c0: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
36d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36e0: 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62 2d  j<i ){.      db-
36f0: 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61 44  >aDb[j] = db->aD
3700: 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  b[i];.    }.    
3710: 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  j++;.  }.  memse
3720: 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20 30  t(&db->aDb[j], 0
3730: 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73 69  , (db->nDb-j)*si
3740: 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d 29  zeof(db->aDb[j])
3750: 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 6a  );.  db->nDb = j
3760: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62 3c  ;.  if( db->nDb<
3770: 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d 64  =2 && db->aDb!=d
3780: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b 0a  b->aDbStatic ){.
3790: 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61      memcpy(db->a
37a0: 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61 44  DbStatic, db->aD
37b0: 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b, 2*sizeof(db->
37c0: 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73 71  aDb[0]));.    sq
37d0: 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61  lite3_free(db->a
37e0: 44 62 29 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62  Db);.    db->aDb
37f0: 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
3800: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
3810: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
3820: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6d  alled when a com
3830: 6d 69 74 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76  mit occurs..*/.v
3840: 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69  oid sqlite3Commi
3850: 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
3860: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3870: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
3880: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
3890: 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ges;.}../*.** Cl
38a0: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
38b0: 61 6d 65 73 20 66 72 6f 6d 20 61 20 74 61 62 6c  ames from a tabl
38c0: 65 20 6f 72 20 76 69 65 77 2e 0a 2a 2f 0a 73 74  e or view..*/.st
38d0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
38e0: 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ResetColumnNames
38f0: 28 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b  (Table *pTable){
3900: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75  .  int i;.  Colu
3910: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65  mn *pCol;.  asse
3920: 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b  rt( pTable!=0 );
3930: 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70  .  if( (pCol = p
3940: 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20  Table->aCol)!=0 
3950: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
3960: 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20  i<pTable->nCol; 
3970: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
3980: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3990: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  (pCol->zName);. 
39a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
39b0: 44 65 6c 65 74 65 28 70 43 6f 6c 2d 3e 70 44 66  Delete(pCol->pDf
39c0: 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  lt);.      sqlit
39d0: 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a 54  e3_free(pCol->zT
39e0: 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ype);.      sqli
39f0: 74 65 33 5f 66 72 65 65 28 70 43 6f 6c 2d 3e 7a  te3_free(pCol->z
3a00: 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Coll);.    }.   
3a10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
3a20: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
3a30: 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20  .  pTable->aCol 
3a40: 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e  = 0;.  pTable->n
3a50: 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Col = 0;.}../*.*
3a60: 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d  * Remove the mem
3a70: 6f 72 79 20 64 61 74 61 20 73 74 72 75 63 74 75  ory data structu
3a80: 72 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  res associated w
3a90: 69 74 68 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  ith the given.**
3aa0: 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e   Table.  No chan
3ab0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
3ac0: 64 69 73 6b 20 62 79 20 74 68 69 73 20 72 6f 75  disk by this rou
3ad0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tine..**.** This
3ae0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 64 65   routine just de
3af0: 6c 65 74 65 73 20 74 68 65 20 64 61 74 61 20 73  letes the data s
3b00: 74 72 75 63 74 75 72 65 2e 20 20 49 74 20 64 6f  tructure.  It do
3b10: 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a  es not unlink.**
3b20: 20 74 68 65 20 74 61 62 6c 65 20 64 61 74 61 20   the table data 
3b30: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
3b40: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 20  he hash table.  
3b50: 4e 6f 72 20 64 6f 65 73 20 69 74 20 72 65 6d 6f  Nor does it remo
3b60: 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e 20 6b 65  ve.** foreign ke
3b70: 79 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  ys from the sqli
3b80: 74 65 2e 61 46 4b 65 79 20 68 61 73 68 20 74 61  te.aFKey hash ta
3b90: 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65  ble.  But it doe
3ba0: 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d  s destroy.** mem
3bb0: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f  ory structures o
3bc0: 66 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e  f the indices an
3bd0: 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61  d foreign keys a
3be0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
3bf0: 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  ** the table..*/
3c00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c  .void sqlite3Del
3c10: 65 74 65 54 61 62 6c 65 28 54 61 62 6c 65 20 2a  eteTable(Table *
3c20: 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78  pTable){.  Index
3c30: 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74   *pIndex, *pNext
3c40: 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c  ;.  FKey *pFKey,
3c50: 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a 0a 20 20   *pNextFKey;..  
3c60: 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 20  if( pTable==0 ) 
3c70: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 44 6f  return;..  /* Do
3c80: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
3c90: 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20  table until the 
3ca0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3cb0: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f  reaches zero. */
3cc0: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d  .  pTable->nRef-
3cd0: 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  -;.  if( pTable-
3ce0: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72  >nRef>0 ){.    r
3cf0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
3d00: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65  ert( pTable->nRe
3d10: 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65  f==0 );..  /* De
3d20: 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  lete all indices
3d30: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3d40: 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f   this table.  */
3d50: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
3d60: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
3d70: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
3d80: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
3d90: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
3da0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
3db0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
3dc0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
3dd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 44 65 6c 65  ;.    sqliteDele
3de0: 74 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b  teIndex(pIndex);
3df0: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
3e00: 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
3e10: 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74  N_KEY.  /* Delet
3e20: 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65  e all foreign ke
3e30: 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
3e40: 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20  th this table.  
3e50: 54 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68  The keys.  ** sh
3e60: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
3e70: 79 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20  y been unlinked 
3e80: 66 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61  from the pSchema
3e90: 2d 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62  ->aFKey hash tab
3ea0: 6c 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  le .  */.  for(p
3eb0: 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b  FKey=pTable->pFK
3ec0: 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79  ey; pFKey; pFKey
3ed0: 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20  =pNextFKey){.   
3ee0: 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b   pNextFKey = pFK
3ef0: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20  ey->pNextFrom;. 
3f00: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
3f10: 65 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62  e3HashFind(&pTab
3f20: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b  le->pSchema->aFK
3f30: 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
3f50: 46 4b 65 79 2d 3e 7a 54 6f 2c 20 73 74 72 6c 65  FKey->zTo, strle
3f60: 6e 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 2b 31 29  n(pFKey->zTo)+1)
3f70: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3f80: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 4b 65  qlite3_free(pFKe
3f90: 79 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  y);.  }.#endif..
3fa0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20    /* Delete the 
3fb0: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  Table structure 
3fc0: 69 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73  itself..  */.  s
3fd0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
3fe0: 4e 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20  Names(pTable);. 
3ff0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54   sqlite3_free(pT
4000: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
4010: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 54 61  sqlite3_free(pTa
4020: 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20  ble->zColAff);. 
4030: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
4040: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 53 65  lete(pTable->pSe
4050: 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  lect);.#ifndef S
4060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
4070: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
4080: 6c 65 74 65 28 70 54 61 62 6c 65 2d 3e 70 43 68  lete(pTable->pCh
4090: 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  eck);.#endif.  s
40a0: 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28  qlite3VtabClear(
40b0: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
40c0: 65 33 5f 66 72 65 65 28 70 54 61 62 6c 65 29 3b  e3_free(pTable);
40d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
40e0: 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65   the given table
40f0: 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74   from the hash t
4100: 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64 65  ables and the de
4110: 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62 6c  lete the.** tabl
4120: 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  e structure with
4130: 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65 73   all its indices
4140: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
4150: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4160: 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74  e3UnlinkAndDelet
4170: 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a  eTable(sqlite3 *
4180: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e  db, int iDb, con
4190: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d  st char *zTabNam
41a0: 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  e){.  Table *p;.
41b0: 20 20 46 4b 65 79 20 2a 70 46 31 2c 20 2a 70 46    FKey *pF1, *pF
41c0: 32 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20  2;.  Db *pDb;.. 
41d0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
41e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
41f0: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
4200: 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a  b );.  assert( z
4210: 54 61 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e  TabName && zTabN
4220: 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20  ame[0] );.  pDb 
4230: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
4240: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61  .  p = sqlite3Ha
4250: 73 68 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70  shInsert(&pDb->p
4260: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
4270: 20 7a 54 61 62 4e 61 6d 65 2c 20 73 74 72 6c 65   zTabName, strle
4280: 6e 28 7a 54 61 62 4e 61 6d 65 29 2b 31 2c 30 29  n(zTabName)+1,0)
4290: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 23 69 66  ;.  if( p ){.#if
42a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
42b0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
42c0: 20 66 6f 72 28 70 46 31 3d 70 2d 3e 70 46 4b 65   for(pF1=p->pFKe
42d0: 79 3b 20 70 46 31 3b 20 70 46 31 3d 70 46 31 2d  y; pF1; pF1=pF1-
42e0: 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20  >pNextFrom){.   
42f0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 74 72     int nTo = str
4300: 6c 65 6e 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20  len(pF1->zTo) + 
4310: 31 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  1;.      pF2 = s
4320: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4330: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
4340: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
4350: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
4360: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
4370: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4380: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4390: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
43a0: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
43b0: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
43c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
43d0: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
43e0: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
43f0: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
4400: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
4410: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
4420: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
4430: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
4440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4450: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4460: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4470: 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64  able(p);.  }.  d
4480: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4490: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
44a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
44b0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
44c0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
44d0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
44e0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
44f0: 6f 6b 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75  oken with any qu
4500: 6f 74 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64  otations removed
4510: 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
4520: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
4530: 72 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69  ring.** is obtai
4540: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4550: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
4560: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
4570: 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63   calling.** func
4580: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65  tion..**.** Toke
4590: 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73  ns are often jus
45a0: 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20  t pointers into 
45b0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c  the original SQL
45c0: 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20   text and so.** 
45d0: 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72  are not \000 ter
45e0: 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20  minated and are 
45f0: 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20  not persistent. 
4600: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   The returned st
4610: 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20  ring.** is \000 
4620: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69  terminated and i
4630: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f  s persistent..*/
4640: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61  .char *sqlite3Na
4650: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69  meFromToken(sqli
4660: 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a  te3 *db, Token *
4670: 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  pName){.  char *
4680: 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61  zName;.  if( pNa
4690: 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
46a0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
46b0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e  up(db, (char*)pN
46c0: 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e  ame->z, pName->n
46d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
46e0: 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  quote(zName);.  
46f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65  }else{.    zName
4700: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
4710: 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zName;.}../*.
4720: 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69  ** Open the sqli
4730: 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
4740: 73 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61  stored in databa
4750: 73 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f  se number iDb fo
4760: 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68  r.** writing. Th
4770: 65 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65  e table is opene
4780: 64 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30  d using cursor 0
4790: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
47a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
47b0: 28 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69  (Parse *p, int i
47c0: 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
47d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
47e0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62  p);.  sqlite3Tab
47f0: 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d  leLock(p, iDb, M
4800: 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53  ASTER_ROOT, 1, S
4810: 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
4820: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
4830: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65  AddOp3(v, OP_Ope
4840: 6e 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45  nWrite, 0, MASTE
4850: 52 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20  R_ROOT, iDb);.  
4860: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4870: 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  2(v, OP_SetNumCo
4880: 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b 20 2f 2a  lumns, 0, 5); /*
4890: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 68   sqlite_master h
48a0: 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  as 5 columns */.
48b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b  }../*.** The tok
48c0: 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69  en *pName contai
48d0: 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ns the name of a
48e0: 20 64 61 74 61 62 61 73 65 20 28 65 69 74 68 65   database (eithe
48f0: 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22  r "main" or.** "
4900: 74 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d  temp" or the nam
4910: 65 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64  e of an attached
4920: 20 64 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69   db). This routi
4930: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
4940: 2a 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  * index of the n
4950: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
4960: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d   db->aDb[], or -
4970: 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64  1 if the named d
4980: 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65  b .** does not e
4990: 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  xist..*/.int sql
49a0: 69 74 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74  ite3FindDb(sqlit
49b0: 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70  e3 *db, Token *p
49c0: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
49d0: 20 2d 31 3b 20 20 20 20 2f 2a 20 44 61 74 61 62   -1;    /* Datab
49e0: 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
49f0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
4a00: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
4a10: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
4a20: 6d 65 20 2a 2f 0a 20 20 44 62 20 2a 70 44 62 3b  me */.  Db *pDb;
4a30: 20 20 20 20 20 20 20 2f 2a 20 41 20 64 61 74 61         /* A data
4a40: 62 61 73 65 20 77 68 6f 73 65 20 6e 61 6d 65 20  base whose name 
4a50: 73 70 61 63 65 20 69 73 20 62 65 69 6e 67 20 73  space is being s
4a60: 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 68 61  earched */.  cha
4a70: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  r *zName;   /* N
4a80: 61 6d 65 20 77 65 20 61 72 65 20 73 65 61 72 63  ame we are searc
4a90: 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 0a 20 20 7a  hing for */..  z
4aa0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4ab0: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
4ac0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
4ad0: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 20 3d 20 73  ame ){.    n = s
4ae0: 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20  trlen(zName);.  
4af0: 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62    for(i=(db->nDb
4b00: 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44  -1), pDb=&db->aD
4b10: 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c  b[i]; i>=0; i--,
4b20: 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69   pDb--){.      i
4b30: 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42  f( (!OMIT_TEMPDB
4b40: 20 7c 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d   || i!=1 ) && n=
4b50: 3d 73 74 72 6c 65 6e 28 70 44 62 2d 3e 7a 4e 61  =strlen(pDb->zNa
4b60: 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20  me) && .        
4b70: 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49    0==sqlite3StrI
4b80: 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20  Cmp(pDb->zName, 
4b90: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
4ba0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4bb0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
4bc0: 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
4bd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a    }.  return i;.
4be0: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
4bf0: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
4c00: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
4c10: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
4c20: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
4c30: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
4c40: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
4c50: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
4c60: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
4c70: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
4c80: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
4c90: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
4ca0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4cb0: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
4cc0: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
4cd0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
4ce0: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
4cf0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
4d00: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
4d10: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
4d20: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
4d30: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
4d40: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
4d50: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
4d60: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
4d70: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
4d80: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
4d90: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
4da0: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
4db0: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
4dc0: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
4dd0: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
4de0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
4df0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
4e00: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
4e10: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
4e20: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
4e30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4e40: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
4e50: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4e60: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4e70: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4e80: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
4e90: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
4ea0: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
4eb0: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
4ec0: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
4ed0: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
4ee0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4ef0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
4f00: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
4f10: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
4f20: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
4f30: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
4f40: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
4f50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4f60: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
4f70: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
4f80: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4f90: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d  >db;..  if( pNam
4fa0: 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  e2 && pName2->n>
4fb0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
4fc0: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
4fd0: 29 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20  );.    *pUnqual 
4fe0: 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44  = pName2;.    iD
4ff0: 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  b = sqlite3FindD
5000: 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20  b(db, pName1);. 
5010: 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a     if( iDb<0 ){.
5020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
5030: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
5040: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20  nknown database 
5050: 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20  %T", pName1);.  
5060: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
5070: 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ++;.      return
5080: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   -1;.    }.  }el
5090: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
50a0: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 30 20  db->init.iDb==0 
50b0: 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  || db->init.busy
50c0: 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 64 62   );.    iDb = db
50d0: 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20  ->init.iDb;.    
50e0: 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65  *pUnqual = pName
50f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
5100: 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  iDb;.}../*.** Th
5110: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
5120: 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
5130: 68 65 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  he UTF-8 string 
5140: 7a 4e 61 6d 65 20 69 73 20 61 20 6c 65 67 61 6c  zName is a legal
5150: 0a 2a 2a 20 75 6e 71 75 61 6c 69 66 69 65 64 20  .** unqualified 
5160: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 20 73  name for a new s
5170: 63 68 65 6d 61 20 6f 62 6a 65 63 74 20 28 74 61  chema object (ta
5180: 62 6c 65 2c 20 69 6e 64 65 78 2c 20 76 69 65 77  ble, index, view
5190: 20 6f 72 0a 2a 2a 20 74 72 69 67 67 65 72 29 2e   or.** trigger).
51a0: 20 41 6c 6c 20 6e 61 6d 65 73 20 61 72 65 20 6c   All names are l
51b0: 65 67 61 6c 20 65 78 63 65 70 74 20 74 68 6f 73  egal except thos
51c0: 65 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  e that begin wit
51d0: 68 20 74 68 65 20 73 74 72 69 6e 67 0a 2a 2a 20  h the string.** 
51e0: 22 73 71 6c 69 74 65 5f 22 20 28 69 6e 20 75 70  "sqlite_" (in up
51f0: 70 65 72 2c 20 6c 6f 77 65 72 20 6f 72 20 6d 69  per, lower or mi
5200: 78 65 64 20 63 61 73 65 29 2e 20 54 68 69 73 20  xed case). This 
5210: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  portion of the n
5220: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 73 20 72  amespace.** is r
5230: 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65  eserved for inte
5240: 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74  rnal use..*/.int
5250: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a   sqlite3CheckObj
5260: 65 63 74 4e 61 6d 65 28 50 61 72 73 65 20 2a 70  ectName(Parse *p
5270: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
5280: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 66 28  r *zName){.  if(
5290: 20 21 70 50 61 72 73 65 2d 3e 64 62 2d 3e 69 6e   !pParse->db->in
52a0: 69 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73  it.busy && pPars
52b0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 0a 20 20  e->nested==0 .  
52c0: 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 72          && (pPar
52d0: 73 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20  se->db->flags & 
52e0: 53 51 4c 49 54 45 5f 57 72 69 74 65 53 63 68 65  SQLITE_WriteSche
52f0: 6d 61 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  ma)==0.         
5300: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
5310: 72 4e 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  rNICmp(zName, "s
5320: 71 6c 69 74 65 5f 22 2c 20 37 29 20 29 7b 0a 20  qlite_", 7) ){. 
5330: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5340: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 62 6a 65  sg(pParse, "obje
5350: 63 74 20 6e 61 6d 65 20 72 65 73 65 72 76 65 64  ct name reserved
5360: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73   for internal us
5370: 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  e: %s", zName);.
5380: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5390: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
53a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
53b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
53c0: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 61 20 6e  constructing a n
53d0: 65 77 20 74 61 62 6c 65 20 72 65 70 72 65 73 65  ew table represe
53e0: 6e 74 61 74 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72  ntation in memor
53f0: 79 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20 74  y.  This is.** t
5400: 68 65 20 66 69 72 73 74 20 6f 66 20 73 65 76 65  he first of seve
5410: 72 61 6c 20 61 63 74 69 6f 6e 20 72 6f 75 74 69  ral action routi
5420: 6e 65 73 20 74 68 61 74 20 67 65 74 20 63 61 6c  nes that get cal
5430: 6c 65 64 20 69 6e 20 72 65 73 70 6f 6e 73 65 0a  led in response.
5440: 2a 2a 20 74 6f 20 61 20 43 52 45 41 54 45 20 54  ** to a CREATE T
5450: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
5460: 20 49 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20   In particular, 
5470: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
5480: 63 61 6c 6c 65 64 0a 2a 2a 20 61 66 74 65 72 20  called.** after 
5490: 73 65 65 69 6e 67 20 74 6f 6b 65 6e 73 20 22 43  seeing tokens "C
54a0: 52 45 41 54 45 22 20 61 6e 64 20 22 54 41 42 4c  REATE" and "TABL
54b0: 45 22 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65  E" and the table
54c0: 20 6e 61 6d 65 2e 20 54 68 65 20 69 73 54 65 6d   name. The isTem
54d0: 70 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75  p.** flag is tru
54e0: 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  e if the table s
54f0: 68 6f 75 6c 64 20 62 65 20 73 74 6f 72 65 64 20  hould be stored 
5500: 69 6e 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  in the auxiliary
5510: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
5520: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 20  e instead of in 
5530: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
5540: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  e file.  This is
5550: 20 6e 6f 72 6d 61 6c 6c 79 20 74 68 65 20 63 61   normally the ca
5560: 73 65 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 22  se.** when the "
5570: 54 45 4d 50 22 20 6f 72 20 22 54 45 4d 50 4f 52  TEMP" or "TEMPOR
5580: 41 52 59 22 20 6b 65 79 77 6f 72 64 20 6f 63 63  ARY" keyword occ
5590: 75 72 73 20 69 6e 20 62 65 74 77 65 65 6e 0a 2a  urs in between.*
55a0: 2a 20 43 52 45 41 54 45 20 61 6e 64 20 54 41 42  * CREATE and TAB
55b0: 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  LE..**.** The ne
55c0: 77 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69  w table record i
55d0: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e  s initialized an
55e0: 64 20 70 75 74 20 69 6e 20 70 50 61 72 73 65 2d  d put in pParse-
55f0: 3e 70 4e 65 77 54 61 62 6c 65 2e 0a 2a 2a 20 41  >pNewTable..** A
5600: 73 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 43 52  s more of the CR
5610: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5620: 6d 65 6e 74 20 69 73 20 70 61 72 73 65 64 2c 20  ment is parsed, 
5630: 61 64 64 69 74 69 6f 6e 61 6c 20 61 63 74 69 6f  additional actio
5640: 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 77 69  n.** routines wi
5650: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 74 6f 20  ll be called to 
5660: 61 64 64 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  add more informa
5670: 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 65 63  tion to this rec
5680: 6f 72 64 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65  ord..** At the e
5690: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
56a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
56b0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 45 6e 64  , the sqlite3End
56c0: 54 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 0a  Table() routine.
56d0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ** is called to 
56e0: 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 63 6f 6e  complete the con
56f0: 73 74 72 75 63 74 69 6f 6e 20 6f 66 20 74 68 65  struction of the
5700: 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f 72   new table recor
5710: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
5720: 65 33 53 74 61 72 74 54 61 62 6c 65 28 0a 20 20  e3StartTable(.  
5730: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5740: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
5750: 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
5760: 4e 61 6d 65 31 2c 20 20 20 2f 2a 20 46 69 72 73  Name1,   /* Firs
5770: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61  t part of the na
5780: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
5790: 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  or view */.  Tok
57a0: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 2f 2a  en *pName2,   /*
57b0: 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
57c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
57d0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
57e0: 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20  .  int isTemp,  
57f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
5800: 68 69 73 20 69 73 20 61 20 54 45 4d 50 20 74 61  his is a TEMP ta
5810: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ble */.  int isV
5820: 69 65 77 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  iew,      /* Tru
5830: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
5840: 49 45 57 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  IEW */.  int isV
5850: 69 72 74 75 61 6c 2c 20 20 20 2f 2a 20 54 72 75  irtual,   /* Tru
5860: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 56  e if this is a V
5870: 49 52 54 55 41 4c 20 74 61 62 6c 65 20 2a 2f 0a  IRTUAL table */.
5880: 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20 20    int noErr     
5890: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
58a0: 20 69 66 20 74 61 62 6c 65 20 61 6c 72 65 61 64   if table alread
58b0: 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
58c0: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 0a   Table *pTable;.
58d0: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
58e0: 30 3b 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 6f  0; /* The name o
58f0: 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
5900: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5910: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
5920: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20   Vdbe *v;.  int 
5930: 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  iDb;         /* 
5940: 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  Database number 
5950: 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
5960: 62 6c 65 20 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ble in */.  Toke
5970: 6e 20 2a 70 4e 61 6d 65 3b 20 20 20 20 2f 2a 20  n *pName;    /* 
5980: 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
5990: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
59a0: 20 63 72 65 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a   create */..  /*
59b0: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
59c0: 65 77 20 6e 61 6d 65 20 74 6f 20 63 72 65 61 74  ew name to creat
59d0: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
59e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
59f0: 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d  tokens.  ** pNam
5a00: 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49  e1 and pName2. I
5a10: 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  f the table name
5a20: 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69   was fully quali
5a30: 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c  fied, for exampl
5a40: 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 52 45  e:.  **.  ** CRE
5a50: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
5a60: 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20  y (...);.  ** . 
5a70: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5a80: 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22 20  is set to "xxx" 
5a90: 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79 22  and pName2 "yyy"
5aa0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
5ab0: 61 6e 64 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  and if.  ** the 
5ac0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f  table name is no
5ad0: 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  t fully qualifie
5ae0: 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20  d, i.e.:.  **.  
5af0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5b00: 79 79 79 28 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20  yyy(...);.  **. 
5b10: 20 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20   ** Then pName1 
5b20: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5b30: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5b40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
5b50: 63 61 6c 6c 20 62 65 6c 6f 77 20 73 65 74 73 20  call below sets 
5b60: 74 68 65 20 70 4e 61 6d 65 20 70 6f 69 6e 74 65  the pName pointe
5b70: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
5b80: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
5b90: 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d 65 32 29 20  or.  ** pName2) 
5ba0: 74 68 61 74 20 73 74 6f 72 65 73 20 74 68 65 20  that stores the 
5bb0: 75 6e 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c  unqualified tabl
5bc0: 65 20 6e 61 6d 65 2e 20 54 68 65 20 76 61 72 69  e name. The vari
5bd0: 61 62 6c 65 20 69 44 62 20 69 73 0a 20 20 2a 2a  able iDb is.  **
5be0: 20 73 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65   set to the inde
5bf0: 78 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  x of the databas
5c00: 65 20 74 68 61 74 20 74 68 65 20 74 61 62 6c 65  e that the table
5c10: 20 6f 72 20 76 69 65 77 20 69 73 20 74 6f 20 62   or view is to b
5c20: 65 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69  e.  ** created i
5c30: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44 62 20 3d 20  n..  */.  iDb = 
5c40: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
5c50: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
5c60: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
5c70: 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
5c80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5c90: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5ca0: 69 73 54 65 6d 70 20 26 26 20 69 44 62 3e 31 20  isTemp && iDb>1 
5cb0: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 63 72 65  ){.    /* If cre
5cc0: 61 74 69 6e 67 20 61 20 74 65 6d 70 20 74 61 62  ating a temp tab
5cd0: 6c 65 2c 20 74 68 65 20 6e 61 6d 65 20 6d 61 79  le, the name may
5ce0: 20 6e 6f 74 20 62 65 20 71 75 61 6c 69 66 69 65   not be qualifie
5cf0: 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  d */.    sqlite3
5d00: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5d10: 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c   "temporary tabl
5d20: 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75  e name must be u
5d30: 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20  nqualified");.  
5d40: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
5d50: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
5d60: 20 26 26 20 69 73 54 65 6d 70 20 29 20 69 44 62   && isTemp ) iDb
5d70: 20 3d 20 31 3b 0a 0a 20 20 70 50 61 72 73 65 2d   = 1;..  pParse-
5d80: 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70  >sNameToken = *p
5d90: 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  Name;.  zName = 
5da0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5db0: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
5dc0: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
5dd0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
5de0: 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
5df0: 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d  e3CheckObjectNam
5e00: 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29  e(pParse, zName)
5e10: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67   ){.    goto beg
5e20: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
5e30: 20 20 7d 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e    }.  if( db->in
5e40: 69 74 2e 69 44 62 3d 3d 31 20 29 20 69 73 54 65  it.iDb==1 ) isTe
5e50: 6d 70 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  mp = 1;.#ifndef 
5e60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
5e70: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 61 73 73 65  ORIZATION.  asse
5e80: 72 74 28 20 28 69 73 54 65 6d 70 20 26 20 31 29  rt( (isTemp & 1)
5e90: 3d 3d 69 73 54 65 6d 70 20 29 3b 0a 20 20 7b 0a  ==isTemp );.  {.
5ea0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
5eb0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62    char *zDb = db
5ec0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
5ed0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
5ee0: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
5ef0: 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54  e, SQLITE_INSERT
5f00: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
5f10: 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20  sTemp), 0, zDb) 
5f20: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
5f30: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
5f40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
5f50: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
5f60: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
5f70: 26 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  && isTemp ){.   
5f80: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
5f90: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 56  TE_CREATE_TEMP_V
5fa0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IEW;.      }else
5fb0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5fc0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 56   SQLITE_CREATE_V
5fd0: 49 45 57 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  IEW;.      }.   
5fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66   }else{.      if
5ff0: 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
6000: 26 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  & isTemp ){.    
6010: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
6020: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
6030: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  BLE;.      }else
6040: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6050: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6060: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ABLE;.      }.  
6070: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69 73 56    }.    if( !isV
6080: 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69 74 65  irtual && sqlite
6090: 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
60a0: 65 2c 20 63 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20  e, code, zName, 
60b0: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
60c0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
60d0: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
60e0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
60f0: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
6100: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
6110: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
6120: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
6130: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
6140: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
6150: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
6160: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
6170: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
6180: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
6190: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
61a0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
61b0: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
61c0: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
61d0: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
61e0: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
61f0: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
6200: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
6210: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
6220: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
6230: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
6240: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
6250: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
6260: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
6270: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
6280: 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ){.    if( SQLIT
6290: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
62a0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
62b0: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65  ){.      goto be
62c0: 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b  gin_table_error;
62d0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 6c  .    }.    pTabl
62e0: 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  e = sqlite3FindT
62f0: 61 62 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  able(db, zName, 
6300: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
6310: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  me);.    if( pTa
6320: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ble ){.      if(
6330: 20 21 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20   !noErr ){.     
6340: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
6350: 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
6360: 65 20 25 54 20 61 6c 72 65 61 64 79 20 65 78 69  e %T already exi
6370: 73 74 73 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  sts", pName);.  
6380: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
6390: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
63a0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
63b0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
63c0: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  ex(db, zName, 0)
63d0: 21 3d 30 20 26 26 20 28 69 44 62 3d 3d 30 20 7c  !=0 && (iDb==0 |
63e0: 7c 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  | !db->init.busy
63f0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
6400: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6410: 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
6420: 65 61 64 79 20 61 6e 20 69 6e 64 65 78 20 6e 61  eady an index na
6430: 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
6440: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6450: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6460: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 54 61 62     }.  }..  pTab
6470: 6c 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  le = sqlite3DbMa
6480: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
6490: 65 6f 66 28 54 61 62 6c 65 29 29 3b 0a 20 20 69  eof(Table));.  i
64a0: 66 28 20 70 54 61 62 6c 65 3d 3d 30 20 29 7b 0a  f( pTable==0 ){.
64b0: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
64c0: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50  iled = 1;.    pP
64d0: 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54  arse->rc = SQLIT
64e0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 70 50 61  E_NOMEM;.    pPa
64f0: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
6500: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6510: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  e_error;.  }.  p
6520: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a  Table->zName = z
6530: 4e 61 6d 65 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  Name;.  pTable->
6540: 69 50 4b 65 79 20 3d 20 2d 31 3b 0a 20 20 70 54  iPKey = -1;.  pT
6550: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 3d 20  able->pSchema = 
6560: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
6570: 68 65 6d 61 3b 0a 20 20 70 54 61 62 6c 65 2d 3e  hema;.  pTable->
6580: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 69 66 28 20  nRef = 1;.  if( 
6590: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
65a0: 65 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74  e ) sqlite3Delet
65b0: 65 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70  eTable(pParse->p
65c0: 4e 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61  NewTable);.  pPa
65d0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d  rse->pNewTable =
65e0: 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49   pTable;..  /* I
65f0: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61  f this is the ma
6600: 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65  gic sqlite_seque
6610: 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62  nce table used b
6620: 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c  y autoincrement,
6630: 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72  .  ** then recor
6640: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  d a pointer to t
6650: 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65  his table in the
6660: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
6670: 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f  tructure.  ** so
6680: 20 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e   that INSERT can
6690: 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20   find the table 
66a0: 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  easily..  */.#if
66b0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
66c0: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
66d0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65   if( !pParse->ne
66e0: 73 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a  sted && strcmp(z
66f0: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65  Name, "sqlite_se
6700: 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20  quence")==0 ){. 
6710: 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65     pTable->pSche
6720: 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54  ma->pSeqTab = pT
6730: 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  able;.  }.#endif
6740: 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e  ..  /* Begin gen
6750: 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65  erating the code
6760: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72   that will inser
6770: 74 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  t the table reco
6780: 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65  rd into.  ** the
6790: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
67a0: 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70  able.  Note in p
67b0: 61 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77  articular that w
67c0: 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a  e must go ahead.
67d0: 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74    ** and allocat
67e0: 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  e the record num
67f0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
6800: 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65  e entry now.  Be
6810: 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52  fore any.  ** PR
6820: 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
6830: 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65  QUE keywords are
6840: 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20   parsed.  Those 
6850: 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61  keywords will ca
6860: 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  use.  ** indices
6870: 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61   to be created a
6880: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63  nd the table rec
6890: 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65  ord must come be
68a0: 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69  fore the .  ** i
68b0: 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20  ndices.  Hence, 
68c0: 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65  the record numbe
68d0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
68e0: 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
68f0: 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f  d.  ** now..  */
6900: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
6910: 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71  .busy && (v = sq
6920: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
6930: 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  rse))!=0 ){.    
6940: 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20  int j1;.    int 
6950: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
6960: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
6970: 72 65 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65  reg3;.    sqlite
6980: 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
6990: 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
69a0: 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  iDb);..#ifndef S
69b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
69c0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
69d0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
69e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
69f0: 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69  dOp0(v, OP_VBegi
6a00: 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  n);.    }.#endif
6a10: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
6a20: 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20  file format and 
6a30: 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20  encoding in the 
6a40: 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f  database have no
6a50: 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20  t been set, .   
6a60: 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77   ** set them now
6a70: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
6a80: 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  1 = pParse->regR
6a90: 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d  owid = ++pParse-
6aa0: 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20  >nMem;.    reg2 
6ab0: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  = pParse->regRoo
6ac0: 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  t = ++pParse->nM
6ad0: 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b  em;.    reg3 = +
6ae0: 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
6af0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6b00: 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43  dOp3(v, OP_ReadC
6b10: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33  ookie, iDb, reg3
6b20: 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f  , 1);   /* file_
6b30: 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 73 71  format */.    sq
6b40: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
6b50: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
6b60: 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  j1 = sqlite3Vdbe
6b70: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
6b80: 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65   reg3);.    file
6b90: 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c  Format = (db->fl
6ba0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67  ags & SQLITE_Leg
6bb0: 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f  acyFileFmt)!=0 ?
6bc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6bd0: 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41     1 : SQLITE_MA
6be0: 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20  X_FILE_FORMAT;. 
6bf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c00: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6c10: 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20  er, fileFormat, 
6c20: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
6c30: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
6c40: 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44  OP_SetCookie, iD
6c50: 62 2c 20 31 2c 20 72 65 67 33 29 3b 0a 20 20 20  b, 1, reg3);.   
6c60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6c70: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
6c80: 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29  , ENC(db), reg3)
6c90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
6ca0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65  eAddOp3(v, OP_Se
6cb0: 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 2c  tCookie, iDb, 4,
6cc0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
6cd0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
6ce0: 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  v, j1);..    /* 
6cf0: 54 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65  This just create
6d00: 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72  s a place-holder
6d10: 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73   record in the s
6d20: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
6d30: 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72  le..    ** The r
6d40: 65 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f  ecord created do
6d50: 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61  es not contain a
6d60: 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74  nything yet.  It
6d70: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
6d80: 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  d.    ** by the 
6d90: 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f  real entry in co
6da0: 64 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20  de generated at 
6db0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
6dc0: 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
6dd0: 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   The rowid for t
6de0: 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
6df0: 6c 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  left on the top 
6e00: 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  of the stack..  
6e10: 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 76    ** The rowid v
6e20: 61 6c 75 65 20 69 73 20 6e 65 65 64 65 64 20 62  alue is needed b
6e30: 79 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  y the code that 
6e40: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20  sqlite3EndTable 
6e50: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e 65  will.    ** gene
6e60: 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  rate..    */.#if
6e70: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6e80: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
6e90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6ea0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6eb0: 29 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77  ).    if( isView
6ec0: 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b   || isVirtual ){
6ed0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6ee0: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
6ef0: 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29  nteger, 0, reg2)
6f00: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
6f10: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 73  if.    {.      s
6f20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6f30: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
6f40: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
6f50: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6f60: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
6f70: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
6f80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6f90: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
6fa0: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
6fb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6fc0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
6fd0: 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73   0, reg3);.    s
6fe0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6ff0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c 20 30  (v, OP_Insert, 0
7000: 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b 0a 20  , reg3, reg1);. 
7010: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
7020: 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
7030: 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20 73 71  _APPEND);.    sq
7040: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
7050: 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a 20 20  v, OP_Close);.  
7060: 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 28  }..  /* Normal (
7070: 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74 75 72  non-error) retur
7080: 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 3b 0a  n. */.  return;.
7090: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
70a0: 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a 75 6d  r occurs, we jum
70b0: 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69 6e 5f  p here */.begin_
70c0: 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20 20 73  table_error:.  s
70d0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
70e0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
70f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
7100: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  o is used to com
7110: 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73  pare two strings
7120: 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e   in a case-insen
7130: 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a  sitive manner..*
7140: 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79  * It is slightly
7150: 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c   faster than cal
7160: 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49  ling sqlite3StrI
7170: 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20  Cmp() directly, 
7180: 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20  but.** produces 
7190: 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a  larger code..**.
71a0: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73  ** WARNING: This
71b0: 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f   macro is not co
71c0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
71d0: 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c  e strcmp() famil
71e0: 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  y. It.** returns
71f0: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f   true if the two
7200: 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75   strings are equ
7210: 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61  al, otherwise fa
7220: 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lse..*/.#define 
7230: 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c  STRICMP(x, y) (\
7240: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
7250: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
7260: 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20  char *)(x)]==   
7270: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
7280: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
7290: 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20   char *)(y)]    
72a0: 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72   \.&& sqlite3Str
72b0: 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31  ICmp((x)+1,(y)+1
72c0: 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64  )==0 )../*.** Ad
72d0: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
72e0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
72f0: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
7300: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
7310: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
7320: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
7330: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
7340: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
7350: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
7360: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
7370: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
7380: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
7390: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
73a0: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
73b0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
73c0: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
73d0: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
73e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
73f0: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
7400: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
7410: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
7420: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
7430: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
7440: 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  Col;.  if( (p = 
7450: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7460: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
7470: 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e    if( p->nCol+1>
7480: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
7490: 4e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  N ){.    sqlite3
74a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
74b0: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
74c0: 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e  ns on %s", p->zN
74d0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
74e0: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
74f0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
7500: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61  (pParse->db, pNa
7510: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
7520: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7530: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
7540: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54  i++){.    if( ST
7550: 52 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c  RICMP(z, p->aCol
7560: 5b 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  [i].zName) ){.  
7570: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7580: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
7590: 6c 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61  licate column na
75a0: 6d 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  me: %s", z);.   
75b0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
75c0: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
75d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
75e0: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
75f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
7600: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
7610: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
7620: 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62  alloc(pParse->db
7630: 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f  ,p->aCol,(p->nCo
7640: 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  l+8)*sizeof(p->a
7650: 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  Col[0]));.    if
7660: 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( aNew==0 ){.   
7670: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
7680: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
7690: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
76a0: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
76b0: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
76c0: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
76d0: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
76e0: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
76f0: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
7700: 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20   = z;. .  /* If 
7710: 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65  there is no type
7720: 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75   specified, colu
7730: 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65 66  mns have the def
7740: 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20  ault affinity.  
7750: 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68  ** 'NONE'. If th
7760: 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73 70  ere is a type sp
7770: 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71  ecified, then sq
7780: 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79  lite3AddColumnTy
7790: 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62  pe() will.  ** b
77a0: 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f  e called next to
77b0: 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   set pCol->affin
77c0: 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ity correctly.. 
77d0: 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69   */.  pCol->affi
77e0: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
77f0: 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f  F_NONE;.  p->nCo
7800: 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  l++;.}../*.** Th
7810: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
7820: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
7830: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
7840: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
7850: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
7860: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
7870: 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e  A "NOT NULL" con
7880: 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62  straint has.** b
7890: 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f  een seen on a co
78a0: 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74  lumn.  This rout
78b0: 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74  ine sets the not
78c0: 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20  Null flag on.** 
78d0: 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65  the column curre
78e0: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
78f0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
7900: 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75   sqlite3AddNotNu
7910: 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ll(Parse *pParse
7920: 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a  , int onError){.
7930: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e    Table *p;.  in
7940: 74 20 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  t i;.  if( (p = 
7950: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
7960: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
7970: 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b    i = p->nCol-1;
7980: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d  .  if( i>=0 ) p-
7990: 3e 61 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c  >aCol[i].notNull
79a0: 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f   = onError;.}../
79b0: 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f  *.** Scan the co
79c0: 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a  lumn type name z
79d0: 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79  Type (length nTy
79e0: 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74  pe) and return t
79f0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
7a00: 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a   affinity type..
7a10: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7a20: 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69  ne does a case-i
7a30: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63  ndependent searc
7a40: 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74  h of zType for t
7a50: 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67  he .** substring
7a60: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
7a70: 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65  ng table. If one
7a80: 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e   of the substrin
7a90: 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20  gs is.** found, 
7aa0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
7ab0: 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65  g affinity is re
7ac0: 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65  turned. If zType
7ad0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72   contains.** mor
7ae0: 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68  e than one of th
7af0: 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e  e substrings, en
7b00: 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65  tries toward the
7b10: 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20   top of .** the 
7b20: 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72  table take prior
7b30: 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ity. For example
7b40: 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42  , if zType is 'B
7b50: 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c  LOBINT', .** SQL
7b60: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20  ITE_AFF_INTEGER 
7b70: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a  is returned..**.
7b80: 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20  ** Substring    
7b90: 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d   | Affinity.** -
7ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7bc0: 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20  ** 'INT'        
7bd0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   | SQLITE_AFF_IN
7be0: 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20  TEGER.** 'CHAR' 
7bf0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
7c00: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f  AFF_TEXT.** 'CLO
7c10: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
7c20: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
7c30: 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53  TEXT'        | S
7c40: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a  QLITE_AFF_TEXT.*
7c50: 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20  * 'BLOB'        
7c60: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  | SQLITE_AFF_NON
7c70: 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20  E.** 'REAL'     
7c80: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7c90: 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20  REAL.** 'FLOA'  
7ca0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7cb0: 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42  FF_REAL.** 'DOUB
7cc0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7cd0: 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a  E_AFF_REAL.**.**
7ce0: 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   If none of the 
7cf0: 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68  substrings in th
7d00: 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72  e above table ar
7d10: 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49  e found,.** SQLI
7d20: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69  TE_AFF_NUMERIC i
7d30: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63  s returned..*/.c
7d40: 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e  har sqlite3Affin
7d50: 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f  ityType(const To
7d60: 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75  ken *pType){.  u
7d70: 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72  32 h = 0;.  char
7d80: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7d90: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e  F_NUMERIC;.  con
7da0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
7db0: 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a   *zIn = pType->z
7dc0: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
7dd0: 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20  ed char *zEnd = 
7de0: 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d  &pType->z[pType-
7df0: 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a  >n];..  while( z
7e00: 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20  In!=zEnd ){.    
7e10: 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c  h = (h<<8) + sql
7e20: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
7e30: 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b  [*zIn];.    zIn+
7e40: 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28  +;.    if( h==((
7e50: 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31  'c'<<24)+('h'<<1
7e60: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29  6)+('a'<<8)+'r')
7e70: 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
7e80: 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20  /* CHAR */.     
7e90: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
7ea0: 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c  F_TEXT; .    }el
7eb0: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c  se if( h==(('c'<
7ec0: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
7ed0: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20  'o'<<8)+'b') ){ 
7ee0: 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f        /* CLOB */
7ef0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
7f00: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20  ITE_AFF_TEXT;.  
7f10: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
7f20: 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c  ('t'<<24)+('e'<<
7f30: 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27  16)+('x'<<8)+'t'
7f40: 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45  ) ){       /* TE
7f50: 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  XT */.      aff 
7f60: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  = SQLITE_AFF_TEX
7f70: 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
7f80: 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28   h==(('b'<<24)+(
7f90: 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38  'l'<<16)+('o'<<8
7fa0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
7fb0: 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20  /* BLOB */.     
7fc0: 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49     && (aff==SQLI
7fd0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c  TE_AFF_NUMERIC |
7fe0: 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46  | aff==SQLITE_AF
7ff0: 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20  F_REAL) ){.     
8000: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8010: 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20  F_NONE;.#ifndef 
8020: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
8030: 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d  TING_POINT.    }
8040: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72  else if( h==(('r
8050: 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29  '<<24)+('e'<<16)
8060: 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20  +('a'<<8)+'l')  
8070: 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20          /* REAL 
8080: 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66  */.        && af
8090: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
80a0: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61  MERIC ){.      a
80b0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
80c0: 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  REAL;.    }else 
80d0: 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34  if( h==(('f'<<24
80e0: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
80f0: 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20  <<8)+'a')       
8100: 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20     /* FLOA */.  
8110: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
8120: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8130: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
8140: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
8150: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
8160: 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f  ==(('d'<<24)+('o
8170: 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b  '<<16)+('u'<<8)+
8180: 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'b')          /*
8190: 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20   DOUB */.       
81a0: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
81b0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
81c0: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
81d0: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64  E_AFF_REAL;.#end
81e0: 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  if.    }else if(
81f0: 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d   (h&0x00FFFFFF)=
8200: 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27  =(('i'<<16)+('n'
8210: 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20  <<8)+'t') ){    
8220: 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20  /* INT */.      
8230: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8240: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
8250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
8260: 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a  ..  return aff;.
8270: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8280: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8290: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
82a0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
82b0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
82c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
82d0: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70  tatement.  The p
82e0: 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74  First token is t
82f0: 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65  he first.** toke
8300: 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63  n in the sequenc
8310: 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74  e of tokens that
8320: 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79   describe the ty
8330: 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c  pe of the.** col
8340: 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  umn currently un
8350: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8360: 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65  .   pLast is the
8370: 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69   last token.** i
8380: 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20  n the sequence. 
8390: 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d   Use this inform
83a0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75  ation to constru
83b0: 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74  ct a string.** t
83c0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
83d0: 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65   typename of the
83e0: 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72   column and stor
83f0: 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a  e that string.**
8400: 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76   in zType..*/ .v
8410: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f  oid sqlite3AddCo
8420: 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a  lumnType(Parse *
8430: 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
8440: 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a  Type){.  Table *
8450: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  p;.  int i;.  Co
8460: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 69  lumn *pCol;..  i
8470: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8480: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8490: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
84a0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
84b0: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
84c0: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69  Col = &p->aCol[i
84d0: 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  ];.  sqlite3_fre
84e0: 65 28 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  e(pCol->zType);.
84f0: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
8500: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
8510: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
8520: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
8530: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
8540: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
8550: 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pType);.}../*.**
8560: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8570: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
8580: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
8590: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
85a0: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
85b0: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
85c0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
85d0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
85e0: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
85f0: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
8600: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
8610: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
8620: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
8630: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
8640: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8650: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8660: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8670: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8680: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8690: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
86a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
86b0: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
86c0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
86d0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62  r *pExpr){.  Tab
86e0: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
86f0: 2a 70 43 6f 6c 3b 0a 20 20 69 66 28 20 28 70 20  *pCol;.  if( (p 
8700: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
8710: 62 6c 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  ble)!=0 ){.    p
8720: 43 6f 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b  Col = &(p->aCol[
8730: 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20  p->nCol-1]);.   
8740: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
8750: 72 49 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e  rIsConstantOrFun
8760: 63 74 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a  ction(pExpr) ){.
8770: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8780: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64  orMsg(pParse, "d
8790: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20  efault value of 
87a0: 63 6f 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e  column [%s] is n
87b0: 6f 74 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20  ot constant",.  
87c0: 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e          pCol->zN
87d0: 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ame);.    }else{
87e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 43 6f  .      Expr *pCo
87f0: 70 79 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  py;.      sqlite
8800: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8810: 64 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  db;.      sqlite
8820: 33 45 78 70 72 44 65 6c 65 74 65 28 70 43 6f 6c  3ExprDelete(pCol
8830: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
8840: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43  pCol->pDflt = pC
8850: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
8860: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 29 3b  rDup(db, pExpr);
8870: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 70 79  .      if( pCopy
8880: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8890: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
88a0: 20 26 70 43 6f 70 79 2d 3e 73 70 61 6e 2c 20 26   &pCopy->span, &
88b0: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
88c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
88d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
88e0: 65 74 65 28 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f  ete(pExpr);.}../
88f0: 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74  *.** Designate t
8900: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66  he PRIMARY KEY f
8910: 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70  or the table.  p
8920: 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f  List is a list o
8930: 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63  f names .** of c
8940: 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d  olumns that form
8950: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
8960: 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e  .  If pList is N
8970: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ULL, then the.**
8980: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
8990: 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  dded column of t
89a0: 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20  he table is the 
89b0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a  primary key..**.
89c0: 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68  ** A table can h
89d0: 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20  ave at most one 
89e0: 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66  primary key.  If
89f0: 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
8a00: 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d  dy has.** a prim
8a10: 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69  ary key (and thi
8a20: 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20  s is the second 
8a30: 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65  primary key) the
8a40: 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65  n create an.** e
8a50: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rror..**.** If t
8a60: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
8a70: 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f  s on a single co
8a80: 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74  lumn whose datat
8a90: 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a  ype is INTEGER,.
8aa0: 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  ** then we will 
8ab0: 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20  try to use that 
8ac0: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f  column as the ro
8ad0: 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61  wid.  Set the Ta
8ae0: 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65  ble.iPKey.** fie
8af0: 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ld of the table 
8b00: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8b10: 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64  on to be the ind
8b20: 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54  ex of the.** INT
8b30: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8b40: 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e   column.  Table.
8b50: 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20  iPKey is set to 
8b60: 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a  -1 if there is.*
8b70: 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49  * no INTEGER PRI
8b80: 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20  MARY KEY..**.** 
8b90: 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f  If the key is no
8ba0: 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  t an INTEGER PRI
8bb0: 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63  MARY KEY, then c
8bc0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a  reate a unique.*
8bd0: 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20  * index for the 
8be0: 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69  key.  No index i
8bf0: 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e  s created for IN
8c00: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
8c10: 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  Ys..*/.void sqli
8c20: 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79  te3AddPrimaryKey
8c30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8c40: 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  e,    /* Parsing
8c50: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
8c60: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  prList *pList,  
8c70: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64  /* List of field
8c80: 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64   names to be ind
8c90: 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e  exed */.  int on
8ca0: 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57  Error,      /* W
8cb0: 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61  hat to do with a
8cc0: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66   uniqueness conf
8cd0: 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75  lict */.  int au
8ce0: 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54  toInc,      /* T
8cf0: 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49  rue if the AUTOI
8d00: 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64  NCREMENT keyword
8d10: 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
8d20: 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20   int sortOrder  
8d30: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f     /* SQLITE_SO_
8d40: 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f  ASC or SQLITE_SO
8d50: 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61  _DESC */.){.  Ta
8d60: 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72  ble *pTab = pPar
8d70: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
8d80: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30   char *zType = 0
8d90: 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d  ;.  int iCol = -
8da0: 31 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62  1, i;.  if( pTab
8db0: 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
8dc0: 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72  E_VTAB ) goto pr
8dd0: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
8de0: 20 20 69 66 28 20 70 54 61 62 2d 3e 68 61 73 50    if( pTab->hasP
8df0: 72 69 6d 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  rimKey ){.    sq
8e00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8e10: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
8e20: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
8e30: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
8e40: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
8e50: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
8e60: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
8e70: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
8e80: 68 61 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  hasPrimKey = 1;.
8e90: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
8ea0: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
8eb0: 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20  b->nCol - 1;.   
8ec0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
8ed0: 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b  ].isPrimKey = 1;
8ee0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
8ef0: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
8f00: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
8f10: 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
8f20: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
8f30: 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iCol++){.       
8f40: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
8f50: 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
8f60: 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f  zName, pTab->aCo
8f70: 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d  l[iCol].zName)==
8f80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  0 ){.          b
8f90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
8fa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8fb0: 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ( iCol<pTab->nCo
8fc0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61  l ){.        pTa
8fd0: 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73  b->aCol[iCol].is
8fe0: 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20  PrimKey = 1;.   
8ff0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
9000: 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  f( pList->nExpr>
9010: 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20  1 ) iCol = -1;. 
9020: 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30   }.  if( iCol>=0
9030: 20 26 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e   && iCol<pTab->n
9040: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  Col ){.    zType
9050: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43   = pTab->aCol[iC
9060: 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20  ol].zType;.  }. 
9070: 20 69 66 28 20 7a 54 79 70 65 20 26 26 20 73 71   if( zType && sq
9080: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79  lite3StrICmp(zTy
9090: 70 65 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d  pe, "INTEGER")==
90a0: 30 0a 20 20 20 20 20 20 20 20 26 26 20 73 6f 72  0.        && sor
90b0: 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53  tOrder==SQLITE_S
90c0: 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61  O_ASC ){.    pTa
90d0: 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b  b->iPKey = iCol;
90e0: 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f  .    pTab->keyCo
90f0: 6e 66 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  nf = onError;.  
9100: 20 20 70 54 61 62 2d 3e 61 75 74 6f 49 6e 63 20    pTab->autoInc 
9110: 3d 20 61 75 74 6f 49 6e 63 3b 0a 20 20 7d 65 6c  = autoInc;.  }el
9120: 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63 20 29  se if( autoInc )
9130: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
9140: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d  _OMIT_AUTOINCREM
9150: 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65 33 45  ENT.    sqlite3E
9160: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9170: 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69  "AUTOINCREMENT i
9180: 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f  s only allowed o
9190: 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20 22 49  n an ".       "I
91a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
91b0: 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  EY");.#endif.  }
91c0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
91d0: 33 43 72 65 61 74 65 49 6e 64 65 78 28 70 50 61  3CreateIndex(pPa
91e0: 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c  rse, 0, 0, 0, pL
91f0: 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c  ist, onError, 0,
9200: 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30   0, sortOrder, 0
9210: 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30  );.    pList = 0
9220: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
9230: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
9240: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
9250: 28 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  (pList);.  retur
9260: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  n;.}../*.** Add 
9270: 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73  a new CHECK cons
9280: 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61  traint to the ta
9290: 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
92a0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
92b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
92c0: 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61  3AddCheckConstra
92d0: 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  int(.  Parse *pP
92e0: 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73  arse,    /* Pars
92f0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
9300: 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70   Expr *pCheckExp
9310: 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20  r  /* The check 
9320: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
9330: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9340: 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62  OMIT_CHECK.  Tab
9350: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
9360: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
9370: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
9380: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
9390: 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c  pTab && !IN_DECL
93a0: 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20  ARE_VTAB ){.    
93b0: 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65 78 70  /* The CHECK exp
93c0: 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20  ression must be 
93d0: 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20 74 68  duplicated so th
93e0: 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a  at tokens refer.
93f0: 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63      ** to malloc
9400: 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e 6f 74  ed space and not
9410: 20 74 68 65 20 28 65 70 68 65 6d 65 72 61 6c 29   the (ephemeral)
9420: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
9430: 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a  ATE TABLE.    **
9440: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
9450: 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d    pTab->pCheck =
9460: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28   sqlite3ExprAnd(
9470: 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  db, pTab->pCheck
9480: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
9490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
94b0: 44 75 70 28 64 62 2c 20 70 43 68 65 63 6b 45 78  Dup(db, pCheckEx
94c0: 70 72 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  pr));.  }.#endif
94d0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
94e0: 6c 65 74 65 28 70 43 68 65 63 6b 45 78 70 72 29  lete(pCheckExpr)
94f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
9500: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
9510: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
9520: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
9530: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
9540: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
9550: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
9560: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
9570: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
9580: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
9590: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
95a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
95b0: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
95c0: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
95d0: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
95e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
95f0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
9600: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
9610: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20  0 ) return;.  i 
9620: 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 0a 20 20  = p->nCol-1;..  
9630: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
9640: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
9650: 72 73 65 2d 3e 64 62 2c 20 70 54 6f 6b 65 6e 29  rse->db, pToken)
9660: 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29  ;.  if( !zColl )
9670: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
9680: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
9690: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
96a0: 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 49  ll, -1) ){.    I
96b0: 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20  ndex *pIdx;.    
96c0: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
96d0: 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20   = zColl;.  .   
96e0: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d   /* If the colum
96f0: 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20 61 73  n is declared as
9700: 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59   "<name> PRIMARY
9710: 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79   KEY COLLATE <ty
9720: 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65  pe>",.    ** the
9730: 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68  n an index may h
9740: 61 76 65 20 62 65 65 6e 20 63 72 65 61 74 65 64  ave been created
9750: 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20   on this column 
9760: 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
9770: 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65  * collation type
9780: 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72   was added. Corr
9790: 65 63 74 20 74 68 69 73 20 69 66 20 69 74 20 69  ect this if it i
97a0: 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20  s the case..    
97b0: 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  */.    for(pIdx=
97c0: 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  p->pIndex; pIdx;
97d0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
97e0: 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t){.      assert
97f0: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d  ( pIdx->nColumn=
9800: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
9810: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30  pIdx->aiColumn[0
9820: 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==i ){.        
9830: 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20  pIdx->azColl[0] 
9840: 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  = p->aCol[i].zCo
9850: 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ll;.      }.    
9860: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  }.  }else{.    s
9870: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c  qlite3_free(zCol
9880: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
9890: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
98a0: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
98b0: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
98c0: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
98d0: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
98e0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
98f0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9900: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
9910: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
9920: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9930: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
9940: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9950: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
9960: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9970: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
9980: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
9990: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
99a0: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
99b0: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
99c0: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
99d0: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
99e0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
99f0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
9a00: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
9a10: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
9a20: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
9a30: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
9a40: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9a50: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9a60: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9a70: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9a80: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9a90: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
9aa0: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
9ab0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9ac0: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
9ad0: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
9ae0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
9af0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9b00: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
9b10: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
9b20: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
9b30: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
9b40: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
9b50: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
9b60: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
9b70: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
9b80: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
9b90: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
9ba0: 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  age..*/.CollSeq 
9bb0: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
9bc0: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
9bd0: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
9be0: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
9bf0: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
9c00: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9c10: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
9c20: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
9c30: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
9c40: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
9c50: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
9c60: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9c70: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
9c80: 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75  e, nName, initbu
9c90: 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  sy);.  if( !init
9ca0: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
9cb0: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
9cc0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
9cd0: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
9ce0: 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61  q(db, pColl, zNa
9cf0: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
9d00: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
9d10: 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20      if( nName<0 
9d20: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65  ){.        nName
9d30: 20 3d 20 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29   = strlen(zName)
9d40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9d50: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9d60: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
9d70: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9d80: 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d  nce: %.*s", nNam
9d90: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
9da0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   pColl = 0;.    
9db0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9dc0: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
9dd0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9de0: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
9df0: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
9e00: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
9e10: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
9e20: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
9e30: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
9e40: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
9e50: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
9e60: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
9e70: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
9e80: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
9e90: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
9ea0: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
9eb0: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
9ec0: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
9ed0: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
9ee0: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
9ef0: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
9f00: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
9f10: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
9f20: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
9f30: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
9f40: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
9f50: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
9f60: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
9f70: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
9f80: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
9f90: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
9fa0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
9fb0: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
9fc0: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
9fd0: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
9fe0: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
9ff0: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
a000: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
a010: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
a020: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
a030: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
a040: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
a050: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
a060: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
a070: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
a080: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
a090: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
a0a0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a0b0: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
a0c0: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
a0d0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a0e0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a0f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
a100: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a110: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a120: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
a130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a140: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
a150: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
a160: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
a170: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
a180: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a190: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a1a0: 44 62 2c 20 30 2c 20 72 31 29 3b 0a 20 20 73 71  Db, 0, r1);.  sq
a1b0: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a1c0: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a1d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a1e0: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a1f0: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a200: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a210: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a220: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a230: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a240: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a250: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a260: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a270: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a280: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a290: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a2a0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a2b0: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a2c0: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a2d0: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a2e0: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a2f0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a300: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a310: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a320: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a330: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
a340: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
a350: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
a360: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 6f   an identifier o
a370: 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74  nto the end of t
a380: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 2e  he given string.
a390: 20 20 41 64 64 0a 2a 2a 20 71 75 6f 74 65 20 63    Add.** quote c
a3a0: 68 61 72 61 63 74 65 72 73 20 61 73 20 6e 65 65  haracters as nee
a3b0: 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ded..*/.static v
a3c0: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
a3d0: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
a3e0: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
a3f0: 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ent){.  unsigned
a400: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
a410: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
a420: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
a430: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
a440: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
a450: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
a460: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
a470: 20 20 69 66 28 20 21 69 73 61 6c 6e 75 6d 28 7a    if( !isalnum(z
a480: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
a490: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
a4a0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
a4b0: 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74 5b 6a  uote =  zIdent[j
a4c0: 5d 21 3d 30 20 7c 7c 20 69 73 64 69 67 69 74 28  ]!=0 || isdigit(
a4d0: 7a 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20  zIdent[0]).     
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
a4f0: 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
a500: 64 65 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54  de(zIdent, j)!=T
a510: 4b 5f 49 44 3b 0a 20 20 69 66 28 20 6e 65 65 64  K_ID;.  if( need
a520: 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d  Quote ) z[i++] =
a530: 20 27 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b   '"';.  for(j=0;
a540: 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29   zIdent[j]; j++)
a550: 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a  {.    z[i++] = z
a560: 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66  Ident[j];.    if
a570: 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27  ( zIdent[j]=='"'
a580: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
a590: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51  .  }.  if( needQ
a5a0: 75 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  uote ) z[i++] = 
a5b0: 27 22 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b  '"';.  z[i] = 0;
a5c0: 0a 20 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a  .  *pIdx = i;.}.
a5d0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a5e0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
a5f0: 74 61 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72  tatement appropr
a600: 69 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76  iate for the giv
a610: 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65  en.** table.  Me
a620: 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  mory to hold the
a630: 20 74 65 78 74 20 6f 66 20 74 68 65 20 73 74 61   text of the sta
a640: 74 65 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e  tement is obtain
a650: 65 64 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74  ed.** from sqlit
a660: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75  eMalloc() and mu
a670: 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74  st be freed by t
a680: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
a690: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ion..*/.static c
a6a0: 68 61 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65  har *createTable
a6b0: 53 74 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62  Stmt(sqlite3 *db
a6c0: 2c 20 54 61 62 6c 65 20 2a 70 2c 20 69 6e 74 20  , Table *p, int 
a6d0: 69 73 54 65 6d 70 29 7b 0a 20 20 69 6e 74 20 69  isTemp){.  int i
a6e0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
a6f0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
a700: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
a710: 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  nd, *z;.  Column
a720: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
a730: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
a740: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
a750: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
a760: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
a770: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
a780: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  zName);.    z = 
a790: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
a7a0: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
a7b0: 6e 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 29 20  n += (strlen(z) 
a7c0: 2b 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  + 1);.    }.  }.
a7d0: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
a7e0: 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  th(p->zName);.  
a7f0: 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20  if( n<50 ){.    
a800: 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a  zSep = "";.    z
a810: 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20  Sep2 = ",";.    
a820: 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65  zEnd = ")";.  }e
a830: 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20  lse{.    zSep = 
a840: 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70  "\n  ";.    zSep
a850: 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20  2 = ",\n  ";.   
a860: 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20   zEnd = "\n)";. 
a870: 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36   }.  n += 35 + 6
a880: 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d  *p->nCol;.  zStm
a890: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
a8a0: 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  oc( n );.  if( z
a8b0: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
a8c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a8d0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
a8e0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
a8f0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
a900: 6d 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mt,.            
a910: 20 20 20 20 20 20 21 4f 4d 49 54 5f 54 45 4d 50        !OMIT_TEMP
a920: 44 42 26 26 69 73 54 65 6d 70 20 3f 20 22 43 52  DB&&isTemp ? "CR
a930: 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20  EATE TEMP TABLE 
a940: 22 3a 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  ":"CREATE TABLE 
a950: 22 29 3b 0a 20 20 6b 20 3d 20 73 74 72 6c 65 6e  ");.  k = strlen
a960: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
a970: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
a980: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
a990: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
a9a0: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
a9b0: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
a9c0: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
a9d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
a9e0: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
a9f0: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
aa00: 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 53 74  k += strlen(&zSt
aa10: 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70  mt[k]);.    zSep
aa20: 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20 69 64   = zSep2;.    id
aa30: 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b  entPut(zStmt, &k
aa40: 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCol->zName);.
aa50: 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f      if( (z = pCo
aa60: 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a  l->zType)!=0 ){.
aa70: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
aa80: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 61 73   = ' ';.      as
aa90: 73 65 72 74 28 20 73 74 72 6c 65 6e 28 7a 29 2b  sert( strlen(z)+
aaa0: 6b 2b 31 3c 3d 6e 20 29 3b 0a 20 20 20 20 20 20  k+1<=n );.      
aab0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
aac0: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
aad0: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
aae0: 20 6b 20 2b 3d 20 73 74 72 6c 65 6e 28 7a 29 3b   k += strlen(z);
aaf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
ab00: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
ab10: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25  k, &zStmt[k], "%
ab20: 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74  s", zEnd);.  ret
ab30: 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a  urn zStmt;.}../*
ab40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ab50: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
ab60: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
ab70: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
ab80: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
ab90: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
aba0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
abb0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
abc0: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
abd0: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
abe0: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
abf0: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
ac00: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
ac10: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
ac20: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
ac30: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
ac40: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
ac50: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
ac60: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
ac70: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
ac80: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
ac90: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
aca0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
acb0: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
acc0: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
acd0: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
ace0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
acf0: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
ad00: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
ad10: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
ad20: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
ad30: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
ad40: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
ad50: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
ad60: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
ad70: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
ad80: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
ad90: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
ada0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
adb0: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
adc0: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
add0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
ade0: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
adf0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
ae00: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
ae10: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
ae20: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
ae30: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
ae40: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
ae50: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
ae60: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
ae70: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
ae80: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
ae90: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
aea0: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
aeb0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
aec0: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
aed0: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
aee0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
aef0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
af00: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
af10: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
af20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
af30: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
af40: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
af50: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
af60: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
af70: 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61 6c 20     /* The final 
af80: 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ')' token in the
af90: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
afa0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
afb0: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
afc0: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
afd0: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
afe0: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
aff0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
b000: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
b010: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69  .  int iDb;..  i
b020: 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26 20 70  f( (pEnd==0 && p
b030: 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20 70 50  Select==0) || pP
b040: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
b050: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
b060: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20   {.    return;. 
b070: 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d   }.  p = pParse-
b080: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
b090: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
b0a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ..  assert( !db-
b0b0: 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70  >init.busy || !p
b0c0: 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62  Select );..  iDb
b0d0: 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
b0e0: 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70  ToIndex(db, p->p
b0f0: 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65  Schema);..#ifnde
b100: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
b110: 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ECK.  /* Resolve
b120: 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48   names in all CH
b130: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ECK constraint e
b140: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
b150: 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b  .  if( p->pCheck
b160: 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20   ){.    SrcList 
b170: 73 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  sSrc;           
b180: 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20          /* Fake 
b190: 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72  SrcList for pPar
b1a0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
b1b0: 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  .    NameContext
b1c0: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
b1d0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
b1e0: 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d  text for pParse-
b1f0: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20  >pNewTable */.. 
b200: 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20     memset(&sNC, 
b210: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
b220: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72  .    memset(&sSr
b230: 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72  c, 0, sizeof(sSr
b240: 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53  c));.    sSrc.nS
b250: 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63  rc = 1;.    sSrc
b260: 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d  .a[0].zName = p-
b270: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63  >zName;.    sSrc
b280: 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a  .a[0].pTab = p;.
b290: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43      sSrc.a[0].iC
b2a0: 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20  ursor = -1;.    
b2b0: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
b2c0: 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72  rse;.    sNC.pSr
b2d0: 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20  cList = &sSrc;. 
b2e0: 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d     sNC.isCheck =
b2f0: 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   1;.    if( sqli
b300: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
b310: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68  mes(&sNC, p->pCh
b320: 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65  eck) ){.      re
b330: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
b340: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
b350: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ed(SQLITE_OMIT_C
b360: 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49  HECK) */..  /* I
b370: 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  f the db->init.b
b380: 75 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e  usy is 1 it mean
b390: 73 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  s we are reading
b3a0: 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65   the SQL off the
b3b0: 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61  .  ** "sqlite_ma
b3c0: 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65  ster" or "sqlite
b3d0: 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61  _temp_master" ta
b3e0: 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e  ble on the disk.
b3f0: 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20  .  ** So do not 
b400: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73  write to the dis
b410: 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63  k again.  Extrac
b420: 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  t the root page 
b430: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20  number.  ** for 
b440: 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74  the table from t
b450: 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54  he db->init.newT
b460: 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65  num field.  (The
b470: 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a   page number.  *
b480: 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65  * should have be
b490: 65 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20  en put there by 
b4a0: 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62  the sqliteOpenCb
b4b0: 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a   routine.).  */.
b4c0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
b4d0: 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e  usy ){.    p->tn
b4e0: 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
b4f0: 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  wTnum;.  }..  /*
b500: 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69   If not initiali
b510: 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74  zing, then creat
b520: 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74  e a record for t
b530: 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a  he new table.  *
b540: 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f  * in the SQLITE_
b550: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20  MASTER table of 
b560: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
b570: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
b580: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
b590: 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20 73 68  w table entry sh
b5a0: 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
b5b0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
b5c0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20  **.  ** If this 
b5d0: 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74  is a TEMPORARY t
b5e0: 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20  able, write the 
b5f0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61  entry into the a
b600: 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69  uxiliary.  ** fi
b610: 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e  le instead of in
b620: 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  to the main data
b630: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a  base file..  */.
b640: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
b650: 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  busy ){.    int 
b660: 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  n;.    Vdbe *v;.
b670: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b      char *zType;
b680: 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72      /* "view" or
b690: 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20   "table" */.    
b6a0: 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20  char *zType2;   
b6b0: 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41  /* "VIEW" or "TA
b6c0: 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72  BLE" */.    char
b6d0: 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54   *zStmt;    /* T
b6e0: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
b6f0: 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54  E TABLE or CREAT
b700: 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74  E VIEW statement
b710: 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c   */..    v = sql
b720: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
b730: 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
b740: 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 20  0 ) return;..   
b750: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b760: 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
b770: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  0);..    /* Crea
b780: 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
b790: 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c  for the new tabl
b7a0: 65 20 61 6e 64 20 70 75 73 68 20 69 74 20 6f 6e  e and push it on
b7b0: 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  to the stack..  
b7c0: 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61 73 20    ** A view has 
b7d0: 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73 6f 20  no rootpage, so 
b7e0: 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65 72 6f  just push a zero
b7f0: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 20   onto the stack 
b800: 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65 77 73  for.    ** views
b810: 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 7a 54  .  Initialize zT
b820: 79 70 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ype at the same 
b830: 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  time..    */.   
b840: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
b850: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
b860: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
b870: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
b880: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
b890: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
b8a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b8b0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
b8c0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
b8d0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
b8e0: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
b8f0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
b900: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
b910: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
b920: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
b930: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
b940: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
b950: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
b960: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
b970: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
b980: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
b990: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
b9a0: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
b9b0: 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74 6f 70  le is on the top
b9c0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 73 74 61   of the vdbe sta
b9d0: 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ck..    **.    *
b9e0: 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43  * Once the SELEC
b9f0: 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64  T has been coded
ba00: 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63   by sqlite3Selec
ba10: 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a  t(), it is in a.
ba20: 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20      ** suitable 
ba30: 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66  state to query f
ba40: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  or the column na
ba50: 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f  mes and types to
ba60: 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20   be used.    ** 
ba70: 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  by the new table
ba80: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
ba90: 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77  A shared-cache w
baa0: 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74  rite-lock is not
bab0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69   required to wri
bac0: 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61  te to the new ta
bad0: 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61  ble,.    ** as a
bae0: 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73   schema-lock mus
baf0: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  t have already b
bb00: 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20  een obtained to 
bb10: 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65  create it. Since
bb20: 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61  .    ** a schema
bb30: 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61  -lock excludes a
bb40: 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  ll other databas
bb50: 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69  e users, the wri
bb60: 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20  te-lock would.  
bb70: 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e    ** be redundan
bb80: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
bb90: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
bba0: 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65     SelectDest de
bbb0: 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  st;.      Table 
bbc0: 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20  *pSelTab;..     
bbd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bbe0: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
bbf0: 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
bc00: 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
bc10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
bc20: 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20  hangeP5(v, 1);. 
bc30: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61       pParse->nTa
bc40: 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  b = 2;.      sql
bc50: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
bc60: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54 61  it(&dest, SRT_Ta
bc70: 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  ble, 1);.      s
bc80: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
bc90: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
bca0: 65 73 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  est, 0, 0, 0, 0)
bcb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bcc0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
bcd0: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Close, 1);.     
bce0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
bcf0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
bd00: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
bd10: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
bd20: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
bd30: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
bd40: 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29  if( pSelTab==0 )
bd50: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
bd60: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
bd70: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
bd80: 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->nCol = pSelTab
bd90: 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->nCol;.        
bda0: 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->aCol = pSelTa
bdb0: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20  b->aCol;.       
bdc0: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
bdd0: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c   0;.        pSel
bde0: 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->aCol = 0;. 
bdf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65         sqlite3De
be00: 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61  leteTable(pSelTa
be10: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
be20: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  }..    /* Comput
be30: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  e the complete t
be40: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
be50: 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  E statement */. 
be60: 20 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29     if( pSelect )
be70: 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20  {.      zStmt = 
be80: 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28  createTableStmt(
be90: 64 62 2c 20 70 2c 20 70 2d 3e 70 53 63 68 65 6d  db, p, p->pSchem
bea0: 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
beb0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 65 6c 73  chema);.    }els
bec0: 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 70 45 6e  e{.      n = pEn
bed0: 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73  d->z - pParse->s
bee0: 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 20 2b 20 31 3b  NameToken.z + 1;
bef0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73  .      zStmt = s
bf00: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
bf10: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 43 52  , .          "CR
bf20: 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c 20 7a  EATE %s %.*s", z
bf30: 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72 73 65  Type2, n, pParse
bf40: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 0a 20  ->sNameToken.z. 
bf50: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
bf60: 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66 6f 72     /* A slot for
bf70: 20 74 68 65 20 72 65 63 6f 72 64 20 68 61 73 20   the record has 
bf80: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
bf90: 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20 0a 20  ocated in the . 
bfa0: 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 53     ** SQLITE_MAS
bfb0: 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65 20 6a  TER table.  We j
bfc0: 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70 64 61  ust need to upda
bfd0: 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77 69 74  te that slot wit
bfe0: 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 68 65  h all.    ** the
bff0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 65 27   information we'
c000: 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 20 20 54  ve collected.  T
c010: 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65  he rowid for the
c020: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 0a 20 20   preallocated.  
c030: 20 20 2a 2a 20 73 6c 6f 74 20 69 73 20 74 68 65    ** slot is the
c040: 20 32 6e 64 20 69 74 65 6d 20 6f 6e 20 74 68 65   2nd item on the
c050: 20 73 74 61 63 6b 2e 20 20 54 68 65 20 74 6f 70   stack.  The top
c060: 20 6f 66 20 74 68 65 20 73 74 61 63 6b 20 69 73   of the stack is
c070: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74   the.    ** root
c080: 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 6e 65   page for the ne
c090: 77 20 74 61 62 6c 65 20 28 6f 72 20 61 20 30 20  w table (or a 0 
c0a0: 69 66 20 74 68 69 73 20 69 73 20 61 20 76 69 65  if this is a vie
c0b0: 77 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  w)..    */.    s
c0c0: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
c0d0: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
c0e0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
c0f0: 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
c100: 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
c110: 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
c120: 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
c130: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
c140: 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
c150: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
c160: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
c170: 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
c180: 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
c190: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
c1a0: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
c1b0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
c1c0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
c1d0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
c1e0: 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
c1f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
c200: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
c210: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
c220: 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e  rse, iDb);..#ifn
c230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
c240: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
c250: 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
c260: 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  e if we need to 
c270: 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65  create an sqlite
c280: 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20  _sequence table 
c290: 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69  for.    ** keepi
c2a0: 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f  ng track of auto
c2b0: 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a  increment keys..
c2c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c2d0: 2d 3e 61 75 74 6f 49 6e 63 20 29 7b 0a 20 20 20  ->autoInc ){.   
c2e0: 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
c2f0: 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20  ->aDb[iDb];.    
c300: 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
c310: 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30 20 29  ma->pSeqTab==0 )
c320: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c330: 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
c340: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 22  rse,.          "
c350: 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 51 2e  CREATE TABLE %Q.
c360: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 28  sqlite_sequence(
c370: 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20 20 20  name,seq)",.    
c380: 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
c390: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
c3a0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
c3b0: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72 73 65  ..    /* Reparse
c3c0: 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f 20 75   everything to u
c3d0: 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e  pdate our intern
c3e0: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
c3f0: 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  es */.    sqlite
c400: 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
c410: 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
c420: 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  Db, 0, 0,.      
c430: 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66    sqlite3MPrintf
c440: 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27  (db, "tbl_name='
c450: 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20  %q'",p->zName), 
c460: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d  P4_DYNAMIC);.  }
c470: 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  ...  /* Add the 
c480: 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d  table to the in-
c490: 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
c4a0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74  ation of the dat
c4b0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
c4c0: 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ( db->init.busy 
c4d0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  && pParse->nErr=
c4e0: 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  =0 ){.    Table 
c4f0: 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65 79 20  *pOld;.    FKey 
c500: 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53 63 68  *pFKey; .    Sch
c510: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70  ema *pSchema = p
c520: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70  ->pSchema;.    p
c530: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73  Old = sqlite3Has
c540: 68 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61  hInsert(&pSchema
c550: 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e  ->tblHash, p->zN
c560: 61 6d 65 2c 20 73 74 72 6c 65 6e 28 70 2d 3e 7a  ame, strlen(p->z
c570: 4e 61 6d 65 29 2b 31 2c 70 29 3b 0a 20 20 20 20  Name)+1,p);.    
c580: 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20  if( pOld ){.    
c590: 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c    assert( p==pOl
c5a0: 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  d );  /* Malloc 
c5b0: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
c5c0: 20 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65   inside HashInse
c5d0: 72 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62  rt() */.      db
c5e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
c5f0: 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
c600: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c610: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
c620: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28  IGN_KEY.    for(
c630: 70 46 4b 65 79 3d 70 2d 3e 70 46 4b 65 79 3b 20  pFKey=p->pFKey; 
c640: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 46 4b  pFKey; pFKey=pFK
c650: 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 29 7b 0a  ey->pNextFrom){.
c660: 20 20 20 20 20 20 76 6f 69 64 20 2a 64 61 74 61        void *data
c670: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20  ;.      int nTo 
c680: 3d 20 73 74 72 6c 65 6e 28 70 46 4b 65 79 2d 3e  = strlen(pFKey->
c690: 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  zTo) + 1;.      
c6a0: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
c6b0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
c6c0: 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  (&pSchema->aFKey
c6d0: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
c6e0: 6f 29 3b 0a 20 20 20 20 20 20 64 61 74 61 20 3d  o);.      data =
c6f0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
c700: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b  rt(&pSchema->aFK
c710: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
c720: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
c730: 20 20 20 69 66 28 20 64 61 74 61 3d 3d 28 76 6f     if( data==(vo
c740: 69 64 20 2a 29 70 46 4b 65 79 20 29 7b 0a 20 20  id *)pFKey ){.  
c750: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
c760: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
c770: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
c780: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
c790: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
c7a0: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
c7b0: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
c7c0: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
c7d0: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
c7e0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
c7f0: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
c800: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
c810: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
c820: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
c830: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
c840: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
c850: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
c860: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
c870: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
c880: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
c890: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
c8a0: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
c8b0: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
c8c0: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 63 6f 6e 73     nName = (cons
c8d0: 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
c8e0: 7a 20 2d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  z - zName;.     
c8f0: 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
c900: 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
c910: 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
c920: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
c930: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
c940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
c950: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
c960: 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
c970: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
c980: 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
c990: 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
c9a0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
c9b0: 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
c9c0: 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
c9d0: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
c9e0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
c9f0: 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
ca00: 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
ca10: 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
ca20: 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
ca30: 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
ca40: 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
ca50: 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
ca60: 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
ca70: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
ca80: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
ca90: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
caa0: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
cab0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
cac0: 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c  lect,   /* A SEL
cad0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
cae0: 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  at will become t
caf0: 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20  he new view */. 
cb00: 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20   int isTemp,    
cb10: 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20      /* TRUE for 
cb20: 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77  a TEMPORARY view
cb30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
cb40: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70           /* Supp
cb50: 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61  ress error messa
cb60: 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72 65  ges if VIEW alre
cb70: 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
cb80: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
cb90: 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  nt n;.  const un
cba0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
cbb0: 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20    Token sEnd;.  
cbc0: 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20 20  DbFixer sFix;.  
cbd0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20  Token *pName;.  
cbe0: 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69 74  int iDb;.  sqlit
cbf0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
cc00: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  >db;..  if( pPar
cc10: 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20  se->nVar>0 ){.  
cc20: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
cc30: 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61 6d  g(pParse, "param
cc40: 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61 6c  eters are not al
cc50: 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22 29  lowed in views")
cc60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
cc70: 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c 65 63  ectDelete(pSelec
cc80: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
cc90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 61    }.  sqlite3Sta
cca0: 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  rtTable(pParse, 
ccb0: 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
ccc0: 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f  isTemp, 1, 0, no
ccd0: 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  Err);.  p = pPar
cce0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
ccf0: 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
cd00: 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20  rse->nErr ){.   
cd10: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
cd20: 6c 65 74 65 28 70 53 65 6c 65 63 74 29 3b 0a 20  lete(pSelect);. 
cd30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
cd40: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
cd50: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
cd60: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
cd70: 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
cd80: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
cd90: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
cda0: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
cdb0: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
cdc0: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
cdd0: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
cde0: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
cdf0: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
ce00: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
ce10: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
ce20: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65  pSelect);.    re
ce30: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
ce40: 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  Make a copy of t
ce50: 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43 54  he entire SELECT
ce60: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
ce70: 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
ce80: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c 6c  ..  ** This will
ce90: 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20 45   force all the E
cea0: 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c 75  xpr.token.z valu
ceb0: 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  es to be dynamic
cec0: 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  ally.  ** alloca
ced0: 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e 20  ted rather than 
cee0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e 70  point to the inp
cef0: 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69 63  ut string - whic
cf00: 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 2a  h means that.  *
cf10: 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72 73  * they will pers
cf20: 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63 75  ist after the cu
cf30: 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 78  rrent sqlite3_ex
cf40: 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e  ec() call return
cf50: 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53 65  s..  */.  p->pSe
cf60: 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65  lect = sqlite3Se
cf70: 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65 6c  lectDup(db, pSel
cf80: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  ect);.  sqlite3S
cf90: 65 6c 65 63 74 44 65 6c 65 74 65 28 70 53 65 6c  electDelete(pSel
cfa0: 65 63 74 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ect);.  if( db->
cfb0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
cfc0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
cfd0: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
cfe0: 62 75 73 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  busy ){.    sqli
cff0: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
d000: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 29  Names(pParse, p)
d010: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61  ;.  }..  /* Loca
d020: 74 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  te the end of th
d030: 65 20 43 52 45 41 54 45 20 56 49 45 57 20 73 74  e CREATE VIEW st
d040: 61 74 65 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73  atement.  Make s
d050: 45 6e 64 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a  End point to.  *
d060: 2a 20 74 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a  * the end..  */.
d070: 20 20 73 45 6e 64 20 3d 20 70 50 61 72 73 65 2d    sEnd = pParse-
d080: 3e 73 4c 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69  >sLastToken;.  i
d090: 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20  f( sEnd.z[0]!=0 
d0a0: 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b  && sEnd.z[0]!=';
d0b0: 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20  ' ){.    sEnd.z 
d0c0: 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20  += sEnd.n;.  }. 
d0d0: 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e   sEnd.n = 0;.  n
d0e0: 20 3d 20 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67   = sEnd.z - pBeg
d0f0: 69 6e 2d 3e 7a 3b 0a 20 20 7a 20 3d 20 28 63 6f  in->z;.  z = (co
d100: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
d110: 72 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20  r*)pBegin->z;.  
d120: 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a  while( n>0 && (z
d130: 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 69 73  [n-1]==';' || is
d140: 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29 29 20 29  space(z[n-1])) )
d150: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e 64 2e  { n--; }.  sEnd.
d160: 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20 20 73  z = &z[n-1];.  s
d170: 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  End.n = 1;..  /*
d180: 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e 64 54   Use sqlite3EndT
d190: 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20 74 68  able() to add th
d1a0: 65 20 76 69 65 77 20 74 6f 20 74 68 65 20 53 51  e view to the SQ
d1b0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
d1c0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 6e  e */.  sqlite3En
d1d0: 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30  dTable(pParse, 0
d1e0: 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a 20 20 72  , &sEnd, 0);.  r
d1f0: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
d200: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
d210: 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  IEW */..#if !def
d220: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
d230: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
d240: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
d250: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f 2a 0a  IRTUALTABLE)./*.
d260: 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73 74 72  ** The Table str
d270: 75 63 74 75 72 65 20 70 54 61 62 6c 65 20 69 73  ucture pTable is
d280: 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57 2e 20   really a VIEW. 
d290: 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e 61 6d   Fill in the nam
d2a0: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 6c  es of.** the col
d2b0: 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69 65 77  umns of the view
d2c0: 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65 20 73   in the pTable s
d2d0: 74 72 75 63 74 75 72 65 2e 20 20 52 65 74 75 72  tructure.  Retur
d2e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20  n the number.** 
d2f0: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 61  of errors.  If a
d300: 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20  n error is seen 
d310: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
d320: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
d330: 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  ->zErrMsg..*/.in
d340: 74 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74  t sqlite3ViewGet
d350: 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61 72 73  ColumnNames(Pars
d360: 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
d370: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54 61 62   *pTable){.  Tab
d380: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20 20 2f  le *pSelTab;   /
d390: 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65 20 66  * A fake table f
d3a0: 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67 65 74  rom which we get
d3b0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
d3c0: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
d3d0: 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f  l;     /* Copy o
d3e0: 66 20 74 68 65 20 53 45 4c 45 43 54 20 74 68 61  f the SELECT tha
d3f0: 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  t implements the
d400: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
d410: 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  Err = 0;     /* 
d420: 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
d430: 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a   encountered */.
d440: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
d450: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 69      /* Temporari
d460: 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 75 6d  ly holds the num
d470: 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 61  ber of cursors a
d480: 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73 71 6c  ssigned */.  sql
d490: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
d4a0: 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
d4b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66  ase connection f
d4c0: 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 73  or malloc errors
d4d0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 41 75 74   */.  int (*xAut
d4e0: 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  h)(void*,int,con
d4f0: 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63  st char*,const c
d500: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
d510: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a  ,const char*);..
d520: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d530: 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
d540: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
d550: 54 41 42 4c 45 0a 20 20 69 66 28 20 73 71 6c 69  TABLE.  if( sqli
d560: 74 65 33 56 74 61 62 43 61 6c 6c 43 6f 6e 6e 65  te3VtabCallConne
d570: 63 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c  ct(pParse, pTabl
d580: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
d590: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
d5a0: 20 7d 0a 20 20 69 66 28 20 49 73 56 69 72 74 75   }.  if( IsVirtu
d5b0: 61 6c 28 70 54 61 62 6c 65 29 20 29 20 72 65 74  al(pTable) ) ret
d5c0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  urn 0;.#endif..#
d5d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
d5e0: 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 41 20 70  IT_VIEW.  /* A p
d5f0: 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20 6d 65 61  ositive nCol mea
d600: 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6e  ns the columns n
d610: 61 6d 65 73 20 66 6f 72 20 74 68 69 73 20 76 69  ames for this vi
d620: 65 77 20 61 72 65 0a 20 20 2a 2a 20 61 6c 72 65  ew are.  ** alre
d630: 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a  ady known..  */.
d640: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
d650: 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e 20 30 3b  ol>0 ) return 0;
d660: 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61 74 69 76  ..  /* A negativ
d670: 65 20 6e 43 6f 6c 20 69 73 20 61 20 73 70 65 63  e nCol is a spec
d680: 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65 61 6e 69  ial marker meani
d690: 6e 67 20 74 68 61 74 20 77 65 20 61 72 65 20 63  ng that we are c
d6a0: 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 74 72  urrently.  ** tr
d6b0: 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75 74 65 20  ying to compute 
d6c0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
d6d0: 2e 20 20 49 66 20 77 65 20 65 6e 74 65 72 20 74  .  If we enter t
d6e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
d6f0: 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74 69 76 65  .  ** a negative
d700: 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61 6e 73 20   nCol, it means 
d710: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76 69 65 77  two or more view
d720: 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70 2c 20 6c  s form a loop, l
d730: 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a 2a 0a 20  ike this:.  **. 
d740: 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56   **     CREATE V
d750: 49 45 57 20 6f 6e 65 20 41 53 20 53 45 4c 45 43  IEW one AS SELEC
d760: 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b 0a 20 20  T * FROM two;.  
d770: 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 56 49  **     CREATE VI
d780: 45 57 20 74 77 6f 20 41 53 20 53 45 4c 45 43 54  EW two AS SELECT
d790: 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a 20 20 2a   * FROM one;.  *
d7a0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 2c  *.  ** Actually,
d7b0: 20 74 68 69 73 20 65 72 72 6f 72 20 69 73 20 63   this error is c
d7c0: 61 75 67 68 74 20 70 72 65 76 69 6f 75 73 6c 79  aught previously
d7d0: 20 61 6e 64 20 73 6f 20 74 68 65 20 66 6f 6c 6c   and so the foll
d7e0: 6f 77 69 6e 67 20 74 65 73 74 0a 20 20 2a 2a 20  owing test.  ** 
d7f0: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 66 61  should always fa
d800: 69 6c 2e 20 20 42 75 74 20 77 65 20 77 69 6c 6c  il.  But we will
d810: 20 6c 65 61 76 65 20 69 74 20 69 6e 20 70 6c 61   leave it in pla
d820: 63 65 20 6a 75 73 74 20 74 6f 20 62 65 20 73 61  ce just to be sa
d830: 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  fe..  */.  if( p
d840: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30 20 29 7b  Table->nCol<0 ){
d850: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
d860: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
d870: 65 77 20 25 73 20 69 73 20 63 69 72 63 75 6c 61  ew %s is circula
d880: 72 6c 79 20 64 65 66 69 6e 65 64 22 2c 20 70 54  rly defined", pT
d890: 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  able->zName);.  
d8a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
d8b0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
d8c0: 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a 0a 20 20  ->nCol>=0 );..  
d8d0: 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
d8e0: 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
d8f0: 77 65 20 6e 65 65 64 20 74 6f 20 63 6f 6d 70 75  we need to compu
d900: 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
d910: 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68  es..  ** Note th
d920: 61 74 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  at the call to s
d930: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
d940: 66 53 65 6c 65 63 74 28 29 20 77 69 6c 6c 20 65  fSelect() will e
d950: 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a 2a 20 22  xpand any.  ** "
d960: 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  *" elements in t
d970: 68 65 20 72 65 73 75 6c 74 73 20 73 65 74 20 6f  he results set o
d980: 66 20 74 68 65 20 76 69 65 77 20 61 6e 64 20 77  f the view and w
d990: 69 6c 6c 20 61 73 73 69 67 6e 20 63 75 72 73 6f  ill assign curso
d9a0: 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 65  rs.  ** to the e
d9b0: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 46  lements of the F
d9c0: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 42 75 74  ROM clause.  But
d9d0: 20 77 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   we do not want 
d9e0: 74 68 65 73 65 20 63 68 61 6e 67 65 73 0a 20 20  these changes.  
d9f0: 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d 61 6e 65  ** to be permane
da00: 6e 74 2e 20 20 53 6f 20 74 68 65 20 63 6f 6d 70  nt.  So the comp
da10: 75 74 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  utation is done 
da20: 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  on a copy of the
da30: 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20 73 74 61   SELECT.  ** sta
da40: 74 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69  tement that defi
da50: 6e 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20  nes the view..  
da60: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
da70: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20 29 3b 0a  ble->pSelect );.
da80: 20 20 70 53 65 6c 20 3d 20 73 71 6c 69 74 65 33    pSel = sqlite3
da90: 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 54  SelectDup(db, pT
daa0: 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  able->pSelect);.
dab0: 20 20 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20    if( pSel ){.  
dac0: 20 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54    n = pParse->nT
dad0: 61 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  ab;.    sqlite3S
dae0: 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
daf0: 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
db00: 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61  ->pSrc);.    pTa
db10: 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a  ble->nCol = -1;.
db20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
db30: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
db40: 4e 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62  N.    xAuth = db
db50: 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d  ->xAuth;.    db-
db60: 3e 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20  >xAuth = 0;.    
db70: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
db80: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
db90: 63 74 28 70 50 61 72 73 65 2c 20 30 2c 20 70 53  ct(pParse, 0, pS
dba0: 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75  el);.    db->xAu
dbb0: 74 68 20 3d 20 78 41 75 74 68 3b 0a 23 65 6c 73  th = xAuth;.#els
dbc0: 65 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  e.    pSelTab = 
dbd0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
dbe0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
dbf0: 20 30 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69   0, pSel);.#endi
dc00: 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  f.    pParse->nT
dc10: 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
dc20: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
dc30: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
dc40: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
dc50: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
dc60: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
dc70: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
dc80: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
dc90: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
dca0: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
dcb0: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
dcc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
dcd0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
dce0: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70  SelTab);.      p
dcf0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
dd00: 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  flags |= DB_Unre
dd10: 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65  setViews;.    }e
dd20: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
dd30: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
dd40: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
dd50: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
dd60: 63 74 44 65 6c 65 74 65 28 70 53 65 6c 29 3b 0a  ctDelete(pSel);.
dd70: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 6e    } else {.    n
dd80: 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65 6e 64 69  Err++;.  }.#endi
dd90: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
dda0: 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72  _VIEW */.  retur
ddb0: 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64  n nErr;  .}.#end
ddc0: 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
ddd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
dde0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
ddf0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
de00: 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64  TABLE) */..#ifnd
de10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
de20: 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  IEW./*.** Clear 
de30: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
de40: 20 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57   from every VIEW
de50: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78   in database idx
de60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
de70: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
de80: 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  All(sqlite3 *db,
de90: 20 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73   int idx){.  Has
dea0: 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 66 28 20  hElem *i;.  if( 
deb0: 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64  !DbHasProperty(d
dec0: 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73  b, idx, DB_Unres
ded0: 65 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72  etViews) ) retur
dee0: 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  n;.  for(i=sqlit
def0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
df00: 61 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61  aDb[idx].pSchema
df10: 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d  ->tblHash); i;i=
df20: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
df30: 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  )){.    Table *p
df40: 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Tab = sqliteHash
df50: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
df60: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
df70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 52 65  {.      sqliteRe
df80: 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  setColumnNames(p
df90: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
dfa0: 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74    DbClearPropert
dfb0: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
dfc0: 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23  resetViews);.}.#
dfd0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71  else.# define sq
dfe0: 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c  liteViewResetAll
dff0: 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20  (A,B).#endif /* 
e000: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e010: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
e020: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
e030: 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20 74  ed by the VDBE t
e040: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74  o adjust the int
e050: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
e060: 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20 77  used by SQLite w
e070: 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61  hen the btree la
e080: 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c  yer moves a tabl
e090: 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65  e root page. The
e0a0: 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66  .** root-page of
e0b0: 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
e0c0: 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44  x in database iD
e0d0: 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66 72  b has changed fr
e0e0: 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69  om iFrom.** to i
e0f0: 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74  To..**.** Ticket
e100: 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d   #1728:  The sym
e110: 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20  bol table might 
e120: 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e  still contain in
e130: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20  formation.** on 
e140: 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e  tables and/or in
e150: 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20 74  dices that are t
e160: 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65  he process of be
e170: 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20  ing deleted..** 
e180: 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63  If you are unluc
e190: 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  ky, one of those
e1a0: 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
e1b0: 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74   or tables might
e1c0: 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d  .** have the sam
e1d0: 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65  e rootpage numbe
e1e0: 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74 61  r as the real ta
e1f0: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61  ble or index tha
e200: 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f  t is.** being mo
e210: 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e  ved.  So we cann
e220: 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e  ot stop searchin
e230: 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72 73  g after the firs
e240: 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61  t match .** beca
e250: 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d 61  use the first ma
e260: 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72  tch might be for
e270: 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65   one of the dele
e280: 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f  ted indices.** o
e290: 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74  r tables and not
e2a0: 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78   the table/index
e2b0: 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c   that is actuall
e2c0: 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a  y being moved..*
e2d0: 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e  * We must contin
e2e0: 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ue looping until
e2f0: 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20   all tables and 
e300: 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20  indices with.** 
e310: 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20  rootpage==iFrom 
e320: 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72  have been conver
e330: 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f  ted to have a ro
e340: 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a  otpage of iTo.**
e350: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20   in order to be 
e360: 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65 20  certain that we 
e370: 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e  got the right on
e380: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
e390: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
e3a0: 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65  CUUM.void sqlite
e3b0: 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 44  3RootPageMoved(D
e3c0: 62 20 2a 70 44 62 2c 20 69 6e 74 20 69 46 72 6f  b *pDb, int iFro
e3d0: 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48  m, int iTo){.  H
e3e0: 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a  ashElem *pElem;.
e3f0: 20 20 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a    Hash *pHash;..
e400: 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
e410: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
e420: 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
e430: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
e440: 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
e450: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
e460: 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
e470: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
e480: 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
e490: 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
e4a0: 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
e4b0: 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
e4c0: 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
e4d0: 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
e4e0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
e4f0: 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
e500: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
e510: 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
e520: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
e530: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
e540: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
e550: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
e560: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
e570: 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
e580: 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
e590: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
e5a0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
e5b0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
e5c0: 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
e5d0: 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
e5e0: 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
e5f0: 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
e600: 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
e610: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
e620: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
e630: 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
e640: 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
e650: 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
e660: 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
e670: 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
e680: 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
e690: 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
e6a0: 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
e6b0: 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
e6c0: 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
e6d0: 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
e6e0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
e6f0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
e700: 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
e710: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
e720: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e730: 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
e740: 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
e750: 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
e760: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
e770: 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f 79 2c 20  (v, OP_Destroy, 
e780: 69 54 61 62 6c 65 2c 20 72 31 2c 20 69 44 62 29  iTable, r1, iDb)
e790: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
e7a0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
e7b0: 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  /* OP_Destroy
e7c0: 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e   stores an in in
e7d0: 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68 69  teger r1. If thi
e7e0: 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69  s integer.  ** i
e7f0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
e800: 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20   it is the root 
e810: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
e820: 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a   table moved to.
e830: 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54    ** location iT
e840: 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  able. The follow
e850: 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65  ing code modifie
e860: 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  s the sqlite_mas
e870: 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a  ter table to.  *
e880: 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a  * reflect this..
e890: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23    **.  ** The "#
e8a0: 25 64 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69  %d" in the SQL i
e8b0: 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73  s a special cons
e8c0: 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20  tant that means 
e8d0: 77 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20  whatever value. 
e8e0: 20 2a 2a 20 69 73 20 6f 6e 20 74 68 65 20 74 6f   ** is on the to
e8f0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 20  p of the stack. 
e900: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69   See sqlite3Regi
e910: 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f  sterExpr()..  */
e920: 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
e930: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
e940: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
e950: 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
e960: 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
e970: 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
e980: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
e990: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
e9a0: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
e9b0: 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
e9c0: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
e9d0: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
e9e0: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
e9f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
ea00: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
ea10: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
ea20: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
ea30: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
ea40: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
ea50: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
ea60: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
ea70: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
ea80: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
ea90: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
eaa0: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
eab0: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
eac0: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
ead0: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
eae0: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
eaf0: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
eb00: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
eb10: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
eb20: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
eb30: 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
eb40: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
eb50: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
eb60: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
eb70: 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
eb80: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
eb90: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
eba0: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
ebb0: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
ebc0: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ebd0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
ebe0: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
ebf0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
ec00: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
ec10: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
ec20: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ec30: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
ec40: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
ec50: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
ec60: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
ec70: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
ec80: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
ec90: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
eca0: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
ecb0: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
ecc0: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
ecd0: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
ece0: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
ecf0: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
ed00: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
ed10: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
ed20: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
ed30: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
ed40: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
ed50: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
ed60: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
ed70: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
ed80: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
ed90: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
eda0: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
edb0: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
edc0: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
edd0: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
ede0: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
edf0: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
ee00: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
ee10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
ee20: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
ee30: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
ee40: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
ee50: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
ee60: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
ee70: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
ee80: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
ee90: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
eea0: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
eeb0: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
eec0: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
eed0: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
eee0: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
eef0: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
ef00: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
ef10: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
ef20: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
ef30: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
ef40: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
ef50: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
ef60: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
ef70: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
ef80: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
ef90: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
efa0: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
efb0: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
efc0: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
efd0: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
efe0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
eff0: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
f000: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
f010: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
f020: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
f030: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
f040: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
f050: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
f060: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
f070: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
f080: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
f090: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f0a0: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
f0b0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
f0c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f0d0: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f0e0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f0f0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f100: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
f110: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
f120: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
f130: 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
f140: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
f150: 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
f160: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f170: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f180: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
f190: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
f1a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
f1b0: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
f1c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
f1d0: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
f1e0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
f1f0: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
f200: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
f210: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
f220: 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
f230: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
f240: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
f250: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f260: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
f270: 44 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  Db;..  if( pPars
f280: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
f290: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f2a0: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
f2b0: 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61  p_table;.  }.  a
f2c0: 73 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53  ssert( pName->nS
f2d0: 72 63 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20  rc==1 );.  pTab 
f2e0: 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
f2f0: 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56  able(pParse, isV
f300: 69 65 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20  iew, .          
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f320: 20 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e    pName->a[0].zN
f330: 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
f340: 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20  .zDatabase);..  
f350: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20  if( pTab==0 ){. 
f360: 20 20 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a     if( noErr ){.
f370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
f380: 6f 72 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  orClear(pParse);
f390: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20  .    }.    goto 
f3a0: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
f3b0: 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
f3c0: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f3d0: 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
f3e0: 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ema);.  assert( 
f3f0: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
f400: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49  ->nDb );..  /* I
f410: 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72 74  f pTab is a virt
f420: 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20  ual table, call 
f430: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
f440: 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20  es() to ensure. 
f450: 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61   ** it is initia
f460: 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  lized..  */.  if
f470: 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
f480: 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65 77  ) && sqlite3View
f490: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70  GetColumnNames(p
f4a0: 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a  Parse, pTab) ){.
f4b0: 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
f4c0: 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69  op_table;.  }.#i
f4d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f4e0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
f4f0: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
f500: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
f510: 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
f520: 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
f530: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
f540: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
f550: 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Name;.    const 
f560: 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b  char *zArg2 = 0;
f570: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
f580: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
f590: 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
f5a0: 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b   zTab, 0, zDb)){
f5b0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
f5c0: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20  _drop_table;.   
f5d0: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
f5e0: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
f5f0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
f600: 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  Db==1 ){.       
f610: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
f620: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20  ROP_TEMP_VIEW;. 
f630: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f640: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
f650: 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20  E_DROP_VIEW;.   
f660: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
f670: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
f680: 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20  TABLE.    }else 
f690: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
f6a0: 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64  ab) ){.      cod
f6b0: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
f6c0: 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41  VTABLE;.      zA
f6d0: 72 67 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64  rg2 = pTab->pMod
f6e0: 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ->zName;.#endif.
f6f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f700: 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
f710: 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20  B && iDb==1 ){. 
f720: 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
f730: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
f740: 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ABLE;.      }els
f750: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
f760: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41  = SQLITE_DROP_TA
f770: 42 4c 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  BLE;.      }.   
f780: 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
f790: 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
f7a0: 73 65 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e  se, code, pTab->
f7b0: 7a 4e 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44  zName, zArg2, zD
f7c0: 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
f7d0: 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
f7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
f7f0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
f800: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
f810: 44 45 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e  DELETE, pTab->zN
f820: 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a  ame, 0, zDb) ){.
f830: 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
f840: 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20  drop_table;.    
f850: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
f860: 66 28 20 70 54 61 62 2d 3e 72 65 61 64 4f 6e 6c  f( pTab->readOnl
f870: 79 20 7c 7c 20 70 54 61 62 3d 3d 64 62 2d 3e 61  y || pTab==db->a
f880: 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
f890: 3e 70 53 65 71 54 61 62 20 29 7b 0a 20 20 20 20  >pSeqTab ){.    
f8a0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
f8b0: 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
f8c0: 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f  s may not be dro
f8d0: 70 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  pped", pTab->zNa
f8e0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
f8f0: 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
f900: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
f910: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
f920: 2a 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41  * Ensure DROP TA
f930: 42 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20  BLE is not used 
f940: 6f 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44  on a view, and D
f950: 52 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20  ROP VIEW is not 
f960: 75 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74  used.  ** on a t
f970: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  able..  */.  if(
f980: 20 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d   isView && pTab-
f990: 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20  >pSelect==0 ){. 
f9a0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
f9b0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20  sg(pParse, "use 
f9c0: 44 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65  DROP TABLE to de
f9d0: 6c 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20  lete table %s", 
f9e0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
f9f0: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
fa00: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  _table;.  }.  if
fa10: 28 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61  ( !isView && pTa
fa20: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
fa30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
fa40: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
fa50: 52 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65  ROP VIEW to dele
fa60: 74 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61  te view %s", pTa
fa70: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
fa80: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fa90: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
faa0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
fab0: 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ode to remove th
fac0: 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65  e table from the
fad0: 20 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20   master table.  
fae0: 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f  ** on disk..  */
faf0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
fb00: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
fb10: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72   if( v ){.    Tr
fb20: 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b  igger *pTrigger;
fb30: 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26  .    Db *pDb = &
fb40: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
fb50: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
fb60: 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
fb70: 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23  rse, 1, iDb);..#
fb80: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
fb90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
fba0: 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
fbb0: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
fbc0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
fbd0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
fbe0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 20 29  );.      if( v )
fbf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
fc00: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
fc10: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 20  P_VBegin);.     
fc20: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
fc30: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c  .    /* Drop all
fc40: 20 74 72 69 67 67 65 72 73 20 61 73 73 6f 63 69   triggers associ
fc50: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 74 61  ated with the ta
fc60: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
fc70: 64 2e 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69  d. Code.    ** i
fc80: 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72  s generated to r
fc90: 65 6d 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72  emove entries fr
fca0: 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  om sqlite_master
fcb0: 20 61 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73   and/or.    ** s
fcc0: 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
fcd0: 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20  r if required.. 
fce0: 20 20 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67     */.    pTrigg
fcf0: 65 72 20 3d 20 70 54 61 62 2d 3e 70 54 72 69 67  er = pTab->pTrig
fd00: 67 65 72 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ger;.    while( 
fd10: 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
fd20: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
fd30: 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
fd40: 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
fd50: 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
fd60: 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
fd70: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
fd80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
fd90: 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
fda0: 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
fdb0: 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20  .      pTrigger 
fdc0: 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
fdd0: 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
fde0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fdf0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
fe00: 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
fe10: 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
fe20: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
fe30: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
fe40: 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
fe50: 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
fe60: 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
fe70: 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
fe80: 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20   is dropped.    
fe90: 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
fea0: 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
feb0: 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
fec0: 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
fed0: 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73  o.    ** move as
fee0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
fef0: 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
ff00: 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
ff10: 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   mode)..    */. 
ff20: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 61 75 74     if( pTab->aut
ff30: 6f 49 6e 63 20 29 7b 0a 20 20 20 20 20 20 73 71  oInc ){.      sq
ff40: 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
ff50: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
ff60: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 73   "DELETE FROM %s
ff70: 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65  .sqlite_sequence
ff80: 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c   WHERE name=%Q",
ff90: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  .        pDb->zN
ffa0: 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
ffb0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
ffc0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
ffd0: 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d  rop all SQLITE_M
ffe0: 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20  ASTER table and 
fff0: 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68  index entries th
10000 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a  at refer to the.
10010 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68      ** table. Th
10020 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
10030 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
10040 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
10050 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20 2a 2a  d deletes.    **
10060 20 65 76 65 72 79 20 72 6f 77 20 74 68 61 74 20   every row that 
10070 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
10080 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61  e of the same na
10090 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65  me as the one be
100a0 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f 70 70  ing.    ** dropp
100b0 65 64 2e 20 54 72 69 67 67 65 72 73 20 61 72 65  ed. Triggers are
100c0 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72 61 74   handled seperat
100d0 65 6c 79 20 62 65 63 61 75 73 65 20 61 20 74 72  ely because a tr
100e0 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20 20 20  igger can be.   
100f0 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 20 74   ** created in t
10100 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
10110 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
10120 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68  a table in anoth
10130 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  er.    ** databa
10140 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  se..    */.    s
10150 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10160 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
10170 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
10180 25 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f  %Q.%s WHERE tbl_
10190 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65  name=%Q and type
101a0 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20  !='trigger'",.  
101b0 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
101c0 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
101d0 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
101e0 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 56 69  );.    if( !isVi
101f0 65 77 20 26 26 20 21 49 73 56 69 72 74 75 61 6c  ew && !IsVirtual
10200 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
10210 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61  destroyTable(pPa
10220 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20  rse, pTab);.    
10230 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  }..    /* Remove
10240 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
10250 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69   from SQLite's i
10260 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61  nternal schema a
10270 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a  nd modify.    **
10280 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
10290 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ie..    */.    i
102a0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
102b0 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  b) ){.      sqli
102c0 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
102d0 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
102e0 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
102f0 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Name, 0);.    }.
10300 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10310 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
10320 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30  Table, iDb, 0, 0
10330 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30  , pTab->zName, 0
10340 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
10350 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
10360 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73  e, iDb);.  }.  s
10370 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
10380 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69  l(db, iDb);..exi
10390 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20  t_drop_table:.  
103a0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65  sqlite3SrcListDe
103b0 6c 65 74 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  lete(pName);.}..
103c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
103d0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
103e0 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
103f0 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
10400 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
10410 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
10420 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
10430 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
10440 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
10450 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
10460 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
10470 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
10480 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
10490 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
104a0 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
104b0 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
104c0 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
104d0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
104e0 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
104f0 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
10500 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
10510 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
10520 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
10530 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
10540 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
10550 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
10560 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
10570 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
10580 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
10590 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
105a0 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
105b0 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
105c0 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
105d0 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
105e0 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
105f0 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
10600 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
10610 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
10620 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
10630 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
10640 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68 65 20  ble field.  The 
10650 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73 20 6e  new FKey.** is n
10660 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 64  ot linked into d
10670 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68 69 73  b->aFKey at this
10680 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20 64 6f   point - that do
10690 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a 2a 2a  es not happen.**
106a0 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33 45 6e   until sqlite3En
106b0 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  dTable()..**.** 
106c0 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  The foreign key 
106d0 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45 44  is set for IMMED
106e0 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67 2e  IATE processing.
106f0 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20 63    A subsequent c
10700 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  all.** to sqlite
10710 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
10720 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20  () might change 
10730 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45 44  this to DEFERRED
10740 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10750 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b 65  3CreateForeignKe
10760 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
10770 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72  se,       /* Par
10780 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
10790 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72 6f    ExprList *pFro
107a0 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e  mCol,  /* Column
107b0 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20  s in this table 
107c0 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74  that point to ot
107d0 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54  her table */.  T
107e0 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20  oken *pTo,      
107f0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
10800 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a  he other table *
10810 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 54  /.  ExprList *pT
10820 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75  oCol,    /* Colu
10830 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  mns in the other
10840 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   table */.  int 
10850 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
10860 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65 73   /* Conflict res
10870 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
10880 6d 73 2e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  ms. */.){.#ifnde
10890 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
108a0 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79  REIGN_KEY.  FKey
108b0 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54   *pFKey = 0;.  T
108c0 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65  able *p = pParse
108d0 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69  ->pNewTable;.  i
108e0 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20  nt nByte;.  int 
108f0 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20  i;.  int nCol;. 
10900 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73   char *z;..  ass
10910 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20  ert( pTo!=0 );. 
10920 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61   if( p==0 || pPa
10930 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f  rse->nErr || IN_
10940 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67  DECLARE_VTAB ) g
10950 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66  oto fk_end;.  if
10960 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b  ( pFromCol==0 ){
10970 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  .    int iCol = 
10980 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69  p->nCol-1;.    i
10990 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f  f( iCol<0 ) goto
109a0 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28   fk_end;.    if(
109b0 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f   pToCol && pToCo
109c0 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20  l->nExpr!=1 ){. 
109d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
109e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f  rMsg(pParse, "fo
109f0 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22  reign key on %s"
10a00 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f 75  .         " shou
10a10 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  ld reference onl
10a20 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20  y one column of 
10a30 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20  table %T",.     
10a40 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c      p->aCol[iCol
10a50 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20  ].zName, pTo);. 
10a60 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
10a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c  ;.    }.    nCol
10a80 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
10a90 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
10aa0 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d  ol->nExpr!=pFrom
10ab0 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  Col->nExpr ){.  
10ac0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
10ad0 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
10ae0 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c    "number of col
10af0 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20  umns in foreign 
10b00 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
10b10 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ch the number of
10b20 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75   ".        "colu
10b30 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65 72  mns in the refer
10b40 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20  enced table");. 
10b50 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
10b60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f    }else{.    nCo
10b70 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45  l = pFromCol->nE
10b80 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  xpr;.  }.  nByte
10b90 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79   = sizeof(*pFKey
10ba0 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  ) + nCol*sizeof(
10bb0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20  pFKey->aCol[0]) 
10bc0 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20  + pTo->n + 1;.  
10bd0 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20  if( pToCol ){.  
10be0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f    for(i=0; i<pTo
10bf0 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  Col->nExpr; i++)
10c00 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d  {.      nByte +=
10c10 20 73 74 72 6c 65 6e 28 70 54 6f 43 6f 6c 2d 3e   strlen(pToCol->
10c20 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b  a[i].zName) + 1;
10c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b  .    }.  }.  pFK
10c40 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ey = sqlite3DbMa
10c50 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d  llocZero(pParse-
10c60 3e 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20  >db, nByte );.  
10c70 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a  if( pFKey==0 ){.
10c80 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
10c90 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46  .  }.  pFKey->pF
10ca0 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79  rom = p;.  pFKey
10cb0 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d  ->pNextFrom = p-
10cc0 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63  >pFKey;.  z = (c
10cd0 68 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a  har*)&pFKey[1];.
10ce0 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20    pFKey->aCol = 
10cf0 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a  (struct sColMap*
10d00 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f  )z;.  z += sizeo
10d10 66 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70  f(struct sColMap
10d20 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d  )*nCol;.  pFKey-
10d30 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63  >zTo = z;.  memc
10d40 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54  py(z, pTo->z, pT
10d50 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e  o->n);.  z[pTo->
10d60 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b 3d 20 70  n] = 0;.  z += p
10d70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
10d80 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30 3b 0a 20  ->pNextTo = 0;. 
10d90 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d 20 6e   pFKey->nCol = n
10da0 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d  Col;.  if( pFrom
10db0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  Col==0 ){.    pF
10dc0 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69 46 72  Key->aCol[0].iFr
10dd0 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  om = p->nCol-1;.
10de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
10df0 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
10e00 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  +){.      int j;
10e10 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
10e20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b  j<p->nCol; j++){
10e30 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
10e40 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d 3e 61  ite3StrICmp(p->a
10e50 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 70 46  Col[j].zName, pF
10e60 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  romCol->a[i].zNa
10e70 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
10e80 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
10e90 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a 20 20  i].iFrom = j;.  
10ea0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10eb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10ec0 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 70 2d  .      if( j>=p-
10ed0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
10ee0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
10ef0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
10f00 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63 6f 6c      "unknown col
10f10 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20 66 6f  umn \"%s\" in fo
10f20 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69  reign key defini
10f30 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  tion", .        
10f40 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d    pFromCol->a[i]
10f50 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  .zName);.       
10f60 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
10f70 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
10f80 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
10f90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
10fa0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
10fb0 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 28   int n = strlen(
10fc0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
10fd0 6d 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79  me);.      pFKey
10fe0 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d  ->aCol[i].zCol =
10ff0 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   z;.      memcpy
11000 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d  (z, pToCol->a[i]
11010 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  .zName, n);.    
11020 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20    z[n] = 0;.    
11030 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20    z += n+1;.    
11040 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69  }.  }.  pFKey->i
11050 73 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20  sDeferred = 0;. 
11060 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f   pFKey->deleteCo
11070 6e 66 20 3d 20 66 6c 61 67 73 20 26 20 30 78 66  nf = flags & 0xf
11080 66 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64 61  f;.  pFKey->upda
11090 74 65 43 6f 6e 66 20 3d 20 28 66 6c 61 67 73 20  teConf = (flags 
110a0 3e 3e 20 38 20 29 20 26 20 30 78 66 66 3b 0a 20  >> 8 ) & 0xff;. 
110b0 20 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f   pFKey->insertCo
110c0 6e 66 20 3d 20 28 66 6c 61 67 73 20 3e 3e 20 31  nf = (flags >> 1
110d0 36 20 29 20 26 20 30 78 66 66 3b 0a 0a 20 20 2f  6 ) & 0xff;..  /
110e0 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
110f0 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
11100 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
11110 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
11120 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
11130 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
11140 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  end:.  sqlite3_f
11150 72 65 65 28 70 46 4b 65 79 29 3b 0a 23 65 6e 64  ree(pFKey);.#end
11160 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
11170 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
11180 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73 71 6c  GN_KEY) */.  sql
11190 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
111a0 74 65 28 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20  te(pFromCol);.  
111b0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
111c0 65 6c 65 74 65 28 70 54 6f 43 6f 6c 29 3b 0a 7d  elete(pToCol);.}
111d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
111e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
111f0 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59  hen an INITIALLY
11200 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20 49 4e   IMMEDIATE or IN
11210 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
11220 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 73 65  .** clause is se
11230 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20 61 20  en as part of a 
11240 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
11250 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69 73 44  nition.  The isD
11260 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d  eferred.** param
11270 65 74 65 72 20 69 73 20 31 20 66 6f 72 20 49 4e  eter is 1 for IN
11280 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52 45 44  ITIALLY DEFERRED
11290 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49 54 49   and 0 for INITI
112a0 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a  ALLY IMMEDIATE..
112b0 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f 72 20  ** The behavior 
112c0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
112d0 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66 6f 72  ntly created for
112e0 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64 6a 75  eign key is adju
112f0 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e  sted.** accordin
11300 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  gly..*/.void sql
11310 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
11320 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  Key(Parse *pPars
11330 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72 72 65  e, int isDeferre
11340 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  d){.#ifndef SQLI
11350 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
11360 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  KEY.  Table *pTa
11370 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  b;.  FKey *pFKey
11380 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20 3d 20  ;.  if( (pTab = 
11390 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
113a0 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20  e)==0 || (pFKey 
113b0 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d  = pTab->pFKey)==
113c0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 46  0 ) return;.  pF
113d0 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20  Key->isDeferred 
113e0 3d 20 69 73 44 65 66 65 72 72 65 64 3b 0a 23 65  = isDeferred;.#e
113f0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
11400 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74  nerate code that
11410 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e 64 20   will erase and 
11420 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a 70 49  refill index *pI
11430 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a 20  dx.  This is.** 
11440 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61 6c 69  used to initiali
11450 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65 61 74  ze a newly creat
11460 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f 20 72  ed index or to r
11470 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20  ecompute the.** 
11480 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 69 6e  content of an in
11490 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73 65 20  dex in response 
114a0 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63 6f 6d  to a REINDEX com
114b0 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d  mand..**.** if m
114c0 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 6f  emRootPage is no
114d0 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20 6d  t negative, it m
114e0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 69 6e  eans that the in
114f0 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a 2a 20  dex is newly.** 
11500 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 72 65  created.  The re
11510 67 69 73 74 65 72 20 73 70 65 63 69 66 69 65 64  gister specified
11520 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   by memRootPage 
11530 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a 2a 20  contains the.** 
11540 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
11550 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20   of the index.  
11560 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69  If memRootPage i
11570 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  s negative, then
11580 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 61 6c  .** the index al
11590 72 65 61 64 79 20 65 78 69 73 74 73 20 61 6e 64  ready exists and
115a0 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72 65 64   must be cleared
115b0 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 72 65   before being re
115c0 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 74 68  filled and.** th
115d0 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
115e0 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  er of the index 
115f0 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 70 49  is taken from pI
11600 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73  ndex->tnum..*/.s
11610 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74  tatic void sqlit
11620 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 50 61  e3RefillIndex(Pa
11630 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64  rse *pParse, Ind
11640 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e 74 20  ex *pIndex, int 
11650 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a 20 20  memRootPage){.  
11660 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49  Table *pTab = pI
11670 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20 20 2f  ndex->pTable;  /
11680 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68 61 74  * The table that
11690 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20   is indexed */. 
116a0 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50 61 72   int iTab = pPar
116b0 73 65 2d 3e 6e 54 61 62 3b 20 20 20 20 20 20 20  se->nTab;       
116c0 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f 72 20  /* Btree cursor 
116d0 75 73 65 64 20 66 6f 72 20 70 54 61 62 20 2a 2f  used for pTab */
116e0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70 50  .  int iIdx = pP
116f0 61 72 73 65 2d 3e 6e 54 61 62 2b 31 3b 20 20 20  arse->nTab+1;   
11700 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
11710 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e 64 65  r used for pInde
11720 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 31  x */.  int addr1
11730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11740 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
11750 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70 20   of top of loop 
11760 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20  */.  int tnum;  
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11780 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
11790 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 56   of index */.  V
117a0 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
117b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
117c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
117d0 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c  nto this virtual
117e0 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 4b 65   machine */.  Ke
117f0 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20 20 20  yInfo *pKey;    
11800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11810 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e 64 65  KeyInfo for inde
11820 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 49 64  x */.  int regId
11830 78 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  xKey;           
11840 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
11850 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  rs containing th
11860 65 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20  e index key */. 
11870 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20   int regRecord; 
11880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11890 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64  /* Register hold
118a0 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64 20 69  ing assemblied i
118b0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
118c0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
118d0 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20  Parse->db;      
118e0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
118f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
11900 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65  int iDb = sqlite
11910 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
11920 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
11930 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ma);..#ifndef SQ
11940 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
11950 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71  IZATION.  if( sq
11960 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
11970 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45  Parse, SQLITE_RE
11980 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a  INDEX, pIndex->z
11990 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64  Name, 0,.      d
119a0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
119b0 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  e ) ){.    retur
119c0 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  n;.  }.#endif.. 
119d0 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20 77 72   /* Require a wr
119e0 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
119f0 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d  table to perform
11a00 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
11a10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  */.  sqlite3Tabl
11a20 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44  eLock(pParse, iD
11a30 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31  b, pTab->tnum, 1
11a40 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
11a50 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
11a60 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
11a70 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
11a80 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f  rn;.  if( memRoo
11a90 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  tPage>=0 ){.    
11aa0 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61  tnum = memRootPa
11ab0 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
11ac0 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e   tnum = pIndex->
11ad0 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  tnum;.    sqlite
11ae0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
11af0 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69  P_Clear, tnum, i
11b00 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20  Db);.  }.  pKey 
11b10 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65  = sqlite3IndexKe
11b20 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49  yinfo(pParse, pI
11b30 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  ndex);.  sqlite3
11b40 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
11b50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78  _OpenWrite, iIdx
11b60 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20  , tnum, iDb, .  
11b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b80 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20    (char *)pKey, 
11b90 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f  P4_KEYINFO_HANDO
11ba0 46 46 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  FF);.  if( memRo
11bb0 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  otPage>=0 ){.   
11bc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
11bd0 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 7d 0a  geP5(v, 1);.  }.
11be0 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
11bf0 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61 62 2c  le(pParse, iTab,
11c00 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f   iDb, pTab, OP_O
11c10 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64 64 72  penRead);.  addr
11c20 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
11c30 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69  ddOp2(v, OP_Rewi
11c40 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20  nd, iTab, 0);.  
11c50 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
11c60 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
11c70 61 72 73 65 29 3b 0a 20 20 72 65 67 49 64 78 4b  arse);.  regIdxK
11c80 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65 6e 65  ey = sqlite3Gene
11c90 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
11ca0 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 54 61  rse, pIndex, iTa
11cb0 62 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  b, regRecord);. 
11cc0 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45   if( pIndex->onE
11cd0 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b  rror!=OE_None ){
11ce0 0a 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b  .    int j1, j2;
11cf0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69  .    int regRowi
11d00 64 3b 0a 0a 20 20 20 20 72 65 67 52 6f 77 69 64  d;..    regRowid
11d10 20 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20 70   = regIdxKey + p
11d20 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a  Index->nColumn;.
11d30 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
11d40 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
11d50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 49 64 78 4b  _IsNull, regIdxK
11d60 65 79 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e  ey, 0, pIndex->n
11d70 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6a 32 20  Column);.    j2 
11d80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
11d90 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71  Op4(v, OP_IsUniq
11da0 75 65 2c 20 69 49 64 78 2c 0a 20 20 20 20 20 20  ue, iIdx,.      
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11dc0 20 20 20 20 20 30 2c 20 72 65 67 52 6f 77 69 64       0, regRowid
11dd0 2c 20 28 63 68 61 72 2a 29 28 73 71 6c 69 74 65  , (char*)(sqlite
11de0 33 5f 69 6e 74 70 74 72 5f 74 29 72 65 67 52 65  3_intptr_t)regRe
11df0 63 6f 72 64 2c 20 50 34 5f 49 4e 54 33 32 29 3b  cord, P4_INT32);
11e00 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
11e10 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c  AddOp4(v, OP_Hal
11e20 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  t, SQLITE_CONSTR
11e30 41 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 20  AINT, OE_Abort, 
11e40 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
11e50 20 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20         "indexed 
11e60 63 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20  columns are not 
11e70 75 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54  unique", P4_STAT
11e80 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
11e90 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11ea0 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  j1);.    sqlite3
11eb0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
11ec0 6a 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  j2);.  }.  sqlit
11ed0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11ee0 4f 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49  OP_IdxInsert, iI
11ef0 64 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a  dx, regRecord);.
11f00 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
11f10 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
11f20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
11f30 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
11f40 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62  v, OP_Next, iTab
11f50 2c 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71  , addr1+1);.  sq
11f60 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11f70 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73  e(v, addr1);.  s
11f80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
11f90 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54  (v, OP_Close, iT
11fa0 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  ab);.  sqlite3Vd
11fb0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
11fc0 6c 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a  lose, iIdx);.}..
11fd0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
11fe0 65 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20  ew index for an 
11ff0 53 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d  SQL table.  pNam
12000 65 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65  e1.pName2 is the
12010 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64   name of the ind
12020 65 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c  ex .** and pTblL
12030 69 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ist is the name 
12040 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  of the table tha
12050 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
12060 65 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a  ed.  Both will .
12070 2a 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61  ** be NULL for a
12080 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
12090 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73  an index that is
120a0 20 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69   created to sati
120b0 73 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20  sfy a.** UNIQUE 
120c0 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20  constraint.  If 
120d0 70 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65  pTable and pInde
120e0 78 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20  x are NULL, use 
120f0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
12100 65 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c  e.** as the tabl
12110 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  e to be indexed.
12120 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61    pParse->pNewTa
12130 62 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74  ble is a table t
12140 68 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e  hat is.** curren
12150 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72  tly being constr
12160 75 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54  ucted by a CREAT
12170 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
12180 74 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69  t..**.** pList i
12190 73 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75  s a list of colu
121a0 6d 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65  mns to be indexe
121b0 64 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62  d.  pList will b
121c0 65 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a  e NULL if this.*
121d0 2a 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b  * is a primary k
121e0 65 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e  ey or unique-con
121f0 73 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d  straint on the m
12200 6f 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d  ost recent colum
12210 6e 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68  n added.** to th
12220 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
12230 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
12240 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20  tion.  .*/.void 
12250 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
12260 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
12270 72 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20  rse,     /* All 
12280 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
12290 74 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a  t this parse */.
122a0 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
122b0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61       /* First pa
122c0 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65  rt of index name
122d0 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f  . May be NULL */
122e0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
122f0 2c 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  ,     /* Second 
12300 70 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61  part of index na
12310 6d 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20  me. May be NULL 
12320 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  */.  SrcList *pT
12330 62 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65  blName, /* Table
12340 20 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70   to index. Use p
12350 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12360 20 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c   if 0 */.  ExprL
12370 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a  ist *pList,   /*
12380 20 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   A list of colum
12390 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
123a0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
123b0 72 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41  r,       /* OE_A
123c0 62 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c  bort, OE_Ignore,
123d0 20 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20   OE_Replace, or 
123e0 4f 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b  OE_None */.  Tok
123f0 65 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20  en *pStart,     
12400 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
12410 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
12420 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
12430 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c  /.  Token *pEnd,
12440 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29         /* The ")
12450 22 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68  " that closes th
12460 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
12470 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
12480 74 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20  t sortOrder,    
12490 20 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f   /* Sort order o
124a0 66 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68  f primary key wh
124b0 65 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a  en pList==NULL *
124c0 2f 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69  /.  int ifNotExi
124d0 73 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65  st     /* Omit e
124e0 72 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c  rror if index al
124f0 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
12500 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
12510 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62   = 0;     /* Tab
12520 6c 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  le to be indexed
12530 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e   */.  Index *pIn
12540 64 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  dex = 0;   /* Th
12550 65 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72  e index to be cr
12560 65 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  eated */.  char 
12570 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20  *zName = 0;     
12580 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
12590 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ndex */.  int nN
125a0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
125b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
125c0 61 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20  acters in zName 
125d0 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  */.  int i, j;. 
125e0 20 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20   Token nullId;  
125f0 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f        /* Fake to
12600 6b 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79  ken for an empty
12610 20 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62   ID list */.  Db
12620 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
12630 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
12640 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
12650 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
12660 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
12670 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
12680 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
12690 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
126a0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
126b0 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
126c0 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
126d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
126e0 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
126f0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
12700 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
12710 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
12720 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
12730 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
12740 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
12750 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
12760 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
12770 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
12780 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
12790 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
127a0 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
127b0 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
127c0 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
127d0 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
127e0 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74   int nCol;.  int
127f0 20 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63   nExtra = 0;.  c
12800 68 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20  har *zExtra;..  
12810 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
12820 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
12830 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  iled || IN_DECLA
12840 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
12850 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12860 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  index;.  }..  /*
12870 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74  .  ** Find the t
12880 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
12890 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74  be indexed.  Ret
128a0 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74  urn early if not
128b0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69   found..  */.  i
128c0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
128d0 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68  {..    /* Use th
128e0 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78  e two-part index
128f0 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69   name to determi
12900 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ne the database 
12910 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63  .    ** to searc
12920 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e  h for the table.
12930 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65   'Fix' the table
12940 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62   name to this db
12950 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c  .    ** before l
12960 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61  ooking up the ta
12970 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ble..    */.    
12980 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26  assert( pName1 &
12990 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20  & pName2 );.    
129a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
129b0 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
129c0 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
129d0 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66   &pName);.    if
129e0 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65  ( iDb<0 ) goto e
129f0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
12a00 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
12a10 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
12a20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65    /* If the inde
12a30 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61  x name was unqua
12a40 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66  lified, check if
12a50 20 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20   the the table. 
12a60 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20     ** is a temp 
12a70 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65  table. If so, se
12a80 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  t the database t
12a90 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74  o 1. Do not do t
12aa0 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e  his.    ** if in
12ab0 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74  itialising a dat
12ac0 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
12ad0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62    */.    if( !db
12ae0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
12af0 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69       pTab = sqli
12b00 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70  te3SrcListLookup
12b10 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d  (pParse, pTblNam
12b20 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  e);.      if( pN
12b30 61 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e  ame2 && pName2->
12b40 6e 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20  n==0 && pTab && 
12b50 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64  pTab->pSchema==d
12b60 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
12b70 61 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62  a ){.        iDb
12b80 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
12b90 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
12ba0 69 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e  if( sqlite3FixIn
12bb0 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
12bc0 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
12bd0 70 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20  pName) &&.      
12be0 20 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c    sqlite3FixSrcL
12bf0 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e  ist(&sFix, pTblN
12c00 61 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ame).    ){.    
12c10 20 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65    /* Because the
12c20 20 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63   parser construc
12c30 74 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d  ts pTblName from
12c40 20 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69   a single identi
12c50 66 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73  fier,.      ** s
12c60 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74  qlite3FixSrcList
12c70 20 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e   can never fail.
12c80 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
12c90 28 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  (0);.    }.    p
12ca0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
12cb0 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
12cc0 20 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b   0, pTblName->a[
12cd0 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  0].zName, .     
12ce0 20 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30     pTblName->a[0
12cf0 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
12d00 20 20 69 66 28 20 21 70 54 61 62 20 29 20 67 6f    if( !pTab ) go
12d10 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
12d20 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
12d30 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
12d40 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
12d50 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65  chema );.  }else
12d60 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
12d70 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
12d80 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
12d90 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
12da0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
12db0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12dc0 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
12dd0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
12de0 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
12df0 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
12e00 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
12e10 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
12e20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
12e30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
12e40 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 70 54 61  index;.  if( pTa
12e50 62 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  b->readOnly ){. 
12e60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
12e70 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
12e80 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
12e90 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
12ea0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
12eb0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
12ec0 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
12ed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
12ee0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
12ef0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
12f00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12f10 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
12f20 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
12f30 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
12f40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
12f50 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
12f60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
12f70 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
12f80 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
12f90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
12fa0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
12fb0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
12fc0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
12fd0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
12fe0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
12ff0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13000 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
13010 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
13020 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
13030 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
13040 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
13050 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
13060 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
13070 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
13080 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
13090 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
130a0 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
130b0 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
130c0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
130d0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
130e0 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
130f0 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
13100 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
13110 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
13120 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
13130 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
13140 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
13150 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
13160 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
13170 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
13180 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
13190 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
131a0 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
131b0 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
131c0 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
131d0 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
131e0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
131f0 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
13200 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
13210 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
13220 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
13230 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
13240 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
13250 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
13260 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13270 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
13280 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
13290 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
132a0 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  ex;.    if( zNam
132b0 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
132c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
132d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
132e0 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
132f0 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
13300 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
13310 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13320 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
13330 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
13340 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69  .busy ){.      i
13350 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
13360 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
13370 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
13380 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13390 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
133a0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
133b0 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
133c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
133d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
133e0 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
133f0 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
13400 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
13410 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13420 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13430 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
13440 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
13450 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
13460 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
13470 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
13480 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
13490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
134a0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
134b0 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
134c0 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
134d0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
134e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
134f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
13500 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  e{.    char zBuf
13510 5b 33 30 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  [30];.    int n;
13520 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
13530 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
13540 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
13550 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
13560 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
13570 2b 2b 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65  ++){}.    sqlite
13580 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13590 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 5f 25  f(zBuf),zBuf,"_%
135a0 64 22 2c 6e 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  d",n);.    zName
135b0 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
135c0 33 53 65 74 53 74 72 69 6e 67 28 26 7a 4e 61 6d  3SetString(&zNam
135d0 65 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69  e, "sqlite_autoi
135e0 6e 64 65 78 5f 22 2c 20 70 54 61 62 2d 3e 7a 4e  ndex_", pTab->zN
135f0 61 6d 65 2c 20 7a 42 75 66 2c 20 28 63 68 61 72  ame, zBuf, (char
13600 2a 29 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e  *)0);.    if( zN
13610 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame==0 ){.      
13620 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13630 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
13640 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13650 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ex;.    }.  }.. 
13660 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
13670 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
13680 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
13690 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
136a0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
136b0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
136c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
136d0 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   pDb->zName;.   
136e0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
136f0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13700 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
13710 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
13720 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
13730 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13740 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
13750 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
13760 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
13770 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
13780 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
13790 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
137a0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
137b0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
137c0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
137d0 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
137e0 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
137f0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13800 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
13810 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13820 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
13830 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
13840 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
13850 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
13860 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
13870 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
13880 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
13890 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
138a0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
138b0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
138c0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
138d0 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
138e0 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
138f0 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70  ullId.z = (u8*)p
13900 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
13910 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
13920 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 74     nullId.n = st
13930 72 6c 65 6e 28 28 63 68 61 72 2a 29 6e 75 6c 6c  rlen((char*)null
13940 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  Id.z);.    pList
13950 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
13960 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
13970 20 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b   0, 0, &nullId);
13980 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
13990 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
139a0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
139b0 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
139c0 4f 72 64 65 72 20 3d 20 73 6f 72 74 4f 72 64 65  Order = sortOrde
139d0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67  r;.  }..  /* Fig
139e0 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
139f0 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
13a00 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
13a10 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79  store explicitly
13a20 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20  .  ** specified 
13a30 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
13a40 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20  ce names..  */. 
13a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
13a60 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
13a70 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
13a80 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
13a90 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
13aa0 70 72 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  pr ){.      nExt
13ab0 72 61 20 2b 3d 20 28 31 20 2b 20 73 74 72 6c 65  ra += (1 + strle
13ac0 6e 28 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e  n(pExpr->pColl->
13ad0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
13ae0 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
13af0 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
13b00 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
13b10 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 74 72  */.  nName = str
13b20 6c 65 6e 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43  len(zName);.  nC
13b30 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ol = pList->nExp
13b40 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71  r;.  pIndex = sq
13b50 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
13b60 6f 28 64 62 2c 20 0a 20 20 20 20 20 20 73 69 7a  o(db, .      siz
13b70 65 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20  eof(Index) +    
13b80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13b90 65 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f  ex structure  */
13ba0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e  .      sizeof(in
13bb0 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  t)*nCol +       
13bc0 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43      /* Index.aiC
13bd0 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20  olumn   */.     
13be0 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43   sizeof(int)*(nC
13bf0 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a  ol+1) +       /*
13c00 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20   Index.aiRowEst 
13c10 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f    */.      sizeo
13c20 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b  f(char *)*nCol +
13c30 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13c40 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20  .azColl     */. 
13c50 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a       sizeof(u8)*
13c60 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20  nCol +          
13c70 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
13c80 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e  Order */.      n
13c90 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20  Name + 1 +      
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
13cb0 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20  ndex.zName      
13cc0 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  */.      nExtra 
13cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ce0 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
13cf0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
13d00 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20  s */.  );.  if( 
13d10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13d20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
13d30 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13d40 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a    }.  pIndex->az
13d50 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28  Coll = (char**)(
13d60 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70  &pIndex[1]);.  p
13d70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20  Index->aiColumn 
13d80 3d 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65  = (int *)(&pInde
13d90 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29  x->azColl[nCol])
13da0 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f  ;.  pIndex->aiRo
13db0 77 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64  wEst = (unsigned
13dc0 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43   *)(&pIndex->aiC
13dd0 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  olumn[nCol]);.  
13de0 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64  pIndex->aSortOrd
13df0 65 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e  er = (u8 *)(&pIn
13e00 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43  dex->aiRowEst[nC
13e10 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78  ol+1]);.  pIndex
13e20 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20  ->zName = (char 
13e30 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72  *)(&pIndex->aSor
13e40 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20  tOrder[nCol]);. 
13e50 20 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72 20   zExtra = (char 
13e60 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  *)(&pIndex->zNam
13e70 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d  e[nName+1]);.  m
13e80 65 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e  emcpy(pIndex->zN
13e90 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
13ea0 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  e+1);.  pIndex->
13eb0 70 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20  pTable = pTab;. 
13ec0 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e   pIndex->nColumn
13ed0 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   = pList->nExpr;
13ee0 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  .  pIndex->onErr
13ef0 6f 72 20 3d 20 6f 6e 45 72 72 6f 72 3b 0a 20 20  or = onError;.  
13f00 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
13f10 78 20 3d 20 70 4e 61 6d 65 3d 3d 30 3b 0a 20 20  x = pName==0;.  
13f20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 20  pIndex->pSchema 
13f30 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
13f40 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68  Schema;..  /* Ch
13f50 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
13f60 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45   should honor DE
13f70 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69  SC requests on i
13f80 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a  ndex columns.  *
13f90 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63  /.  if( pDb->pSc
13fa0 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61  hema->file_forma
13fb0 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74  t>=4 ){.    sort
13fc0 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20  OrderMask = -1; 
13fd0 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20    /* Honor DESC 
13fe0 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
13ff0 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20  sortOrderMask = 
14000 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20  0;    /* Ignore 
14010 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  DESC */.  }..  /
14020 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65 73  * Scan the names
14030 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20   of the columns 
14040 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
14050 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a 20  be indexed and. 
14060 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c   ** load the col
14070 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74 6f  umn indices into
14080 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75 63   the Index struc
14090 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  ture.  Report an
140a0 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61   error.  ** if a
140b0 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  ny column is not
140c0 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66   found..  */.  f
140d0 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74 65  or(i=0, pListIte
140e0 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
140f0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
14100 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20   pListItem++){. 
14110 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
14120 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49  ColName = pListI
14130 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
14140 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b  Column *pTabCol;
14150 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73 74  .    int request
14160 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  edSortOrder;.   
14170 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  /* Collation seq
141a0 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20  uence name */.. 
141b0 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62     for(j=0, pTab
141c0 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
141d0 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
141e0 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20  +, pTabCol++){. 
141f0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
14200 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65  StrICmp(zColName
14210 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65  , pTabCol->zName
14220 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
14230 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70    }.    if( j>=p
14240 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
14250 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
14260 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
14270 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75  e %s has no colu
14280 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20  mn named %s",.  
14290 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
142a0 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20  e, zColName);.  
142b0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
142c0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
142d0 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 20  }.    /* TODO:  
142e0 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d 61  Add a test to ma
142f0 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
14300 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20   same column is 
14310 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a  not named.    **
14320 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
14330 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
14340 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65  index.  Only the
14350 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65 20   first instance 
14360 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 6f  of.    ** the co
14370 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20 62  lumn will ever b
14380 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f 70  e used by the op
14390 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74  timizer.  Note t
143a0 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20  hat using the.  
143b0 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e    ** same column
143c0 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20   more than once 
143d0 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72 72  cannot be an err
143e0 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74 20  or because that 
143f0 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 62 72  would .    ** br
14400 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63 6f  eak backwards co
14410 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69 74  mpatibility - it
14420 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20 77   needs to be a w
14430 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  arning..    */. 
14440 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c     pIndex->aiCol
14450 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20  umn[i] = j;.    
14460 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  if( pListItem->p
14470 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 61 73  Expr ){.      as
14480 73 65 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d  sert( pListItem-
14490 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b  >pExpr->pColl );
144a0 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a  .      zColl = z
144b0 45 78 74 72 61 3b 0a 20 20 20 20 20 20 73 71 6c  Extra;.      sql
144c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45  ite3_snprintf(nE
144d0 78 74 72 61 2c 20 7a 45 78 74 72 61 2c 20 22 25  xtra, zExtra, "%
144e0 73 22 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  s", pListItem->p
144f0 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61  Expr->pColl->zNa
14500 6d 65 29 3b 0a 20 20 20 20 20 20 7a 45 78 74 72  me);.      zExtr
14510 61 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 43 6f  a += (strlen(zCo
14520 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65  ll) + 1);.    }e
14530 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  lse{.      zColl
14540 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
14550 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66  .zColl;.      if
14560 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !zColl ){.    
14570 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e      zColl = db->
14580 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  pDfltColl->zName
14590 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
145a0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
145b0 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74  t.busy && !sqlit
145c0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
145d0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d  pParse, zColl, -
145e0 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  1) ){.      goto
145f0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14600 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
14610 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20  ndex->azColl[i] 
14620 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71  = zColl;.    req
14630 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20  uestedSortOrder 
14640 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72  = pListItem->sor
14650 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64  tOrder & sortOrd
14660 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64  erMask;.    pInd
14670 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ex->aSortOrder[i
14680 5d 20 3d 20 72 65 71 75 65 73 74 65 64 53 6f 72  ] = requestedSor
14690 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73 71  tOrder;.  }.  sq
146a0 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
146b0 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20 69  st(pIndex);..  i
146c0 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
146d0 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
146e0 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e    /* This routin
146f0 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65  e has been calle
14700 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 61  d to create an a
14710 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 61  utomatic index a
14720 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c  s a.    ** resul
14730 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20 4b  t of a PRIMARY K
14740 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c 61  EY or UNIQUE cla
14750 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  use on a column 
14760 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20  definition, or. 
14770 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59 20     ** a PRIMARY 
14780 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
14790 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ause following t
147a0 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69  he column defini
147b0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69 2e  tions..    ** i.
147c0 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20 2a  e. one of:.    *
147d0 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20  *.    ** CREATE 
147e0 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41 52  TABLE t(x PRIMAR
147f0 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20 2a  Y KEY, y);.    *
14800 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
14810 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78 2c  (x, y, UNIQUE(x,
14820 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20   y));.    **.   
14830 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20   ** Either way, 
14840 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
14850 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
14860 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69 6e  y has such an in
14870 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20 73  dex. If.    ** s
14880 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72 20  o, don't bother 
14890 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f 6e  creating this on
148a0 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70 70  e. This only app
148b0 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 61  lies to.    ** a
148c0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72 65  utomatically cre
148d0 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55 73  ated indices. Us
148e0 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74 68  ers can do as th
148f0 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20 20  ey wish with.   
14900 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e 64   ** explicit ind
14910 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ices..    */.   
14920 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
14930 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
14940 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
14950 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
14960 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
14970 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
14980 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
14990 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  one );.      ass
149a0 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f 49  ert( pIdx->autoI
149b0 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61 73  ndex );.      as
149c0 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f 6e  sert( pIndex->on
149d0 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
149e0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  ;..      if( pId
149f0 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e 64  x->nColumn!=pInd
14a00 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63 6f  ex->nColumn ) co
14a10 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
14a20 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e  r(k=0; k<pIdx->n
14a30 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20 20  Column; k++){.  
14a40 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
14a50 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a 43   *z1 = pIdx->azC
14a60 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20  oll[k];.        
14a70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20 3d  const char *z2 =
14a80 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
14a90 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k];.        if( 
14aa0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
14ab0 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
14ac0 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
14ad0 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78          if( pIdx
14ae0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 21  ->aSortOrder[k]!
14af0 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72  =pIndex->aSortOr
14b00 64 65 72 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  der[k] ) break;.
14b10 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d          if( z1!=
14b20 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  z2 && sqlite3Str
14b30 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62  ICmp(z1, z2) ) b
14b40 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14b50 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
14b60 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
14b70 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
14b80 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
14b90 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
14ba0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
14bb0 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
14bc0 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
14bd0 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
14be0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
14bf0 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
14c00 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
14c10 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
14c20 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
14c30 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
14c40 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
14c50 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
14c60 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
14c70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
14c80 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
14c90 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
14ca0 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
14cb0 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
14cc0 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
14cd0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
14ce0 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
14cf0 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
14d00 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
14d10 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
14d20 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20  ified behaviour 
14d30 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
14d40 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
14d50 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
14d60 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
14d70 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
14d80 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
14d90 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
14da0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
14db0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
14dd0 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
14de0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
14df0 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
14e00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14e10 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
14e20 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
14e30 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
14e40 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
14e50 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
14e60 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
14e70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14e80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14e90 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
14ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14eb0 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
14ec0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
14ed0 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
14ee0 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
14ef0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
14f00 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
14f10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
14f20 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
14f30 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
14f40 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
14f50 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
14f60 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
14f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14f80 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78            pIndex
14f90 2d 3e 7a 4e 61 6d 65 2c 20 73 74 72 6c 65 6e 28  ->zName, strlen(
14fa0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2b 31  pIndex->zName)+1
14fb0 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69  , pIndex);.    i
14fc0 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73  f( p ){.      as
14fd0 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20  sert( p==pIndex 
14fe0 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75  );  /* Malloc mu
14ff0 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a  st have failed *
15000 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c  /.      db->mall
15010 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
15020 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
15030 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
15040 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20  }.    db->flags 
15050 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e  |= SQLITE_Intern
15060 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28  Changes;.    if(
15070 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
15080 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e        pIndex->tn
15090 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65  um = db->init.ne
150a0 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  wTnum;.    }.  }
150b0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62  ..  /* If the db
150c0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30  ->init.busy is 0
150d0 20 74 68 65 6e 20 63 72 65 61 74 65 20 74 68 65   then create the
150e0 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20   index on disk. 
150f0 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c   This.  ** invol
15100 76 65 73 20 77 72 69 74 69 6e 67 20 74 68 65 20  ves writing the 
15110 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d  index into the m
15120 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20  aster table and 
15130 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20  filling in the. 
15140 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74   ** index with t
15150 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
15160 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a   contents..  **.
15170 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69    ** The db->ini
15180 74 2e 62 75 73 79 20 69 73 20 30 20 77 68 65 6e  t.busy is 0 when
15190 20 74 68 65 20 75 73 65 72 20 66 69 72 73 74 20   the user first 
151a0 65 6e 74 65 72 73 20 61 20 43 52 45 41 54 45 20  enters a CREATE 
151b0 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d  INDEX .  ** comm
151c0 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62  and.  db->init.b
151d0 75 73 79 20 69 73 20 31 20 77 68 65 6e 20 61 20  usy is 1 when a 
151e0 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
151f0 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45  ed and .  ** CRE
15200 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ATE INDEX statem
15210 65 6e 74 73 20 61 72 65 20 72 65 61 64 20 6f 75  ents are read ou
15220 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  t of the master 
15230 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20  table.  In.  ** 
15240 74 68 65 20 6c 61 74 74 65 72 20 63 61 73 65 20  the latter case 
15250 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
15260 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b  y exists on disk
15270 2c 20 77 68 69 63 68 20 69 73 20 77 68 79 0a 20  , which is why. 
15280 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e   ** we don't wan
15290 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 69 74  t to recreate it
152a0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
152b0 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  TblName==0 it me
152c0 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78 20 69  ans this index i
152d0 73 20 67 65 6e 65 72 61 74 65 64 20 61 73 20 61  s generated as a
152e0 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a   primary key.  *
152f0 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73  * or UNIQUE cons
15300 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41  traint of a CREA
15310 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
15320 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74  nt.  Since the t
15330 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75  able.  ** has ju
15340 73 74 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c  st been created,
15350 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   it contains no 
15360 64 61 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64  data and the ind
15370 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ex initializatio
15380 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20  n.  ** step can 
15390 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f  be skipped..  */
153a0 0a 20 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e  .  else if( db->
153b0 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
153c0 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20      Vdbe *v;.   
153d0 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20   char *zStmt;.  
153e0 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70    int iMem = ++p
153f0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20  Parse->nMem;..  
15400 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
15410 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
15420 20 20 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74    if( v==0 ) got
15430 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
15440 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72  dex;...    /* Cr
15450 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
15460 65 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  e for the index.
15470 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
15480 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
15490 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
154a0 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
154b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
154c0 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20  OP_CreateIndex, 
154d0 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20  iDb, iMem);..   
154e0 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63   /* Gather the c
154f0 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
15500 74 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58  the CREATE INDEX
15510 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a   statement into.
15520 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74      ** the zStmt
15530 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f   variable.    */
15540 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
15550 26 26 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  && pEnd ){.     
15560 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65   /* A named inde
15570 78 20 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63  x with an explic
15580 69 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  it CREATE INDEX 
15590 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
155a0 20 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74     zStmt = sqlit
155b0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43  e3MPrintf(db, "C
155c0 52 45 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e  REATE%s INDEX %.
155d0 2a 73 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45  *s",.        onE
155e0 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20  rror==OE_None ? 
155f0 22 22 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a  "" : " UNIQUE",.
15600 20 20 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20          pEnd->z 
15610 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a  - pName->z + 1,.
15620 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a          pName->z
15630 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15640 20 20 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61      /* An automa
15650 74 69 63 20 69 6e 64 65 78 20 63 72 65 61 74 65  tic index create
15660 64 20 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b  d by a PRIMARY K
15670 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  EY or UNIQUE con
15680 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
15690 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69   /* zStmt = sqli
156a0 74 65 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20  te3MPrintf(""); 
156b0 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  */.      zStmt =
156c0 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
156d0 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69  * Add an entry i
156e0 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  n sqlite_master 
156f0 66 6f 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20  for this index. 
15700 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
15710 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
15720 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49  rse, .        "I
15730 4e 53 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73  NSERT INTO %Q.%s
15740 20 56 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c   VALUES('index',
15750 25 51 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c  %Q,%Q,#%d,%Q);",
15760 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62  .        db->aDb
15770 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48  [iDb].zName, SCH
15780 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a  EMA_TABLE(iDb),.
15790 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
157a0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70  zName,.        p
157b0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  Tab->zName,.    
157c0 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20      iMem,.      
157d0 20 20 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20    zStmt.    );. 
157e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
157f0 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
15800 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
15810 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
15820 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
15830 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
15840 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
15850 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
15860 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
15870 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
15880 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
15890 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
158a0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
158b0 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
158c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
158d0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
158e0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
158f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15900 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
15910 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20  a, iDb, 0, 0,.  
15920 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
15930 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
15940 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  '%q'", pIndex->z
15950 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49  Name), P4_DYNAMI
15960 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
15970 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
15980 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20  P_Expire, 0);.  
15990 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
159a0 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
159b0 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
159c0 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
159d0 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
159e0 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
159f0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
15a00 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
15a10 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
15a20 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
15a30 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
15a40 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
15a50 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
15a60 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
15a70 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
15a80 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
15a90 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
15aa0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
15ab0 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
15ac0 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
15ad0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
15ae0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
15af0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
15b00 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
15b10 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
15b20 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
15b30 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
15b40 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
15b50 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
15b60 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
15b70 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
15b80 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
15b90 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
15ba0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
15bb0 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
15bc0 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
15bd0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
15be0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
15bf0 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
15c00 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
15c10 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
15c20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
15c30 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
15c40 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
15c50 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
15c60 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
15c70 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
15c80 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
15c90 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71  Index);.  }.  sq
15ca0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
15cb0 65 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 73 71  ete(pList);.  sq
15cc0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
15cd0 74 65 28 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20  te(pTblName);.  
15ce0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
15cf0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
15d00 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
15d10 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75   code to make su
15d20 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  re the file form
15d30 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20  at number is at 
15d40 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e  least minFormat.
15d50 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65  .** The generate
15d60 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72  d code will incr
15d70 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f  ease the file fo
15d80 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e  rmat number if n
15d90 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69  ecessary..*/.voi
15da0 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d  d sqlite3Minimum
15db0 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65  FileFormat(Parse
15dc0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
15dd0 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74  b, int minFormat
15de0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
15df0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15e00 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
15e10 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ( v ){.    int r
15e20 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
15e30 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
15e40 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
15e50 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
15e60 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 6a  arse);.    int j
15e70 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
15e80 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
15e90 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
15ea0 72 31 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  r1, 1);.    sqli
15eb0 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
15ec0 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  (v, iDb);.    sq
15ed0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15ee0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
15ef0 69 6e 46 6f 72 6d 61 74 2c 20 72 32 29 3b 0a 20  inFormat, r2);. 
15f00 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
15f10 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
15f20 47 65 2c 20 72 32 2c 20 30 2c 20 72 31 29 3b 0a  Ge, r2, 0, r1);.
15f30 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
15f40 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
15f50 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72  ookie, iDb, 1, r
15f60 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
15f70 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
15f80 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  1);.    sqlite3R
15f90 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
15fa0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 73  arse, r1);.    s
15fb0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
15fc0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
15fd0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
15fe0 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
15ff0 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
16000 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
16010 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
16020 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
16030 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
16040 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
16050 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
16060 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
16070 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f  is suppose to co
16080 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
16090 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
160a0 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69  the index..** Si
160b0 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  nce we do not kn
160c0 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c  ow, guess 1 mill
160d0 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31  ion.  aiRowEst[1
160e0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
160f0 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
16100 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
16110 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
16120 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
16130 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
16140 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
16150 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52   the index.  aiR
16160 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65  owEst[2] is an e
16170 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
16180 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
16190 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
161a0 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
161b0 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  niation of the f
161c0 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
161d0 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
161e0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
161f0 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
16200 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
16210 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
16220 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
16230 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
16240 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
16250 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
16260 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
16270 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
16280 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
16290 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
162a0 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
162b0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
162c0 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
162d0 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
162e0 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
162f0 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
16300 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
16310 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
16320 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
16330 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
16340 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
16350 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
16360 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Est;.  int i;.  
16370 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a  assert( a!=0 );.
16380 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30    a[0] = 1000000
16390 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e  ;.  for(i=pIdx->
163a0 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69  nColumn; i>=5; i
163b0 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  --){.    a[i] = 
163c0 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  5;.  }.  while( 
163d0 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d  i>=1 ){.    a[i]
163e0 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69   = 11 - i;.    i
163f0 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  --;.  }.  if( pI
16400 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
16410 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49  None ){.    a[pI
16420 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31  dx->nColumn] = 1
16430 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
16440 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
16450 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
16460 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
16470 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
16480 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
16490 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
164a0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
164b0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
164c0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
164d0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
164e0 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
164f0 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
16500 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
16510 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16520 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
16530 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
16540 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
16550 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
16560 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
16570 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
16580 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
16590 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
165a0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
165b0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
165c0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
165d0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
165e0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
165f0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
16600 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
16610 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
16620 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
16630 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
16640 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
16650 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16660 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16670 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
16680 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
16690 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
166a0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
166b0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
166c0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
166d0 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
166e0 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
166f0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16700 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
16710 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16720 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
16730 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
16740 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
16750 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
16760 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
16770 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
16780 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
16790 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
167a0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
167b0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
167c0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
167d0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
167e0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
167f0 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
16800 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
16810 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
16820 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
16830 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
16840 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
16850 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
16860 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
16870 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16880 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16890 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
168a0 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
168b0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
168c0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
168d0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
168e0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
168f0 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
16900 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
16910 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16920 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16930 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
16940 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
16950 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
16960 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
16970 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
16980 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
16990 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
169a0 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
169b0 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
169c0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
169d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
169e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
169f0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
16a00 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
16a10 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
16a20 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
16a30 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
16a40 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
16a50 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
16a60 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
16a70 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
16a80 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
16a90 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
16aa0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
16ab0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  me.    );.    sq
16ac0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
16ad0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
16ae0 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
16af0 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64  age(pParse, pInd
16b00 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ex->tnum, iDb);.
16b10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16b20 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70  ddOp4(v, OP_Drop
16b30 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30  Index, iDb, 0, 0
16b40 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
16b50 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64   0);.  }..exit_d
16b60 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c  rop_index:.  sql
16b70 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
16b80 65 28 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  e(pName);.}../*.
16b90 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
16ba0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
16bb0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
16bc0 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
16bd0 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
16be0 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
16bf0 73 69 7a 65 2e 20 20 54 68 69 73 20 72 6f 75 74  size.  This rout
16c00 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
16c10 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e  new.** object on
16c20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
16c30 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e  array..**.** *pn
16c40 45 6e 74 72 79 20 69 73 20 74 68 65 20 6e 75 6d  Entry is the num
16c50 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61  ber of entries a
16c60 6c 72 65 61 64 79 20 69 6e 20 75 73 65 2e 20 20  lready in use.  
16c70 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74  *pnAlloc is.** t
16c80 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  he previously al
16c90 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
16ca0 74 68 65 20 61 72 72 61 79 2e 20 20 69 6e 69 74  the array.  init
16cb0 53 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  Size is the.** s
16cc0 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
16cd0 20 61 72 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f   array size allo
16ce0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
16cf0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
16d00 65 77 20 65 6e 74 72 79 20 69 73 20 72 65 74 75  ew entry is retu
16d10 72 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a  rned in *pIdx..*
16d20 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
16d30 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  e returns a poin
16d40 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
16d50 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 54 68   of objects.  Th
16d60 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74  is.** might be t
16d70 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
16d80 41 72 72 61 79 20 70 61 72 61 6d 65 74 65 72 20  Array parameter 
16d90 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  or it might be a
16da0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f   different.** po
16db0 69 6e 74 65 72 20 69 66 20 74 68 65 20 61 72 72  inter if the arr
16dc0 61 79 20 77 61 73 20 72 65 73 69 7a 65 64 2e 0a  ay was resized..
16dd0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
16de0 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
16df0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
16e00 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
16e10 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
16e20 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
16e30 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
16e40 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
16e50 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
16e60 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
16e70 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
16e80 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
16e90 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
16ea0 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
16eb0 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20 20 20  int initSize,   
16ec0 20 20 2f 2a 20 53 75 67 67 65 73 74 65 64 20 69    /* Suggested i
16ed0 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f  nitial allocatio
16ee0 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a  n, in elements *
16ef0 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
16f00 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
16f10 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
16f20 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
16f30 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20   int *pnAlloc,  
16f40 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
16f50 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
16f60 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74  tion, in element
16f70 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  s */.  int *pIdx
16f80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
16f90 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
16fa0 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
16fb0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
16fc0 20 20 69 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e    if( *pnEntry >
16fd0 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  = *pnAlloc ){.  
16fe0 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
16ff0 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20    int newSize;. 
17000 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70     newSize = (*p
17010 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74  nAlloc)*2 + init
17020 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Size;.    pNew =
17030 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
17040 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 6e 65  c(db, pArray, ne
17050 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a  wSize*szEntry);.
17060 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
17070 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
17080 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
17090 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
170a0 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 6e      *pnAlloc = n
170b0 65 77 53 69 7a 65 3b 0a 20 20 20 20 70 41 72 72  ewSize;.    pArr
170c0 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ay = pNew;.  }. 
170d0 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72   z = (char*)pArr
170e0 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b  ay;.  memset(&z[
170f0 2a 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74  *pnEntry * szEnt
17100 72 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29  ry], 0, szEntry)
17110 3b 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45  ;.  *pIdx = *pnE
17120 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74  ntry;.  ++*pnEnt
17130 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72  ry;.  return pAr
17140 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  ray;.}../*.** Ap
17150 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65  pend a new eleme
17160 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  nt to the given 
17170 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  IdList.  Create 
17180 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a  a new IdList if.
17190 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a  ** need be..**.*
171a0 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69  * A new IdList i
171b0 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e  s returned, or N
171c0 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20  ULL if malloc() 
171d0 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74  fails..*/.IdList
171e0 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41   *sqlite3IdListA
171f0 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64  ppend(sqlite3 *d
17200 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74  b, IdList *pList
17210 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
17220 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
17230 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
17240 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
17250 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
17260 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20   sizeof(IdList) 
17270 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
17280 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17290 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
172a0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  c = 0;.  }.  pLi
172b0 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41  st->a = sqlite3A
172c0 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20  rrayAllocate(.  
172d0 20 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c      db,.      pL
172e0 69 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69  ist->a,.      si
172f0 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
17300 29 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20 20 20  ),.      5,.    
17310 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20    &pList->nId,. 
17320 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c       &pList->nAl
17330 6c 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a 20 20  loc,.      &i.  
17340 29 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  );.  if( i<0 ){.
17350 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
17360 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 0a  tDelete(pList);.
17370 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17380 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
17390 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
173a0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
173b0 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
173c0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
173d0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
173e0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
173f0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
17400 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  (IdList *pList){
17410 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17420 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
17430 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
17440 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
17450 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
17460 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ee(pList->a[i].z
17470 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Name);.  }.  sql
17480 69 74 65 33 5f 66 72 65 65 28 70 4c 69 73 74 2d  ite3_free(pList-
17490 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  >a);.  sqlite3_f
174a0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
174b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
174c0 69 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f  index in pList o
174d0 66 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72  f the identifier
174e0 20 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74   named zId.  Ret
174f0 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74  urn -1.** if not
17500 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73   found..*/.int s
17510 71 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65  qlite3IdListInde
17520 78 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  x(IdList *pList,
17530 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
17540 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
17550 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
17560 65 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28  eturn -1;.  for(
17570 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49  i=0; i<pList->nI
17580 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  d; i++){.    if(
17590 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
175a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
175b0 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72  e, zName)==0 ) r
175c0 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72  eturn i;.  }.  r
175d0 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
175e0 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
175f0 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
17600 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
17610 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
17620 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
17630 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
17640 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
17650 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
17660 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e  n if pToken is N
17670 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ULL..**.** A new
17680 20 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75   SrcList is retu
17690 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66  rned, or NULL if
176a0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e   malloc() fails.
176b0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62  .**.** If pDatab
176c0 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c  ase is not null,
176d0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
176e0 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20  he table has an 
176f0 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61  optional.** data
17700 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78  base name prefix
17710 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22  .  Like this:  "
17720 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e  database.table".
17730 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65 0a    The pDatabase.
17740 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
17750 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
17760 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74  the pTable point
17770 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
17780 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53  e name..** The S
17790 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65  rcList.a[].zName
177a0 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64   field is filled
177b0 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
177c0 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74  name which might
177d0 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54  .** come from pT
177e0 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62 61  able (if pDataba
177f0 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66  se is NULL) or f
17800 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20  rom pDatabase.  
17810 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  .** SrcList.a[].
17820 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69 6c  zDatabase is fil
17830 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74  led with the dat
17840 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20  abase name from 
17850 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69  pTable,.** or wi
17860 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61  th NULL if no da
17870 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69 66  tabase is specif
17880 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74  ied..**.** In ot
17890 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61  her words, if ca
178a0 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  ll like this:.**
178b0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69  .**         sqli
178c0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
178d0 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a  (D,A,B,0);.**.**
178e0 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61 62   Then B is a tab
178f0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
17900 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
17910 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49   unspecified.  I
17920 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65  f called.** like
17930 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
17940 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
17950 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
17960 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43  C);.**.** Then C
17970 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61   is the table na
17980 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65 20  me and B is the 
17990 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a  database name..*
179a0 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
179b0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
179c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
179d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
179e0 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
179f0 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  f malloc failure
17a00 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  s */.  SrcList *
17a10 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41 70  pList,     /* Ap
17a20 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72 63  pend to this Src
17a30 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74  List. NULL creat
17a40 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74  es a new SrcList
17a50 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
17a60 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61 62  ble,      /* Tab
17a70 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  le to append */.
17a80 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61    Token *pDataba
17a90 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  se    /* Databas
17aa0 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a  e of the table *
17ab0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
17ac0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
17ad0 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
17ae0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
17af0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17b00 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
17b10 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
17b20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
17b30 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
17b40 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
17b50 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d    }.  if( pList-
17b60 3e 6e 53 72 63 3e 3d 70 4c 69 73 74 2d 3e 6e 41  >nSrc>=pList->nA
17b70 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
17b80 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ist *pNew;.    p
17b90 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 2a 3d 20  List->nAlloc *= 
17ba0 32 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  2;.    pNew = sq
17bb0 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
17bc0 62 2c 20 70 4c 69 73 74 2c 0a 20 20 20 20 20 20  b, pList,.      
17bd0 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
17be0 2a 70 4c 69 73 74 29 20 2b 20 28 70 4c 69 73 74  *pList) + (pList
17bf0 2d 3e 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65  ->nAlloc-1)*size
17c00 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 20  of(pList->a[0]) 
17c10 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
17c20 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
17c30 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
17c40 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 72  (pList);.      r
17c50 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
17c60 20 20 20 70 4c 69 73 74 20 3d 20 70 4e 65 77 3b     pList = pNew;
17c70 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
17c80 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
17c90 6e 53 72 63 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  nSrc];.  memset(
17ca0 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  pItem, 0, sizeof
17cb0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
17cc0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
17cd0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
17ce0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
17cf0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
17d00 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
17d10 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
17d20 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
17d30 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
17d40 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
17d50 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
17d60 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
17d70 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
17d80 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
17d90 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
17da0 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
17db0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17dc0 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
17dd0 73 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 69 43  se);.  pItem->iC
17de0 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 49  ursor = -1;.  pI
17df0 74 65 6d 2d 3e 69 73 50 6f 70 75 6c 61 74 65 64  tem->isPopulated
17e00 20 3d 20 30 3b 0a 20 20 70 4c 69 73 74 2d 3e 6e   = 0;.  pList->n
17e10 53 72 63 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Src++;.  return 
17e20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
17e30 41 73 73 69 67 6e 20 63 75 72 73 6f 72 73 20 74  Assign cursors t
17e40 6f 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20  o all tables in 
17e50 61 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69  a SrcList.*/.voi
17e60 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
17e70 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61  AssignCursors(Pa
17e80 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
17e90 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
17ea0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
17eb0 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
17ec0 74 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  tem;.  assert(pL
17ed0 69 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ist || pParse->d
17ee0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
17ef0 29 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  );.  if( pList )
17f00 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  {.    for(i=0, p
17f10 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
17f20 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
17f30 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
17f40 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43     if( pItem->iC
17f50 75 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b  ursor>=0 ) break
17f60 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69  ;.      pItem->i
17f70 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
17f80 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69  >nTab++;.      i
17f90 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
17fa0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
17fb0 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67  ite3SrcListAssig
17fc0 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c  nCursors(pParse,
17fd0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d   pItem->pSelect-
17fe0 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a  >pSrc);.      }.
17ff0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
18000 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
18010 69 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c  ire SrcList incl
18020 75 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75  uding all its su
18030 62 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76  bstructure..*/.v
18040 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  oid sqlite3SrcLi
18050 73 74 44 65 6c 65 74 65 28 53 72 63 4c 69 73 74  stDelete(SrcList
18060 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
18070 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  i;.  struct SrcL
18080 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
18090 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
180a0 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
180b0 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20  pItem=pList->a, 
180c0 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53  i=0; i<pList->nS
180d0 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
180e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
180f0 72 65 65 28 70 49 74 65 6d 2d 3e 7a 44 61 74 61  ree(pItem->zData
18100 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  base);.    sqlit
18110 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a  e3_free(pItem->z
18120 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
18130 65 33 5f 66 72 65 65 28 70 49 74 65 6d 2d 3e 7a  e3_free(pItem->z
18140 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c 69  Alias);.    sqli
18150 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
18160 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
18170 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
18180 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 53 65 6c  lete(pItem->pSel
18190 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
181a0 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65  3ExprDelete(pIte
181b0 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c  m->pOn);.    sql
181c0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
181d0 28 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  (pItem->pUsing);
181e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
181f0 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  ree(pList);.}../
18200 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
18210 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
18220 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64  he parser to add
18230 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
18240 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67  he.** end of a g
18250 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75  rowing FROM clau
18260 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72  se.  The "p" par
18270 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61  ameter is the pa
18280 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f  rt of.** the FRO
18290 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61  M clause that ha
182a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
182b0 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22  onstructed.  "p"
182c0 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74   is NULL.** if t
182d0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
182e0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
182f0 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c  M clause.  pTabl
18300 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a  e and pDatabase.
18310 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20  ** are the name 
18320 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
18330 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
18340 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
18350 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74  se term..** pDat
18360 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66  abase is NULL if
18370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
18380 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  me qualifier is 
18390 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a  missing - the.**
183a0 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66   usual case.  If
183b0 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20   the term has a 
183c0 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
183d0 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
183e0 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
183f0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
18400 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
18410 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
18420 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
18430 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
18440 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
18450 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
18460 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
18470 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
18480 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
18490 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
184a0 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
184b0 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
184c0 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
184d0 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
184e0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
184f0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
18500 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
18510 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
18520 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
18530 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
18540 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
18550 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
18560 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
18570 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18580 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
18590 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
185a0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
185b0 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
185c0 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
185d0 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
185e0 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
185f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
18600 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
18610 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
18620 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
18630 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
18640 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
18650 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
18660 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
18670 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
18680 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
18690 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
186a0 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
186b0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
186c0 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
186d0 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
186e0 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
186f0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
18700 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
18710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18720 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
18730 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
18740 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
18750 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
18760 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
18770 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
18780 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
18790 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
187a0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
187b0 62 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  b;.  p = sqlite3
187c0 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
187d0 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
187e0 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
187f0 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d  ==0 || p->nSrc==
18800 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
18810 45 78 70 72 44 65 6c 65 74 65 28 70 4f 6e 29 3b  ExprDelete(pOn);
18820 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
18830 73 74 44 65 6c 65 74 65 28 70 55 73 69 6e 67 29  stDelete(pUsing)
18840 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
18850 65 63 74 44 65 6c 65 74 65 28 70 53 75 62 71 75  ectDelete(pSubqu
18860 65 72 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ery);.    return
18870 20 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20   p;.  }.  pItem 
18880 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
18890 31 5d 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73  1];.  if( pAlias
188a0 20 26 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b   && pAlias->n ){
188b0 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  .    pItem->zAli
188c0 61 73 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  as = sqlite3Name
188d0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41  FromToken(db, pA
188e0 6c 69 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74  lias);.  }.  pIt
188f0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53  em->pSelect = pS
18900 75 62 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d  ubquery;.  pItem
18910 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70  ->pOn = pOn;.  p
18920 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70  Item->pUsing = p
18930 55 73 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20  Using;.  return 
18940 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  p;.}../*.** When
18950 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46   building up a F
18960 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68  ROM clause in th
18970 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f  e parser, the jo
18980 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69  in operator.** i
18990 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61  s initially atta
189a0 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74  ched to the left
189b0 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74   operand.  But t
189c0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
189d0 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65  r.** expects the
189e0 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74   join operator t
189f0 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68  o be on the righ
18a00 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73  t operand.  This
18a10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66   routine.** Shif
18a20 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72  ts all join oper
18a30 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20  ators from left 
18a40 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20  to right for an 
18a50 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63  entire FROM.** c
18a60 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61  lause..**.** Exa
18a70 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68  mple: Suppose th
18a80 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74  e join is like t
18a90 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
18aa0 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63       A natural c
18ab0 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a  ross join B.**.*
18ac0 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69  * The operator i
18ad0 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73  s "natural cross
18ae0 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61   join".  The A a
18af0 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72  nd B operands ar
18b00 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70  e stored.** in p
18b10 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b  ->a[0] and p->a[
18b20 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  1], respectively
18b30 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e  .  The parser in
18b40 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74  itially stores t
18b50 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77  he.** operator w
18b60 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75  ith A.  This rou
18b70 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61 74  tine shifts that
18b80 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74   operator over t
18b90 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  o B..*/.void sql
18ba0 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66 74  ite3SrcListShift
18bb0 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74  JoinType(SrcList
18bc0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26   *p){.  if( p &&
18bd0 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74   p->a ){.    int
18be0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d   i;.    for(i=p-
18bf0 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d  >nSrc-1; i>0; i-
18c00 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69  -){.      p->a[i
18c10 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e  ].jointype = p->
18c20 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b  a[i-1].jointype;
18c30 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b  .    }.    p->a[
18c40 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b  0].jointype = 0;
18c50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  .  }.}../*.** Be
18c60 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  gin a transactio
18c70 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
18c80 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  3BeginTransactio
18c90 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  n(Parse *pParse,
18ca0 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71   int type){.  sq
18cb0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
18cc0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  e *v;.  int i;..
18cd0 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20    if( pParse==0 
18ce0 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64  || (db=pParse->d
18cf0 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62  b)==0 || db->aDb
18d00 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74  [0].pBt==0 ) ret
18d10 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73  urn;.  if( pPars
18d20 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
18d30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
18d40 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69  turn;.  if( sqli
18d50 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
18d60 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
18d70 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22  SACTION, "BEGIN"
18d80 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
18d90 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
18da0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
18db0 0a 20 20 69 66 28 20 21 76 20 29 20 72 65 74 75  .  if( !v ) retu
18dc0 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d  rn;.  if( type!=
18dd0 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20  TK_DEFERRED ){. 
18de0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
18df0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
18e00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18e10 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73  dOp2(v, OP_Trans
18e20 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65  action, i, (type
18e30 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b  ==TK_EXCLUSIVE)+
18e40 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
18e50 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 76  3VdbeUsesBtree(v
18e60 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , i);.    }.  }.
18e70 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18e80 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
18e90 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  mmit, 0, 0);.}..
18ea0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74  /*.** Commit a t
18eb0 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f  ransaction.*/.vo
18ec0 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74  id sqlite3Commit
18ed0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
18ee0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
18ef0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
18f00 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61  e *v;..  if( pPa
18f10 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
18f20 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
18f30 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
18f40 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
18f50 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
18f60 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
18f70 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
18f80 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
18f90 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
18fa0 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
18fb0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20  "COMMIT", 0, 0) 
18fc0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
18fd0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
18fe0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
18ff0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
19000 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19010 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30  AutoCommit, 1, 0
19020 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
19030 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73  Rollback a trans
19040 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73  action.*/.void s
19050 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72  qlite3RollbackTr
19060 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
19070 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
19080 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
19090 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
190a0 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
190b0 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
190c0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
190d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
190e0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
190f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
19100 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
19110 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
19120 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
19130 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52  _TRANSACTION, "R
19140 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20  OLLBACK", 0, 0) 
19150 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
19160 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
19170 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
19180 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
19190 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
191a0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31  AutoCommit, 1, 1
191b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
191c0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45  Make sure the TE
191d0 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  MP database is o
191e0 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c  pen and availabl
191f0 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75  e for use.  Retu
19200 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
19210 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61   of errors.  Lea
19220 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  ve any error mes
19230 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61  sages in the pPa
19240 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
19250 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65  /.int sqlite3Ope
19260 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61  nTempDatabase(Pa
19270 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
19280 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
19290 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20  arse->db;.  if( 
192a0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d  db->aDb[1].pBt==
192b0 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78  0 && !pParse->ex
192c0 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74  plain ){.    int
192d0 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69 63 20   rc;.    static 
192e0 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
192f0 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  = .          SQL
19300 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
19310 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
19320 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
19330 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
19340 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
19350 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  IVE |.          
19360 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
19370 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20  TEONCLOSE |.    
19380 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
19390 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20  N_TEMP_DB;..    
193a0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
193b0 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20  eFactory(db, 0, 
193c0 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  0, SQLITE_DEFAUL
193d0 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 66 6c  T_CACHE_SIZE, fl
193e0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
193f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19400 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b 31        &db->aDb[1
19410 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20  ].pBt);.    if( 
19420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19430 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
19440 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
19450 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61  unable to open a
19460 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
19470 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66  ase ".        "f
19480 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ile for storing 
19490 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73  temporary tables
194a0 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  ");.      pParse
194b0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
194c0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
194d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 64 62  .    assert( (db
194e0 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
194f0 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 7c 7c 20  _InTrans)==0 || 
19500 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
19510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
19520 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
19530 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
19540 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
19550 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
19560 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79  that will verify
19570 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
19580 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20  ie and start.** 
19590 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
195a0 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64  on for all named
195b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
195c0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70  .**.** It is imp
195d0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
195e0 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62  schema cookies b
195f0 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61  e verified and a
19600 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73  ll.** read trans
19610 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74  actions be start
19620 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69  ed before anythi
19630 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20  ng else happens 
19640 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70  in.** the VDBE p
19650 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69  rogram.  But thi
19660 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
19670 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75   called after mu
19680 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65  ch other.** code
19690 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61   has been genera
196a0 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73  ted.  So here is
196b0 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a   what we do:.**.
196c0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
196d0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
196e0 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64  s called, we cod
196f0 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61  e an OP_Goto tha
19700 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74  t.** will jump t
19710 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61  o a subroutine a
19720 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
19730 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20   program.  Then 
19740 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65  we.** record eve
19750 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
19760 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65 6d   needs its schem
19770 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74 68  a verified in th
19780 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e.** pParse->coo
19790 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20  kieMask field.  
197a0 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c  Later, after all
197b0 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
197c0 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65  been.** generate
197d0 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  d, the subroutin
197e0 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20  e that does the 
197f0 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
19800 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72  ions and.** star
19810 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
19820 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65  ons will be code
19830 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74  d and the OP_Got
19840 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69  o P2 value.** wi
19850 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f  ll be made to po
19860 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62 72  int to that subr
19870 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e  outine.  The gen
19880 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  eration of the.*
19890 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  * cookie verific
198a0 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65  ation subroutine
198b0 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e   code happens in
198c0 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
198d0 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ding()..**.** If
198e0 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65   iDb<0 then code
198f0 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c   the OP_Goto onl
19900 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c  y - don't set fl
19910 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  ag to verify the
19920 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e  .** schema on an
19930 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54 68  y databases.  Th
19940 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
19950 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f  o position the O
19960 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20  P_Goto.** early 
19970 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66  in the code, bef
19980 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61  ore we know if a
19990 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ny database tabl
199a0 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  es will be used.
199b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
199c0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
199d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
199e0 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
199f0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
19a00 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  *v;.  int mask;.
19a10 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
19a20 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
19a30 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
19a40 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  rn;  /* This onl
19a50 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
19a60 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65  re was a prior e
19a70 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70  rror */.  db = p
19a80 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
19a90 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
19aa0 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  oto==0 ){.    pP
19ab0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
19ac0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
19ad0 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
19ae0 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20   0, 0)+1;.  }.  
19af0 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
19b00 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
19b10 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
19b20 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
19b30 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d  ].pBt!=0 || iDb=
19b40 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
19b50 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58  ( iDb<SQLITE_MAX
19b60 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20  _ATTACHED+2 );. 
19b70 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
19b80 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
19b90 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
19ba0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
19bb0 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
19bc0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
19bd0 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
19be0 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
19bf0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
19c00 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
19c10 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
19c20 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
19c30 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
19c40 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
19c50 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
19c60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19c70 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
19c80 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
19c90 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
19ca0 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
19cb0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
19cc0 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
19cd0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
19ce0 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
19cf0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19d00 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
19d10 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
19d20 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
19d30 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
19d40 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
19d50 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
19d60 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
19d70 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
19d80 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
19d90 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
19da0 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
19db0 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
19dc0 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
19dd0 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
19de0 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
19df0 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
19e00 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
19e10 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
19e20 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
19e30 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
19e40 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
19e50 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
19e60 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
19e70 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
19e80 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
19e90 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
19ea0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
19eb0 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
19ec0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
19ed0 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
19ee0 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
19ef0 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
19f00 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
19f10 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2a  d not be set..**
19f20 0a 2a 2a 20 4f 6e 6c 79 20 64 61 74 61 62 61 73  .** Only databas
19f30 65 20 69 44 62 20 61 6e 64 20 74 68 65 20 74 65  e iDb and the te
19f40 6d 70 20 64 61 74 61 62 61 73 65 20 61 72 65 20  mp database are 
19f50 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20 62 79  made writable by
19f60 20 74 68 69 73 20 63 61 6c 6c 2e 0a 2a 2a 20 49   this call..** I
19f70 66 20 69 44 62 3d 3d 30 2c 20 74 68 65 6e 20 74  f iDb==0, then t
19f80 68 65 20 6d 61 69 6e 20 61 6e 64 20 74 65 6d 70  he main and temp
19f90 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 6d   databases are m
19fa0 61 64 65 20 77 72 69 74 61 62 6c 65 2e 20 20 20  ade writable.   
19fb0 49 66 0a 2a 2a 20 69 44 62 3d 3d 31 20 74 68 65  If.** iDb==1 the
19fc0 6e 20 6f 6e 6c 79 20 74 68 65 20 74 65 6d 70 20  n only the temp 
19fd0 64 61 74 61 62 61 73 65 20 69 73 20 6d 61 64 65  database is made
19fe0 20 77 72 69 74 61 62 6c 65 2e 20 20 49 66 20 69   writable.  If i
19ff0 44 62 3e 31 20 74 68 65 6e 20 74 68 65 0a 2a 2a  Db>1 then the.**
1a000 20 73 70 65 63 69 66 69 65 64 20 61 75 78 69 6c   specified auxil
1a010 69 61 72 79 20 64 61 74 61 62 61 73 65 20 61 6e  iary database an
1a020 64 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  d the temp datab
1a030 61 73 65 20 61 72 65 20 6d 61 64 65 20 77 72 69  ase are made wri
1a040 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
1a050 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
1a060 4f 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20  Operation(Parse 
1a070 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74  *pParse, int set
1a080 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69  Statement, int i
1a090 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  Db){.  Vdbe *v =
1a0a0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1a0b0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
1a0c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1a0d0 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
1a0e0 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
1a0f0 69 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  iDb);.  pParse->
1a100 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c  writeMask |= 1<<
1a110 69 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74  iDb;.  if( setSt
1a120 61 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73  atement && pPars
1a130 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
1a140 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a150 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74 61 74  ddOp1(v, OP_Stat
1a160 65 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20 20 7d  ement, iDb);.  }
1a170 0a 20 20 69 66 28 20 28 4f 4d 49 54 5f 54 45 4d  .  if( (OMIT_TEM
1a180 50 44 42 20 7c 7c 20 69 44 62 21 3d 31 29 20 26  PDB || iDb!=1) &
1a190 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44  & pParse->db->aD
1a1a0 62 5b 31 5d 2e 70 42 74 21 3d 30 20 29 7b 0a 20  b[1].pBt!=0 ){. 
1a1b0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
1a1c0 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
1a1d0 61 72 73 65 2c 20 73 65 74 53 74 61 74 65 6d 65  arse, setStateme
1a1e0 6e 74 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  nt, 1);.  }.}../
1a1f0 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
1a200 65 20 69 66 20 70 49 6e 64 65 78 20 75 73 65 73  e if pIndex uses
1a210 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
1a220 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20  equence pColl.  
1a230 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69  Return.** true i
1a240 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61  f it does and fa
1a250 6c 73 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e  lse if it does n
1a260 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ot..*/.#ifndef S
1a270 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1a280 45 58 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  EX.static int co
1a290 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e  llationMatch(con
1a2a0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20  st char *zColl, 
1a2b0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a  Index *pIndex){.
1a2c0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1a2d0 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43  =0; i<pIndex->nC
1a2e0 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
1a2f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1a300 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b   pIndex->azColl[
1a310 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a  i];.    if( z==z
1a320 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43  Coll || (z && zC
1a330 6f 6c 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  oll && 0==sqlite
1a340 33 53 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c  3StrICmp(z, zCol
1a350 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  l)) ){.      ret
1a360 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
1a370 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1a380 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63  endif../*.** Rec
1a390 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1a3a0 65 73 20 6f 66 20 70 54 61 62 20 74 68 61 74 20  es of pTab that 
1a3b0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
1a3c0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
1a3d0 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ..** If pColl==0
1a3e0 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20   then recompute 
1a3f0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70  all indices of p
1a400 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  Tab..*/.#ifndef 
1a410 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1a420 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
1a430 72 65 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72  reindexTable(Par
1a440 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c  se *pParse, Tabl
1a450 65 20 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f  e *pTab, char co
1a460 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49  nst *zColl){.  I
1a470 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
1a480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1a490 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65   index associate
1a4a0 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a  d with pTab */..
1a4b0 20 20 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61    for(pIndex=pTa
1a4c0 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  b->pIndex; pInde
1a4d0 78 3b 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78  x; pIndex=pIndex
1a4e0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a4f0 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f  ( zColl==0 || co
1a500 6c 6c 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f  llationMatch(zCo
1a510 6c 6c 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20  ll, pIndex) ){. 
1a520 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
1a530 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
1a540 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
1a550 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
1a560 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
1a570 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1a580 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1a590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1a5a0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1a5b0 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
1a5c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
1a5d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70  if../*.** Recomp
1a5e0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1a5f0 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e  of all tables in
1a600 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77   all databases w
1a610 68 65 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69  here the.** indi
1a620 63 65 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  ces use the coll
1a630 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1a640 43 6f 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d  Coll.  If pColl=
1a650 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74  =0 then recomput
1a660 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73  e.** all indices
1a670 20 65 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a   everywhere..*/.
1a680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a690 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1a6a0 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44  ic void reindexD
1a6b0 61 74 61 62 61 73 65 73 28 50 61 72 73 65 20 2a  atabases(Parse *
1a6c0 70 50 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e  pParse, char con
1a6d0 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62  st *zColl){.  Db
1a6e0 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20 20   *pDb;          
1a6f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
1a700 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a  ingle database *
1a710 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a730 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1a740 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1a750 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1a760 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1a770 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1a780 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61  nnection */.  Ha
1a790 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
1a7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
1a7b0 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
1a7c0 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
1a7d0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a7f0 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
1a800 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f  atabase */..  fo
1a810 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
1a820 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
1a830 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
1a840 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 44  {.    assert( pD
1a850 62 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28  b!=0 );.    for(
1a860 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  k=sqliteHashFirs
1a870 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
1a880 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b  >tblHash);  k; k
1a890 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
1a8a0 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  k)){.      pTab 
1a8b0 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65  = (Table*)sqlite
1a8c0 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20  HashData(k);.   
1a8d0 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
1a8e0 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43  pParse, pTab, zC
1a8f0 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oll);.    }.  }.
1a900 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a910 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
1a920 72 20 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f  r the REINDEX co
1a930 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  mmand..**.**    
1a940 20 20 20 20 52 45 49 4e 44 45 58 20 20 20 20 20      REINDEX     
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a960 20 20 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20         -- 1.**  
1a970 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c        REINDEX  <
1a980 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20  collation>      
1a990 20 20 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a           -- 2.**
1a9a0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1a9b0 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74   ?<database>.?<t
1a9c0 61 62 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a  ablename>  -- 3.
1a9d0 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1a9e0 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f  X  ?<database>.?
1a9f0 3c 69 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20  <indexname>  -- 
1aa00 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63  4.**.** Form 1 c
1aa10 61 75 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65  auses all indice
1aa20 73 20 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  s in all attache
1aa30 64 20 64 61 74 61 62 61 73 65 73 20 74 6f 20 62  d databases to b
1aa40 65 20 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f  e rebuilt..** Fo
1aa50 72 6d 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c  rm 2 rebuilds al
1aa60 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
1aa70 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
1aa80 75 73 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a  use the named.**
1aa90 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1aaa0 69 6f 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e  ion.  Forms 3 an
1aab0 64 20 34 20 72 65 62 75 69 6c 64 20 74 68 65 20  d 4 rebuild the 
1aac0 6e 61 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61  named index or a
1aad0 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73  ll.** indices as
1aae0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
1aaf0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a  e named table..*
1ab00 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1ab10 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f  _OMIT_REINDEX.vo
1ab20 69 64 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65  id sqlite3Reinde
1ab30 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
1ab40 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
1ab50 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a  Token *pName2){.
1ab60 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
1ab70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1ab80 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
1ab90 6e 63 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65  nce to be reinde
1aba0 78 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  xed, or NULL */.
1abb0 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
1abc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1abd0 20 4e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65   Name of a table
1abe0 20 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63   or index */.  c
1abf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20  onst char *zDb; 
1ac00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1ac10 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1ac20 73 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  se */.  Table *p
1ac30 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1ac40 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1ac50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1ac60 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  /.  Index *pInde
1ac70 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1ac80 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f  /* An index asso
1ac90 63 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62  ciated with pTab
1aca0 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20   */.  int iDb;  
1acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acc0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1acd0 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a  e index number *
1ace0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
1acf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
1ad00 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1ad10 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
1ad20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b  Token *pObjName;
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ad40 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1ad50 20 6f 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20   or index to be 
1ad60 72 65 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20  reindexed */..  
1ad70 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61  /* Read the data
1ad80 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20  base schema. If 
1ad90 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1ada0 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
1adb0 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64  message.  ** and
1adc0 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20   code in pParse 
1add0 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  and return NULL.
1ade0 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45   */.  if( SQLITE
1adf0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
1ae00 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
1ae10 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
1ae20 7d 0a 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d  }..  if( pName1=
1ae30 3d 30 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d  =0 || pName1->z=
1ae40 3d 30 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  =0 ){.    reinde
1ae50 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
1ae60 65 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  e, 0);.    retur
1ae70 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  n;.  }else if( p
1ae80 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d  Name2==0 || pNam
1ae90 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
1aea0 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
1aeb0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
1aec0 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
1aed0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1aee0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
1aef0 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
1af00 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
1af10 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
1af20 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
1af30 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
1af40 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a   zColl, -1, 0);.
1af50 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1af60 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c  .      if( zColl
1af70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 69 6e   ){.        rein
1af80 64 65 78 44 61 74 61 62 61 73 65 73 28 70 50 61  dexDatabases(pPa
1af90 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  rse, zColl);.   
1afa0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1afb0 65 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20  e(zColl);.      
1afc0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  }.      return;.
1afd0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1afe0 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 29 3b 0a 20  3_free(zColl);. 
1aff0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
1b000 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
1b010 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
1b020 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29  ame2, &pObjName)
1b030 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 20  ;.  if( iDb<0 ) 
1b040 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71  return;.  z = sq
1b050 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1b060 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29  en(db, pObjName)
1b070 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72  ;.  if( z==0 ) r
1b080 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64  eturn;.  zDb = d
1b090 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1b0a0 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  e;.  pTab = sqli
1b0b0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
1b0c0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20   z, zDb);.  if( 
1b0d0 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e  pTab ){.    rein
1b0e0 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
1b0f0 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73   pTab, 0);.    s
1b100 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
1b110 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1b120 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
1b130 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
1b140 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  z, zDb);.  sqlit
1b150 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 69 66  e3_free(z);.  if
1b160 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
1b170 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1b180 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1b190 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
1b1a0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1b1b0 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1b1c0 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  x, -1);.    retu
1b1d0 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
1b1e0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1b1f0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65  , "unable to ide
1b200 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74  ntify the object
1b210 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1b220 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ");.}.#endif../*
1b230 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e  .** Return a dyn
1b240 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64  amicly allocated
1b250 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1b260 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  re that can be u
1b270 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f  sed.** with OP_O
1b280 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70  penRead or OP_Op
1b290 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65 73  enWrite to acces
1b2a0 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  s database index
1b2b0 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pIdx..**.** If 
1b2c0 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f  successful, a po
1b2d0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
1b2e0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
1b2f0 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
1b300 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  case.** the call
1b310 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1b320 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71  e for calling sq
1b330 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 20  lite3_free() on 
1b340 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a  the returned .**
1b350 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e 20   pointer. If an 
1b360 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f 75  error occurs (ou
1b370 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d  t of memory or m
1b380 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  issing collation
1b390 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c 20   .** sequence), 
1b3a0 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
1b3b0 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20 6f   and the state o
1b3c0 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65 64  f pParse updated
1b3d0 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74   to reflect.** t
1b3e0 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79  he error..*/.Key
1b3f0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64  Info *sqlite3Ind
1b400 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65 20  exKeyinfo(Parse 
1b410 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
1b420 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  pIdx){.  int i;.
1b430 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64    int nCol = pId
1b440 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e  x->nColumn;.  in
1b450 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65 6f  t nBytes = sizeo
1b460 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43  f(KeyInfo) + (nC
1b470 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c  ol-1)*sizeof(Col
1b480 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20  lSeq*) + nCol;. 
1b490 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d   KeyInfo *pKey =
1b4a0 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69   (KeyInfo *)sqli
1b4b0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
1b4c0 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74  pParse->db, nByt
1b4d0 65 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79  es);..  if( pKey
1b4e0 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62   ){.    pKey->db
1b4f0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1b500 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72     pKey->aSortOr
1b510 64 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b  der = (u8 *)&(pK
1b520 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29  ey->aColl[nCol])
1b530 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70  ;.    assert( &p
1b540 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Key->aSortOrder[
1b550 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29  nCol]==&(((u8 *)
1b560 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29  pKey)[nBytes]) )
1b570 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1b580 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
1b590 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d     char *zColl =
1b5a0 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d   pIdx->azColl[i]
1b5b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b5c0 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70  zColl );.      p
1b5d0 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20  Key->aColl[i] = 
1b5e0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
1b5f0 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
1b600 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 70  ll, -1);.      p
1b610 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Key->aSortOrder[
1b620 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  i] = pIdx->aSort
1b630 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a  Order[i];.    }.
1b640 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c 64      pKey->nField
1b650 20 3d 20 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20   = nCol;.  }..  
1b660 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1b670 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1b680 66 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20  free(pKey);.    
1b690 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pKey = 0;.  }.  
1b6a0 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a     return pKey;.}.