/ Hex Artifact Content
Login

Artifact a8320b5fe742dcae98c8f7315b59d61e8e642a4d:


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 35 33 37 20 32 30 30 39 2f 30 35 2f 30 36  1.537 2009/05/06
02f0: 20 31 38 3a 34 32 3a 32 31 20 64 72 68 20 45 78   18:42:21 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0320: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0330: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
0340: 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74 65   a new SQL state
0350: 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69 6e  ment is beginnin
0360: 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73 65  g to.** be parse
0370: 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  d.  Initialize t
0380: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
0390: 75 72 65 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ure as needed..*
03a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
03b0: 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20 2a  ginParse(Parse *
03c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70 6c  pParse, int expl
03d0: 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70 50 61 72  ainFlag){.  pPar
03e0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 28 75  se->explain = (u
03f0: 38 29 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20  8)explainFlag;. 
0400: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
0410: 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
0420: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0430: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0440: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0450: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0460: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0470: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0480: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0490: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
04a0: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
04b0: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
04d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
04e0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
04f0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0500: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
0510: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
0520: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0530: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0540: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0550: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0560: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0570: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0580: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
05a0: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
05b0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
05c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
05d0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
05e0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
05f0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
0600: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
0610: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0620: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0630: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0640: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0650: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0660: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0670: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0680: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0690: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
06a0: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
06b0: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
06c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
06d0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
06e0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
06f0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
0700: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
0710: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
0720: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0730: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0740: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0750: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0760: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0770: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0780: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0790: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
07a0: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
07b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
07c0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
07d0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
07e0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
07f0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
0800: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
0810: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
0820: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0830: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0840: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0850: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0860: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0870: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0880: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0890: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
08a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
08b0: 42 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f  Bytes;.  TableLo
08c0: 63 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 69 44  ck *p;..  if( iD
08d0: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
08e0: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
08f0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0900: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0910: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0920: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0930: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0940: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0950: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
0960: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
0970: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
0980: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
0990: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09a0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09b0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
09c0: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
09d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
09e0: 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
09f0: 6f 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c  ock = .      sql
0a00: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
0a10: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
0a20: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a30: 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69  ck, nBytes);.  i
0a40: 66 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  f( pParse->aTabl
0a50: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d  eLock ){.    p =
0a60: 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65   &pParse->aTable
0a70: 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61  Lock[pParse->nTa
0a80: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a90: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0aa0: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0ab0: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0ac0: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0ad0: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ck;.    p->zName
0ae0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73   = zName;.  }els
0af0: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e{.    pParse->n
0b00: 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  TableLock = 0;. 
0b10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
0b20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
0b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0b40: 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f  de an OP_TableLo
0b50: 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ck instruction f
0b60: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f  or each table lo
0b70: 63 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  cked by the.** s
0b80: 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67  tatement (config
0b90: 75 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ured by calls to
0ba0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0bb0: 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  k())..*/.static 
0bc0: 76 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f  void codeTableLo
0bd0: 63 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  cks(Parse *pPars
0be0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  e){.  int i;.  V
0bf0: 64 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20  dbe *pVdbe; ..  
0c00: 69 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20  if( 0==(pVdbe = 
0c10: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
0c20: 50 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72  Parse)) ){.    r
0c30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
0c40: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
0c50: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b  >nTableLock; i++
0c60: 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b  ){.    TableLock
0c70: 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
0c80: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0c90: 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44    int p1 = p->iD
0ca0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  b;.    sqlite3Vd
0cb0: 62 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20  beAddOp4(pVdbe, 
0cc0: 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31  OP_TableLock, p1
0cd0: 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73  , p->iTab, p->is
0ce0: 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  WriteLock,.     
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54   p->zName, P4_ST
0d10: 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ATIC);.  }.}.#el
0d20: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64  se.  #define cod
0d30: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23  eTableLocks(x).#
0d40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
0d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0d60: 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67  led after a sing
0d70: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
0d80: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72   has been.** par
0d90: 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70  sed and a VDBE p
0da0: 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
0db0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
0dc0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65   has been.** pre
0dd0: 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75  pared.  This rou
0de0: 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69  tine puts the fi
0df0: 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20  nishing touches 
0e00: 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  on the.** VDBE p
0e10: 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74  rogram and reset
0e20: 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  s the pParse str
0e30: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e  ucture for the n
0e40: 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a  ext.** parse..**
0e50: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0e60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0e70: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0e80: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0e90: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0ea0: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
0ec0: 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a  shCoding(Parse *
0ed0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0ee0: 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
0ef0: 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  v;..  db = pPars
0f00: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
0f10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
0f20: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f30: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0f40: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f50: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
0f60: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  rn;..  /* Begin 
0f70: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
0f80: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
0f90: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
0fa0: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
0fb0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 76  program.  */.  v
0fc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
0fd0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
0fe0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
0ff0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1000: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
1010: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
1020: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
1030: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1040: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1050: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1060: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1070: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1080: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1090: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
10a0: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
10b0: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
10c0: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
10d0: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
10e0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
10f0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1100: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
1110: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
1120: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
1130: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1140: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1150: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1160: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
1170: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
1180: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
1190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11a0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
11b0: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
11c0: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
11d0: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
11e0: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
11f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1200: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1210: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
1220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1240: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
1250: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1260: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f  VdbeAddOp2(v,OP_
1270: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
1280: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
1290: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
12a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
12b0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
12f0: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
1300: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
1310: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1320: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1330: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1340: 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BLE.      {.    
1350: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1360: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
1370: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b  arse->nVtabLock;
1380: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1390: 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63   char *vtab = (c
13a0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 61 70  har *)pParse->ap
13b0: 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d 3e 70 56 74  VtabLock[i]->pVt
13c0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ab;.          sq
13d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13e0: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
13f0: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1400: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 20 20 7d  VTAB);.        }
1410: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1420: 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a  >nVtabLock = 0;.
1430: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1440: 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c        /* Once al
1450: 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61  l the cookies ha
1460: 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  ve been verified
1470: 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   and transaction
1480: 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20  s opened, .     
1490: 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72   ** obtain the r
14a0: 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f  equired table-lo
14b0: 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e  cks. This is a n
14c0: 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20  o-op unless the 
14d0: 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64  .      ** shared
14e0: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
14f0: 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20  s enabled..     
1500: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61   */.      codeTa
1510: 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29  bleLocks(pParse)
1520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1530: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1540: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
1550: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20  >cookieGoto);.  
1560: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47    }.  }...  /* G
1570: 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  et the VDBE prog
1580: 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78  ram ready for ex
1590: 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69  ecution.  */.  i
15a0: 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e  f( v && pParse->
15b0: 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e  nErr==0 && !db->
15c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
15e0: 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72  BUG.    FILE *tr
15f0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
1600: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
1610: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
1620: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
1630: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
1640: 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ace);.#endif.   
1650: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1660: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20  >iCacheLevel==0 
1670: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1680: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1690: 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71 6c 69  atch */.    sqli
16a0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
16b0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
16c0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a  , pParse->nMem,.
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
16f0: 3e 6e 54 61 62 2c 20 70 50 61 72 73 65 2d 3e 65  >nTab, pParse->e
1700: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
1710: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1720: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
1730: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
1740: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1750: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
1760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
1770: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1780: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
1790: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
17a0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
17b0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
17c0: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
17d0: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50  ->nVar = 0;.  pP
17e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
17f0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1800: 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a  cookieGoto = 0;.
1810: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1820: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1830: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1840: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1850: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1860: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1870: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1880: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1890: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
18a0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
18b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18c0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
18d0: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
18e0: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
18f0: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1900: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1910: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1920: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1930: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1940: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1950: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1960: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1970: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1980: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1990: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
19a0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
19b0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
19c0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
19d0: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
19e0: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
19f0: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1a00: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1a10: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1a20: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1a30: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1a40: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1a50: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1a60: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1a70: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1a80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1a90: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1aa0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1ab0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ac0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1ad0: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
1ae0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1af0: 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  >db;.# define SA
1b00: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1b10: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1b20: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1b30: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1b40: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1b50: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1b60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1b70: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1b80: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1b90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1ba0: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1bb0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1bc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1bd0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1be0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
1bf0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1c00: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1c10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c20: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1c30: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c40: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1c50: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1c60: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1c70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1c80: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1c90: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1ca0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1cb0: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1cc0: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
1cd0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1ce0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1cf0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1d00: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
1d10: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1d20: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1d30: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1d40: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1d60: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1d70: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1d80: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1d90: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1da0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1db0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1dc0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1dd0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1de0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1df0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1e00: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1e10: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1e30: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1e40: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1e50: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1e60: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1e70: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1e80: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1e90: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1ea0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1eb0: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1ec0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1ed0: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1ee0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1ef0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1f00: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1f10: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1f20: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1f30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1f40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1f50: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
1f60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1f70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1f80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1fa0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
1fb0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1fc0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
1fd0: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1fe0: 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  0 );.  nName = s
1ff0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2000: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
2010: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2020: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2030: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
2040: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
2050: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
2060: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
2070: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
2080: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2090: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
20a0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
20b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
20c0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
20d0: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53  d(&db->aDb[j].pS
20e0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
20f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2100: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2110: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2130: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2140: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2150: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2160: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2170: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2180: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2190: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
21a0: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
21b0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
21c0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
21d0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
21e0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
21f0: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2200: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2210: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2220: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2230: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2240: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2250: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2260: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2270: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2280: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2290: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
22a0: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
22b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
22c0: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
22d0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
22e0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
22f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2300: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2310: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2320: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2330: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
2340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2350: 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20   if looking for 
2360: 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74 68  a VIEW rather th
2370: 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20  an a TABLE */.  
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2390: 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
23a0: 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
23b0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
23c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23d0: 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61  zDbase     /* Na
23e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
23f0: 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  se.  Might be NU
2400: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  LL */.){.  Table
2410: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
2420: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
2430: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
2440: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
2450: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
2460: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
2470: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
2480: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
2490: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
24a0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
24b0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
24c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
24d0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
24e0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
24f0: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
2500: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2510: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2520: 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e  sg = isView ? "n
2530: 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22  o such view" : "
2540: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a  no such table";.
2550: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
2560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2580: 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73  "%s: %s.%s", zMs
2590: 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  g, zDbase, zName
25a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
25d0: 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d   %s", zMsg, zNam
25e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
25f0: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
2600: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 1;.  }.  ret
2610: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2620: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2630: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2640: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
2650: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
2660: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
2670: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
2680: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
2690: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
26a0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
26b0: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
26c0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
26d0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
26e0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
26f0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2700: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2710: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
2720: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
2730: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
2740: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2750: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
2760: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
2770: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
2780: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2790: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
27a0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
27b0: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
27c0: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
27d0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
27e0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
27f0: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
2800: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2810: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2820: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2830: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
2840: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
2850: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
2860: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2870: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
2880: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2890: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
28a0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
28b0: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
28c0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
28d0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68   MAIN */.    Sch
28e0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
28f0: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2900: 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  a;.    if( zDb &
2910: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2920: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
2930: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
2940: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
2950: 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31  pSchema || (j==1
2960: 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e   && !db->aDb[1].
2970: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
2980: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
2990: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
29a0: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
29b0: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  dxHash, zName, n
29c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
29d0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
29e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
29f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
2a00: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
2a10: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
2a20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2a30: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
2a40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2a50: 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 4d 65   p->pTable->dbMe
2a60: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  m;.  sqlite3DbFr
2a70: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
2a80: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  f);.  sqlite3DbF
2a90: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2aa0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2ab0: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
2ac0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
2ad0: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
2ae0: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
2af0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
2b00: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
2b10: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
2b20: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
2b30: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
2b40: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
2b50: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
2b60: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
2b70: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
2b80: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
2b90: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
2ba0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2bb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2bc0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2bd0: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e  (Index *p){.  In
2be0: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e  dex *pOld;.  con
2bf0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2c00: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f   p->zName;..  pO
2c10: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
2c20: 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
2c30: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
2c40: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2c60: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c70: 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 61 73 73  Name), 0);.  ass
2c80: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2c90: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65  pOld==p );.  fre
2ca0: 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a  eIndex(p);.}../*
2cb0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
2cc0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
2cd0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
2ce0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cf0: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
2d00: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
2d10: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
2d20: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
2d30: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
2d40: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
2d50: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
2d60: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
2d70: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
2d80: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
2d90: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
2da0: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
2db0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2dc0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
2dd0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
2de0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
2df0: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
2e00: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
2e10: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
2e20: 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20  xHash;..  len = 
2e30: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e40: 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  zIdxName);.  pIn
2e50: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73  dex = sqlite3Has
2e60: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
2e70: 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29  IdxName, len, 0)
2e80: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
2e90: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
2ea0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2eb0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
2ec0: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
2ed0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
2ee0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
2ef0: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
2f00: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
2f10: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2f20: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2f30: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2f40: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2f50: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2f60: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
2f70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
2f80: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
2f90: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2fa0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
2fb0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
2fc0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
2fd0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2ff0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
3000: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
3010: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
3020: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
3030: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
3040: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3050: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
3060: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
3070: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
3080: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
3090: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
30a0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
30b0: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
30c0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
30d0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
30e0: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
30f0: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
3100: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
3110: 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 20 74 68  .** If iDb==0 th
3120: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
3130: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
3140: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
3150: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
3160: 49 66 20 69 44 62 3e 3d 31 20 74 68 65 6e 20 72  If iDb>=1 then r
3170: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
3180: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
3190: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
31a0: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
31b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
31c0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
31d0: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
31e0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
31f0: 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  i, j;.  assert( 
3200: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
3210: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  ->nDb );..  if( 
3220: 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  iDb==0 ){.    sq
3230: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
3240: 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f  ll(db);.  }.  fo
3250: 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e  r(i=iDb; i<db->n
3260: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
3270: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3280: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3290: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
32a0: 20 20 20 61 73 73 65 72 74 28 69 3d 3d 31 20 7c     assert(i==1 |
32b0: 7c 20 28 70 44 62 2d 3e 70 42 74 20 26 26 20 73  | (pDb->pBt && s
32c0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
32d0: 4d 75 74 65 78 28 70 44 62 2d 3e 70 42 74 29 29  Mutex(pDb->pBt))
32e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32f0: 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e  SchemaFree(pDb->
3300: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
3310: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
3320: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
3330: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
3340: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3350: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3360: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 42  nges;.  sqlite3B
3370: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
3380: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
3390: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
33a0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
33b0: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
33c0: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
33d0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  n remove them fr
33e0: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
33f0: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
3400: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
3410: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
3420: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
3430: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
3440: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
3450: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
3460: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3470: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
3480: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
3490: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
34a0: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
34b0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
34c0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
34d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
34e0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
34f0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3500: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3510: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
3520: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
3530: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
3540: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
3550: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
3560: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
3570: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3580: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3590: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
35a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
35b0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
35c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
35d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
35e0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
35f0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3600: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3610: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3620: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3630: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3640: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3650: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
3660: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
3670: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
3680: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
3690: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
36a0: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
36b0: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
36c0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
36d0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
36e0: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
36f0: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
3700: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
3710: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3720: 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64   db->aDb);.    d
3730: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
3740: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
3750: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3760: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
3770: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
3780: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3790: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
37a0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
37b0: 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  db){.  db->flags
37c0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
37d0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
37e0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
37f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
3800: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e  a table or view.
3810: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3820: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
3830: 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54  nNames(Table *pT
3840: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
3850: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
3860: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3870: 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 20  pTable->dbMem;. 
3880: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
3890: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
38a0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
38b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
38c0: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
38d0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
38e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
38f0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
3900: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
3910: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3920: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
3930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3940: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
3950: 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73  >zType);.      s
3960: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3970: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20   pCol->zColl);. 
3980: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3990: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
39a0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e->aCol);.  }.  
39b0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
39c0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
39d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
39e0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
39f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
3a00: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3a10: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
3a20: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
3a30: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
3a40: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
3a50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
3a60: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
3a70: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
3a80: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
3a90: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
3aa0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
3ab0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
3ac0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
3ad0: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
3ae0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
3af0: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
3b00: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
3b10: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
3b20: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
3b30: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
3b40: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
3b50: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
3b60: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
3b70: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
3b80: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
3b90: 65 79 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ey;.  sqlite3 *d
3ba0: 62 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65  b;..  if( pTable
3bb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3bc0: 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 4d  db = pTable->dbM
3bd0: 65 6d 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  em;..  /* Do not
3be0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
3bf0: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
3c00: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
3c10: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70  hes zero. */.  p
3c20: 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Table->nRef--;. 
3c30: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65   if( pTable->nRe
3c40: 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  f>0 ){.    retur
3c50: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3c60: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30   pTable->nRef==0
3c70: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
3c80: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
3c90: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3ca0: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
3cb0: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
3cc0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
3cd0: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
3ce0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
3cf0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3d00: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
3d10: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
3d20: 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  e->pSchema );.  
3d30: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49    sqlite3DeleteI
3d40: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
3d50: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3d60: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
3d70: 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  EY.  /* Delete a
3d80: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
3d90: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3da0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
3db0: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
3dc0: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
3dd0: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
3de0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
3df0: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
3e00: 72 6f 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rom;.    sqlite3
3e10: 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
3e20: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
3e30: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
3e40: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
3e50: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71  tself..  */.  sq
3e60: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3e70: 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20  ames(pTable);.  
3e80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3e90: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
3ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3eb0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
3ec0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
3ed0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
3ee0: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
3ef0: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
3f00: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
3f10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3f20: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43  e(db, pTable->pC
3f30: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  heck);.#endif.  
3f40: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
3f50: 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  (pTable);.  sqli
3f60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3f70: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
3f80: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
3f90: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
3fa0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3fb0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
3fc0: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
3fd0: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
3fe0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3ff0: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4000: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4010: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4020: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4030: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4040: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4050: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
4060: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
4070: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
4080: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
4090: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
40a0: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54  ( zTabName && zT
40b0: 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70  abName[0] );.  p
40c0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
40d0: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
40e0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
40f0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
4100: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20  sh, zTabName,.  
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
4130: 6c 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29 2c  len30(zTabName),
4140: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  0);.  sqlite3Del
4150: 65 74 65 54 61 62 6c 65 28 70 29 3b 0a 20 20 64  eteTable(p);.  d
4160: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4170: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
4190: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
41a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
41b0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
41c0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
41d0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
41e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
41f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
4200: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4210: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
4220: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
4230: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
4240: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
4250: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
4260: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
4270: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
4280: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
4290: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
42a0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
42b0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
42c0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
42d0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
42e0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
42f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
4300: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
4310: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
4320: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
4330: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
4340: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
4350: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
4360: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
4370: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
4380: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
4390: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
43a0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
43b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
43c0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
43d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
43e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
43f0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
4400: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
4410: 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 71 75 6f    if( pName->quo
4420: 74 65 64 20 29 20 73 71 6c 69 74 65 33 44 65 71  ted ) sqlite3Deq
4430: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
4440: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
4450: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4460: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
4470: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
4480: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
4490: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
44a0: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
44b0: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
44c0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
44d0: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
44e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
44f0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4500: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
4510: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
4520: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
4530: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
4540: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
4550: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
4560: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
4570: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4580: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
4590: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
45a0: 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20 73  _ROOT, iDb);.  s
45b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
45c0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
45d0: 2a 29 35 2c 20 50 34 5f 49 4e 54 33 32 29 3b 20  *)5, P4_INT32); 
45e0: 20 2f 2a 20 35 20 63 6f 6c 75 6d 6e 20 74 61 62   /* 5 column tab
45f0: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  le */.  if( p->n
4600: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Tab==0 ){.    p-
4610: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d  >nTab = 1;.  }.}
4620: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
4630: 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74  r zName points t
4640: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
4650: 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ed buffer contai
4660: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  ning the name.**
4670: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
4680: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f  "main", "temp" o
4690: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
46a0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
46b0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
46c0: 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65  returns the inde
46d0: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
46e0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
46f0: 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69  Db[], or.** -1 i
4700: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63  f the named db c
4710: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
4720: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
4730: 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33  ndDbName(sqlite3
4740: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
4750: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
4760: 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  i = -1;         
4770: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4780: 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d  er */.  if( zNam
4790: 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  e ){.    Db *pDb
47a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71  ;.    int n = sq
47b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
47c0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
47d0: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
47e0: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
47f0: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
4800: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4810: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4820: 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33   ) && n==sqlite3
4830: 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e  Strlen30(pDb->zN
4840: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
4850: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
4860: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
4870: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
4880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4890: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
48a0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
48b0: 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d   The token *pNam
48c0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
48d0: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
48e0: 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22  e (either "main"
48f0: 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72   or.** "temp" or
4900: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
4910: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
4920: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
4930: 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  ns the.** index 
4940: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
4950: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
4960: 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65  [], or -1 if the
4970: 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f   named db .** do
4980: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  es not exist..*/
4990: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
49a0: 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  Db(sqlite3 *db, 
49b0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
49c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
49f0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
4a00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
4a30: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
4a40: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
4a50: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4a60: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
4a70: 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  i = sqlite3FindD
4a80: 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bName(db, zName)
4a90: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4aa0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
4ab0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
4ac0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
4ad0: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
4ae0: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
4af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4b00: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
4b10: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4b20: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4b30: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4b40: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4b50: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4b60: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4b70: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
4b80: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4b90: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
4ba0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
4bb0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
4bc0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
4bd0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
4be0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
4bf0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4c00: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
4c10: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4c20: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4c30: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4c40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4c50: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
4c60: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
4c70: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
4c80: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
4c90: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
4ca0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
4cb0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
4cc0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
4cd0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
4ce0: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
4cf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
4d00: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
4d10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4d20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4d30: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4d40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4d50: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
4d60: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
4d70: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4d80: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
4d90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
4da0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
4db0: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
4dc0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
4dd0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
4de0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
4df0: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
4e00: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
4e10: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
4e40: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
4e50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4e60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
4e70: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
4e80: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
4e90: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
4ea0: 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73  busy ) {.      s
4eb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4ec0: 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
4ed0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
4ee0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4ef0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
4f00: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55  1;.    }.    *pU
4f10: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
4f20: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
4f30: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
4f40: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
4f50: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
4f60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4f70: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
4f80: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
4f90: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
4fa0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4fb0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
4fc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4fd0: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
4fe0: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
4ff0: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
5000: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
5010: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
5020: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
5030: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
5040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5050: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
5060: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
5070: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
5080: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
5090: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
50a0: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
50b0: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
50c0: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
50d0: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
50e0: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
50f0: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
5100: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
5110: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
5120: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
5130: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
5140: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
5150: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
5160: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
5170: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
5180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
5190: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
51a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
51b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
51c0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
51d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
51e0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
51f0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
5200: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
5210: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
5220: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
5230: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
5240: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
5250: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
5260: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5270: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5280: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
5290: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
52a0: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
52b0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
52c0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
52d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
52e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
52f0: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
5300: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
5310: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
5320: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
5330: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
5340: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
5350: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
5360: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
5370: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
5380: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5390: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
53a0: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
53b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
53c0: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
53d0: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
53e0: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
53f0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5400: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
5410: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
5420: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
5430: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
5440: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
5450: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
5460: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
5470: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
5480: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
5490: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
54a0: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
54b0: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
54c0: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
54d0: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
54e0: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
54f0: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
5500: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
5510: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
5520: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5530: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
5540: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
5550: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
5560: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
5570: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
5580: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
5590: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
55a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
55b0: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
55c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
55d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
55e0: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
55f0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
5600: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
5610: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
5620: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
5630: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
5640: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
5650: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
5660: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
5670: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
5680: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
5690: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
56a0: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
56b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
56c0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
56d0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
56e0: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
56f0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
5700: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
5710: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
5720: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
5730: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
5740: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
5750: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
5760: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5770: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69  is a VIEW */.  i
5780: 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20  nt isVirtual,   
5790: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
57a0: 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62  is a VIRTUAL tab
57b0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  le */.  int noEr
57c0: 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  r        /* Do n
57d0: 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20  othing if table 
57e0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
57f0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
5800: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  able;.  char *zN
5810: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  ame = 0; /* The 
5820: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  name of the new 
5830: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
5840: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5850: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
5860: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
5870: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5880: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
5890: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
58a0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
58b0: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
58c0: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
58d0: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
58e0: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ..  /* The table
58f0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f   or view name to
5900: 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65   create is passe
5910: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5920: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a  e via tokens.  *
5930: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5940: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5950: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5960: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5970: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
5980: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5990: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20  xxx.yyy (...);. 
59a0: 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70   ** .  ** Then p
59b0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
59c0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
59d0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
59e0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a  ther hand if.  *
59f0: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5a00: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
5a10: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20  alified, i.e.:. 
5a20: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5a30: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
5a40: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70    **.  ** Then p
5a50: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5a60: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5a70: 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a   is ""..  **.  *
5a80: 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77  * The call below
5a90: 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20   sets the pName 
5aa0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
5ab0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
5ac0: 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e  Name1 or.  ** pN
5ad0: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
5ae0: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
5af0: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  d table name. Th
5b00: 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69  e variable iDb i
5b10: 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68  s.  ** set to th
5b20: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
5b30: 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65  atabase that the
5b40: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
5b50: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65  s to be.  ** cre
5b60: 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ated in..  */.  
5b70: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
5b80: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
5b90: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
5ba0: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
5bb0: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
5bc0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5bd0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
5be0: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  iDb>1 ){.    /* 
5bf0: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
5c00: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
5c10: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
5c20: 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73  alified */.    s
5c30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5c40: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
5c50: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
5c60: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
5c70: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
5c80: 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f    }.  if( !OMIT_
5c90: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
5ca0: 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70   ) iDb = 1;..  p
5cb0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
5cc0: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e  n = *pName;.  zN
5cd0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5ce0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
5cf0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
5d00: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
5d10: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5d20: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
5d30: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
5d40: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
5d50: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5d60: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
5d70: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
5d80: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
5d90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5da0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
5db0: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
5dc0: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
5dd0: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
5de0: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
5df0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
5e00: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
5e10: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5e20: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
5e30: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
5e40: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
5e50: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
5e60: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5e70: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
5e80: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
5e90: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
5ea0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5eb0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
5ec0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5ed0: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
5ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5ef0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5f00: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
5f10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5f20: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
5f30: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5f40: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5f50: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5f60: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
5f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5f80: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5f90: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
5fa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5fb0: 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20  ( !isVirtual && 
5fc0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5fd0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
5fe0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
5ff0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6000: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6010: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6020: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6030: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
6040: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
6050: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
6060: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
6070: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
6080: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
6090: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
60a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
60b0: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65   ** it does. The
60c0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
60d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62   the statement b
60e0: 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20  eing parsed was 
60f0: 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61  passed.  ** to a
6100: 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
6110: 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49  e_vtab() call. I
6120: 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
6130: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6140: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73  s.  ** and types
6150: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73   will be used, s
6160: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
6170: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e  ed to test for n
6180: 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f  amespace.  ** co
6190: 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  llisions..  */. 
61a0: 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45   if( !IN_DECLARE
61b0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28  _VTAB ){.    if(
61c0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
61d0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
61e0: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
61f0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6200: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6210: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
6220: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
6230: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
6240: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b].zName);.    i
6250: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
6260: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
6270: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6280: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6290: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
62a0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
62b0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
62c0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
62d0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
62e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
62f0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
6300: 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44  me, 0)!=0 && (iD
6310: 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69  b==0 || !db->ini
6320: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
6330: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6340: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
6350: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
6360: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
6370: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
6380: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6390: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
63a0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
63b0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
63c0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
63d0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
63e0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
63f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
6400: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
6410: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6420: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6430: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
6440: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6450: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
6460: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
6470: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
6480: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
6490: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
64a0: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
64b0: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
64c0: 20 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 20    pTable->dbMem 
64d0: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
64e0: 62 45 6e 61 62 6c 65 64 20 3f 20 64 62 20 3a 20  bEnabled ? db : 
64f0: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
6500: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
6510: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
6520: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6530: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
6540: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
6550: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
6560: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
6570: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
6580: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
6590: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
65a0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
65b0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
65c0: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
65d0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
65e0: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
65f0: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
6600: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
6610: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
6620: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
6630: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
6640: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
6650: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
6660: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
6670: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
6680: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
6690: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
66a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
66b0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
66c0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
66d0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
66e0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
66f0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
6700: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
6710: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
6720: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
6730: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
6740: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
6750: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6760: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
6770: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
6780: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
6790: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
67a0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
67b0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
67c0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
67d0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
67e0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
67f0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
6800: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
6810: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
6820: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
6830: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6840: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
6850: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
6860: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
6870: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
6880: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
6890: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
68a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
68b0: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
68c0: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
68d0: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
68e0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
68f0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
6900: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
6910: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6920: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6930: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
6940: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
6950: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
6960: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
6970: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
6980: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
6990: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
69a0: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
69b0: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
69c0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
69d0: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
69e0: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
69f0: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
6a00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
6a10: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
6a20: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
6a30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6a40: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
6a50: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
6a60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6a70: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
6a80: 69 44 62 2c 20 72 65 67 33 2c 20 31 29 3b 20 20  iDb, reg3, 1);  
6a90: 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20   /* file_format 
6aa0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
6ab0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
6ac0: 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  Db);.    j1 = sq
6ad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6ae0: 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b  v, OP_If, reg3);
6af0: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
6b00: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
6b10: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
6b20: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
6b40: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
6b50: 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69  FORMAT;.    sqli
6b60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6b70: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
6b80: 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a  eFormat, reg3);.
6b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ba0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
6bb0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72  ookie, iDb, 1, r
6bc0: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6bd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6be0: 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64  P_Integer, ENC(d
6bf0: 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  b), reg3);.    s
6c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c10: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
6c20: 2c 20 69 44 62 2c 20 34 2c 20 72 65 67 33 29 3b  , iDb, 4, reg3);
6c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6c40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
6c50: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6c60: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6c70: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6c80: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6c90: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6ca0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6cb0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6cc0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6cd0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6ce0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
6cf0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
6d00: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
6d10: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
6d20: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6d30: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6d40: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6d50: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
6d60: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
6d70: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
6d80: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
6d90: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
6da0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
6db0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
6dc0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
6dd0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
6de0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
6df0: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
6e00: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
6e10: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
6e20: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
6e30: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
6e40: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6e50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
6e60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6e70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6e80: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
6e90: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
6ea0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6eb0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6ec0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
6ed0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
6ee0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
6ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6f00: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
6f10: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
6f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6f30: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
6f40: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
6f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
6f70: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
6f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
6fa0: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
6fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6fc0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
6fd0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
6fe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ff0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7000: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7020: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
7030: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
7040: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
7050: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
7060: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
7070: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
7080: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
7090: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
70a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
70b0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
70c0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
70d0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
70e0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
70f0: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
7100: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
7110: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
7120: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
7130: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
7140: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
7150: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
7160: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
7170: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
7180: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
7190: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
71a0: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
71b0: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
71c0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
71d0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
71e0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
71f0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
7200: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
7210: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
7220: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
7230: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
7240: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
7250: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
7260: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
7270: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
7280: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
7290: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
72a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
72b0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
72c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
72d0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
72e0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
72f0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7300: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
7310: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
7320: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
7330: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7340: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
7350: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
7360: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
7370: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
7380: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
7390: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
73a0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
73b0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
73c0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
73d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
73e0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
73f0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7400: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
7410: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
7420: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7430: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
7440: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7450: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7460: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
7470: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
7480: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
7490: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
74a0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
74b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
74c0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
74d0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
74e0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
74f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7500: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
7510: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7520: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7530: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7540: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7550: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7560: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7570: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7580: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7590: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
75a0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
75b0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
75c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
75d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
75e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
75f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
7600: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
7610: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
7620: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
7630: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
7640: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
7650: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
7660: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
7670: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
7680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7690: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
76a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
76b0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
76c0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
76d0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
76e0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
76f0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
7700: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
7710: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
7720: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7730: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
7740: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
7750: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
7760: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
7770: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
7780: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
7790: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
77a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
77b0: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
77c0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
77d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
77e0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
77f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
7800: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
7810: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a    p->nCol++;.}..
7820: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7830: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7840: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7850: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7860: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7870: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7880: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
7890: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
78a0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
78b0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
78c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
78d0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
78e0: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
78f0: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
7900: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
7910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7920: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
7930: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
7940: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
7950: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
7960: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
7970: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
7980: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
7990: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
79a0: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
79b0: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  .notNull = (u8)o
79c0: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
79d0: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
79e0: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
79f0: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
7a00: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
7a10: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
7a20: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
7a30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
7a40: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
7a50: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
7a60: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
7a70: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
7a80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
7a90: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
7aa0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7ab0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
7ac0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
7ad0: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
7ae0: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
7af0: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
7b00: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
7b10: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
7b20: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
7b30: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
7b40: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
7b50: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
7b60: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
7b70: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
7b80: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
7b90: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
7ba0: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
7bb0: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
7be0: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
7bf0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7c00: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
7c10: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7c20: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
7c30: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7c40: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
7c50: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7c60: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
7c70: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7c80: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
7c90: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
7ca0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7cb0: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
7cc0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7cd0: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
7ce0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7cf0: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
7d00: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
7d10: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
7d20: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
7d30: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
7d40: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
7d50: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
7d60: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
7d70: 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  ype(const Token 
7d80: 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68  *pType){.  u32 h
7d90: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
7da0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
7db0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75  MERIC;.  const u
7dc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
7dd0: 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20  n = pType->z;.  
7de0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7df0: 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79  har *zEnd = &pTy
7e00: 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b  pe->z[pType->n];
7e10: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d  ..  while( zIn!=
7e20: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20  zEnd ){.    h = 
7e30: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
7e40: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49  UpperToLower[*zI
7e50: 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  n];.    zIn++;. 
7e60: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
7e70: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
7e80: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7ea0: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
7eb0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
7ec0: 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69  XT; .    }else i
7ed0: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
7ee0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7ef0: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
7f00: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
7f10: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7f20: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
7f30: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
7f40: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
7f50: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
7f60: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
7f70: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7f80: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
7f90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7fa0: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
7fb0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
7fc0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
7fd0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
7fe0: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
7ff0: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
8000: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
8010: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
8020: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
8030: 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  NE;.#ifndef SQLI
8040: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
8050: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
8060: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
8070: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
8080: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
8090: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
80a0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
80b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
80c0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
80d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
80e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
80f0: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
8100: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8110: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
8120: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
8130: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8140: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8150: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8160: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
8170: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8180: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
8190: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
81a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
81b0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
81c0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
81d0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
81e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
81f0: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
8200: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
8210: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
8220: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
8230: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
8240: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
8250: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
8260: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
8270: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
8280: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
8290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
82a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
82b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
82c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
82d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
82e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
82f0: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
8300: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
8310: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
8320: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
8330: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
8340: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
8350: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
8360: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8370: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
8380: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
8390: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
83a0: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
83b0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
83c0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
83d0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
83e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
83f0: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
8400: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
8410: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
8420: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
8430: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
8440: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
8450: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
8460: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
8470: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
8480: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
8490: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  3 *db;..  if( (p
84a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
84b0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
84c0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
84d0: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
84e0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
84f0: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
8500: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8510: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8520: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
8530: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
8540: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
8550: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 79 70  omToken(db, pTyp
8560: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69  e);.  pCol->affi
8570: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8580: 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70 65  finityType(pType
8590: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
85a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
85b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
85c0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
85d0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
85e0: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
85f0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8600: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8610: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
8620: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
8630: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
8640: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
8650: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
8660: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
8670: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8680: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8690: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
86a0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
86b0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
86c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
86d0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
86e0: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
86f0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
8700: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
8710: 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  xpr){.  Table *p
8720: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
8730: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8740: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8750: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
8760: 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29  >pNewTable)!=0 )
8770: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
8780: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8790: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
87a0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
87b0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78  ntOrFunction(pEx
87c0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
87d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
87e0: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
87f0: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
8800: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
8810: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
8820: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
8830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8840: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
8850: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
8860: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
8870: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
8880: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
8890: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
88a0: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
88b0: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
88c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
88d0: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
88e0: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
88f0: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
8900: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8910: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8920: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
8930: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8940: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8950: 28 64 62 2c 20 70 45 78 70 72 2c 20 45 58 50 52  (db, pExpr, EXPR
8960: 44 55 50 5f 52 45 44 55 43 45 7c 45 58 50 52 44  DUP_REDUCE|EXPRD
8970: 55 50 5f 53 50 41 4e 29 3b 0a 20 20 20 20 7d 0a  UP_SPAN);.    }.
8980: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
8990: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
89a0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
89b0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
89c0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
89d0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
89e0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
89f0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
8a00: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
8a10: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
8a20: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
8a30: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
8a40: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8a50: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
8a60: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
8a70: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
8a80: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
8a90: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
8aa0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
8ab0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
8ac0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
8ad0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
8ae0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
8af0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
8b00: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
8b10: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
8b20: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
8b30: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
8b40: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
8b50: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
8b60: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
8b70: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
8b80: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
8b90: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
8ba0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
8bb0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
8bc0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
8bd0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
8be0: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
8bf0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
8c00: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
8c10: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
8c20: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
8c30: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
8c50: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
8c60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8c70: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8c80: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
8c90: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
8ca0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
8cb0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
8cc0: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
8cd0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
8ce0: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
8cf0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8d00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8d10: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8d20: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
8d30: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
8d40: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
8d50: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
8d60: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
8d70: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
8d80: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
8d90: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
8da0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8db0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
8dc0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
8dd0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
8de0: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
8df0: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
8e00: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
8e10: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
8e20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
8e30: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
8e40: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
8e50: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
8e60: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
8e70: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
8e80: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
8e90: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
8ea0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
8eb0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
8ec0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8ed0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8ee0: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
8ef0: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
8f00: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
8f10: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
8f20: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
8f30: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
8f40: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
8f50: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
8f60: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
8f70: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
8f80: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
8f90: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
8fa0: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
8fb0: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
8fc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8fd0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
8fe0: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
8ff0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
9000: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
9010: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9020: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
9030: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
9040: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9050: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
9060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9080: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
9090: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
90a0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
90b0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
90c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
90d0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
90e0: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
90f0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
9100: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
9110: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
9120: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
9130: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
9140: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
9150: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
9160: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
9170: 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  GER")==0.       
9180: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53   && sortOrder==S
9190: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
91a0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
91b0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
91c0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
91d0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
91e0: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
91f0: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
9200: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
9210: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
9220: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
9230: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
9240: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
9250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
9260: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
9270: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9280: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
9290: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
92a0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
92b0: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
92c0: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
92d0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
92e0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
92f0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
9300: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
9310: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
9320: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
9330: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
9340: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
9350: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9360: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
9370: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
9380: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
9390: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
93a0: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
93b0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
93c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
93d0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
93e0: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
93f0: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
9400: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
9410: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9420: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
9430: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
9440: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
9450: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9460: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
9470: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9480: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
9490: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
94a0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
94b0: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
94c0: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
94d0: 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65    /* The CHECK e
94e0: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
94f0: 65 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20  e duplicated so 
9500: 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65  that tokens refe
9510: 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c  r.    ** to mall
9520: 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e  oced space and n
9530: 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65 72 61  ot the (ephemera
9540: 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  l) text of the C
9550: 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20  REATE TABLE.    
9560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ** statement */.
9570: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
9580: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
9590: 64 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65  d(db, pTab->pChe
95a0: 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
95d0: 70 72 44 75 70 28 64 62 2c 20 70 43 68 65 63 6b  prDup(db, pCheck
95e0: 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 7d 0a 23  Expr, 0));.  }.#
95f0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45  endif.  sqlite3E
9600: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
9610: 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  heckExpr);.}../*
9620: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
9630: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
9640: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9650: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
9660: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
9670: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
9680: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9690: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
96a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
96b0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
96c0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
96d0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
96e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
96f0: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
9700: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
9710: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
9720: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
9730: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9740: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
9750: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
9760: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
9770: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
9780: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
9790: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
97a0: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
97b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
97c0: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
97d0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
97e0: 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Coll, -1) ){.   
97f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9800: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
9810: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
9820: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
9830: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
9840: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
9850: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
9860: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
9870: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
9880: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
9890: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
98a0: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
98b0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
98c0: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
98d0: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
98e0: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
98f0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
9900: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9910: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9920: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9930: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
9940: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
9950: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
9960: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
9970: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
9980: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
9990: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
99a0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
99b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
99c0: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
99d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
99e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
99f0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
9a00: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
9a10: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
9a20: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
9a30: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
9a40: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
9a50: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
9a60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9a70: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9a80: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
9a90: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
9aa0: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
9ab0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
9ac0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
9ad0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
9ae0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
9af0: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
9b00: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9b10: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
9b20: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
9b30: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
9b40: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
9b50: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
9b60: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
9b70: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
9b80: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
9b90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
9ba0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
9bb0: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
9bc0: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
9bd0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
9be0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
9bf0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
9c00: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
9c10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
9c20: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
9c30: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
9c40: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
9c50: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
9c60: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9c70: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
9c80: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
9c90: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9ca0: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
9cb0: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
9cc0: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
9cd0: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
9ce0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43  or message..*/.C
9cf0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
9d00: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
9d10: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9d20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
9d30: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c  nt nName){.  sql
9d40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9d50: 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20  e->db;.  u8 enc 
9d60: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20  = ENC(db);.  u8 
9d70: 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69  initbusy = db->i
9d80: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
9d90: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70  Seq *pColl;..  p
9da0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
9db0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  ndCollSeq(db, en
9dc0: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
9dd0: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
9de0: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
9df0: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
9e00: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
9e10: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
9e20: 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f  tCollSeq(db, pCo
9e30: 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ll, zName, nName
9e40: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
9e50: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  l ){.      if( n
9e60: 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Name<0 ){.      
9e70: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
9e80: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
9e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ea0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9eb0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
9ec0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9ed0: 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d  nce: %.*s", nNam
9ee0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
9ef0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   pColl = 0;.    
9f00: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9f10: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
9f20: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9f30: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
9f40: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
9f50: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
9f60: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
9f70: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
9f80: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
9f90: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
9fa0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
9fb0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
9fc0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
9fd0: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
9fe0: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
9ff0: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
a000: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
a010: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
a020: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
a030: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
a040: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
a050: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
a060: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
a070: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
a080: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
a090: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
a0a0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
a0b0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
a0c0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
a0d0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
a0e0: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
a0f0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
a100: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
a110: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
a120: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
a130: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
a140: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
a150: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
a160: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
a170: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
a180: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
a190: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
a1a0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
a1b0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
a1c0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
a1d0: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
a1e0: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
a1f0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a200: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
a210: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
a220: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a230: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a240: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
a250: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a260: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a270: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
a280: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a290: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
a2a0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
a2b0: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
a2c0: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
a2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a2e0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a2f0: 44 62 2c 20 30 2c 20 72 31 29 3b 0a 20 20 73 71  Db, 0, r1);.  sq
a300: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a310: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a330: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a340: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a350: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a360: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a370: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a380: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a390: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a3a0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a3b0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a3c0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a3d0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a3e0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a3f0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a400: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a410: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a420: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a430: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a440: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a450: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a460: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a470: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a480: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
a490: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
a4a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a4b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
a4c0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
a4d0: 69 74 65 33 47 65 74 54 6f 6b 65 6e 28 29 20 75  ite3GetToken() u
a4e0: 73 65 64 20 62 79 20 0a 2a 2a 20 69 73 56 61 6c  sed by .** isVal
a4f0: 69 64 44 69 6d 65 6e 73 69 6f 6e 28 29 2e 20 54  idDimension(). T
a500: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 66  his function dif
a510: 66 65 72 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  fers from sqlite
a520: 33 47 65 74 54 6f 6b 65 6e 28 29 20 69 6e 0a 2a  3GetToken() in.*
a530: 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  * that:.**.**   
a540: 2a 20 57 68 69 74 65 73 70 61 63 65 20 69 73 20  * Whitespace is 
a550: 69 67 6e 6f 72 65 64 2c 20 61 6e 64 0a 2a 2a 20  ignored, and.** 
a560: 20 20 2a 20 54 68 65 20 6f 75 74 70 75 74 20 76    * The output v
a570: 61 72 69 61 62 6c 65 20 2a 70 65 54 6f 6b 65 6e  ariable *peToken
a580: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 20   is set to 0 if 
a590: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
a5a0: 2a 20 20 20 20 20 6e 75 6c 2d 74 65 72 6d 69 6e  *     nul-termin
a5b0: 61 74 65 64 20 69 6e 70 75 74 20 73 74 72 69 6e  ated input strin
a5c0: 67 20 69 73 20 72 65 61 63 68 65 64 2e 0a 2a 2f  g is reached..*/
a5d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54  .static int getT
a5e0: 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 75 6e 73 69  okenNoSpace(unsi
a5f0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e  gned char *z, in
a600: 74 20 2a 70 65 54 6f 6b 65 6e 29 7b 0a 20 20 69  t *peToken){.  i
a610: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt n = 0;.  whil
a620: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
a630: 65 28 7a 5b 6e 5d 29 20 29 20 6e 2b 2b 3b 0a 20  e(z[n]) ) n++;. 
a640: 20 69 66 28 20 21 7a 5b 6e 5d 20 29 7b 0a 20 20   if( !z[n] ){.  
a650: 20 20 2a 70 65 54 6f 6b 65 6e 20 3d 20 30 3b 0a    *peToken = 0;.
a660: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a670: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 73  }.  return n + s
a680: 71 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e 28 26  qlite3GetToken(&
a690: 7a 5b 6e 5d 2c 20 70 65 54 6f 6b 65 6e 29 3b 0a  z[n], peToken);.
a6a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
a6b0: 65 72 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61  er z points to a
a6c0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
a6d0: 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 74  string. Return t
a6e0: 72 75 65 20 69 66 2c 20 77 68 65 6e 0a 2a 2a 20  rue if, when.** 
a6f0: 77 68 69 74 65 73 70 61 63 65 20 69 73 20 69 67  whitespace is ig
a700: 6e 6f 72 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  nored, the conte
a710: 6e 74 73 20 6f 66 20 74 68 69 73 20 73 74 72 69  nts of this stri
a720: 6e 67 20 6d 61 74 63 68 65 73 20 6f 6e 65 20 6f  ng matches one o
a730: 66 20 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  f .** the follow
a740: 69 6e 67 20 70 61 74 74 65 72 6e 73 3a 0a 2a 2a  ing patterns:.**
a750: 0a 2a 2a 20 20 20 20 20 22 22 0a 2a 2a 20 20 20  .**     "".**   
a760: 20 20 22 28 6e 75 6d 62 65 72 29 22 0a 2a 2a 20    "(number)".** 
a770: 20 20 20 20 22 28 6e 75 6d 62 65 72 2c 6e 75 6d      "(number,num
a780: 62 65 72 29 22 0a 2a 2f 0a 73 74 61 74 69 63 20  ber)".*/.static 
a790: 69 6e 74 20 69 73 56 61 6c 69 64 44 69 6d 65 6e  int isValidDimen
a7a0: 73 69 6f 6e 28 75 6e 73 69 67 6e 65 64 20 63 68  sion(unsigned ch
a7b0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 65 54  ar *z){.  int eT
a7c0: 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  oken;.  int n = 
a7d0: 30 3b 0a 20 20 6e 20 2b 3d 20 67 65 74 54 6f 6b  0;.  n += getTok
a7e0: 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d 2c  enNoSpace(&z[n],
a7f0: 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28   &eToken);.  if(
a800: 20 65 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   eToken ){.    i
a810: 66 28 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f 4c 50  f( eToken!=TK_LP
a820: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
a830: 20 6e 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f   n += getTokenNo
a840: 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54  Space(&z[n], &eT
a850: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 65  oken);.    if( e
a860: 54 6f 6b 65 6e 3d 3d 54 4b 5f 50 4c 55 53 20 7c  Token==TK_PLUS |
a870: 7c 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 4d 49 4e  | eToken==TK_MIN
a880: 55 53 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d  US ){.      n +=
a890: 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61 63 65   getTokenNoSpace
a8a0: 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65 6e 29  (&z[n], &eToken)
a8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a8c0: 65 54 6f 6b 65 6e 21 3d 54 4b 5f 49 4e 54 45 47  eToken!=TK_INTEG
a8d0: 45 52 20 26 26 20 65 54 6f 6b 65 6e 21 3d 54 4b  ER && eToken!=TK
a8e0: 5f 46 4c 4f 41 54 20 29 20 72 65 74 75 72 6e 20  _FLOAT ) return 
a8f0: 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 54  0;.    n += getT
a900: 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e  okenNoSpace(&z[n
a910: 5d 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20  ], &eToken);.   
a920: 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f   if( eToken==TK_
a930: 43 4f 4d 4d 41 20 29 7b 0a 20 20 20 20 20 20 6e  COMMA ){.      n
a940: 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70   += getTokenNoSp
a950: 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b  ace(&z[n], &eTok
a960: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  en);.      if( e
a970: 54 6f 6b 65 6e 3d 3d 54 4b 5f 50 4c 55 53 20 7c  Token==TK_PLUS |
a980: 7c 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 4d 49 4e  | eToken==TK_MIN
a990: 55 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  US ){.        n 
a9a0: 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61  += getTokenNoSpa
a9b0: 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65  ce(&z[n], &eToke
a9c0: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
a9d0: 20 20 69 66 28 20 65 54 6f 6b 65 6e 21 3d 54 4b    if( eToken!=TK
a9e0: 5f 49 4e 54 45 47 45 52 20 26 26 20 65 54 6f 6b  _INTEGER && eTok
a9f0: 65 6e 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72  en!=TK_FLOAT ) r
aa00: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 6e  eturn 0;.      n
aa10: 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70   += getTokenNoSp
aa20: 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b  ace(&z[n], &eTok
aa30: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  en);.    }.    i
aa40: 66 28 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f 52 50  f( eToken!=TK_RP
aa50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
aa60: 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61 63 65   getTokenNoSpace
aa70: 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65 6e 29  (&z[n], &eToken)
aa80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 54 6f 6b  ;.  }.  if( eTok
aa90: 65 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  en ) return 0;. 
aaa0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
aab0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
aac0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
aad0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
aae0: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
aaf0: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
ab00: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
ab10: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
ab20: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
ab30: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
ab40: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
ab50: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
ab60: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
ab70: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
ab80: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
ab90: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
aba0: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
abb0: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
abc0: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
abd0: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
abe0: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
abf0: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
ac00: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
ac10: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
ac20: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
ac30: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
ac40: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
ac50: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
ac60: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
ac70: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
ac80: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
ac90: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
aca0: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
acb0: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
acc0: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
acd0: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
ace0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
acf0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
ad00: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
ad10: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
ad20: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
ad30: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
ad40: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
ad50: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
ad60: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
ad70: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
ad80: 65 6e 74 2c 20 69 6e 74 20 69 73 54 79 70 65 6e  ent, int isTypen
ad90: 61 6d 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ame){.  unsigned
ada0: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
adb0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
adc0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
add0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
ade0: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
adf0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
ae00: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
ae10: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
ae20: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
ae30: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
ae40: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
ae50: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
ae60: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
ae70: 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73 71 6c 69  dent[0]) || sqli
ae80: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
ae90: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
aea0: 3b 0a 20 20 69 66 28 20 21 6e 65 65 64 51 75 6f  ;.  if( !needQuo
aeb0: 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  te ){.    if( is
aec0: 54 79 70 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Typename ){.    
aed0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
aee0: 61 20 74 79 70 65 2d 6e 61 6d 65 2c 20 61 6c 6c  a type-name, all
aef0: 6f 77 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65  ow a little more
af00: 20 66 6c 65 78 69 62 69 6c 69 74 79 2e 20 49 6e   flexibility. In
af10: 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
af20: 2a 20 61 20 74 79 70 65 2d 6e 61 6d 65 20 69 73  * a type-name is
af30: 20 73 70 65 63 69 66 69 65 64 20 61 73 3a 0a 20   specified as:. 
af40: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
af50: 20 20 20 69 64 73 20 5b 69 64 73 5d 20 5b 28 6e     ids [ids] [(n
af60: 75 6d 62 65 72 20 5b 2c 20 6e 75 6d 62 65 72 5d  umber [, number]
af70: 29 5d 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )].      **.    
af80: 20 20 2a 2a 20 77 68 65 72 65 20 22 69 64 73 22    ** where "ids"
af90: 20 69 73 20 65 69 74 68 65 72 20 61 20 71 75 6f   is either a quo
afa0: 74 65 64 20 73 74 72 69 6e 67 20 6f 72 20 61 20  ted string or a 
afb0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
afc0: 72 20 28 69 6e 20 74 68 65 0a 20 20 20 20 20 20  r (in the.      
afd0: 2a 2a 20 61 62 6f 76 65 20 6e 6f 74 61 74 69 6f  ** above notatio
afe0: 6e 2c 20 5b 5d 20 6d 65 61 6e 73 20 6f 70 74 69  n, [] means opti
aff0: 6f 6e 61 6c 29 2e 20 49 74 20 69 73 20 61 20 62  onal). It is a b
b000: 69 74 20 74 72 69 63 6b 79 20 74 6f 20 63 68 65  it tricky to che
b010: 63 6b 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ck.      ** for 
b020: 61 6c 6c 20 63 61 73 65 73 2c 20 62 75 74 20 69  all cases, but i
b030: 74 20 69 73 20 67 6f 6f 64 20 74 6f 20 61 76 6f  t is good to avo
b040: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79  id unnecessarily
b050: 20 71 75 6f 74 69 6e 67 20 63 6f 6d 6d 6f 6e 0a   quoting common.
b060: 20 20 20 20 20 20 2a 2a 20 74 79 70 65 6e 61 6d        ** typenam
b070: 65 73 20 6c 69 6b 65 20 56 41 52 43 48 41 52 28  es like VARCHAR(
b080: 31 30 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  10)..      */.  
b090: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
b0a0: 21 69 73 56 61 6c 69 64 44 69 6d 65 6e 73 69 6f  !isValidDimensio
b0b0: 6e 28 26 7a 49 64 65 6e 74 5b 6a 5d 29 3b 0a 20  n(&zIdent[j]);. 
b0c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b0d0: 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64 65  needQuote = zIde
b0e0: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  nt[j];.    }.  }
b0f0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
b100: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
b110: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
b120: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
b130: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
b140: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
b150: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
b160: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
b170: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
b180: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
b190: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
b1a0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
b1b0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
b1c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b1d0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
b1e0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
b1f0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
b200: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
b210: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
b220: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
b230: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
b240: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
b250: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
b260: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
b270: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
b280: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
b290: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
b2a0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
b2b0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
b2c0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
b2d0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
b2e0: 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  nd, *z;.  Column
b2f0: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
b300: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
b310: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
b320: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
b330: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
b340: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
b350: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  zName);.    z = 
b360: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
b370: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
b380: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
b390: 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (z);.    }.  }. 
b3a0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
b3b0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
b3c0: 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a  f( n<50 ){.    z
b3d0: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
b3e0: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
b3f0: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
b400: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
b410: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
b420: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
b430: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
b440: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
b450: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
b460: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
b470: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
b480: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  mt==0 ){.    db-
b490: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
b4a0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
b4b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
b4c0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
b4d0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
b4e0: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
b4f0: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
b500: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
b510: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
b520: 2c 20 30 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  , 0);.  zStmt[k+
b530: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
b540: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
b550: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
b560: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
b570: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b580: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
b590: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
b5a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b5b0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
b5c0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
b5d0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
b5e0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
b5f0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
b600: 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (z = pCol->zType
b610: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53  )!=0 ){.      zS
b620: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a  tmt[k++] = ' ';.
b630: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
b640: 6e 74 29 28 73 71 6c 69 74 65 33 53 74 72 6c 65  nt)(sqlite3Strle
b650: 6e 33 30 28 7a 29 2b 6b 2b 31 29 3c 3d 6e 20 29  n30(z)+k+1)<=n )
b660: 3b 0a 20 20 20 20 20 20 69 64 65 6e 74 50 75 74  ;.      identPut
b670: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 7a 2c 20 31  (zStmt, &k, z, 1
b680: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
b690: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b6a0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
b6b0: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
b6c0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
b6d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b6e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
b6f0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
b700: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
b710: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
b720: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b730: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
b740: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
b750: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
b760: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
b770: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
b780: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
b790: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
b7a0: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
b7b0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
b7c0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
b7d0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
b7e0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
b7f0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
b800: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
b810: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
b820: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
b830: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
b840: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
b850: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
b860: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
b870: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
b880: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
b890: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
b8a0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
b8b0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
b8c0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
b8d0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
b8e0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
b8f0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
b900: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
b910: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
b920: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
b930: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
b940: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
b950: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
b960: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
b970: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
b980: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
b990: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
b9a0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
b9b0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
b9c0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
b9d0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
b9e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
b9f0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
ba00: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
ba10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
ba20: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
ba30: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
ba40: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ba50: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
ba60: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
ba70: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
ba80: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ba90: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
baa0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
bab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
bac0: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
bad0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
bae0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
baf0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
bb00: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61       /* The fina
bb10: 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74  l ')' token in t
bb20: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
bb30: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
bb40: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
bb50: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
bb60: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
bb70: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
bb80: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
bb90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bba0: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
bbb0: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
bbc0: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
bbd0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
bbe0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bbf0: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b   ) {.    return;
bc00: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
bc10: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
bc20: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
bc30: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
bc40: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
bc50: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
bc60: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
bc70: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
bc80: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
bc90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bca0: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
bcb0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
bcc0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
bcd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
bce0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
bcf0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
bd00: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
bd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
bd20: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
bd30: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
bd40: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
bd50: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
bd60: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
bd70: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
bd80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
bd90: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
bda0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
bdb0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
bdc0: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
bdd0: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
bde0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
bdf0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
be00: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
be10: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
be20: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
be30: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
be40: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
be50: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
be60: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
be70: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
be80: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
be90: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
bea0: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
beb0: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
bec0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
bed0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
bee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bef0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
bf00: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
bf10: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
bf20: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
bf30: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
bf40: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
bf50: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
bf60: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
bf70: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
bf80: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
bf90: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
bfa0: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
bfb0: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
bfc0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
bfd0: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
bfe0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
bff0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
c000: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
c010: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
c020: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
c030: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
c040: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
c050: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
c060: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
c070: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
c080: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
c090: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
c0a0: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
c0b0: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
c0c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
c0d0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
c0e0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
c0f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
c100: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
c110: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
c120: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
c130: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
c140: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
c150: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
c160: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
c170: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
c180: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
c190: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
c1a0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
c1b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
c1c0: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
c1d0: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
c1e0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
c1f0: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
c200: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
c210: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
c220: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
c230: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
c240: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
c250: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
c260: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c270: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
c280: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
c290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c2a0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
c2b0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
c2c0: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
c2d0: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
c2e0: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
c2f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c300: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
c310: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
c320: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
c330: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
c340: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
c350: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
c360: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c370: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
c380: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
c390: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
c3a0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
c3b0: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
c3c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
c3d0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c3e0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
c3f0: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
c400: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
c410: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
c420: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
c430: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
c440: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
c450: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
c460: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
c470: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
c480: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
c490: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
c4a0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
c4b0: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
c4c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
c4d0: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
c4e0: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
c4f0: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
c500: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
c510: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
c520: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
c530: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
c540: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
c550: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
c560: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
c570: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
c580: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
c590: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
c5a0: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
c5b0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
c5c0: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
c5d0: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
c5e0: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
c5f0: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
c600: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
c610: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
c620: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
c630: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
c640: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
c650: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
c660: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
c670: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
c680: 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Tab;..      asse
c690: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
c6a0: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
c6b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c6c0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
c6d0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
c6e0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
c6f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
c700: 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  5(v, 1);.      p
c710: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
c720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
c730: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
c740: 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  st, SRT_Table, 1
c750: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c760: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c770: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
c780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c790: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
c7a0: 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ose, 1);.      i
c7b0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
c7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  =0 ){.        pS
c7d0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
c7e0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
c7f0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
c800: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
c810: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
c820: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
c830: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
c840: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f  ;.        p->nCo
c850: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
c860: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43  l;.        p->aC
c870: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
c880: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
c890: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
c8a0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c8b0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
c8c0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
c8d0: 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20  able(pSelTab);. 
c8e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c8f0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
c900: 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
c910: 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
c920: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
c930: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
c940: 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
c950: 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
c960: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c970: 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45      n = (int)(pE
c980: 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  nd->z - pParse->
c990: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20  sNameToken.z) + 
c9a0: 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  1;.      zStmt =
c9b0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c9c0: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
c9d0: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
c9e0: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
c9f0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
ca00: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
ca10: 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
ca20: 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
ca30: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
ca40: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
ca50: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
ca60: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
ca70: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
ca80: 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
ca90: 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
caa0: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
cab0: 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
cac0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
cad0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
cae0: 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
caf0: 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
cb00: 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
cb10: 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
cb20: 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
cb30: 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
cb40: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
cb50: 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
cb60: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
cb70: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
cb80: 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  LE(iDb),.      z
cb90: 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
cba0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
cbb0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
cbc0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
cbd0: 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
cbe0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
cbf0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
cc00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
cc10: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
cc20: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
cc30: 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66  arse, iDb);..#if
cc40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cc50: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
cc60: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
cc70: 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
cc80: 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
cc90: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
cca0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
ccb0: 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
ccc0: 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
ccd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
cce0: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
ccf0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
cd00: 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
cd10: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
cd20: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
cd30: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
cd40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
cd50: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
cd60: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
cd70: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
cd80: 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
cd90: 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c  ence(name,seq)",
cda0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
cdb0: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  zName.        );
cdc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
cdd0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
cde0: 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67  parse everything
cdf0: 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69   to update our i
ce00: 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72  nternal data str
ce10: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73  uctures */.    s
ce20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ce30: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
ce40: 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20  ma, iDb, 0, 0,. 
ce50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
ce60: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
ce70: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
ce80: 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  me), P4_DYNAMIC)
ce90: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
cea0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
ceb0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
cec0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
ced0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
cee0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
cef0: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
cf00: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
cf10: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
cf20: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
cf30: 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
cf40: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
cf50: 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
cf60: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
cf70: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
cfa0: 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70  en30(p->zName),p
cfb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
cfc0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
cfd0: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
cfe0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
cff0: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
d000: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
d010: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
d020: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
d030: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
d040: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
d050: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
d060: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
d070: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
d080: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
d090: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
d0a0: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
d0b0: 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
d0c0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
d0d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
d0e0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
d0f0: 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
d100: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
d110: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
d120: 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
d130: 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
d140: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
d150: 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
d160: 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
d170: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
d180: 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
d190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
d1a0: 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
d1b0: 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
d1c0: 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
d1d0: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
d1e0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
d1f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
d200: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d210: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
d220: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
d230: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
d240: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
d250: 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
d260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
d270: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
d280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
d290: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
d2a0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
d2b0: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
d2c0: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
d2d0: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
d2e0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
d2f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
d300: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
d310: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
d320: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
d330: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
d340: 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
d350: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
d360: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d370: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
d380: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
d390: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
d3a0: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
d3b0: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
d3c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
d3d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45  ,        /* TRUE
d3e0: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
d3f0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
d400: 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a  oErr          /*
d410: 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20   Suppress error 
d420: 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57  messages if VIEW
d430: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
d440: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
d450: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
d460: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
d470: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
d480: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
d490: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
d4a0: 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  e;.  int iDb;.  
d4b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d4c0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
d4d0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
d4e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d4f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d500: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
d510: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
d520: 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ews");.    sqlit
d530: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
d540: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
d550: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
d560: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
d570: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
d580: 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c   pName2, isTemp,
d590: 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20   1, 0, noErr);. 
d5a0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
d5b0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
d5c0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
d5d0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
d5e0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d5f0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
d600: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
d610: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
d620: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
d630: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
d640: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
d650: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
d660: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
d670: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
d680: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
d690: 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c  se, iDb, "view",
d6a0: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
d6b0: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
d6c0: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
d6d0: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
d6e0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d6f0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
d700: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
d710: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
d720: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
d730: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
d740: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
d750: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
d760: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
d770: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
d780: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
d790: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
d7a0: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
d7b0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
d7c0: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
d7d0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
d7e0: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
d7f0: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
d800: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
d810: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
d820: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
d830: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
d840: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
d850: 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
d860: 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  DUCE);.  sqlite3
d870: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d880: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
d890: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d8a0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
d8b0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e  .  }.  if( !db->
d8c0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
d8d0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
d8e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
d8f0: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
d900: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
d910: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
d920: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
d930: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
d940: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
d950: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
d960: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
d970: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
d980: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
d990: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
d9a0: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
d9b0: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
d9c0: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45  ;.  n = (int)(sE
d9d0: 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
d9e0: 29 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  );.  z = (const 
d9f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
da00: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
da10: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
da20: 5d 3d 3d 27 3b 27 20 7c 7c 20 73 71 6c 69 74 65  ]==';' || sqlite
da30: 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29  3Isspace(z[n-1])
da40: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
da50: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
da60: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
da70: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
da80: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
da90: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
daa0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
dab0: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
dac0: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
dad0: 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  , 0, &sEnd, 0);.
dae0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
daf0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
db00: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
db10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
db20: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
db30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
db40: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
db50: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
db60: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
db70: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
db80: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
db90: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
dba0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
dbb0: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
dbc0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
dbd0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
dbe0: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
dbf0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
dc00: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
dc10: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
dc20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
dc30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
dc40: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
dc50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
dc60: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
dc70: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
dc80: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
dc90: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
dca0: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
dcb0: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
dcc0: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
dcd0: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
dce0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
dcf0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
dd00: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
dd10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
dd20: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
dd30: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
dd40: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
dd50: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
dd60: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
dd70: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
dd80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
dd90: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
dda0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ddb0: 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
ddc0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ors */.  int (*x
ddd0: 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Auth)(void*,int,
dde0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
ddf0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
de00: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
de10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
de20: 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
de30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
de40: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
de50: 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
de60: 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
de70: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
de80: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
de90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
dea0: 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
deb0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
dec0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ded0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
dee0: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
def0: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
df00: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
df10: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
df20: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
df30: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
df40: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
df50: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
df60: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
df70: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
df80: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
df90: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
dfa0: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
dfb0: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
dfc0: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
dfd0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
dfe0: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
dff0: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
e000: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
e010: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
e020: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
e030: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
e040: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
e050: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
e060: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
e070: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
e080: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
e090: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
e0a0: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
e0b0: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
e0c0: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
e0d0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
e0e0: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
e0f0: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
e100: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
e110: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
e120: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
e130: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
e140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e150: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e160: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
e170: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
e180: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
e190: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
e1a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
e1b0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
e1c0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
e1d0: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
e1e0: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
e1f0: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
e200: 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
e210: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
e220: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
e230: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
e240: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
e250: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
e260: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
e270: 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
e280: 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
e290: 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
e2a0: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
e2b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
e2c0: 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
e2d0: 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
e2e0: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
e2f0: 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
e300: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
e310: 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
e320: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
e330: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
e340: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
e350: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e360: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
e370: 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
e380: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
e390: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
e3a0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
e3b0: 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c   ){.    u8 enabl
e3c0: 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d  eLookaside = db-
e3d0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e3e0: 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61  led;.    n = pPa
e3f0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
e400: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
e410: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
e420: 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
e430: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
e440: 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c   = -1;.    db->l
e450: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e460: 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  d = 0;.#ifndef S
e470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
e480: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75  RIZATION.    xAu
e490: 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a  th = db->xAuth;.
e4a0: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
e4b0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  0;.    pSelTab =
e4c0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
e4d0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
e4e0: 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d  , pSel);.    db-
e4f0: 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a  >xAuth = xAuth;.
e500: 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61  #else.    pSelTa
e510: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
e520: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
e530: 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64  rse, pSel);.#end
e540: 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  if.    db->looka
e550: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
e560: 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b  enableLookaside;
e570: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
e580: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
e590: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
e5a0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
e5b0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
e5c0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
e5d0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
e5e0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
e5f0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
e600: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
e610: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
e620: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
e630: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
e640: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53  e3DeleteTable(pS
e650: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54  elTab);.      pT
e660: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  able->pSchema->f
e670: 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
e680: 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c  etViews;.    }el
e690: 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  se{.      pTable
e6a0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
e6b0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a    nErr++;.    }.
e6c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
e6d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
e6e0: 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
e6f0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65    nErr++;.  }.#e
e700: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e710: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
e720: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
e730: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
e740: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e750: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
e760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e770: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
e780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e790: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
e7a0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
e7b0: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
e7c0: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
e7d0: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
e7e0: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
e7f0: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
e800: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
e810: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
e820: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
e830: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
e840: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
e850: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
e860: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
e870: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
e880: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
e890: 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
e8a0: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
e8b0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
e8c0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
e8d0: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
e8e0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
e8f0: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
e900: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
e910: 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
e920: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
e930: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
e940: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
e950: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
e960: 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
e970: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
e980: 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
e990: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
e9a0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
e9b0: 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
e9c0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
e9d0: 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
e9e0: 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
e9f0: 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
ea00: 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
ea10: 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
ea20: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
ea30: 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
ea40: 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
ea50: 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
ea60: 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
ea70: 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
ea80: 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
ea90: 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
eaa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
eab0: 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
eac0: 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
ead0: 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
eae0: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
eaf0: 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
eb00: 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
eb10: 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
eb20: 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
eb30: 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
eb40: 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
eb50: 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
eb60: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
eb70: 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
eb80: 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
eb90: 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
eba0: 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
ebb0: 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
ebc0: 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
ebd0: 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
ebe0: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
ebf0: 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
ec00: 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
ec10: 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
ec20: 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
ec30: 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
ec40: 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
ec50: 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
ec60: 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
ec70: 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
ec80: 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
ec90: 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
eca0: 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
ecb0: 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
ecc0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
ecd0: 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
ece0: 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
ecf0: 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
ed00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ed10: 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
ed20: 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
ed30: 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69  d(Db *pDb, int i
ed40: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
ed50: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
ed60: 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
ed70: 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ;..  pHash = &pD
ed80: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
ed90: 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
eda0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
edb0: 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
edc0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
edd0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
ede0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
edf0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
ee00: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
ee10: 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
ee20: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
ee30: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
ee40: 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
ee50: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
ee60: 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
ee70: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
ee80: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
ee90: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
eea0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
eeb0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
eec0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
eed0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
eee0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
eef0: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
ef00: 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
ef10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
ef20: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
ef30: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
ef40: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
ef50: 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
ef60: 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
ef70: 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
ef80: 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
ef90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
efa0: 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
efb0: 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
efc0: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
efd0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
efe0: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
eff0: 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
f000: 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
f010: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
f020: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
f030: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
f040: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
f050: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
f060: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f070: 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
f080: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
f090: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f0a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
f0b0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
f0c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f0d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f0e0: 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
f0f0: 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
f100: 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Db);.#ifndef SQL
f110: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
f120: 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
f130: 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
f140: 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
f150: 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
f160: 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
f170: 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
f180: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
f190: 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
f1a0: 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
f1b0: 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
f1c0: 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
f1d0: 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
f1e0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
f1f0: 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
f200: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
f210: 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53   "#NNN" in the S
f220: 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
f230: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
f240: 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
f250: 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65  ue.  ** is in re
f260: 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65  gister NNN.  See
f270: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
f280: 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  Expr()..  */.  s
f290: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
f2a0: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
f2b0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
f2c0: 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
f2d0: 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74  ERE #%d AND root
f2e0: 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20  page=#%d",.     
f2f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
f300: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
f310: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
f320: 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
f330: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f340: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f350: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
f360: 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
f370: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
f380: 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
f390: 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
f3a0: 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
f3b0: 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
f3c0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f3d0: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
f3e0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
f3f0: 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
f400: 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
f410: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
f420: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
f430: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
f440: 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
f450: 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
f460: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
f470: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
f480: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
f490: 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
f4a0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
f4b0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
f4c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f4d0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f4e0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
f4f0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
f500: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
f510: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
f520: 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
f530: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
f540: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
f550: 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
f560: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
f570: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f580: 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
f590: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
f5a0: 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
f5b0: 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
f5c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
f5d0: 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
f5e0: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
f5f0: 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
f600: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
f610: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
f620: 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
f630: 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
f640: 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
f650: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
f660: 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
f670: 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
f680: 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
f690: 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
f6a0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
f6b0: 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
f6c0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
f6d0: 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
f6e0: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
f6f0: 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
f700: 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
f710: 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
f720: 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
f730: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
f740: 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
f750: 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
f760: 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
f770: 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
f780: 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
f790: 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
f7a0: 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
f7b0: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
f7c0: 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
f7d0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
f7e0: 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
f7f0: 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
f800: 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
f810: 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
f820: 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
f830: 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
f840: 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
f850: 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
f860: 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
f870: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
f880: 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
f890: 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
f8a0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
f8b0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
f8c0: 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
f8d0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
f8e0: 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
f8f0: 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
f900: 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
f910: 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
f920: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
f930: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
f940: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
f950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
f960: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
f970: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
f980: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
f990: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
f9a0: 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
f9b0: 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
f9c0: 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
f9d0: 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
f9e0: 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
f9f0: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
fa00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
fa10: 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
fa20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
fa30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
fa40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
fa50: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
fa60: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
fa70: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65  chema);.      de
fa80: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
fa90: 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
faa0: 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
fab0: 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
fac0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
fad0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dif.}../*.** Thi
fae0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
faf0: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
fb00: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
fb10: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
fb20: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
fb30: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
fb40: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
fb50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
fb60: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
fb70: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
fb80: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
fb90: 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
fba0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
fbb0: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
fbc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
fbd0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
fbe0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
fbf0: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
fc00: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
fc10: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fc20: 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
fc30: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
fc40: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
fc50: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
fc60: 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
fc70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
fc90: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
fca0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
fcb0: 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20  tabase);..  if( 
fcc0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
fcd0: 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  f( noErr ){.    
fce0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
fcf0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
fd00: 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74   }.    goto exit
fd10: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
fd20: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
fd30: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
fd40: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
fd50: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
fd60: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
fd70: 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
fd80: 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
fd90: 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
fda0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
fdb0: 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
fdc0: 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
fdd0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
fde0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
fdf0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
fe00: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
fe10: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
fe20: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
fe30: 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
fe40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fe50: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
fe60: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
fe70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
fe80: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
fe90: 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
fea0: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
feb0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
fec0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fed0: 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20   *zArg2 = 0;.   
fee0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
fef0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
ff00: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
ff10: 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
ff20: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
ff30: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
ff40: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
ff50: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
ff60: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
ff70: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
ff80: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
ff90: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
ffa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ffb0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
ffc0: 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
ffd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ffe0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fff0: 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
10000 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10010 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20  ){.      code = 
10020 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
10030 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
10040 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e  = pTab->pMod->zN
10050 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
10060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
10070 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
10080 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
10090 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
100a0 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
100b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
100c0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
100d0 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
100e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
100f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
10100 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10110 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
10120 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
10130 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
10140 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
10150 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
10160 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
10170 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
10180 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
10190 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
101a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
101b0 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
101c0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
101d0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
101e0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
101f0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ite_", 7)==0 ){.
10200 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10210 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
10220 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
10230 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
10240 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
10250 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
10260 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  e;.  }..#ifndef 
10270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10280 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f  .  /* Ensure DRO
10290 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75  P TABLE is not u
102a0 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61  sed on a view, a
102b0 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20  nd DROP VIEW is 
102c0 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e  not used.  ** on
102d0 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20   a table..  */. 
102e0 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
102f0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
10300 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10310 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10320 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
10330 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
10340 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
10350 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
10360 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
10370 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
10380 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
10390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
103a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
103b0 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
103c0 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
103d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
103e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
103f0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e  p_table;.  }.#en
10400 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
10410 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
10420 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
10430 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
10440 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
10450 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
10460 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
10470 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
10480 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
10490 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62  ger;.    Db *pDb
104a0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
104b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
104c0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
104d0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
104e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
104f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10500 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69  BLE.    if( IsVi
10510 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
10520 20 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20       if( v ){.  
10530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10540 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
10550 65 67 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  egin);.      }. 
10560 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
10570 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
10580 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
10590 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
105a0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
105b0 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
105c0 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
105d0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
105e0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
105f0 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
10600 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
10610 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
10620 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
10630 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
10640 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
10650 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  );.    while( pT
10660 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
10670 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
10680 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
10690 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
106a0 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
106b0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
106c0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
106d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
106e0 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
106f0 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
10700 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
10710 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
10720 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
10730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10740 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
10750 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
10760 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
10770 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10780 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10790 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
107a0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
107b0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
107c0 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
107d0 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a  s dropped.    **
107e0 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65   at the btree le
107f0 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65  vel, in case the
10800 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
10810 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a   table needs to.
10820 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61      ** move as a
10830 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
10840 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
10850 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
10860 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ode)..    */.   
10870 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
10880 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
10890 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  rement ){.      
108a0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
108b0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
108c0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
108d0 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %s.sqlite_sequen
108e0 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
108f0 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
10900 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
10910 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
10920 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
10930 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
10940 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
10950 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
10960 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
10970 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20  e.    ** table. 
10980 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
10990 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
109a0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
109b0 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20  and deletes.    
109c0 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
109d0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
109e0 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
109f0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
10a00 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f  being.    ** dro
10a10 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
10a20 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72  re handled seper
10a30 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
10a40 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
10a50 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e     ** created in
10a60 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
10a70 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
10a80 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
10a90 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61  ther.    ** data
10aa0 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
10ab0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10ac0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
10ad0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
10ae0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
10af0 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
10b00 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
10b10 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
10b20 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
10b30 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
10b40 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  me);..    /* Dro
10b50 70 20 61 6e 79 20 73 74 61 74 69 73 74 69 63 73  p any statistics
10b60 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
10b70 5f 73 74 61 74 31 20 74 61 62 6c 65 2c 20 69 66  _stat1 table, if
10b80 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
10b90 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
10ba0 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
10bb0 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61  te_stat1", db->a
10bc0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29  Db[iDb].zName) )
10bd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
10be0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10bf0 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
10c00 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
10c10 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 74 62  e_stat1 WHERE tb
10c20 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d  l=%Q", pDb->zNam
10c30 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
10c40 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
10c50 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26     if( !isView &
10c60 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
10c70 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74  b) ){.      dest
10c80 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
10c90 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20   pTab);.    }.. 
10ca0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
10cb0 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
10cc0 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
10cd0 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
10ce0 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65  odify.    ** the
10cf0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
10d00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
10d10 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
10d20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10d30 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10d40 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
10d50 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
10d60 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
10d70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10d80 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
10d90 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
10da0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
10db0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
10dc0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
10dd0 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
10de0 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
10df0 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
10e00 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
10e10 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
10e20 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
10e30 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10e40 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
10e50 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
10e60 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
10e70 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
10e80 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
10e90 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
10ea0 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
10eb0 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
10ec0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
10ed0 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
10ee0 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
10ef0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
10f00 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
10f10 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
10f20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
10f30 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
10f40 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
10f50 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
10f60 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
10f70 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
10f80 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
10f90 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
10fa0 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
10fb0 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
10fc0 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
10fd0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
10fe0 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
10ff0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
11000 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
11010 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
11020 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
11030 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
11040 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
11050 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
11060 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
11070 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
11080 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
11090 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
110a0 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
110b0 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
110c0 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
110d0 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
110e0 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
110f0 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
11100 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
11110 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
11120 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
11130 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
11140 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
11150 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
11160 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
11170 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
11180 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
11190 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
111a0 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
111b0 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
111c0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
111d0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
111e0 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
111f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11200 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
11210 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11220 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
11230 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
11240 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
11250 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
11260 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
11270 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
11280 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
11290 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
112a0 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
112b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
112c0 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
112d0 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c  FKey = 0;.  Tabl
112e0 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
112f0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
11300 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
11310 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
11320 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
11330 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
11340 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
11350 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45 43  ->nErr || IN_DEC
11360 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
11370 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
11380 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
11390 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
113a0 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
113b0 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
113c0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
113d0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
113e0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
113f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11400 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
11410 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
11420 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
11430 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
11440 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
11450 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
11460 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
11470 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
11480 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11490 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
114a0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
114b0 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
114c0 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
114d0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
114e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
114f0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
11500 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11510 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
11520 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
11530 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
11540 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
11550 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
11560 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
11570 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
11580 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
11590 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
115a0 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
115b0 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
115c0 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
115d0 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
115e0 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
115f0 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
11600 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
11610 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
11620 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
11630 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11640 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
11650 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
11660 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
11670 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
11680 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
11690 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
116a0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
116b0 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
116c0 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
116d0 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
116e0 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
116f0 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
11700 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
11710 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
11720 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
11730 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
11740 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
11750 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
11760 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
11770 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
11780 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
11790 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
117a0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
117b0 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
117c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
117d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
117e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
117f0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
11800 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
11810 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11820 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
11830 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
11840 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
11850 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
11860 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
11870 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
11880 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
118a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
118b0 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
118c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
118d0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
118e0 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
118f0 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
11900 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
11910 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
11920 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
11930 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
11940 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
11950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11960 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
11970 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
11980 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
11990 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
119a0 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
119b0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
119c0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
119d0 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
119e0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
119f0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
11a00 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
11a10 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
11a20 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
11a30 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
11a40 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
11a50 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
11a60 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
11a70 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  f);.  pFKey->upd
11a80 61 74 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 28  ateConf = (u8)((
11a90 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
11aa0 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  xff);.  pFKey->i
11ab0 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 75 38 29  nsertConf = (u8)
11ac0 28 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20  ((flags >> 16 ) 
11ad0 26 20 30 78 66 66 29 3b 0a 0a 20 20 2f 2a 20 4c  & 0xff);..  /* L
11ae0 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
11af0 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
11b00 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
11b10 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
11b20 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
11b30 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
11b40 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
11b50 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
11b60 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
11b70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
11b80 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
11b90 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11ba0 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
11bb0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
11bc0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
11bd0 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
11be0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11bf0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
11c00 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
11c10 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
11c20 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
11c30 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
11c40 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
11c50 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
11c60 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
11c70 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
11c80 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
11c90 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
11ca0 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
11cb0 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
11cc0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
11cd0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
11ce0 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
11cf0 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
11d00 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
11d10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
11d20 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
11d30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11d40 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
11d50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11d60 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
11d70 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
11d80 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
11d90 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
11da0 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
11db0 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
11dc0 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
11dd0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
11de0 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
11df0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
11e00 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
11e10 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
11e20 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
11e30 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11e40 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
11e50 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
11e60 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
11e70 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
11e80 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
11e90 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
11ea0 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
11eb0 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
11ec0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
11ed0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
11ee0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
11ef0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
11f00 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
11f10 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
11f20 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
11f30 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
11f40 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
11f50 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
11f60 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
11f70 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
11f80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
11f90 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
11fa0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
11fb0 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
11fc0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
11fd0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
11fe0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
11ff0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
12000 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
12010 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
12020 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
12030 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
12040 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
12050 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
12060 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
12070 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
12080 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
12090 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
120a0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
120b0 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
120c0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
120d0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
120e0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
120f0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
12100 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
12110 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
12120 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
12130 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
12140 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
12150 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
12160 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
12190 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
121a0 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121c0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
121d0 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
121e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
121f0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
12200 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
12210 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
12220 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
12230 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
12240 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
12250 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
12260 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20   int regIdxKey; 
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e  /* Registers con
12290 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
122a0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72  x key */.  int r
122b0 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
122c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
122d0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
122e0 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72  semblied index r
122f0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
12300 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
12310 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
12320 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12330 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
12340 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12350 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
12360 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
12370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12380 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12390 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
123a0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
123b0 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
123c0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
123d0 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
123e0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
123f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12400 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
12410 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
12420 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
12430 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
12440 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
12450 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
12460 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
12470 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
12480 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
12490 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
124a0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
124b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
124c0 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
124d0 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
124e0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
124f0 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
12500 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
12510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12520 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61  ddOp2(v, OP_Clea
12530 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  r, tnum, iDb);. 
12540 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
12550 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
12560 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
12570 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12580 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
12590 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
125a0 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
125b0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
125c0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
125d0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
125e0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
125f0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
12600 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12610 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 1);.  }.  sqli
12620 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
12630 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
12640 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
12650 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
12660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12670 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
12680 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63  ab, 0);.  regRec
12690 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
126a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
126b0 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73  .  regIdxKey = s
126c0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
126d0 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
126e0 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67  Index, iTab, reg
126f0 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66  Record, 1);.  if
12700 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
12710 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
12720 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52    const int regR
12730 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79  owid = regIdxKey
12740 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   + pIndex->nColu
12750 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  mn;.    const in
12760 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
12770 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12780 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a   + 2;.    void *
12790 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d   const pRegKey =
127a0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
127b0 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a  TR(regIdxKey);..
127c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73      /* The regis
127d0 74 65 72 73 20 61 63 63 65 73 73 65 64 20 62 79  ters accessed by
127e0 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65   the OP_IsUnique
127f0 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c   opcode were all
12800 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73  ocated.    ** us
12810 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74 54 65  ing sqlite3GetTe
12820 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65  mpRange() inside
12830 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 47   of the sqlite3G
12840 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
12850 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62  ).    ** call ab
12860 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65  ove. Just before
12870 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77   that function w
12880 61 73 20 66 72 65 65 64 20 74 68 65 79 20 77 65  as freed they we
12890 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  re released.    
128a0 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62  ** (made availab
128b0 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c  le to the compil
128c0 65 72 20 66 6f 72 20 72 65 75 73 65 29 20 75 73  er for reuse) us
128d0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ing .    ** sqli
128e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
128f0 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d  nge(). So in som
12900 65 20 77 61 79 73 20 68 61 76 69 6e 67 20 74 68  e ways having th
12910 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20  e OP_IsUnique.  
12920 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20    ** opcode use 
12930 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
12940 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64  d within seems d
12950 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65  angerous. Howeve
12960 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20  r, since.    ** 
12970 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  we can be sure t
12980 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d  hat no other tem
12990 70 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65  p registers have
129a0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
129b0 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c      ** since sql
129c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
129d0 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  ange() was calle
129e0 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  d, it is safe to
129f0 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20   do so..    */. 
12a00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12a10 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69  dOp4(v, OP_IsUni
12a20 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72  que, iIdx, j2, r
12a30 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79  egRowid, pRegKey
12a40 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
12a50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12a60 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p4(v, OP_Halt, S
12a70 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12a80 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 0a 20  , OE_Abort, 0,. 
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75     "indexed colu
12ab0 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  mns are not uniq
12ac0 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ue", P4_STATIC);
12ad0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
12ae0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
12af0 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
12b00 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
12b10 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12b20 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
12b30 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
12b40 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12b50 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
12b60 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
12b70 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12b80 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
12b90 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
12ba0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
12bb0 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
12bc0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
12bd0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
12be0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12bf0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
12c00 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iIdx);.}../*.*
12c10 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
12c20 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
12c30 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
12c40 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
12c50 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
12c60 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
12c70 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
12c80 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
12c90 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
12ca0 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
12cb0 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
12cc0 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
12cd0 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
12ce0 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
12cf0 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
12d00 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
12d10 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
12d20 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
12d30 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
12d40 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
12d50 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
12d60 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
12d70 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
12d80 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
12d90 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
12da0 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
12db0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
12dc0 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
12dd0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
12de0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
12df0 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
12e00 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
12e10 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
12e20 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
12e30 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
12e40 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
12e50 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
12e60 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
12e70 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
12e80 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
12e90 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
12ea0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12eb0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
12ec0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
12ed0 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
12ee0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
12ef0 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
12f00 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
12f10 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
12f20 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
12f30 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
12f40 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
12f50 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
12f60 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
12f70 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
12f80 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
12f90 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
12fa0 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
12fb0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
12fc0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
12fd0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
12fe0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
12ff0 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
13000 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
13010 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
13020 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
13030 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
13040 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
13050 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73  that begins this
13060 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13070 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
13080 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68     /* The ")" th
13090 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52  at closes the CR
130a0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
130b0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ment */.  int so
130c0 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
130d0 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
130e0 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
130f0 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
13100 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20  int ifNotExist  
13110 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
13120 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
13130 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
13140 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
13150 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
13160 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
13170 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
13180 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  = 0;   /* The in
13190 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
131a0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
131b0 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  me = 0;     /* N
131c0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
131d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
131e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
131f0 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
13200 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  rs in zName */. 
13210 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
13220 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20  en nullId;      
13230 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
13240 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
13250 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65  list */.  DbFixe
13260 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f  r sFix;        /
13270 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20  * For assigning 
13280 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74  database names t
13290 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  o pTable */.  in
132a0 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  t sortOrderMask;
132b0 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72     /* 1 to honor
132c0 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20   DESC in index. 
132d0 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f   0 to ignore. */
132e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
132f0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44   pParse->db;.  D
13300 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
13310 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
13320 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  fic table contai
13330 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64  ning the indexed
13340 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
13350 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
13360 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
13370 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
13380 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
13390 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
133a0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Name = 0;    /* 
133b0 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
133c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
133d0 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72   create */.  str
133e0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
133f0 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a  m *pListItem; /*
13400 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
13410 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  r pList */.  int
13420 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78   nCol;.  int nEx
13430 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tra = 0;.  char 
13440 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 69 66 28 20  *zExtra;..  if( 
13450 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
13460 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
13470 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
13480 54 41 42 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  TAB ){.    goto 
13490 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
134a0 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  x;.  }..  /*.  *
134b0 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62 6c 65  * Find the table
134c0 20 74 68 61 74 20 69 73 20 74 6f 20 62 65 20 69   that is to be i
134d0 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72 6e 20  ndexed.  Return 
134e0 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75  early if not fou
134f0 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  nd..  */.  if( p
13500 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20  TblName!=0 ){.. 
13510 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20 74 77     /* Use the tw
13520 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e 61 6d  o-part index nam
13530 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  e to determine t
13540 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
13550 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20 66 6f   ** to search fo
13560 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27 46 69  r the table. 'Fi
13570 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  x' the table nam
13580 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20 20 20  e to this db.   
13590 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69   ** before looki
135a0 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c 65 2e  ng up the table.
135b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
135c0 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20 70 4e  rt( pName1 && pN
135d0 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44 62 20  ame2 );.    iDb 
135e0 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
135f0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
13600 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
13610 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
13620 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  b<0 ) goto exit_
13630 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23  create_index;..#
13640 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13650 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a  IT_TEMPDB.    /*
13660 20 49 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   If the index na
13670 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69 66 69  me was unqualifi
13680 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74 68 65  ed, check if the
13690 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
136a0 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61 62 6c  * is a temp tabl
136b0 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20 74 68  e. If so, set th
136c0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 31 2e  e database to 1.
136d0 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a   Do not do this.
136e0 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74 69 61      ** if initia
136f0 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62 61 73  lising a databas
13700 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f  e schema..    */
13710 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
13720 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20  it.busy ){.     
13730 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53   pTab = sqlite3S
13740 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61  rcListLookup(pPa
13750 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a  rse, pTblName);.
13760 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 32        if( pName2
13770 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30   && pName2->n==0
13780 20 26 26 20 70 54 61 62 20 26 26 20 70 54 61 62   && pTab && pTab
13790 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61  ->pSchema==db->a
137a0 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
137b0 0a 20 20 20 20 20 20 20 20 69 44 62 20 3d 20 31  .        iDb = 1
137c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
137d0 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
137e0 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26  sqlite3FixInit(&
137f0 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44  sFix, pParse, iD
13800 62 2c 20 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d  b, "index", pNam
13810 65 29 20 26 26 0a 20 20 20 20 20 20 20 20 73 71  e) &&.        sq
13820 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 28  lite3FixSrcList(
13830 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29  &sFix, pTblName)
13840 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
13850 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61 72   Because the par
13860 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70  ser constructs p
13870 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73  TblName from a s
13880 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72  ingle identifier
13890 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  ,.      ** sqlit
138a0 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e  e3FixSrcList can
138b0 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a   never fail. */.
138c0 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
138d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20  .    }.    pTab 
138e0 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
138f0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 30 2c 20  able(pParse, 0, 
13900 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  pTblName->a[0].z
13910 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20 70  Name, .        p
13920 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  TblName->a[0].zD
13930 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 69 66  atabase);.    if
13940 28 20 21 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d  ( !pTab || db->m
13950 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67 6f  allocFailed ) go
13960 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13970 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
13980 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
13990 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
139a0 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65  chema );.  }else
139b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
139c0 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54  ame==0 );.    pT
139d0 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
139e0 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28 20  wTable;.    if( 
139f0 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78 69  !pTab ) goto exi
13a00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13a10 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
13a20 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
13a30 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
13a40 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20 26  );.  }.  pDb = &
13a50 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20  db->aDb[iDb];.. 
13a60 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20   if( pTab==0 || 
13a70 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 67  pParse->nErr ) g
13a80 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13a90 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 73 71 6c  index;.  if( sql
13aa0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
13ab0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
13ac0 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20  e_", 7)==0 .    
13ad0 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 26 70 54     && memcmp(&pT
13ae0 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c  ab->zName[7],"al
13af0 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30 20 29  tertab_",9)!=0 )
13b00 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13b10 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
13b20 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
13b30 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70 54 61  be indexed", pTa
13b40 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
13b50 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13b60 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64  index;.  }.#ifnd
13b70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13b80 49 45 57 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  IEW.  if( pTab->
13b90 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73  pSelect ){.    s
13ba0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13bb0 50 61 72 73 65 2c 20 22 76 69 65 77 73 20 6d 61  Parse, "views ma
13bc0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
13bd0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
13be0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13bf0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
13c00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13c10 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
13c20 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
13c30 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
13c40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13c50 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73   "virtual tables
13c60 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
13c70 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
13c80 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13c90 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  x;.  }.#endif.. 
13ca0 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68   /*.  ** Find th
13cb0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  e name of the in
13cc0 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  dex.  Make sure 
13cd0 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61 6c 72  there is not alr
13ce0 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a  eady another.  *
13cf0 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  * index or table
13d00 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
13d10 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a  ame.  .  **.  **
13d20 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49 66 20   Exception:  If 
13d30 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 74  we are reading t
13d40 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d  he names of perm
13d50 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20 66 72  anent indices fr
13d60 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69  om the.  ** sqli
13d70 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20  te_master table 
13d80 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 74  (because some ot
13d90 68 65 72 20 70 72 6f 63 65 73 73 20 63 68 61 6e  her process chan
13da0 67 65 64 20 74 68 65 20 73 63 68 65 6d 61 29 20  ged the schema) 
13db0 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20  and.  ** one of 
13dc0 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 73 20  the index names 
13dd0 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20 74 68  collides with th
13de0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65 6d 70  e name of a temp
13df0 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 0a 20  orary table or. 
13e00 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65 6e 20   ** index, then 
13e10 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
13e20 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 69 73   to process this
13e30 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a   index..  **.  *
13e40 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74  * If pName==0 it
13e50 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 61   means that we a
13e60 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20  re.  ** dealing 
13e70 77 69 74 68 20 61 20 70 72 69 6d 61 72 79 20 6b  with a primary k
13e80 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e  ey or UNIQUE con
13e90 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68 61 76  straint.  We hav
13ea0 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a  e to invent our.
13eb0 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20    ** own name.. 
13ec0 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d 65 20   */.  if( pName 
13ed0 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  ){.    zName = s
13ee0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
13ef0 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
13f00 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
13f10 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
13f20 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
13f30 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13f40 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 7a  index;.    if( z
13f50 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
13f60 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13f70 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
13f80 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63  _OK!=sqlite3Chec
13f90 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72  kObjectName(pPar
13fa0 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  se, zName) ){.  
13fb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13fc0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13fd0 7d 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69  }.    if( !db->i
13fe0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
13ff0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
14000 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
14010 6d 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74  ma(pParse) ) got
14020 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14030 64 65 78 3b 0a 20 20 20 20 20 20 69 66 28 20 73  dex;.      if( s
14040 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
14050 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30  db, zName, 0)!=0
14060 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14070 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14080 73 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c  se, "there is al
14090 72 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61  ready a table na
140a0 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  med %s", zName);
140b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78  .        goto ex
140c0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
140d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
140e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69     if( sqlite3Fi
140f0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d  ndIndex(db, zNam
14100 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d  e, pDb->zName)!=
14110 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
14120 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20  ifNotExist ){.  
14130 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
14140 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
14150 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20  ndex %s already 
14160 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b  exists", zName);
14170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
14180 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14190 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
141a0 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  else{.    int n;
141b0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f  .    Index *pLoo
141c0 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70  p;.    for(pLoop
141d0 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e  =pTab->pIndex, n
141e0 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70  =1; pLoop; pLoop
141f0 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e  =pLoop->pNext, n
14200 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20  ++){}.    zName 
14210 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
14220 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74  (db, "sqlite_aut
14230 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70  oindex_%s_%d", p
14240 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a  Tab->zName, n);.
14250 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30      if( zName==0
14260 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14270 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14280 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
14290 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68  * Check for auth
142a0 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65  orization to cre
142b0 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20  ate an index..  
142c0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
142d0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
142e0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e  TION.  {.    con
142f0 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70  st char *zDb = p
14300 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  Db->zName;.    i
14310 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
14320 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
14330 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d  TE_INSERT, SCHEM
14340 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c  A_TABLE(iDb), 0,
14350 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
14360 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14370 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
14380 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41   i = SQLITE_CREA
14390 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66  TE_INDEX;.    if
143a0 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26  ( !OMIT_TEMPDB &
143b0 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53  & iDb==1 ) i = S
143c0 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
143d0 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
143e0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
143f0 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61  k(pParse, i, zNa
14400 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  me, pTab->zName,
14410 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
14420 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
14430 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d  index;.    }.  }
14440 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
14450 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65   pList==0, it me
14460 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ans this routine
14470 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d   was called to m
14480 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20  ake a primary.  
14490 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68  ** key out of th
144a0 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64  e last column ad
144b0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
144c0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
144d0 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65  ion..  ** So cre
144e0 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20  ate a fake list 
144f0 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73  to simulate this
14500 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69  ..  */.  if( pLi
14510 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c  st==0 ){.    nul
14520 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61  lId.z = (u8*)pTa
14530 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43  b->aCol[pTab->nC
14540 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  ol-1].zName;.   
14550 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c 69   nullId.n = sqli
14560 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63 68 61  te3Strlen30((cha
14570 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20  r*)nullId.z);.  
14580 20 20 6e 75 6c 6c 49 64 2e 71 75 6f 74 65 64 20    nullId.quoted 
14590 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  = 0;.    pList =
145a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
145b0 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
145c0 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b 0a 20  , 0, &nullId);. 
145d0 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
145e0 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
145f0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 70 4c  te_index;.    pL
14600 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72  ist->a[0].sortOr
14610 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74 4f 72  der = (u8)sortOr
14620 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  der;.  }..  /* F
14630 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
14640 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ny bytes of spac
14650 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
14660 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63 69 74  o store explicit
14670 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66 69 65  ly.  ** specifie
14680 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
14690 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f  ence names..  */
146a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c  .  for(i=0; i<pL
146b0 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
146c0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
146d0 72 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  r;.    CollSeq *
146e0 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20 28  pColl;.    if( (
146f0 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61  pExpr = pList->a
14700 5b 69 5d 2e 70 45 78 70 72 29 21 3d 30 20 26 26  [i].pExpr)!=0 &&
14710 20 28 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d   (pColl = pExpr-
14720 3e 70 43 6f 6c 6c 29 21 3d 30 20 29 7b 0a 20 20  >pColl)!=0 ){.  
14730 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
14740 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
14750 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  30(pColl->zName)
14760 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
14770 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74  /* .  ** Allocat
14780 65 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  e the index stru
14790 63 74 75 72 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e  cture. .  */.  n
147a0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
147b0 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
147c0 20 6e 43 6f 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e   nCol = pList->n
147d0 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78 20 3d  Expr;.  pIndex =
147e0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
147f0 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20  Zero(db, .      
14800 73 69 7a 65 6f 66 28 49 6e 64 65 78 29 20 2b 20  sizeof(Index) + 
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14820 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
14830 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
14840 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b 20 20 20 20  (int)*nCol +    
14850 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
14860 61 69 43 6f 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20  aiColumn   */.  
14870 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a      sizeof(int)*
14880 28 6e 43 6f 6c 2b 31 29 20 2b 20 20 20 20 20 20  (nCol+1) +      
14890 20 2f 2a 20 49 6e 64 65 78 2e 61 69 52 6f 77 45   /* Index.aiRowE
148a0 73 74 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  st   */.      si
148b0 7a 65 6f 66 28 63 68 61 72 20 2a 29 2a 6e 43 6f  zeof(char *)*nCo
148c0 6c 20 2b 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  l +        /* In
148d0 64 65 78 2e 61 7a 43 6f 6c 6c 20 20 20 20 20 2a  dex.azColl     *
148e0 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75  /.      sizeof(u
148f0 38 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  8)*nCol +       
14900 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53       /* Index.aS
14910 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ortOrder */.    
14920 20 20 6e 4e 61 6d 65 20 2b 20 31 20 2b 20 20 20    nName + 1 +   
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14940 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d 65 20 20 20  * Index.zName   
14950 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 45 78 74     */.      nExt
14960 72 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ra              
14970 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
14980 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
14990 61 6d 65 73 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  ames */.  );.  i
149a0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
149b0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
149c0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
149d0 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 2d  x;.  }.  pIndex-
149e0 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72 2a  >azColl = (char*
149f0 2a 29 28 26 70 49 6e 64 65 78 5b 31 5d 29 3b 0a  *)(&pIndex[1]);.
14a00 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75    pIndex->aiColu
14a10 6d 6e 20 3d 20 28 69 6e 74 20 2a 29 28 26 70 49  mn = (int *)(&pI
14a20 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f  ndex->azColl[nCo
14a30 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  l]);.  pIndex->a
14a40 69 52 6f 77 45 73 74 20 3d 20 28 75 6e 73 69 67  iRowEst = (unsig
14a50 6e 65 64 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  ned *)(&pIndex->
14a60 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b  aiColumn[nCol]);
14a70 0a 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  .  pIndex->aSort
14a80 4f 72 64 65 72 20 3d 20 28 75 38 20 2a 29 28 26  Order = (u8 *)(&
14a90 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74  pIndex->aiRowEst
14aa0 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e  [nCol+1]);.  pIn
14ab0 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68  dex->zName = (ch
14ac0 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61  ar *)(&pIndex->a
14ad0 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29  SortOrder[nCol])
14ae0 3b 0a 20 20 7a 45 78 74 72 61 20 3d 20 28 63 68  ;.  zExtra = (ch
14af0 61 72 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 7a  ar *)(&pIndex->z
14b00 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a  Name[nName+1]);.
14b10 20 20 6d 65 6d 63 70 79 28 70 49 6e 64 65 78 2d    memcpy(pIndex-
14b20 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e  >zName, zName, n
14b30 4e 61 6d 65 2b 31 29 3b 0a 20 20 70 49 6e 64 65  Name+1);.  pInde
14b40 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
14b50 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ;.  pIndex->nCol
14b60 75 6d 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78  umn = pList->nEx
14b70 70 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 6f 6e  pr;.  pIndex->on
14b80 45 72 72 6f 72 20 3d 20 28 75 38 29 6f 6e 45 72  Error = (u8)onEr
14b90 72 6f 72 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  ror;.  pIndex->a
14ba0 75 74 6f 49 6e 64 65 78 20 3d 20 28 75 38 29 28  utoIndex = (u8)(
14bb0 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20 20 70 49 6e  pName==0);.  pIn
14bc0 64 65 78 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64  dex->pSchema = d
14bd0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
14be0 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ema;..  /* Check
14bf0 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73 68   to see if we sh
14c00 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20  ould honor DESC 
14c10 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65  requests on inde
14c20 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20  x columns.  */. 
14c30 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d   if( pDb->pSchem
14c40 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d  a->file_format>=
14c50 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  4 ){.    sortOrd
14c60 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f  erMask = -1;   /
14c70 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a  * Honor DESC */.
14c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72    }else{.    sor
14c90 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20  tOrderMask = 0; 
14ca0 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53     /* Ignore DES
14cb0 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  C */.  }..  /* S
14cc0 63 61 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  can the names of
14cd0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
14ce0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
14cf0 69 6e 64 65 78 65 64 20 61 6e 64 0a 20 20 2a 2a  indexed and.  **
14d00 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e   load the column
14d10 20 69 6e 64 69 63 65 73 20 69 6e 74 6f 20 74 68   indices into th
14d20 65 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  e Index structur
14d30 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
14d40 72 6f 72 0a 20 20 2a 2a 20 69 66 20 61 6e 79 20  ror.  ** if any 
14d50 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 66 6f  column is not fo
14d60 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  und..  */.  for(
14d70 69 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70  i=0, pListItem=p
14d80 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
14d90 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c  ->nExpr; i++, pL
14da0 69 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  istItem++){.    
14db0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
14dc0 4e 61 6d 65 20 3d 20 70 4c 69 73 74 49 74 65 6d  Name = pListItem
14dd0 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 43 6f 6c  ->zName;.    Col
14de0 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20  umn *pTabCol;.  
14df0 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
14e00 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 63 68  ortOrder;.    ch
14e10 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
14e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e30 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
14e40 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  ce name */..    
14e50 66 6f 72 28 6a 3d 30 2c 20 70 54 61 62 43 6f 6c  for(j=0, pTabCol
14e60 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
14e70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
14e80 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  pTabCol++){.    
14e90 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
14ea0 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70  ICmp(zColName, p
14eb0 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d  TabCol->zName)==
14ec0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
14ed0 0a 20 20 20 20 69 66 28 20 6a 3e 3d 70 54 61 62  .    if( j>=pTab
14ee0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
14ef0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
14f00 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25  pParse, "table %
14f10 73 20 68 61 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20  s has no column 
14f20 6e 61 6d 65 64 20 25 73 22 2c 0a 20 20 20 20 20  named %s",.     
14f30 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20     pTab->zName, 
14f40 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zColName);.     
14f50 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14f60 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14f70 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 20 41 64 64     /* TODO:  Add
14f80 20 61 20 74 65 73 74 20 74 6f 20 6d 61 6b 65 20   a test to make 
14f90 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 61  sure that the sa
14fa0 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74  me column is not
14fb0 20 6e 61 6d 65 64 0a 20 20 20 20 2a 2a 20 6d 6f   named.    ** mo
14fc0 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74  re than once wit
14fd0 68 69 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64  hin the same ind
14fe0 65 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69  ex.  Only the fi
14ff0 72 73 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a  rst instance of.
15000 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d      ** the colum
15010 6e 20 77 69 6c 6c 20 65 76 65 72 20 62 65 20 75  n will ever be u
15020 73 65 64 20 62 79 20 74 68 65 20 6f 70 74 69 6d  sed by the optim
15030 69 7a 65 72 2e 20 20 4e 6f 74 65 20 74 68 61 74  izer.  Note that
15040 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a   using the.    *
15050 2a 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f  * same column mo
15060 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 63 61 6e  re than once can
15070 6e 6f 74 20 62 65 20 61 6e 20 65 72 72 6f 72 20  not be an error 
15080 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
15090 6c 64 20 0a 20 20 20 20 2a 2a 20 62 72 65 61 6b  ld .    ** break
150a0 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
150b0 74 69 62 69 6c 69 74 79 20 2d 20 69 74 20 6e 65  tibility - it ne
150c0 65 64 73 20 74 6f 20 62 65 20 61 20 77 61 72 6e  eds to be a warn
150d0 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
150e0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
150f0 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20 20 69 66 28  [i] = j;.    if(
15100 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
15110 72 20 26 26 20 70 4c 69 73 74 49 74 65 6d 2d 3e  r && pListItem->
15120 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a  pExpr->pColl ){.
15130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
15140 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e  istItem->pExpr->
15150 70 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 7a  pColl );.      z
15160 43 6f 6c 6c 20 3d 20 7a 45 78 74 72 61 3b 0a 20  Coll = zExtra;. 
15170 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
15180 72 69 6e 74 66 28 6e 45 78 74 72 61 2c 20 7a 45  rintf(nExtra, zE
15190 78 74 72 61 2c 20 22 25 73 22 2c 20 70 4c 69 73  xtra, "%s", pLis
151a0 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
151b0 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  oll->zName);.   
151c0 20 20 20 7a 45 78 74 72 61 20 2b 3d 20 28 73 71     zExtra += (sq
151d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43  lite3Strlen30(zC
151e0 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20 20 20 20 7d  oll) + 1);.    }
151f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c  else{.      zCol
15200 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
15210 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69  ].zColl;.      i
15220 66 28 20 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !zColl ){.   
15230 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d       zColl = db-
15240 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d  >pDfltColl->zNam
15250 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  e;.      }.    }
15260 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  .    if( !db->in
15270 69 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69  it.busy && !sqli
15280 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71  te3LocateCollSeq
15290 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20  (pParse, zColl, 
152a0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  -1) ){.      got
152b0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
152c0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
152d0 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
152e0 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
152f0 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
15300 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
15310 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
15320 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
15330 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
15340 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
15350 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  edSortOrder;.  }
15360 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  .  sqlite3Defaul
15370 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b  tRowEst(pIndex);
15380 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
15390 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
153a0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
153b0 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
153c0 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
153d0 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
153e0 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
153f0 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
15400 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
15410 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
15420 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
15430 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
15440 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
15450 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
15460 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
15470 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
15480 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
15490 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
154a0 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
154b0 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
154c0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
154d0 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
154e0 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
154f0 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
15500 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
15510 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
15520 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
15530 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
15540 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
15550 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
15560 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
15570 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
15580 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
15590 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
155a0 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
155b0 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
155c0 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
155d0 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
155e0 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
155f0 78 3b 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d  x;.    for(pIdx=
15600 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
15610 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70  dx; pIdx=pIdx->p
15620 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
15630 20 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   k;.      assert
15640 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
15650 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20 20 20 20  =OE_None );.    
15660 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
15670 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a 20 20 20  autoIndex );.   
15680 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65     assert( pInde
15690 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  x->onError!=OE_N
156a0 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  one );..      if
156b0 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21  ( pIdx->nColumn!
156c0 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
156d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
156e0 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
156f0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  dx->nColumn; k++
15700 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
15710 20 63 68 61 72 20 2a 7a 31 20 3d 20 70 49 64 78   char *z1 = pIdx
15720 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
15730 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
15740 2a 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a  *z2 = pIndex->az
15750 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
15760 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
15770 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e  umn[k]!=pIndex->
15780 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72  aiColumn[k] ) br
15790 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
157a0 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65   pIdx->aSortOrde
157b0 72 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 53  r[k]!=pIndex->aS
157c0 6f 72 74 4f 72 64 65 72 5b 6b 5d 20 29 20 62 72  ortOrder[k] ) br
157d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
157e0 20 7a 31 21 3d 7a 32 20 26 26 20 73 71 6c 69 74   z1!=z2 && sqlit
157f0 65 33 53 74 72 49 43 6d 70 28 7a 31 2c 20 7a 32  e3StrICmp(z1, z2
15800 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
15810 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
15820 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  pIdx->nColumn ){
15830 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
15840 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 70 49 6e 64  x->onError!=pInd
15850 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 29 7b 0a 20  ex->onError ){. 
15860 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73           /* This
15870 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 72 65 61   constraint crea
15880 74 65 73 20 74 68 65 20 73 61 6d 65 20 69 6e 64  tes the same ind
15890 65 78 20 61 73 20 61 20 70 72 65 76 69 6f 75 73  ex as a previous
158a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
158b0 6e 73 74 72 61 69 6e 74 20 73 70 65 63 69 66 69  nstraint specifi
158c0 65 64 20 73 6f 6d 65 77 68 65 72 65 20 69 6e 20  ed somewhere in 
158d0 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
158e0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
158f0 20 20 20 20 20 20 2a 2a 20 48 6f 77 65 76 65 72        ** However
15900 20 74 68 65 20 4f 4e 20 43 4f 4e 46 4c 49 43 54   the ON CONFLICT
15910 20 63 6c 61 75 73 65 73 20 61 72 65 20 64 69 66   clauses are dif
15920 66 65 72 65 6e 74 2e 20 49 66 20 62 6f 74 68 20  ferent. If both 
15930 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20 20  this .          
15940 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  ** constraint an
15950 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65  d the previous e
15960 71 75 69 76 61 6c 65 6e 74 20 63 6f 6e 73 74 72  quivalent constr
15970 61 69 6e 74 20 68 61 76 65 20 65 78 70 6c 69 63  aint have explic
15980 69 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  it.          ** 
15990 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
159a0 73 65 73 20 74 68 69 73 20 69 73 20 61 6e 20 65  ses this is an e
159b0 72 72 6f 72 2e 20 4f 74 68 65 72 77 69 73 65 2c  rror. Otherwise,
159c0 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 20 20   use the.       
159d0 20 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 6c 79     ** explicitly
159e0 20 73 70 65 63 69 66 69 65 64 20 62 65 68 61 76   specified behav
159f0 69 6f 75 72 20 66 6f 72 20 74 68 65 20 69 6e 64  iour for the ind
15a00 65 78 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ex..          */
15a10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
15a20 28 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d  (pIdx->onError==
15a30 4f 45 5f 44 65 66 61 75 6c 74 20 7c 7c 20 70 49  OE_Default || pI
15a40 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
15a50 45 5f 44 65 66 61 75 6c 74 29 20 29 7b 0a 20 20  E_Default) ){.  
15a60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15a70 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
15a80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
15a90 20 20 20 22 63 6f 6e 66 6c 69 63 74 69 6e 67 20     "conflicting 
15aa0 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
15ab0 73 65 73 20 73 70 65 63 69 66 69 65 64 22 2c 20  ses specified", 
15ac0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
15ad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
15ae0 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f  dx->onError==OE_
15af0 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
15b00 20 20 20 20 20 20 20 70 49 64 78 2d 3e 6f 6e 45         pIdx->onE
15b10 72 72 6f 72 20 3d 20 70 49 6e 64 65 78 2d 3e 6f  rror = pIndex->o
15b20 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 20 20  nError;.        
15b30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
15b40 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15b50 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15b60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
15b70 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e  .  /* Link the n
15b80 65 77 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  ew Index structu
15b90 72 65 20 74 6f 20 69 74 73 20 74 61 62 6c 65 20  re to its table 
15ba0 61 6e 64 20 74 6f 20 74 68 65 20 6f 74 68 65 72  and to the other
15bb0 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  .  ** in-memory 
15bc0 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75  database structu
15bd0 72 65 73 2e 20 0a 20 20 2a 2f 0a 20 20 69 66 28  res. .  */.  if(
15be0 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
15bf0 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 3b 0a  {.    Index *p;.
15c00 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
15c10 61 73 68 49 6e 73 65 72 74 28 26 70 49 6e 64 65  ashInsert(&pInde
15c20 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  x->pSchema->idxH
15c30 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ash, .          
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73  pIndex->zName, s
15c60 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
15c70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20  Index->zName),. 
15c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c90 20 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 29           pIndex)
15ca0 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
15cb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
15cc0 70 49 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61  pIndex );  /* Ma
15cd0 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
15ce0 61 69 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64  ailed */.      d
15cf0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15d00 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
15d10 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15d20 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  x;.    }.    db-
15d30 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
15d40 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
15d50 20 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65      if( pTblName
15d60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  !=0 ){.      pIn
15d70 64 65 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e  dex->tnum = db->
15d80 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20  init.newTnum;.  
15d90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
15da0 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
15db0 73 79 20 69 73 20 30 20 74 68 65 6e 20 63 72 65  sy is 0 then cre
15dc0 61 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e  ate the index on
15dd0 20 64 69 73 6b 2e 20 20 54 68 69 73 0a 20 20 2a   disk.  This.  *
15de0 2a 20 69 6e 76 6f 6c 76 65 73 20 77 72 69 74 69  * involves writi
15df0 6e 67 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  ng the index int
15e00 6f 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  o the master tab
15e10 6c 65 20 61 6e 64 20 66 69 6c 6c 69 6e 67 20 69  le and filling i
15e20 6e 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  n the.  ** index
15e30 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
15e40 74 20 74 61 62 6c 65 20 63 6f 6e 74 65 6e 74 73  t table contents
15e50 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
15e60 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
15e70 20 30 20 77 68 65 6e 20 74 68 65 20 75 73 65 72   0 when the user
15e80 20 66 69 72 73 74 20 65 6e 74 65 72 73 20 61 20   first enters a 
15e90 43 52 45 41 54 45 20 49 4e 44 45 58 20 0a 20 20  CREATE INDEX .  
15ea0 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d  ** command.  db-
15eb0 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
15ec0 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
15ed0 69 73 20 6f 70 65 6e 65 64 20 61 6e 64 20 0a 20  is opened and . 
15ee0 20 2a 2a 20 43 52 45 41 54 45 20 49 4e 44 45 58   ** CREATE INDEX
15ef0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
15f00 72 65 61 64 20 6f 75 74 20 6f 66 20 74 68 65 20  read out of the 
15f10 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 49  master table.  I
15f20 6e 0a 20 20 2a 2a 20 74 68 65 20 6c 61 74 74 65  n.  ** the latte
15f30 72 20 63 61 73 65 20 74 68 65 20 69 6e 64 65 78  r case the index
15f40 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
15f50 6f 6e 20 64 69 73 6b 2c 20 77 68 69 63 68 20 69  on disk, which i
15f60 73 20 77 68 79 0a 20 20 2a 2a 20 77 65 20 64 6f  s why.  ** we do
15f70 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 65 63 72  n't want to recr
15f80 65 61 74 65 20 69 74 2e 0a 20 20 2a 2a 0a 20 20  eate it..  **.  
15f90 2a 2a 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d  ** If pTblName==
15fa0 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
15fb0 69 6e 64 65 78 20 69 73 20 67 65 6e 65 72 61 74  index is generat
15fc0 65 64 20 61 73 20 61 20 70 72 69 6d 61 72 79 20  ed as a primary 
15fd0 6b 65 79 0a 20 20 2a 2a 20 6f 72 20 55 4e 49 51  key.  ** or UNIQ
15fe0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66  UE constraint of
15ff0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
16000 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63  statement.  Sinc
16010 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a  e the table.  **
16020 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63   has just been c
16030 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61  reated, it conta
16040 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20  ins no data and 
16050 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61  the index initia
16060 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74  lization.  ** st
16070 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65  ep can be skippe
16080 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69  d..  */.  else i
16090 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  f( db->init.busy
160a0 3d 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ==0 ){.    Vdbe 
160b0 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  *v;.    char *zS
160c0 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65  tmt;.    int iMe
160d0 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  m = ++pParse->nM
160e0 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c  em;..    v = sql
160f0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
16100 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  se);.    if( v==
16110 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
16120 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20  eate_index;...  
16130 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20    /* Create the 
16140 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65  rootpage for the
16150 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20   index.    */.  
16160 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
16170 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
16180 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20  rse, 1, iDb);.  
16190 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
161a0 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op2(v, OP_Create
161b0 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65 6d  Index, iDb, iMem
161c0 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68 65  );..    /* Gathe
161d0 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
161e0 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
161f0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
16200 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74 68  t into.    ** th
16210 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c 65  e zStmt variable
16220 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16230 70 53 74 61 72 74 20 26 26 20 70 45 6e 64 20 29  pStart && pEnd )
16240 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61 6d  {.      /* A nam
16250 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61 6e  ed index with an
16260 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54 45   explicit CREATE
16270 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
16280 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   */.      zStmt 
16290 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
162a0 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20 49  (db, "CREATE%s I
162b0 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20 20  NDEX %.*s",.    
162c0 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f      onError==OE_
162d0 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55 4e  None ? "" : " UN
162e0 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20 20 70  IQUE",.        p
162f0 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e  End->z - pName->
16300 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20 20 70  z + 1,.        p
16310 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Name->z);.    }e
16320 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  lse{.      /* An
16330 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78   automatic index
16340 20 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52   created by a PR
16350 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49  IMARY KEY or UNI
16360 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  QUE constraint *
16370 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74  /.      /* zStmt
16380 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
16390 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20  f(""); */.      
163a0 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  zStmt = 0;.    }
163b0 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20  ..    /* Add an 
163c0 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f  entry in sqlite_
163d0 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20  master for this 
163e0 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20  index.    */.   
163f0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
16400 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
16410 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
16420 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27  O %Q.%s VALUES('
16430 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64  index',%Q,%Q,#%d
16440 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20  ,%Q);",.        
16450 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
16460 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
16470 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70  (iDb),.        p
16480 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20  Index->zName,.  
16490 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d        pTab->zNam
164a0 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c  e,.        iMem,
164b0 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20  .        zStmt. 
164c0 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
164d0 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d  3DbFree(db, zStm
164e0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c  t);..    /* Fill
164f0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
16500 64 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65  data and reparse
16510 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64   the schema. Cod
16520 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20  e an OP_Expire. 
16530 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64     ** to invalid
16540 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70  ate all pre-comp
16550 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
16560 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16570 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20  pTblName ){.    
16580 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
16590 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
165a0 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20  dex, iMem);.    
165b0 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
165c0 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
165d0 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  b);.      sqlite
165e0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
165f0 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69  P_ParseSchema, i
16600 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20  Db, 0, 0,.      
16610 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
16620 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
16630 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  ", pIndex->zName
16640 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  ), P4_DYNAMIC);.
16650 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16660 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 78  eAddOp1(v, OP_Ex
16670 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pire, 0);.    }.
16680 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
16690 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
166a0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
166b0 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
166c0 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
166d0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
166e0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
166f0 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
16700 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
16710 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
16720 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
16730 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
16740 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 55 50   operation of UP
16750 44 41 54 45 0a 20 20 2a 2a 20 61 6e 64 20 49 4e  DATE.  ** and IN
16760 53 45 52 54 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  SERT..  */.  if(
16770 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c   db->init.busy |
16780 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b  | pTblName==0 ){
16790 0a 20 20 20 20 69 66 28 20 6f 6e 45 72 72 6f 72  .    if( onError
167a0 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 7c 7c 20  !=OE_Replace || 
167b0 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a  pTab->pIndex==0.
167c0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 54 61 62           || pTab
167d0 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ->pIndex->onErro
167e0 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65 29 7b 0a  r==OE_Replace){.
167f0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
16800 65 78 74 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  ext = pTab->pInd
16810 65 78 3b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e  ex;.      pTab->
16820 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b  pIndex = pIndex;
16830 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16840 20 20 49 6e 64 65 78 20 2a 70 4f 74 68 65 72 20    Index *pOther 
16850 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
16860 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4f 74        while( pOt
16870 68 65 72 2d 3e 70 4e 65 78 74 20 26 26 20 70 4f  her->pNext && pO
16880 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45  ther->pNext->onE
16890 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
168a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f 74 68   ){.        pOth
168b0 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  er = pOther->pNe
168c0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
168d0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
168e0 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b  = pOther->pNext;
168f0 0a 20 20 20 20 20 20 70 4f 74 68 65 72 2d 3e 70  .      pOther->p
16900 4e 65 78 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20  Next = pIndex;. 
16910 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78 20     }.    pIndex 
16920 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  = 0;.  }..  /* C
16930 6c 65 61 6e 20 75 70 20 62 65 66 6f 72 65 20 65  lean up before e
16940 78 69 74 69 6e 67 20 2a 2f 0a 65 78 69 74 5f 63  xiting */.exit_c
16950 72 65 61 74 65 5f 69 6e 64 65 78 3a 0a 20 20 69  reate_index:.  i
16960 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
16970 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
16980 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  ndex->zColAff);.
16990 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
169a0 65 28 64 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20  e(db, pIndex);. 
169b0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
169c0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
169d0 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
169e0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
169f0 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 73  , pTblName);.  s
16a00 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16a10 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
16a20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
16a30 72 61 74 65 20 63 6f 64 65 20 74 6f 20 6d 61 6b  rate code to mak
16a40 65 20 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  e sure the file 
16a50 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 73  format number is
16a60 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 6f 72   at least minFor
16a70 6d 61 74 2e 0a 2a 2a 20 54 68 65 20 67 65 6e 65  mat..** The gene
16a80 72 61 74 65 64 20 63 6f 64 65 20 77 69 6c 6c 20  rated code will 
16a90 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
16aa0 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65 72 20  e format number 
16ab0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f  if necessary..*/
16ac0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 69 6e  .void sqlite3Min
16ad0 69 6d 75 6d 46 69 6c 65 46 6f 72 6d 61 74 28 50  imumFileFormat(P
16ae0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
16af0 74 20 69 44 62 2c 20 69 6e 74 20 6d 69 6e 46 6f  t iDb, int minFo
16b00 72 6d 61 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rmat){.  Vdbe *v
16b10 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
16b20 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
16b30 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 69    if( v ){.    i
16b40 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
16b50 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
16b60 29 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20  );.    int r2 = 
16b70 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
16b80 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  g(pParse);.    i
16b90 6e 74 20 6a 31 3b 0a 20 20 20 20 73 71 6c 69 74  nt j1;.    sqlit
16ba0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
16bb0 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69  OP_ReadCookie, i
16bc0 44 62 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20  Db, r1, 1);.    
16bd0 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
16be0 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
16bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16c00 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16c10 72 2c 20 6d 69 6e 46 6f 72 6d 61 74 2c 20 72 32  r, minFormat, r2
16c20 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  );.    j1 = sqli
16c30 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16c40 20 4f 50 5f 47 65 2c 20 72 32 2c 20 30 2c 20 72   OP_Ge, r2, 0, r
16c50 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
16c60 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16c70 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
16c80 31 2c 20 72 32 29 3b 0a 20 20 20 20 73 71 6c 69  1, r2);.    sqli
16c90 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
16ca0 76 2c 20 6a 31 29 3b 0a 20 20 20 20 73 71 6c 69  v, j1);.    sqli
16cb0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16cc0 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20  g(pParse, r1);. 
16cd0 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
16ce0 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
16cf0 20 72 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   r2);.  }.}../*.
16d00 2a 2a 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65  ** Fill the Inde
16d10 78 2e 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72  x.aiRowEst[] arr
16d20 61 79 20 77 69 74 68 20 64 65 66 61 75 6c 74 20  ay with default 
16d30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e  information - in
16d40 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20  formation.** to 
16d50 62 65 20 75 73 65 64 20 77 68 65 6e 20 77 65 20  be used when we 
16d60 68 61 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65  have not run the
16d70 20 41 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64   ANALYZE command
16d80 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74  ..**.** aiRowEst
16d90 5b 30 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74  [0] is suppose t
16da0 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75  o contain the nu
16db0 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73  mber of elements
16dc0 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   in the index..*
16dd0 2a 20 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f  * Since we do no
16de0 74 20 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20  t know, guess 1 
16df0 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45  million.  aiRowE
16e00 73 74 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69  st[1] is an esti
16e10 6d 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e  mate of the.** n
16e20 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
16e30 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
16e40 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
16e50 75 6c 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68  ular value of th
16e60 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d  e.** first colum
16e70 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  n of the index. 
16e80 20 61 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20   aiRowEst[2] is 
16e90 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
16ea0 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20  he number.** of 
16eb0 72 6f 77 73 20 74 68 61 74 20 6d 61 74 63 68 20  rows that match 
16ec0 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20 63  any particular c
16ed0 6f 6d 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74  ombiniation of t
16ee0 68 65 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d  he first 2 colum
16ef0 6e 73 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64  ns.** of the ind
16f00 65 78 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ex.  And so fort
16f10 68 2e 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61  h.  It must alwa
16f20 79 73 20 62 65 20 74 68 65 20 63 61 73 65 20 74  ys be the case t
16f30 68 61 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  hat.*.**        
16f40 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d     aiRowEst[N]<=
16f50 61 69 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a  aiRowEst[N-1].**
16f60 20 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77             aiRow
16f70 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20  Est[N]>=1.**.** 
16f80 41 70 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c  Apart from that,
16f90 20 77 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20   we have little 
16fa0 74 6f 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73  to go on besides
16fb0 20 69 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f   intuition as to
16fc0 0a 2a 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74  .** how aiRowEst
16fd0 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  [] should be ini
16fe0 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e  tialized.  The n
16ff0 75 6d 62 65 72 73 20 67 65 6e 65 72 61 74 65 64  umbers generated
17000 20 68 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73   here.** are bas
17010 65 64 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61  ed on typical va
17020 6c 75 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63  lues found in ac
17030 74 75 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f  tual indices..*/
17040 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66  .void sqlite3Def
17050 61 75 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78  aultRowEst(Index
17060 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67   *pIdx){.  unsig
17070 6e 65 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61  ned *a = pIdx->a
17080 69 52 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69  iRowEst;.  int i
17090 3b 0a 20 20 61 73 73 65 72 74 28 20 61 21 3d 30  ;.  assert( a!=0
170a0 20 29 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30   );.  a[0] = 100
170b0 30 30 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49  0000;.  for(i=pI
170c0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d  dx->nColumn; i>=
170d0 35 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69  5; i--){.    a[i
170e0 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69  ] = 5;.  }.  whi
170f0 6c 65 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20  le( i>=1 ){.    
17100 61 5b 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20  a[i] = 11 - i;. 
17110 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66     i--;.  }.  if
17120 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
17130 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20  =OE_None ){.    
17140 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d  a[pIdx->nColumn]
17150 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
17160 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17170 77 69 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69  will drop an exi
17180 73 74 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65  sting named inde
17190 78 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  x.  This routine
171a0 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  .** implements t
171b0 68 65 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74  he DROP INDEX st
171c0 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  atement..*/.void
171d0 20 73 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65   sqlite3DropInde
171e0 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  x(Parse *pParse,
171f0 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c   SrcList *pName,
17200 20 69 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a   int ifExists){.
17210 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
17220 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71  .  Vdbe *v;.  sq
17230 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
17240 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44  se->db;.  int iD
17250 62 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65  b;..  if( pParse
17260 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
17270 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
17280 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17290 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73  _index;.  }.  as
172a0 73 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72  sert( pName->nSr
172b0 63 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51  c==1 );.  if( SQ
172c0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
172d0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
172e0 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  e) ){.    goto e
172f0 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
17300 20 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73    }.  pIndex = s
17310 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28  qlite3FindIndex(
17320 64 62 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e  db, pName->a[0].
17330 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b  zName, pName->a[
17340 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  0].zDatabase);. 
17350 20 69 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29   if( pIndex==0 )
17360 7b 0a 20 20 20 20 69 66 28 20 21 69 66 45 78 69  {.    if( !ifExi
17370 73 74 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  sts ){.      sql
17380 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
17390 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  rse, "no such in
173a0 64 65 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c  dex: %S", pName,
173b0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70   0);.    }.    p
173c0 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
173d0 6d 61 20 3d 20 31 3b 0a 20 20 20 20 67 6f 74 6f  ma = 1;.    goto
173e0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
173f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 64  ;.  }.  if( pInd
17400 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 7b  ex->autoIndex ){
17410 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
17420 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
17430 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
17440 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20  ith UNIQUE ".   
17450 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b     "or PRIMARY K
17460 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61  EY constraint ca
17470 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22  nnot be dropped"
17480 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  , 0);.    goto e
17490 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
174a0 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69    }.  iDb = sqli
174b0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
174c0 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
174d0 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53  hema);.#ifndef S
174e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
174f0 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20  RIZATION.  {.   
17500 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49   int code = SQLI
17510 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20  TE_DROP_INDEX;. 
17520 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
17530 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b   pIndex->pTable;
17540 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
17550 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *zDb = db->aDb[i
17560 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63  Db].zName;.    c
17570 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
17580 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  = SCHEMA_TABLE(i
17590 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  Db);.    if( sql
175a0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
175b0 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
175c0 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
175d0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
175e0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
175f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17600 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
17610 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c  iDb ) code = SQL
17620 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e  ITE_DROP_TEMP_IN
17630 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
17640 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
17650 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64  arse, code, pInd
17660 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  ex->zName, pTab-
17670 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a  >zName, zDb) ){.
17680 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
17690 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20  drop_index;.    
176a0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
176b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
176c0 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69   to remove the i
176d0 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68  ndex and from th
176e0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a  e master table *
176f0 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  /.  v = sqlite3G
17700 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
17710 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
17720 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65  qlite3BeginWrite
17730 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65  Operation(pParse
17740 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  , 1, iDb);.    s
17750 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
17760 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
17770 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
17780 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25  .%s WHERE name=%
17790 51 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61  Q",.       db->a
177a0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53  Db[iDb].zName, S
177b0 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
177c0 2c 0a 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ,.       pIndex-
177d0 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
177e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
177f0 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
17800 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61  te_stat1", db->a
17810 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29  Db[iDb].zName) )
17820 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
17830 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
17840 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
17850 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
17860 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 69 64  e_stat1 WHERE id
17870 78 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20 64  x=%Q",.        d
17880 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
17890 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
178a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
178b0 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
178c0 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
178d0 69 44 62 29 3b 0a 20 20 20 20 64 65 73 74 72 6f  iDb);.    destro
178e0 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65  yRootPage(pParse
178f0 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20  , pIndex->tnum, 
17900 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
17910 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
17920 50 5f 44 72 6f 70 49 6e 64 65 78 2c 20 69 44 62  P_DropIndex, iDb
17930 2c 20 30 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e  , 0, 0, pIndex->
17940 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a  zName, 0);.  }..
17950 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3a  exit_drop_index:
17960 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  .  sqlite3SrcLis
17970 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d  tDelete(db, pNam
17980 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72  e);.}../*.** pAr
17990 72 61 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ray is a pointer
179a0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
179b0 6f 62 6a 65 63 74 73 2e 20 20 45 61 63 68 20 6f  objects.  Each o
179c0 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20  bject in the.** 
179d0 61 72 72 61 79 20 69 73 20 73 7a 45 6e 74 72 79  array is szEntry
179e0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
179f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
17a00 6c 6f 63 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a  locates a new.**
17a10 20 6f 62 6a 65 63 74 20 6f 6e 20 74 68 65 20 65   object on the e
17a20 6e 64 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  nd of the array.
17a30 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e 74 72 79 20  .**.** *pnEntry 
17a40 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
17a50 20 65 6e 74 72 69 65 73 20 61 6c 72 65 61 64 79   entries already
17a60 20 69 6e 20 75 73 65 2e 20 20 2a 70 6e 41 6c 6c   in use.  *pnAll
17a70 6f 63 20 69 73 0a 2a 2a 20 74 68 65 20 70 72 65  oc is.** the pre
17a80 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65  viously allocate
17a90 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  d size of the ar
17aa0 72 61 79 2e 20 20 69 6e 69 74 53 69 7a 65 20 69  ray.  initSize i
17ab0 73 20 74 68 65 0a 2a 2a 20 73 75 67 67 65 73 74  s the.** suggest
17ac0 65 64 20 69 6e 69 74 69 61 6c 20 61 72 72 61 79  ed initial array
17ad0 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74 69 6f 6e   size allocation
17ae0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65  ..**.** The inde
17af0 78 20 6f 66 20 74 68 65 20 6e 65 77 20 65 6e 74  x of the new ent
17b00 72 79 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ry is returned i
17b10 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54  n *pIdx..**.** T
17b20 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
17b30 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  rns a pointer to
17b40 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 62   the array of ob
17b50 6a 65 63 74 73 2e 20 20 54 68 69 73 0a 2a 2a 20  jects.  This.** 
17b60 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
17b70 65 20 61 73 20 74 68 65 20 70 41 72 72 61 79 20  e as the pArray 
17b80 70 61 72 61 6d 65 74 65 72 20 6f 72 20 69 74 20  parameter or it 
17b90 6d 69 67 68 74 20 62 65 20 61 20 64 69 66 66 65  might be a diffe
17ba0 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rent.** pointer 
17bb0 69 66 20 74 68 65 20 61 72 72 61 79 20 77 61 73  if the array was
17bc0 20 72 65 73 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69   resized..*/.voi
17bd0 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41  d *sqlite3ArrayA
17be0 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74  llocate(.  sqlit
17bf0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20  e3 *db,      /* 
17c00 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  Connection to no
17c10 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66  tify of malloc f
17c20 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69  ailures */.  voi
17c30 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f  d *pArray,     /
17c40 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63  * Array of objec
17c50 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65  ts.  Might be re
17c60 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
17c70 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20  nt szEntry,     
17c80 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68   /* Size of each
17c90 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61   object in the a
17ca0 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rray */.  int in
17cb0 69 74 53 69 7a 65 2c 20 20 20 20 20 2f 2a 20 53  itSize,     /* S
17cc0 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
17cd0 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20   allocation, in 
17ce0 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  elements */.  in
17cf0 74 20 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20  t *pnEntry,     
17d00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a  /* Number of obj
17d10 65 63 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69  ects currently i
17d20 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  n use */.  int *
17d30 70 6e 41 6c 6c 6f 63 2c 20 20 20 20 20 2f 2a 20  pnAlloc,     /* 
17d40 43 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  Current size of 
17d50 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20  the allocation, 
17d60 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20  in elements */. 
17d70 20 69 6e 74 20 2a 70 49 64 78 20 20 20 20 20 20   int *pIdx      
17d80 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
17d90 69 6e 64 65 78 20 6f 66 20 61 20 6e 65 77 20 73  index of a new s
17da0 6c 6f 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lot here */.){. 
17db0 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
17dc0 2a 70 6e 45 6e 74 72 79 20 3e 3d 20 2a 70 6e 41  *pnEntry >= *pnA
17dd0 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 76 6f 69 64  lloc ){.    void
17de0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
17df0 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 6e 65 77  newSize;.    new
17e00 53 69 7a 65 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63  Size = (*pnAlloc
17e10 29 2a 32 20 2b 20 69 6e 69 74 53 69 7a 65 3b 0a  )*2 + initSize;.
17e20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74      pNew = sqlit
17e30 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
17e40 70 41 72 72 61 79 2c 20 6e 65 77 53 69 7a 65 2a  pArray, newSize*
17e50 73 7a 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66  szEntry);.    if
17e60 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
17e70 20 20 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20     *pIdx = -1;. 
17e80 20 20 20 20 20 72 65 74 75 72 6e 20 70 41 72 72       return pArr
17e90 61 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  ay;.    }.    *p
17ea0 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  nAlloc = sqlite3
17eb0 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c  DbMallocSize(db,
17ec0 20 70 4e 65 77 29 2f 73 7a 45 6e 74 72 79 3b 0a   pNew)/szEntry;.
17ed0 20 20 20 20 70 41 72 72 61 79 20 3d 20 70 4e 65      pArray = pNe
17ee0 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 28 63 68  w;.  }.  z = (ch
17ef0 61 72 2a 29 70 41 72 72 61 79 3b 0a 20 20 6d 65  ar*)pArray;.  me
17f00 6d 73 65 74 28 26 7a 5b 2a 70 6e 45 6e 74 72 79  mset(&z[*pnEntry
17f10 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20   * szEntry], 0, 
17f20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64  szEntry);.  *pId
17f30 78 20 3d 20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20  x = *pnEntry;.  
17f40 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 72 65  ++*pnEntry;.  re
17f50 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 7d 0a 0a  turn pArray;.}..
17f60 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
17f70 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
17f80 65 20 67 69 76 65 6e 20 49 64 4c 69 73 74 2e 20  e given IdList. 
17f90 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 49 64   Create a new Id
17fa0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
17fb0 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  be..**.** A new 
17fc0 49 64 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e  IdList is return
17fd0 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6d  ed, or NULL if m
17fe0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
17ff0 2f 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  /.IdList *sqlite
18000 33 49 64 4c 69 73 74 41 70 70 65 6e 64 28 73 71  3IdListAppend(sq
18010 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
18020 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
18030 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 69 6e 74 20  *pToken){.  int 
18040 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
18050 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
18060 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
18070 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
18080 49 64 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69  IdList) );.    i
18090 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
180a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73  turn 0;.    pLis
180b0 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
180c0 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
180d0 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
180e0 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
180f0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
18100 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
18110 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
18120 20 35 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74   5,.      &pList
18130 2d 3e 6e 49 64 2c 0a 20 20 20 20 20 20 26 70 4c  ->nId,.      &pL
18140 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20  ist->nAlloc,.   
18150 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66 28     &i.  );.  if(
18160 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69   i<0 ){.    sqli
18170 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
18180 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
18190 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
181a0 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  pList->a[i].zNam
181b0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
181c0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f  romToken(db, pTo
181d0 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ken);.  return p
181e0 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
181f0 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74 2e  elete an IdList.
18200 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
18210 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71 6c  IdListDelete(sql
18220 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73 74  ite3 *db, IdList
18230 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
18240 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
18250 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
18260 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
18270 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
18280 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
18290 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
182a0 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
182b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
182c0 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
182d0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
182e0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
182f0 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e  urn the index in
18300 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69 64   pList of the id
18310 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20 7a  entifier named z
18320 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a  Id.  Return -1.*
18330 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  * if not found..
18340 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 64  */.int sqlite3Id
18350 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73 74  ListIndex(IdList
18360 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20 63   *pList, const c
18370 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
18380 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
18390 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  t==0 ) return -1
183a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
183b0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
183c0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
183d0 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61  StrICmp(pList->a
183e0 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65  [i].zName, zName
183f0 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  )==0 ) return i;
18400 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
18410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e  ;.}../*.** Expan
18420 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c 6f  d the space allo
18430 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67 69  cated for the gi
18440 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a 65  ven SrcList obje
18450 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69 6e  ct by.** creatin
18460 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c 6f  g nExtra new slo
18470 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  ts beginning at 
18480 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74 20  iStart.  iStart 
18490 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a 2a  is zero based..*
184a0 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65 20  * New slots are 
184b0 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  zeroed..**.** Fo
184c0 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70 6f  r example, suppo
184d0 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e 69  se a SrcList ini
184e0 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73 20  tially contains 
184f0 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c 42  two entries: A,B
18500 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20 33  ..** To append 3
18510 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e 74   new entries ont
18520 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74 68  o the end, do th
18530 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c  is:.**.**    sql
18540 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72  ite3SrcListEnlar
18550 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74 2c  ge(db, pSrclist,
18560 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66   3, 2);.**.** Af
18570 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62 6f  ter the call abo
18580 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e 74  ve it would cont
18590 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c 2c  ain:  A, B, nil,
185a0 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66   nil, nil..** If
185b0 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67 75   the iStart argu
185c0 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31 20  ment had been 1 
185d0 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74 68  instead of 2, th
185e0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  en the result.**
185f0 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
18600 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20  :  A, nil, nil, 
18610 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65 70  nil, B.  To prep
18620 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f 74  end the new slot
18630 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72 74  s,.** the iStart
18640 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65 20   value would be 
18650 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 74  0.  The result t
18660 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a  hen would.** be:
18670 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20   nil, nil, nil, 
18680 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  A, B..**.** If a
18690 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
186a0 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72 63  on fails the Src
186b0 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67 65  List is unchange
186c0 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d  d.  The.** db->m
186d0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
186e0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
186f0 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74  true..*/.SrcList
18700 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74   *sqlite3SrcList
18710 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69 74  Enlarge(.  sqlit
18720 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a  e3 *db,       /*
18730 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
18740 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f  tion to notify o
18750 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f 0a  f OOM errors */.
18760 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
18770 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63 4c       /* The SrcL
18780 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72 67  ist to be enlarg
18790 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  ed */.  int nExt
187a0 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ra,        /* Nu
187b0 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f 74  mber of new slot
187c0 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72 63  s to add to pSrc
187d0 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ->a[] */.  int i
187e0 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f 2a  Start         /*
187f0 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d 3e   Index in pSrc->
18800 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65 77  a[] of first new
18810 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e   slot */.){.  in
18820 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  t i;..  /* Sanit
18830 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63 61  y checking on ca
18840 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  lling parameters
18850 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 53   */.  assert( iS
18860 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  tart>=0 );.  ass
18870 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20 29  ert( nExtra>=1 )
18880 3b 0a 20 20 69 66 28 20 70 53 72 63 3d 3d 30 20  ;.  if( pSrc==0 
18890 7c 7c 20 69 53 74 61 72 74 3e 70 53 72 63 2d 3e  || iStart>pSrc->
188a0 6e 53 72 63 20 29 7b 0a 20 20 20 20 61 73 73 65  nSrc ){.    asse
188b0 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
188c0 69 6c 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75  iled );.    retu
188d0 72 6e 20 70 53 72 63 3b 0a 20 20 7d 0a 0a 20 20  rn pSrc;.  }..  
188e0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69  /* Allocate addi
188f0 74 69 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20  tional space if 
18900 6e 65 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20  needed */.  if( 
18910 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
18920 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29  a>pSrc->nAlloc )
18930 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
18940 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  New;.    int nAl
18950 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63  loc = pSrc->nSrc
18960 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74  +nExtra;.    int
18970 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20   nGot;.    pNew 
18980 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
18990 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20  oc(db, pSrc,.   
189a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
189b0 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c  of(*pSrc) + (nAl
189c0 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53  loc-1)*sizeof(pS
189d0 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  rc->a[0]) );.   
189e0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
189f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
18a00 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
18a10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
18a20 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Src;.    }.    p
18a30 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  Src = pNew;.    
18a40 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44  nGot = (sqlite3D
18a50 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
18a60 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a  pNew) - sizeof(*
18a70 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53  pSrc))/sizeof(pS
18a80 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20  rc->a[0])+1;.   
18a90 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pSrc->nAlloc = 
18aa0 28 75 31 36 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a  (u16)nGot;.  }..
18ab0 20 20 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69    /* Move existi
18ac0 6e 67 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f  ng slots that co
18ad0 6d 65 20 61 66 74 65 72 20 74 68 65 20 6e 65 77  me after the new
18ae0 6c 79 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74  ly inserted slot
18af0 73 0a 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68  s.  ** out of th
18b00 65 20 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69  e way */.  for(i
18b10 3d 70 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69  =pSrc->nSrc-1; i
18b20 3e 3d 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a  >=iStart; i--){.
18b30 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45      pSrc->a[i+nE
18b40 78 74 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b  xtra] = pSrc->a[
18b50 69 5d 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e  i];.  }.  pSrc->
18b60 6e 53 72 63 20 2b 3d 20 28 69 31 36 29 6e 45 78  nSrc += (i16)nEx
18b70 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20  tra;..  /* Zero 
18b80 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  the newly alloca
18b90 74 65 64 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d  ted slots */.  m
18ba0 65 6d 73 65 74 28 26 70 53 72 63 2d 3e 61 5b 69  emset(&pSrc->a[i
18bb0 53 74 61 72 74 5d 2c 20 30 2c 20 73 69 7a 65 6f  Start], 0, sizeo
18bc0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45  f(pSrc->a[0])*nE
18bd0 78 74 72 61 29 3b 0a 20 20 66 6f 72 28 69 3d 69  xtra);.  for(i=i
18be0 53 74 61 72 74 3b 20 69 3c 69 53 74 61 72 74 2b  Start; i<iStart+
18bf0 6e 45 78 74 72 61 3b 20 69 2b 2b 29 7b 0a 20 20  nExtra; i++){.  
18c00 20 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75    pSrc->a[i].iCu
18c10 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a  rsor = -1;.  }..
18c20 20 20 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f    /* Return a po
18c30 69 6e 74 65 72 20 74 6f 20 74 68 65 20 65 6e 6c  inter to the enl
18c40 61 72 67 65 64 20 53 72 63 4c 69 73 74 20 2a 2f  arged SrcList */
18c50 0a 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a  .  return pSrc;.
18c60 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  }.../*.** Append
18c70 20 61 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d   a new table nam
18c80 65 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 53  e to the given S
18c90 72 63 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20  rcList.  Create 
18ca0 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 69 66  a new SrcList if
18cb0 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 20 20 41 20  .** need be.  A 
18cc0 6e 65 77 20 65 6e 74 72 79 20 69 73 20 63 72 65  new entry is cre
18cd0 61 74 65 64 20 69 6e 20 74 68 65 20 53 72 63 4c  ated in the SrcL
18ce0 69 73 74 20 65 76 65 6e 20 69 66 20 70 54 6f 6b  ist even if pTok
18cf0 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  en is NULL..**.*
18d00 2a 20 41 20 53 72 63 4c 69 73 74 20 69 73 20 72  * A SrcList is r
18d10 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c  eturned, or NULL
18d20 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
18d30 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 54 68 65 20  OOM error.  The 
18d40 72 65 74 75 72 6e 65 64 0a 2a 2a 20 53 72 63 4c  returned.** SrcL
18d50 69 73 74 20 6d 69 67 68 74 20 62 65 20 74 68 65  ist might be the
18d60 20 73 61 6d 65 20 61 73 20 74 68 65 20 53 72 63   same as the Src
18d70 4c 69 73 74 20 74 68 61 74 20 77 61 73 20 69 6e  List that was in
18d80 70 75 74 20 6f 72 20 69 74 20 6d 69 67 68 74 20  put or it might 
18d90 62 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 2e  be.** a new one.
18da0 20 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f    If an OOM erro
18db0 72 20 64 6f 65 73 20 6f 63 63 75 72 73 2c 20 74  r does occurs, t
18dc0 68 65 6e 20 74 68 65 20 70 72 69 6f 72 20 76 61  hen the prior va
18dd0 6c 75 65 20 6f 66 20 70 4c 69 73 74 0a 2a 2a 20  lue of pList.** 
18de0 74 68 61 74 20 69 73 20 69 6e 70 75 74 20 74 6f  that is input to
18df0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18e00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
18e10 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  reed..**.** If p
18e20 44 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  Database is not 
18e30 6e 75 6c 6c 2c 20 69 74 20 6d 65 61 6e 73 20 74  null, it means t
18e40 68 61 74 20 74 68 65 20 74 61 62 6c 65 20 68 61  hat the table ha
18e50 73 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a  s an optional.**
18e60 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 70   database name p
18e70 72 65 66 69 78 2e 20 20 4c 69 6b 65 20 74 68 69  refix.  Like thi
18e80 73 3a 20 20 22 64 61 74 61 62 61 73 65 2e 74 61  s:  "database.ta
18e90 62 6c 65 22 2e 20 20 54 68 65 20 70 44 61 74 61  ble".  The pData
18ea0 62 61 73 65 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  base.** points t
18eb0 6f 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  o the table name
18ec0 20 61 6e 64 20 74 68 65 20 70 54 61 62 6c 65 20   and the pTable 
18ed0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 64 61  points to the da
18ee0 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20  tabase name..** 
18ef0 54 68 65 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  The SrcList.a[].
18f00 7a 4e 61 6d 65 20 66 69 65 6c 64 20 69 73 20 66  zName field is f
18f10 69 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74  illed with the t
18f20 61 62 6c 65 20 6e 61 6d 65 20 77 68 69 63 68 20  able name which 
18f30 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d 65 20 66 72  might.** come fr
18f40 6f 6d 20 70 54 61 62 6c 65 20 28 69 66 20 70 44  om pTable (if pD
18f50 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 29  atabase is NULL)
18f60 20 6f 72 20 66 72 6f 6d 20 70 44 61 74 61 62 61   or from pDataba
18f70 73 65 2e 20 20 0a 2a 2a 20 53 72 63 4c 69 73 74  se.  .** SrcList
18f80 2e 61 5b 5d 2e 7a 44 61 74 61 62 61 73 65 20 69  .a[].zDatabase i
18f90 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74 68  s filled with th
18fa0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20  e database name 
18fb0 66 72 6f 6d 20 70 54 61 62 6c 65 2c 0a 2a 2a 20  from pTable,.** 
18fc0 6f 72 20 77 69 74 68 20 4e 55 4c 4c 20 69 66 20  or with NULL if 
18fd0 6e 6f 20 64 61 74 61 62 61 73 65 20 69 73 20 73  no database is s
18fe0 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
18ff0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
19000 69 66 20 63 61 6c 6c 20 6c 69 6b 65 20 74 68 69  if call like thi
19010 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
19020 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
19030 70 70 65 6e 64 28 44 2c 41 2c 42 2c 30 29 3b 0a  ppend(D,A,B,0);.
19040 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42 20 69 73 20  **.** Then B is 
19050 61 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  a table name and
19060 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
19070 6d 65 20 69 73 20 75 6e 73 70 65 63 69 66 69 65  me is unspecifie
19080 64 2e 20 20 49 66 20 63 61 6c 6c 65 64 0a 2a 2a  d.  If called.**
19090 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
190a0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
190b0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
190c0 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,C);.**.** T
190d0 68 65 6e 20 43 20 69 73 20 74 68 65 20 74 61 62  hen C is the tab
190e0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 42 20 69 73  le name and B is
190f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
19100 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a  me..*/.SrcList *
19110 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19120 70 65 6e 64 28 0a 20 20 73 71 6c 69 74 65 33 20  pend(.  sqlite3 
19130 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  *db,        /* C
19140 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
19150 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
19160 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53 72 63 4c  ilures */.  SrcL
19170 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20  ist *pList,     
19180 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
19190 73 20 53 72 63 4c 69 73 74 2e 20 4e 55 4c 4c 20  s SrcList. NULL 
191a0 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 53 72  creates a new Sr
191b0 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  cList */.  Token
191c0 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20 20 2f   *pTable,      /
191d0 2a 20 54 61 62 6c 65 20 74 6f 20 61 70 70 65 6e  * Table to appen
191e0 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  d */.  Token *pD
191f0 61 74 61 62 61 73 65 20 20 20 20 2f 2a 20 44 61  atabase    /* Da
19200 74 61 62 61 73 65 20 6f 66 20 74 68 65 20 74 61  tabase of the ta
19210 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ble */.){.  stru
19220 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
19230 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
19240 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
19250 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ist = sqlite3DbM
19260 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
19270 7a 65 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b  zeof(SrcList) );
19280 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
19290 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
192a0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
192b0 3d 20 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  = 1;.  }.  pList
192c0 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
192d0 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69  tEnlarge(db, pLi
192e0 73 74 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53  st, 1, pList->nS
192f0 72 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  rc);.  if( db->m
19300 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
19310 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
19320 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
19330 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  t);.    return 0
19340 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
19350 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
19360 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20  >nSrc-1];.  if( 
19370 70 44 61 74 61 62 61 73 65 20 26 26 20 70 44 61  pDatabase && pDa
19380 74 61 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a  tabase->z==0 ){.
19390 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d 20      pDatabase = 
193a0 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61  0;.  }.  if( pDa
193b0 74 61 62 61 73 65 20 26 26 20 70 54 61 62 6c 65  tabase && pTable
193c0 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70   ){.    Token *p
193d0 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65  Temp = pDatabase
193e0 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20  ;.    pDatabase 
193f0 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54  = pTable;.    pT
19400 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20  able = pTemp;.  
19410 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  }.  pItem->zName
19420 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
19430 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62  omToken(db, pTab
19440 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44  le);.  pItem->zD
19450 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65  atabase = sqlite
19460 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
19470 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20  b, pDatabase);. 
19480 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
19490 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56  ../*.** Assign V
194a0 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20  dbeCursor index 
194b0 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74  numbers to all t
194c0 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69  ables in a SrcLi
194d0 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  st.*/.void sqlit
194e0 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43  e3SrcListAssignC
194f0 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50  ursors(Parse *pP
19500 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70  arse, SrcList *p
19510 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
19520 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19530 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19540 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20  assert(pList || 
19550 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
19560 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
19570 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66  ( pList ){.    f
19580 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
19590 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
195a0 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
195b0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
195c0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d  pItem->iCursor>=
195d0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
195e0 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20   pItem->iCursor 
195f0 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
19600 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
19610 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  m->pSelect ){.  
19620 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
19630 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72  ListAssignCursor
19640 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  s(pParse, pItem-
19650 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b  >pSelect->pSrc);
19660 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19670 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
19680 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63  te an entire Src
19690 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61  List including a
196a0 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74  ll its substruct
196b0 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ure..*/.void sql
196c0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
196d0 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  e(sqlite3 *db, S
196e0 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  rcList *pList){.
196f0 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
19700 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19710 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
19720 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
19730 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
19740 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69  t->a, i=0; i<pLi
19750 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
19760 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
19770 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
19780 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29  Item->zDatabase)
19790 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
197a0 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a  ree(db, pItem->z
197b0 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  Name);.    sqlit
197c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74  e3DbFree(db, pIt
197d0 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
197e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
197f0 62 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  b, pItem->zIndex
19800 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  );.    sqlite3De
19810 6c 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d  leteTable(pItem-
19820 3e 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69  >pTab);.    sqli
19830 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
19840 64 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  db, pItem->pSele
19850 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
19860 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
19870 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
19880 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
19890 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
198a0 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71  Using);.  }.  sq
198b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
198c0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
198d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
198e0 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
198f0 61 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e  arser to add a n
19900 65 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a  ew term to the.*
19910 2a 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69  * end of a growi
19920 6e 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  ng FROM clause. 
19930 20 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74   The "p" paramet
19940 65 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f  er is the part o
19950 66 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  f.** the FROM cl
19960 61 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c  ause that has al
19970 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74  ready been const
19980 72 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20  ructed.  "p" is 
19990 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20  NULL.** if this 
199a0 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72  is the first ter
199b0 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  m of the FROM cl
199c0 61 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e  ause.  pTable an
199d0 64 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61  d pDatabase.** a
199e0 72 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  re the name of t
199f0 68 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74  he table and dat
19a00 61 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74  abase named in t
19a10 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
19a20 65 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73  erm..** pDatabas
19a30 65 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65  e is NULL if the
19a40 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71   database name q
19a50 75 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73  ualifier is miss
19a60 69 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75  ing - the.** usu
19a70 61 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65  al case.  If the
19a80 20 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69 61   term has a alia
19a90 73 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70  s, then pAlias p
19aa0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
19ab0 61 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66  alias token.  If
19ac0 20 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73   the term is a s
19ad0 75 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53  ubquery, then pS
19ae0 75 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a  ubquery is the.*
19af0 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  * SELECT stateme
19b00 6e 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71  nt that the subq
19b10 75 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54  uery encodes.  T
19b20 68 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a  he pTable and.**
19b30 20 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d   pDatabase param
19b40 65 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66  eters are NULL f
19b50 6f 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20  or subqueries.  
19b60 54 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69  The pOn and pUsi
19b70 6e 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73  ng.** parameters
19b80 20 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74   are the content
19b90 20 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55   of the ON and U
19ba0 53 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a  SING clauses..**
19bb0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77  .** Return a new
19bc0 20 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65   SrcList which e
19bd0 6e 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52  ncodes is the FR
19be0 4f 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a  OM with the new.
19bf0 2a 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a  ** term added..*
19c00 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74  /.SrcList *sqlit
19c10 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46  e3SrcListAppendF
19c20 72 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65  romTerm(.  Parse
19c30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
19c40 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
19c50 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
19c60 73 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  st *p,          
19c70 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70     /* The left p
19c80 61 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  art of the FROM 
19c90 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73  clause already s
19ca0 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  een */.  Token *
19cb0 70 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  pTable,         
19cc0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19cd0 74 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20  table to add to 
19ce0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
19cf0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74  */.  Token *pDat
19d00 61 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  abase,       /* 
19d10 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
19d20 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
19d30 70 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65  pTable */.  Toke
19d40 6e 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20  n *pAlias,      
19d50 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
19d60 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
19d70 65 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69  e AS subexpressi
19d80 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  on */.  Select *
19d90 70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20  pSubquery,      
19da0 2f 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73  /* A subquery us
19db0 65 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61  ed in place of a
19dc0 20 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20   table name */. 
19dd0 20 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20   Expr *pOn,     
19de0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19df0 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a  ON clause of a j
19e00 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20  oin */.  IdList 
19e10 2a 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20  *pUsing         
19e20 20 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c   /* The USING cl
19e30 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a  ause of a join *
19e40 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72  /.){.  struct Sr
19e50 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
19e60 6d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  m;.  sqlite3 *db
19e70 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
19e80 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
19e90 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
19ea0 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
19eb0 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
19ec0 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b  || p->nSrc==0 ){
19ed0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19ee0 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b  Delete(db, pOn);
19ef0 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
19f00 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73  stDelete(db, pUs
19f10 69 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ing);.    sqlite
19f20 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
19f30 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
19f40 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a    return p;.  }.
19f50 20 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b    pItem = &p->a[
19f60 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66  p->nSrc-1];.  if
19f70 28 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69  ( pAlias && pAli
19f80 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74  as->n ){.    pIt
19f90 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
19fa0 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
19fb0 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20  n(db, pAlias);. 
19fc0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c   }.  pItem->pSel
19fd0 65 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b  ect = pSubquery;
19fe0 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20  .  pItem->pOn = 
19ff0 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55  pOn;.  pItem->pU
1a000 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20  sing = pUsing;. 
1a010 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a020 0a 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58  .** Add an INDEX
1a030 45 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44  ED BY or NOT IND
1a040 45 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74  EXED clause to t
1a050 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
1a060 20 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65   added .** eleme
1a070 6e 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65  nt of the source
1a080 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20  -list passed as 
1a090 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
1a0a0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
1a0b0 69 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78  ite3SrcListIndex
1a0c0 65 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72  edBy(Parse *pPar
1a0d0 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  se, SrcList *p, 
1a0e0 54 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42  Token *pIndexedB
1a0f0 79 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  y){.  if( pIndex
1a100 65 64 42 79 20 26 26 20 70 20 26 26 20 70 2d 3e  edBy && p && p->
1a110 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 73 74  nSrc>0 ){.    st
1a120 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1a130 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61  m *pItem = &p->a
1a140 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20  [p->nSrc-1];.   
1a150 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1a160 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26  notIndexed==0 &&
1a170 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d   pItem->zIndex==
1a180 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
1a190 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26  dexedBy->n==1 &&
1a1a0 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20   !pIndexedBy->z 
1a1b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e  ){.      /* A "N
1a1c0 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75  OT INDEXED" clau
1a1d0 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e  se was supplied.
1a1e0 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20   See parse.y .  
1a1f0 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
1a200 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66   "indexed_opt" f
1a210 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20  or details. */. 
1a220 20 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49       pItem->notI
1a230 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20  ndexed = 1;.    
1a240 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74  }else{.      pIt
1a250 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c  em->zIndex = sql
1a260 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
1a270 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49  n(pParse->db, pI
1a280 6e 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d  ndexedBy);.    }
1a290 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68  .  }.}../*.** Wh
1a2a0 65 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61  en building up a
1a2b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20   FROM clause in 
1a2c0 74 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20  the parser, the 
1a2d0 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  join operator.**
1a2e0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74   is initially at
1a2f0 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65  tached to the le
1a300 66 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74  ft operand.  But
1a310 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1a320 74 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74  tor.** expects t
1a330 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72  he join operator
1a340 20 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69   to be on the ri
1a350 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
1a360 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68  is routine.** Sh
1a370 69 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70  ifts all join op
1a380 65 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66  erators from lef
1a390 74 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61  t to right for a
1a3a0 6e 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a  n entire FROM.**
1a3b0 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45   clause..**.** E
1a3c0 78 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20  xample: Suppose 
1a3d0 74 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65  the join is like
1a3e0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1a3f0 20 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c         A natural
1a400 20 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a   cross join B.**
1a410 0a 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72  .** The operator
1a420 20 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f   is "natural cro
1a430 73 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41  ss join".  The A
1a440 20 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20   and B operands 
1a450 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e  are stored.** in
1a460 20 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e   p->a[0] and p->
1a470 61 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65  a[1], respective
1a480 6c 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20  ly.  The parser 
1a490 69 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73  initially stores
1a4a0 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72   the.** operator
1a4b0 20 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72   with A.  This r
1a4c0 6f 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68  outine shifts th
1a4d0 61 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72  at operator over
1a4e0 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73   to B..*/.void s
1a4f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69  qlite3SrcListShi
1a500 66 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69  ftJoinType(SrcLi
1a510 73 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20  st *p){.  if( p 
1a520 26 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69  && p->a ){.    i
1a530 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
1a540 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20  p->nSrc-1; i>0; 
1a550 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  i--){.      p->a
1a560 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  [i].jointype = p
1a570 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
1a580 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  e;.    }.    p->
1a590 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20  a[0].jointype = 
1a5a0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1a5b0 42 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74  Begin a transact
1a5c0 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1a5d0 74 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74  te3BeginTransact
1a5e0 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1a5f0 65 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20  e, int type){.  
1a600 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
1a610 64 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b  dbe *v;.  int i;
1a620 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d 3d  ..  if( pParse==
1a630 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65 2d  0 || (db=pParse-
1a640 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  >db)==0 || db->a
1a650 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72  Db[0].pBt==0 ) r
1a660 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
1a670 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
1a680 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1a690 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 71  return;.  if( sq
1a6a0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1a6b0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52  Parse, SQLITE_TR
1a6c0 41 4e 53 41 43 54 49 4f 4e 2c 20 22 42 45 47 49  ANSACTION, "BEGI
1a6d0 4e 22 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75  N", 0, 0) ) retu
1a6e0 72 6e 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74  rn;..  v = sqlit
1a6f0 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1a700 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
1a710 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65  turn;.  if( type
1a720 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b  !=TK_DEFERRED ){
1a730 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1a740 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
1a750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a760 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61  AddOp2(v, OP_Tra
1a770 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
1a780 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
1a790 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+1);.      sqli
1a7a0 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
1a7b0 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (v, i);.    }.  
1a7c0 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
1a7d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
1a7e0 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
1a7f0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
1a800 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1a810 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
1a820 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
1a830 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
1a840 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56  sqlite3 *db;.  V
1a850 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70  dbe *v;..  if( p
1a860 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d  Parse==0 || (db=
1a870 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c  pParse->db)==0 |
1a880 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  | db->aDb[0].pBt
1a890 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1a8a0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1a8b0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
1a8c0 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20  iled ) return;. 
1a8d0 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
1a8e0 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
1a8f0 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
1a900 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
1a910 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
1a920 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1a930 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1a940 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1a950 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a960 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1a970 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1a980 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 74 72 61  * Rollback a tra
1a990 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1a9a0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
1a9b0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73  Transaction(Pars
1a9c0 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
1a9d0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1a9e0 65 20 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61  e *v;..  if( pPa
1a9f0 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50  rse==0 || (db=pP
1aa00 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20  arse->db)==0 || 
1aa10 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d  db->aDb[0].pBt==
1aa20 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
1aa30 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
1aa40 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1aa50 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  ed ) return;.  i
1aa60 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
1aa70 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1aa80 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20  TE_TRANSACTION, 
1aa90 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c 20 30  "ROLLBACK", 0, 0
1aaa0 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76  ) ) return;..  v
1aab0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1aac0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1aad0 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
1aae0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1aaf0 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c  P_AutoCommit, 1,
1ab00 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   1);.  }.}../*.*
1ab10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ab20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
1ab30 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74 20   parser when it 
1ab40 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64  parses a command
1ab50 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72   to create,.** r
1ab60 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
1ab70 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70 6f  ck an SQL savepo
1ab80 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  int. .*/.void sq
1ab90 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28 50  lite3Savepoint(P
1aba0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
1abb0 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  t op, Token *pNa
1abc0 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61  me){.  char *zNa
1abd0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1abe0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1abf0 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
1ac00 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
1ac10 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
1ac20 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
1ac30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
1ac40 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
1ac50 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63 20  TION.    static 
1ac60 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 5d  const char *az[]
1ac70 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22 52   = { "BEGIN", "R
1ac80 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42 41  ELEASE", "ROLLBA
1ac90 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65 72  CK" };.    asser
1aca0 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42 45  t( !SAVEPOINT_BE
1acb0 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e 54  GIN && SAVEPOINT
1acc0 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20 53  _RELEASE==1 && S
1acd0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
1ace0 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 20  K==2 );.#endif. 
1acf0 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71 6c     if( !v || sql
1ad00 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
1ad10 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41 56  arse, SQLITE_SAV
1ad20 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20  EPOINT, az[op], 
1ad30 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20 20  zName, 0) ){.   
1ad40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1ad50 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61  (pParse->db, zNa
1ad60 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
1ad70 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
1ad80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1ad90 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c 20  , OP_Savepoint, 
1ada0 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c  op, 0, 0, zName,
1adb0 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
1adc0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
1add0 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64 61  sure the TEMP da
1ade0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20 61  tabase is open a
1adf0 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  nd available for
1ae00 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a   use.  Return.**
1ae10 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
1ae20 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61 6e  rrors.  Leave an
1ae30 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  y error messages
1ae40 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73   in the pParse s
1ae50 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74  tructure..*/.int
1ae60 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
1ae70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20 2a  Database(Parse *
1ae80 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
1ae90 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1aea0 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 61  >db;.  if( db->a
1aeb0 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26 20  Db[1].pBt==0 && 
1aec0 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e  !pParse->explain
1aed0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1aee0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1aef0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20 20   int flags = .  
1af00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
1af10 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 0a  PEN_READWRITE |.
1af20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1af30 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20  _OPEN_CREATE |. 
1af40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1af50 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
1af60 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1af70 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1af80 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
1af90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
1afa0 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d 20  P_DB;..    rc = 
1afb0 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63 74  sqlite3BtreeFact
1afc0 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 53 51  ory(db, 0, 0, SQ
1afd0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
1afe0 48 45 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c 0a  HE_SIZE, flags,.
1aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b010 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74   &db->aDb[1].pBt
1b020 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b030 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b040 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1b050 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
1b060 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  e to open a temp
1b070 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20 22  orary database "
1b080 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20 66  .        "file f
1b090 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70 6f  or storing tempo
1b0a0 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a 20  rary tables");. 
1b0b0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20       pParse->rc 
1b0c0 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75  = rc;.      retu
1b0d0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1b0e0 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c 61  assert( (db->fla
1b0f0 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54 72  gs & SQLITE_InTr
1b100 61 6e 73 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61  ans)==0 || db->a
1b110 75 74 6f 43 6f 6d 6d 69 74 20 29 3b 0a 20 20 20  utoCommit );.   
1b120 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
1b130 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20  [1].pSchema );. 
1b140 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a     sqlite3PagerJ
1b150 6f 75 72 6e 61 6c 4d 6f 64 65 28 73 71 6c 69 74  ournalMode(sqlit
1b160 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d  e3BtreePager(db-
1b170 3e 61 44 62 5b 31 5d 2e 70 42 74 29 2c 0a 20 20  >aDb[1].pBt),.  
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 64 66            db->df
1b1a0 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a  ltJournalMode);.
1b1b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1b1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b1d0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1b1e0 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68 65   will verify the
1b1f0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 61   schema cookie a
1b200 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72 65  nd start.** a re
1b210 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ad-transaction f
1b220 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61 74  or all named dat
1b230 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a  abase files..**.
1b240 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  ** It is importa
1b250 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68 65  nt that all sche
1b260 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76 65  ma cookies be ve
1b270 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a 2a  rified and all.*
1b280 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74 69  * read transacti
1b290 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20 62  ons be started b
1b2a0 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20 65  efore anything e
1b2b0 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a 2a  lse happens in.*
1b2c0 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  * the VDBE progr
1b2d0 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72 6f  am.  But this ro
1b2e0 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61 6c  utine can be cal
1b2f0 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20 6f  led after much o
1b300 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61 73  ther.** code has
1b310 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64 2e   been generated.
1b320 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68 61    So here is wha
1b330 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54  t we do:.**.** T
1b340 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
1b350 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b360 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61 6e  lled, we code an
1b370 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a 2a   OP_Goto that.**
1b380 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61 20   will jump to a 
1b390 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74 68  subroutine at th
1b3a0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72 6f  e end of the pro
1b3b0 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a 2a  gram.  Then we.*
1b3c0 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20 64  * record every d
1b3d0 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65 65  atabase that nee
1b3e0 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76 65  ds its schema ve
1b3f0 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a  rified in the.**
1b400 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d   pParse->cookieM
1b410 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74 65  ask field.  Late
1b420 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74 68  r, after all oth
1b430 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65 6e  er code has been
1b440 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20 74  .** generated, t
1b450 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74 68  he subroutine th
1b460 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f 6b  at does the cook
1b470 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  ie verifications
1b480 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20 74   and.** starts t
1b490 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  he transactions 
1b4a0 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61 6e  will be coded an
1b4b0 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50 32  d the OP_Goto P2
1b4c0 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62   value.** will b
1b4d0 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  e made to point 
1b4e0 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74 69  to that subrouti
1b4f0 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61 74  ne.  The generat
1b500 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ion of the.** co
1b510 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f  okie verificatio
1b520 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f 64  n subroutine cod
1b530 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71 6c  e happens in sql
1b540 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67  ite3FinishCoding
1b550 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ()..**.** If iDb
1b560 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68 65  <0 then code the
1b570 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20   OP_Goto only - 
1b580 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20 74  don't set flag t
1b590 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a 20  o verify the.** 
1b5a0 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64 61  schema on any da
1b5b0 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20 63  tabases.  This c
1b5c0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70 6f  an be used to po
1b5d0 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47 6f  sition the OP_Go
1b5e0 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20 74  to.** early in t
1b5f0 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65 20  he code, before 
1b600 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20 64  we know if any d
1b610 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20 77  atabase tables w
1b620 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f 0a  ill be used..*/.
1b630 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65  void sqlite3Code
1b640 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61 72  VerifySchema(Par
1b650 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1b660 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  iDb){.  sqlite3 
1b670 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  *db;.  Vdbe *v;.
1b680 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20 76    int mask;..  v
1b690 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
1b6a0 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
1b6b0 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20   v==0 ) return; 
1b6c0 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
1b6d0 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20 77  ppens if there w
1b6e0 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f 72  as a prior error
1b6f0 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72 73   */.  db = pPars
1b700 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50 61  e->db;.  if( pPa
1b710 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d  rse->cookieGoto=
1b720 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  =0 ){.    pParse
1b730 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 73  ->cookieGoto = s
1b740 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1b750 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1b760 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  0)+1;.  }.  if( 
1b770 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61 73  iDb>=0 ){.    as
1b780 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
1b790 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  b );.    assert(
1b7a0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42   db->aDb[iDb].pB
1b7b0 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20 29  t!=0 || iDb==1 )
1b7c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 44  ;.    assert( iD
1b7d0 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  b<SQLITE_MAX_ATT
1b7e0 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20 6d  ACHED+2 );.    m
1b7f0 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  ask = 1<<iDb;.  
1b800 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e 63    if( (pParse->c
1b810 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73 6b  ookieMask & mask
1b820 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  )==0 ){.      pP
1b830 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1b840 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
1b850 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56 61  pParse->cookieVa
1b860 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e 61  lue[iDb] = db->a
1b870 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d  Db[iDb].pSchema-
1b880 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a  >schema_cookie;.
1b890 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f        if( !OMIT_
1b8a0 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31  TEMPDB && iDb==1
1b8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b8c0 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61 62  te3OpenTempDatab
1b8d0 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ase(pParse);.   
1b8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1b8f0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1b900 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74 20   VDBE code that 
1b910 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f 69  prepares for doi
1b920 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  ng an operation 
1b930 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63 68  that.** might ch
1b940 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61 73  ange the databas
1b950 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
1b960 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20 6e  utine starts a n
1b970 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ew transaction i
1b980 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c 72  f we are not alr
1b990 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20 61  eady within.** a
1b9a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49   transaction.  I
1b9b0 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64 79  f we are already
1b9c0 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73 61   within a transa
1b9d0 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63 68  ction, then a ch
1b9e0 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20 73  eckpoint.** is s
1b9f0 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74 61  et if the setSta
1ba00 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65 72  tement parameter
1ba10 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68 65   is true.  A che
1ba20 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a 2a  ckpoint should.*
1ba30 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70 65  * be set for ope
1ba40 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69 67  rations that mig
1ba50 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f 20  ht fail (due to 
1ba60 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70 61  a constraint) pa
1ba70 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61 79  rt of.** the way
1ba80 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68 69   through and whi
1ba90 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  ch will need to 
1baa0 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65 73  undo some writes
1bab0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1bac0 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  to.** rollback t
1bad0 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61 63  he whole transac
1bae0 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72 61  tion.  For opera
1baf0 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c 20  tions where all 
1bb00 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 63  constraints.** c
1bb10 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62 65  an be checked be
1bb20 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1bb30 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
1bb40 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69 73   database, it is
1bb50 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73 73   never.** necess
1bb60 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77 72  ary to undo a wr
1bb70 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65 63  ite and the chec
1bb80 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e 6f  kpoint should no
1bb90 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69  t be set..*/.voi
1bba0 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72  d sqlite3BeginWr
1bbb0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61 72  iteOperation(Par
1bbc0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
1bbd0 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69 6e  setStatement, in
1bbe0 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
1bbf0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1bc00 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1bc10 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
1bc20 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
1bc30 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
1bc40 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72 73  e, iDb);.  pPars
1bc50 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d 20  e->writeMask |= 
1bc60 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73 65  1<<iDb;.  if( se
1bc70 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 50  tStatement && pP
1bc80 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
1bc90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
1bca0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 53  beAddOp1(v, OP_S
1bcb0 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b 0a  tatement, iDb);.
1bcc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65    }.}../*.** Che
1bcd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e  ck to see if pIn
1bce0 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c  dex uses the col
1bcf0 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1bd00 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a  pColl.  Return.*
1bd10 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65  * true if it doe
1bd20 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69  s and false if i
1bd30 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23  t does not..*/.#
1bd40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bd50 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1bd60 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d  c int collationM
1bd70 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20  atch(const char 
1bd80 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70  *zColl, Index *p
1bd90 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b  Index){.  int i;
1bda0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
1bdb0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  ndex->nColumn; i
1bdc0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
1bdd0 68 61 72 20 2a 7a 20 3d 20 70 49 6e 64 65 78 2d  har *z = pIndex-
1bde0 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
1bdf0 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20  if( z==zColl || 
1be00 28 7a 20 26 26 20 7a 43 6f 6c 6c 20 26 26 20 30  (z && zColl && 0
1be10 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1be20 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20  (z, zColl)) ){. 
1be30 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1be40 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1be50 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
1be60 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
1be70 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
1be80 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
1be90 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1bea0 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
1beb0 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
1bec0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1bed0 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
1bee0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bef0 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1bf00 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
1bf10 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
1bf20 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
1bf30 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
1bf40 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
1bf50 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
1bf60 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
1bf70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1bf80 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
1bf90 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
1bfa0 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
1bfb0 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
1bfc0 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
1bfd0 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
1bfe0 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
1bff0 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
1c000 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
1c010 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
1c020 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
1c030 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
1c040 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1c050 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
1c060 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
1c070 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1c080 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1c090 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
1c0a0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
1c0b0 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
1c0c0 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
1c0d0 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
1c0e0 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
1c0f0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
1c100 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1c110 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
1c120 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
1c130 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
1c140 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
1c150 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
1c160 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
1c170 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
1c180 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1c190 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1c1a0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1c1b0 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1d0 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
1c1e0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
1c1f0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
1c200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1c210 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
1c220 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
1c230 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
1c240 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
1c250 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1c260 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
1c270 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1c280 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1c290 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
1c2a0 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
1c2b0 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
1c2c0 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
1c2d0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c2e0 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c  */..  for(iDb=0,
1c2f0 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44   pDb=db->aDb; iD
1c300 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b  b<db->nDb; iDb++
1c310 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73  , pDb++){.    as
1c320 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a  sert( pDb!=0 );.
1c330 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
1c340 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
1c350 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
1c360 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
1c370 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
1c380 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
1c390 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
1c3a0 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64  (k);.      reind
1c3b0 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  exTable(pParse, 
1c3c0 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  pTab, zColl);.  
1c3d0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1c3e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
1c3f0 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45   code for the RE
1c400 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  INDEX command..*
1c410 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  *.**        REIN
1c420 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20  DEX             
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
1c440 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 1.**        RE
1c450 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f  INDEX  <collatio
1c460 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n>              
1c470 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20   -- 2.**        
1c480 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62  REINDEX  ?<datab
1c490 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65  ase>.?<tablename
1c4a0 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20  >  -- 3.**      
1c4b0 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74    REINDEX  ?<dat
1c4c0 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61  abase>.?<indexna
1c4d0 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20  me>  -- 4.**.** 
1c4e0 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c  Form 1 causes al
1c4f0 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c  l indices in all
1c500 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
1c510 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c  ses to be rebuil
1c520 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62  t..** Form 2 reb
1c530 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65  uilds all indice
1c540 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
1c550 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20  es that use the 
1c560 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69  named.** collati
1c570 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f  ng function.  Fo
1c580 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75  rms 3 and 4 rebu
1c590 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e  ild the named in
1c5a0 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e  dex or all.** in
1c5b0 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64  dices associated
1c5c0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20   with the named 
1c5d0 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  table..*/.#ifnde
1c5e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45  f SQLITE_OMIT_RE
1c5f0 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74  INDEX.void sqlit
1c600 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20  e3Reindex(Parse 
1c610 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1c620 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70  pName1, Token *p
1c630 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65  Name2){.  CollSe
1c640 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20  q *pColl;       
1c650 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
1c660 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62  ng sequence to b
1c670 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20  e reindexed, or 
1c680 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
1c690 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z;              
1c6a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c6b0 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65   a table or inde
1c6c0 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  x */.  const cha
1c6d0 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
1c6e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1c6f0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1c700 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
1c710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1c720 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
1c730 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65  tabase */.  Inde
1c740 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20  x *pIndex;      
1c750 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1c760 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  dex associated w
1c770 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  ith pTab */.  in
1c780 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
1c790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c7a0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
1c7b0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69  number */.  sqli
1c7c0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1c7d0 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64  ->db;   /* The d
1c7e0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c7f0 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  on */.  Token *p
1c800 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  ObjName;        
1c810 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1c820 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  he table or inde
1c830 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  x to be reindexe
1c840 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  d */..  /* Read 
1c850 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
1c860 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
1c870 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
1c880 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
1c890 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
1c8a0 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
1c8b0 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
1c8c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
1c8d0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
1c8e0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
1c8f0 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
1c900 20 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e   pName1==0 || pN
1c910 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  ame1->z==0 ){.  
1c920 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61 73    reindexDatabas
1c930 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a 20  es(pParse, 0);. 
1c940 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
1c950 73 65 20 69 66 28 20 70 4e 61 6d 65 32 3d 3d 30  se if( pName2==0
1c960 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30   || pName2->z==0
1c970 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43   ){.    char *zC
1c980 6f 6c 6c 3b 0a 20 20 20 20 61 73 73 65 72 74 28  oll;.    assert(
1c990 20 70 4e 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20   pName1->z );.  
1c9a0 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    zColl = sqlite
1c9b0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
1c9c0 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65  Parse->db, pName
1c9d0 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 43 6f  1);.    if( !zCo
1c9e0 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ll ) return;.   
1c9f0 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
1ca00 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
1ca10 45 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20  ENC(db), zColl, 
1ca20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  -1, 0);.    if( 
1ca30 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  pColl ){.      i
1ca40 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( zColl ){.    
1ca50 20 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62      reindexDatab
1ca60 61 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f  ases(pParse, zCo
1ca70 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ll);.        sql
1ca80 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1ca90 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Coll);.      }. 
1caa0 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1cab0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
1cac0 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
1cad0 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1cae0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
1caf0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
1cb00 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61 6d  pName2, &pObjNam
1cb10 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30 20  e);.  if( iDb<0 
1cb20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d 20  ) return;.  z = 
1cb30 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1cb40 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61 6d  oken(db, pObjNam
1cb50 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
1cb60 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20 3d   return;.  zDb =
1cb70 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
1cb80 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  ame;.  pTab = sq
1cb90 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
1cba0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69 66  b, z, zDb);.  if
1cbb0 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72 65  ( pTab ){.    re
1cbc0 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72 73  indexTable(pPars
1cbd0 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20 20  e, pTab, 0);.   
1cbe0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1cbf0 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75 72  b, z);.    retur
1cc00 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78 20  n;.  }.  pIndex 
1cc10 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  = sqlite3FindInd
1cc20 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  ex(db, z, zDb);.
1cc30 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1cc40 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70 49  db, z);.  if( pI
1cc50 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
1cc60 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
1cc70 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
1cc80 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , iDb);.    sqli
1cc90 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1cca0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1ccb0 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  1);.    return;.
1ccc0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
1ccd0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1cce0 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69 66  nable to identif
1ccf0 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f 20  y the object to 
1cd00 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b 0a  be reindexed");.
1cd10 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1cd20 52 65 74 75 72 6e 20 61 20 64 79 6e 61 6d 69 63  Return a dynamic
1cd30 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 4b 65 79  ly allocated Key
1cd40 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
1cd50 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 0a  hat can be used.
1cd60 2a 2a 20 77 69 74 68 20 4f 50 5f 4f 70 65 6e 52  ** with OP_OpenR
1cd70 65 61 64 20 6f 72 20 4f 50 5f 4f 70 65 6e 57 72  ead or OP_OpenWr
1cd80 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 64 61  ite to access da
1cd90 74 61 62 61 73 65 20 69 6e 64 65 78 20 70 49 64  tabase index pId
1cda0 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  x..**.** If succ
1cdb0 65 73 73 66 75 6c 2c 20 61 20 70 6f 69 6e 74 65  essful, a pointe
1cdc0 72 20 74 6f 20 74 68 65 20 6e 65 77 20 73 74 72  r to the new str
1cdd0 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 6e  ucture is return
1cde0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
1cdf0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
1ce00 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1ce10 72 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  r calling sqlite
1ce20 33 44 62 46 72 65 65 28 64 62 2c 20 29 20 6f 6e  3DbFree(db, ) on
1ce30 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 0a 2a   the returned .*
1ce40 2a 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 61 6e  * pointer. If an
1ce50 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 6f   error occurs (o
1ce60 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 6f 72 20  ut of memory or 
1ce70 6d 69 73 73 69 6e 67 20 63 6f 6c 6c 61 74 69 6f  missing collatio
1ce80 6e 20 0a 2a 2a 20 73 65 71 75 65 6e 63 65 29 2c  n .** sequence),
1ce90 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1cea0 64 20 61 6e 64 20 74 68 65 20 73 74 61 74 65 20  d and the state 
1ceb0 6f 66 20 70 50 61 72 73 65 20 75 70 64 61 74 65  of pParse update
1cec0 64 20 74 6f 20 72 65 66 6c 65 63 74 0a 2a 2a 20  d to reflect.** 
1ced0 74 68 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65  the error..*/.Ke
1cee0 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 49 6e  yInfo *sqlite3In
1cef0 64 65 78 4b 65 79 69 6e 66 6f 28 50 61 72 73 65  dexKeyinfo(Parse
1cf00 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
1cf10 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
1cf20 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
1cf30 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
1cf40 6e 74 20 6e 42 79 74 65 73 20 3d 20 73 69 7a 65  nt nBytes = size
1cf50 6f 66 28 4b 65 79 49 6e 66 6f 29 20 2b 20 28 6e  of(KeyInfo) + (n
1cf60 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66 28 43 6f  Col-1)*sizeof(Co
1cf70 6c 6c 53 65 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a  llSeq*) + nCol;.
1cf80 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1cf90 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 4b 65  pParse->db;.  Ke
1cfa0 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 28 4b  yInfo *pKey = (K
1cfb0 65 79 49 6e 66 6f 20 2a 29 73 71 6c 69 74 65 33  eyInfo *)sqlite3
1cfc0 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1cfd0 20 6e 42 79 74 65 73 29 3b 0a 0a 20 20 69 66 28   nBytes);..  if(
1cfe0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 70 4b 65   pKey ){.    pKe
1cff0 79 2d 3e 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  y->db = pParse->
1d000 64 62 3b 0a 20 20 20 20 70 4b 65 79 2d 3e 61 53  db;.    pKey->aS
1d010 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20 2a  ortOrder = (u8 *
1d020 29 26 28 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e  )&(pKey->aColl[n
1d030 43 6f 6c 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  Col]);.    asser
1d040 74 28 20 26 70 4b 65 79 2d 3e 61 53 6f 72 74 4f  t( &pKey->aSortO
1d050 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28  rder[nCol]==&(((
1d060 75 38 20 2a 29 70 4b 65 79 29 5b 6e 42 79 74 65  u8 *)pKey)[nByte
1d070 73 5d 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  s]) );.    for(i
1d080 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1d090 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 43  {.      char *zC
1d0a0 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f  oll = pIdx->azCo
1d0b0 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  ll[i];.      ass
1d0c0 65 72 74 28 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20  ert( zColl );.  
1d0d0 20 20 20 20 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b      pKey->aColl[
1d0e0 69 5d 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  i] = sqlite3Loca
1d0f0 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  teCollSeq(pParse
1d100 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20  , zColl, -1);.  
1d110 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
1d120 72 64 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e  rder[i] = pIdx->
1d130 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
1d140 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 2d 3e 6e     }.    pKey->n
1d150 46 69 65 6c 64 20 3d 20 28 75 31 36 29 6e 43 6f  Field = (u16)nCo
1d160 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  l;.  }..  if( pP
1d170 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
1d180 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
1d190 64 62 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 70  db, pKey);.    p
1d1a0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
1d1b0 65 74 75 72 6e 20 70 4b 65 79 3b 0a 7d 0a        eturn pKey;.}.