/ Hex Artifact Content
Login

Artifact d9890c52f02a009aa7bd280218b3505e291a7670:


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 34 32 20 32 30 30 39 2f 30 35 2f 31 33  1.542 2009/05/13
02f0: 20 31 37 3a 32 31 3a 31 34 20 64 72 68 20 45 78   17:21:14 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 4e 45  ck *p;..  if( NE
08d0: 56 45 52 28 69 44 62 3c 30 29 20 29 20 72 65 74  VER(iDb<0) ) ret
08e0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
08f0: 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  i<pParse->nTable
0900: 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Lock; i++){.    
0910: 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 54 61  p = &pParse->aTa
0920: 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20  bleLock[i];.    
0930: 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20  if( p->iDb==iDb 
0940: 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62  && p->iTab==iTab
0950: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57   ){.      p->isW
0960: 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69  riteLock = (p->i
0970: 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73  sWriteLock || is
0980: 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
0990: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
09a0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20    }..  nBytes = 
09b0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b  sizeof(TableLock
09c0: 29 20 2a 20 28 70 50 61 72 73 65 2d 3e 6e 54 61  ) * (pParse->nTa
09d0: 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20 20 70 50  bleLock+1);.  pP
09e0: 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  arse->aTableLock
09f0: 20 3d 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65   = .      sqlite
0a00: 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
0a10: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 50 61  (pParse->db, pPa
0a20: 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b 2c  rse->aTableLock,
0a30: 20 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20   nBytes);.  if( 
0a40: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a50: 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70  ck ){.    p = &p
0a60: 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f 63  Parse->aTableLoc
0a70: 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  k[pParse->nTable
0a80: 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20 70 2d 3e  Lock++];.    p->
0a90: 69 44 62 20 3d 20 69 44 62 3b 0a 20 20 20 20 70  iDb = iDb;.    p
0aa0: 2d 3e 69 54 61 62 20 3d 20 69 54 61 62 3b 0a 20  ->iTab = iTab;. 
0ab0: 20 20 20 70 2d 3e 69 73 57 72 69 74 65 4c 6f 63     p->isWriteLoc
0ac0: 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b  k = isWriteLock;
0ad0: 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20  .    p->zName = 
0ae0: 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zName;.  }else{.
0af0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62      pParse->nTab
0b00: 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  leLock = 0;.    
0b10: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
0b20: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
0b30: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  }.}../*.** Code 
0b40: 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 20  an OP_TableLock 
0b50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 66 6f 72 20  instruction for 
0b60: 65 61 63 68 20 74 61 62 6c 65 20 6c 6f 63 6b 65  each table locke
0b70: 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 61 74  d by the.** stat
0b80: 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67 75 72 65  ement (configure
0b90: 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
0ba0: 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 29  lite3TableLock()
0bb0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
0bc0: 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73  d codeTableLocks
0bd0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
0be0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
0bf0: 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20 70 56 64   *pVdbe; ..  pVd
0c00: 62 65 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  be = sqlite3GetV
0c10: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61  dbe(pParse);.  a
0c20: 73 73 65 72 74 28 20 70 56 64 62 65 21 3d 30 20  ssert( pVdbe!=0 
0c30: 29 3b 20 2f 2a 20 73 71 6c 69 74 65 33 47 65 74  ); /* sqlite3Get
0c40: 56 64 62 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Vdbe cannot fail
0c50: 3a 20 56 44 42 45 20 61 6c 72 65 61 64 79 20 61  : VDBE already a
0c60: 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 0a 20 20 66  llocated */..  f
0c70: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
0c80: 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b  ->nTableLock; i+
0c90: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63  +){.    TableLoc
0ca0: 6b 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e  k *p = &pParse->
0cb0: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0cc0: 20 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69     int p1 = p->i
0cd0: 44 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  Db;.    sqlite3V
0ce0: 64 62 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c  dbeAddOp4(pVdbe,
0cf0: 20 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70   OP_TableLock, p
0d00: 31 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69  1, p->iTab, p->i
0d10: 73 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20  sWriteLock,.    
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53    p->zName, P4_S
0d40: 54 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65  TATIC);.  }.}.#e
0d50: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f  lse.  #define co
0d60: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a  deTableLocks(x).
0d70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0d80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
0d90: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e  lled after a sin
0da0: 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  gle SQL statemen
0db0: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61  t has been.** pa
0dc0: 72 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20  rsed and a VDBE 
0dd0: 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75  program to execu
0de0: 74 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e  te that statemen
0df0: 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72  t has been.** pr
0e00: 65 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f  epared.  This ro
0e10: 75 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66  utine puts the f
0e20: 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73  inishing touches
0e30: 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20   on the.** VDBE 
0e40: 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65  program and rese
0e50: 74 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74  ts the pParse st
0e60: 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
0e70: 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a  next.** parse..*
0e80: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
0e90: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
0ea0: 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65  red, it might be
0eb0: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a   the case that.*
0ec0: 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77  * no VDBE code w
0ed0: 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f  as generated..*/
0ee0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e  .void sqlite3Fin
0ef0: 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20  ishCoding(Parse 
0f00: 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
0f10: 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
0f20: 2a 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72  *v;..  db = pPar
0f30: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62  se->db;.  if( db
0f40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
0f50: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
0f60: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20  Parse->nested ) 
0f70: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f80: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
0f90: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e  urn;..  /* Begin
0fa0: 20 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73   by generating s
0fb0: 6f 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  ome termination 
0fc0: 63 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20  code at the end 
0fd0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65  of the.  ** vdbe
0fe0: 20 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20   program.  */.  
0ff0: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1000: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1010: 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1020: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
1030: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f  OP_Halt);..    /
1040: 2a 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73  * The cookie mas
1050: 6b 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62  k contains one b
1060: 69 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61  it for each data
1070: 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a  base file open..
1080: 20 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73      ** (Bit 0 is
1090: 20 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31   for main, bit 1
10a0: 20 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e   is for temp, an
10b0: 64 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69  d so forth.)  Bi
10c0: 74 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65  ts are.    ** se
10d0: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
10e0: 61 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ase that is used
10f0: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
1100: 20 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20   to start a.    
1110: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  ** transaction o
1120: 6e 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61  n each used data
1130: 62 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69  base and to veri
1140: 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1150: 6f 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65  okie.    ** on e
1160: 61 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73  ach used databas
1170: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1180: 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  ( pParse->cookie
1190: 47 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20  Goto>0 ){.      
11a0: 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20  u32 mask;.      
11b0: 69 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73  int iDb;.      s
11c0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
11d0: 72 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f  re(v, pParse->co
11e0: 6f 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20  okieGoto-1);.   
11f0: 20 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61     for(iDb=0, ma
1200: 73 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  sk=1; iDb<db->nD
1210: 62 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62  b; mask<<=1, iDb
1220: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
1230: 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d   (mask & pParse-
1240: 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20  >cookieMask)==0 
1250: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1260: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
1270: 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
1280: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1290: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50  3VdbeAddOp2(v,OP
12a0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44  _Transaction, iD
12b0: 62 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73  b, (mask & pPars
12c0: 65 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30  e->writeMask)!=0
12d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
12e0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
12f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
1300: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1310: 2c 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65  ,OP_VerifyCookie
1320: 2c 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63  , iDb, pParse->c
1330: 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29  ookieValue[iDb])
1340: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1350: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1360: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
1370: 41 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  ABLE.      {.   
1380: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1390: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
13a0: 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b  Parse->nVtabLock
13b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
13c0: 20 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28    char *vtab = (
13d0: 63 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 61  char *)pParse->a
13e0: 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d 3e 70 56  pVtabLock[i]->pV
13f0: 74 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73  tab;.          s
1400: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1410: 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30  (v, OP_VBegin, 0
1420: 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34  , 0, 0, vtab, P4
1430: 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 20 20  _VTAB);.        
1440: 7d 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  }.        pParse
1450: 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b  ->nVtabLock = 0;
1460: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1470: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61  .      /* Once a
1480: 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68  ll the cookies h
1490: 61 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65  ave been verifie
14a0: 64 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f  d and transactio
14b0: 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20  ns opened, .    
14c0: 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20    ** obtain the 
14d0: 72 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c  required table-l
14e0: 6f 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20  ocks. This is a 
14f0: 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65  no-op unless the
1500: 20 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65   .      ** share
1510: 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20  d-cache feature 
1520: 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
1530: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54    */.      codeT
1540: 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65  ableLocks(pParse
1550: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1560: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1570: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
1580: 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20  ->cookieGoto);. 
1590: 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
15a0: 47 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f  Get the VDBE pro
15b0: 67 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65  gram ready for e
15c0: 78 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20  xecution.  */.  
15d0: 69 66 28 20 76 20 26 26 20 41 4c 57 41 59 53 28  if( v && ALWAYS(
15e0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29  pParse->nErr==0)
15f0: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46   && !db->mallocF
1600: 61 69 6c 65 64 20 29 7b 0a 23 69 66 64 65 66 20  ailed ){.#ifdef 
1610: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1620: 20 46 49 4c 45 20 2a 74 72 61 63 65 20 3d 20 28   FILE *trace = (
1630: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
1640: 54 45 5f 56 64 62 65 54 72 61 63 65 29 21 3d 30  TE_VdbeTrace)!=0
1650: 20 3f 20 73 74 64 6f 75 74 20 3a 20 30 3b 0a 20   ? stdout : 0;. 
1660: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
1670: 61 63 65 28 76 2c 20 74 72 61 63 65 29 3b 0a 23  ace(v, trace);.#
1680: 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
1690: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
16a0: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
16b0: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
16c0: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
16d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
16e0: 4d 61 6b 65 52 65 61 64 79 28 76 2c 20 70 50 61  MakeReady(v, pPa
16f0: 72 73 65 2d 3e 6e 56 61 72 2c 20 70 50 61 72 73  rse->nVar, pPars
1700: 65 2d 3e 6e 4d 65 6d 2c 0a 20 20 20 20 20 20 20  e->nMem,.       
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2c 20    pParse->nTab, 
1730: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 29  pParse->explain)
1740: 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  ;.    pParse->rc
1750: 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1760: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e      pParse->colN
1770: 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d  amesSet = 0;.  }
1780: 65 6c 73 65 20 69 66 28 20 70 50 61 72 73 65 2d  else if( pParse-
1790: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
17a0: 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63  {.    pParse->rc
17b0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
17c0: 0a 20 20 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e  .  }.  pParse->n
17d0: 54 61 62 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Tab = 0;.  pPars
17e0: 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 20 70  e->nMem = 0;.  p
17f0: 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d 20 30 3b  Parse->nSet = 0;
1800: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20  .  pParse->nVar 
1810: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 63  = 0;.  pParse->c
1820: 6f 6f 6b 69 65 4d 61 73 6b 20 3d 20 30 3b 0a 20  ookieMask = 0;. 
1830: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1840: 6f 74 6f 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  oto = 0;.}../*.*
1850: 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65 72  * Run the parser
1860: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
1870: 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79 20  tor recursively 
1880: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65  in order to gene
1890: 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72  rate.** code for
18a0: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
18b0: 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68  nt given onto th
18c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61  e end of the pPa
18d0: 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63  rse context.** c
18e0: 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
18f0: 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68  onstruction.  Wh
1900: 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69 73  en the parser is
1910: 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79   run recursively
1920: 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68  .** this way, th
1930: 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20  e final OP_Halt 
1940: 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20  is not appended 
1950: 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61  and other initia
1960: 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  lization.** and 
1970: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65  finalization ste
1980: 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62  ps are omitted b
1990: 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72 65  ecause those are
19a0: 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65   handling by the
19b0: 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61  .** outermost pa
19c0: 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20  rser..**.** Not 
19d0: 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65  everything is ne
19e0: 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61  stable.  This fa
19f0: 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e  cility is design
1a00: 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20  ed to permit.** 
1a10: 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20  INSERT, UPDATE, 
1a20: 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61  and DELETE opera
1a30: 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51  tions against SQ
1a40: 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73  LITE_MASTER.  Us
1a50: 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75  e.** care if you
1a60: 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20 74   decide to try t
1a70: 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74 69  o use this routi
1a80: 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ne for some othe
1a90: 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76  r purposes..*/.v
1aa0: 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65  oid sqlite3Neste
1ab0: 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70 50  dParse(Parse *pP
1ac0: 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  arse, const char
1ad0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
1ae0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1af0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
1b00: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
1b10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
1b20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20  = pParse->db;.# 
1b30: 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20  define SAVE_SZ  
1b40: 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d  (sizeof(Parse) -
1b50: 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c   offsetof(Parse,
1b60: 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20 73 61  nVar)).  char sa
1b70: 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a  veBuf[SAVE_SZ];.
1b80: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1b90: 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  Err ) return;.  
1ba0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1bb0: 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a  nested<10 );  /*
1bc0: 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20   Nesting should 
1bd0: 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74  only be of limit
1be0: 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61  ed depth */.  va
1bf0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
1c00: 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  at);.  zSql = sq
1c10: 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62  lite3VMPrintf(db
1c20: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
1c30: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1c40: 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20  if( zSql==0 ){. 
1c50: 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20     return;   /* 
1c60: 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  A malloc must ha
1c70: 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d  ve failed */.  }
1c80: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1c90: 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61  d++;.  memcpy(sa
1ca0: 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e  veBuf, &pParse->
1cb0: 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a  nVar, SAVE_SZ);.
1cc0: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
1cd0: 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f  ->nVar, 0, SAVE_
1ce0: 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75  SZ);.  sqlite3Ru
1cf0: 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c 20  nParser(pParse, 
1d00: 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b  zSql, &zErrMsg);
1d10: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1d20: 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
1d30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1d40: 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63  b, zSql);.  memc
1d50: 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  py(&pParse->nVar
1d60: 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f  , saveBuf, SAVE_
1d70: 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  SZ);.  pParse->n
1d80: 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a  ested--;.}../*.*
1d90: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
1da0: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
1db0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1dc0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
1dd0: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
1de0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
1df0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
1e00: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
1e10: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
1e20: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
1e30: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
1e40: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1e50: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
1e60: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
1e70: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
1e80: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
1e90: 72 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20  r the table and 
1ea0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6d 61 74  the.** first mat
1eb0: 63 68 69 6e 67 20 74 61 62 6c 65 20 69 73 20 72  ching table is r
1ec0: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
1ed0: 65 63 6b 69 6e 67 20 66 6f 72 20 64 75 70 6c 69  ecking for dupli
1ee0: 63 61 74 65 20 74 61 62 6c 65 0a 2a 2a 20 6e 61  cate table.** na
1ef0: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
1f00: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
1f10: 69 73 20 54 45 4d 50 20 66 69 72 73 74 2c 20 74  is TEMP first, t
1f20: 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20 61  hen MAIN, then a
1f30: 6e 79 0a 2a 2a 20 61 75 78 69 6c 69 61 72 79 20  ny.** auxiliary 
1f40: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 20  databases added 
1f50: 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43 48  using the ATTACH
1f60: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
1f70: 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
1f80: 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 0a 2a  LocateTable()..*
1f90: 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74 65 33  /.Table *sqlite3
1fa0: 46 69 6e 64 54 61 62 6c 65 28 73 71 6c 69 74 65  FindTable(sqlite
1fb0: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1fc0: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
1fd0: 63 68 61 72 20 2a 7a 44 61 74 61 62 61 73 65 29  char *zDatabase)
1fe0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 30  {.  Table *p = 0
1ff0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
2000: 20 6e 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74   nName;.  assert
2010: 28 20 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ( zName!=0 );.  
2020: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
2030: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
2040: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
2050: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
2060: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
2070: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
2080: 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68 20 54  i;   /* Search T
2090: 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20  EMP before MAIN 
20a0: 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61 74 61  */.    if( zData
20b0: 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c 69 74  base!=0 && sqlit
20c0: 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74 61 62  e3StrICmp(zDatab
20d0: 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ase, db->aDb[j].
20e0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
20f0: 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  e;.    p = sqlit
2100: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
2110: 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61 2d 3e  aDb[j].pSchema->
2120: 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20  tblHash, zName, 
2130: 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  nName);.    if( 
2140: 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  p ) break;.  }. 
2150: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
2160: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
2170: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
2180: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
2190: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  s a particular d
21a0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65  atabase.** table
21b0: 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   given the name 
21c0: 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e  of that table an
21d0: 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74  d (optionally) t
21e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a  he name of the.*
21f0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  * database conta
2200: 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e  ining the table.
2210: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
2220: 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73   not found.  Als
2230: 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72  o leave an.** er
2240: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
2250: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
2260: 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
2270: 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
2280: 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71  s routine and sq
2290: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
22a0: 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a   is that this.**
22b0: 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20   routine leaves 
22c0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
22d0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
22e0: 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c  Msg where.** sql
22f0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20  ite3FindTable() 
2300: 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62  does not..*/.Tab
2310: 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74  le *sqlite3Locat
2320: 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20  eTable(.  Parse 
2330: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
2340: 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77   /* context in w
2350: 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65  hich to report e
2360: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  rrors */.  int i
2370: 73 56 69 65 77 2c 20 20 20 20 20 20 20 20 20 20  sView,          
2380: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f    /* True if loo
2390: 6b 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20  king for a VIEW 
23a0: 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 54 41  rather than a TA
23b0: 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  BLE */.  const c
23c0: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
23d0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
23e0: 61 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b  able we are look
23f0: 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e  ing for */.  con
2400: 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20  st char *zDbase 
2410: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2420: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69  he database.  Mi
2430: 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29  ght be NULL */.)
2440: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20  {.  Table *p;.. 
2450: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
2460: 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66  abase schema. If
2470: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2480: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
2490: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e   message.  ** an
24a0: 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65  d code in pParse
24b0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
24c0: 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
24d0: 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
24e0: 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
24f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
2500: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
2510: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61  te3FindTable(pPa
2520: 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20  rse->db, zName, 
2530: 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  zDbase);.  if( p
2540: 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
2550: 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73   char *zMsg = is
2560: 56 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20  View ? "no such 
2570: 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68  view" : "no such
2580: 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69 66 28   table";.    if(
2590: 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20   zDbase ){.     
25a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
25b0: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
25c0: 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61  .%s", zMsg, zDba
25d0: 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  se, zName);.    
25e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
25f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2600: 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a  rse, "%s: %s", z
2610: 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  Msg, zName);.   
2620: 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63   }.    pParse->c
2630: 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a  heckSchema = 1;.
2640: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
2650: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
2660: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2670: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2680: 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72  cribes .** a par
2690: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69  ticular index gi
26a0: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
26b0: 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e  that index.** an
26c0: 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
26d0: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
26e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
26f0: 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55  ex..** Return NU
2700: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2710: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
2720: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
2730: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
2740: 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ched for the.** 
2750: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69  table and the fi
2760: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64  rst matching ind
2770: 65 78 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ex is returned. 
2780: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a   (No checking.**
2790: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69   for duplicate i
27a0: 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f  ndex names is do
27b0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
27c0: 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d   order is.** TEM
27d0: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
27e0: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78  IN, then any aux
27f0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2800: 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20   added.** using 
2810: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
2820: 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  nd..*/.Index *sq
2830: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73  lite3FindIndex(s
2840: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
2850: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63  t char *zName, c
2860: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
2870: 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b  .  Index *p = 0;
2880: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
2890: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
28a0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
28b0: 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54 45 4d    for(i=OMIT_TEM
28c0: 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  PDB; i<db->nDb; 
28d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 20  i++){.    int j 
28e0: 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20 3a 20  = (i<2) ? i^1 : 
28f0: 69 3b 20 20 2f 2a 20 53 65 61 72 63 68 20 54 45  i;  /* Search TE
2900: 4d 50 20 62 65 66 6f 72 65 20 4d 41 49 4e 20 2a  MP before MAIN *
2910: 2f 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  /.    Schema *pS
2920: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
2930: 6a 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  j].pSchema;.    
2940: 61 73 73 65 72 74 28 20 70 53 63 68 65 6d 61 20  assert( pSchema 
2950: 29 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  );.    if( zDb &
2960: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2970: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
2980: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
2990: 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  ue;.    p = sqli
29a0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 53 63  te3HashFind(&pSc
29b0: 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a  hema->idxHash, z
29c0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
29d0: 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b    if( p ) break;
29e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
29f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69  .}../*.** Reclai
2a00: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65  m the memory use
2a10: 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f  d by an index.*/
2a20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
2a30: 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29  eIndex(Index *p)
2a40: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
2a50: 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 4d  = p->pTable->dbM
2a60: 65 6d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  em;.  testcase( 
2a70: 64 62 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  db==0 );.  sqlit
2a80: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
2a90: 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69  zColAff);.  sqli
2aa0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
2ab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  ;.}../*.** Remov
2ac0: 65 20 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65  e the given inde
2ad0: 78 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78  x from the index
2ae0: 20 68 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64   hash table, and
2af0: 20 66 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d   free.** its mem
2b00: 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a  ory structures..
2b10: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  **.** The index 
2b20: 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
2b30: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
2b40: 68 20 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20  h tables but.** 
2b50: 69 74 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b  it is not unlink
2b60: 65 64 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c  ed from the Tabl
2b70: 65 20 74 68 61 74 20 69 74 20 69 6e 64 65 78 65  e that it indexe
2b80: 73 2e 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20  s..** Unlinking 
2b90: 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d  from the Table m
2ba0: 75 73 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74  ust be done by t
2bb0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2bc0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
2bd0: 6f 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74  oid sqlite3Delet
2be0: 65 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29  eIndex(Index *p)
2bf0: 7b 0a 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b  {.  Index *pOld;
2c00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c10: 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b  Name = p->zName;
2c20: 0a 0a 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74  ..  pOld = sqlit
2c30: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d  e3HashInsert(&p-
2c40: 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73  >pSchema->idxHas
2c50: 68 2c 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  h, zName,.      
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
2c80: 65 6e 33 30 28 7a 4e 61 6d 65 29 2c 20 30 29 3b  en30(zName), 0);
2c90: 0a 20 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d  .  assert( pOld=
2ca0: 3d 30 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b  =0 || pOld==p );
2cb0: 0a 20 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b  .  freeIndex(p);
2cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  .}../*.** For th
2cd0: 65 20 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a  e index called z
2ce0: 49 64 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73  IdxName which is
2cf0: 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61   found in the da
2d00: 74 61 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75  tabase iDb,.** u
2d10: 6e 6c 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78  nlike that index
2d20: 20 66 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20   from its Table 
2d30: 74 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20  then remove the 
2d40: 69 6e 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68  index from.** th
2d50: 65 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62  e index hash tab
2d60: 6c 65 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20  le and free all 
2d70: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2d80: 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  s associated.** 
2d90: 77 69 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a  with the index..
2da0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55  */.void sqlite3U
2db0: 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e  nlinkAndDeleteIn
2dc0: 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dex(sqlite3 *db,
2dd0: 20 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20   int iDb, const 
2de0: 63 68 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b  char *zIdxName){
2df0: 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
2e00: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48  ;.  int len;.  H
2e10: 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62  ash *pHash = &db
2e20: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
2e30: 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20  ma->idxHash;..  
2e40: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  len = sqlite3Str
2e50: 6c 65 6e 33 30 28 7a 49 64 78 4e 61 6d 65 29 3b  len30(zIdxName);
2e60: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2e70: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2e80: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2e90: 65 6e 2c 20 30 29 3b 0a 20 20 2f 2a 20 4a 75 73  en, 0);.  /* Jus
2ea0: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c  tification of AL
2eb0: 57 41 59 53 28 29 3a 20 20 54 68 69 73 20 72 6f  WAYS():  This ro
2ec0: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61  utine is only ca
2ed0: 6c 6c 65 64 20 66 72 6f 6d 20 74 68 65 0a 20 20  lled from the.  
2ee0: 2a 2a 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 20  ** OP_DropIndex 
2ef0: 6f 70 63 6f 64 65 2e 20 20 41 6e 64 20 74 68 65  opcode.  And the
2f00: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  re is no way tha
2f10: 74 20 6f 70 63 6f 64 65 20 77 69 6c 6c 20 65 76  t opcode will ev
2f20: 65 72 20 72 75 6e 0a 20 20 2a 2a 20 75 6e 6c 65  er run.  ** unle
2f30: 73 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  ss the correspon
2f40: 64 69 6e 67 20 69 6e 64 65 78 20 69 73 20 69 6e  ding index is in
2f50: 20 74 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c   the symbol tabl
2f60: 65 2e 20 2a 2f 0a 20 20 69 66 28 20 41 4c 57 41  e. */.  if( ALWA
2f70: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
2f80: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
2f90: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
2fa0: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
2fb0: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
2fc0: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
2fd0: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
2fe0: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
2ff0: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
3000: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3010: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
3020: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3030: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3040: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3050: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3060: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3070: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3080: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3090: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
30a0: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
30b0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
30c0: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
30d0: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
30e0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
30f0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
3100: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
3110: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
3120: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
3130: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
3140: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
3150: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
3160: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
3170: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
3180: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
3190: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
31a0: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
31b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
31c0: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
31d0: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
31e0: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
31f0: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
3200: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
3210: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
3220: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
3230: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
3240: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
3250: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
3260: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
3270: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
3280: 3d 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  ==0 then reset t
3290: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
32a0: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
32b0: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
32c0: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 31 20  les.  If iDb>=1 
32d0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
32e0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
32f0: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
3300: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
3310: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
3320: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
3330: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
3340: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
3350: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73    int i, j;.  as
3360: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
3370: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
3380: 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a    if( iDb==0 ){.
3390: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
33a0: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
33b0: 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  }.  for(i=iDb; i
33c0: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
33d0: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
33e0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
33f0: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
3400: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
3410: 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42  i==1 || (pDb->pB
3420: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
3430: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d  eHoldsMutex(pDb-
3440: 3e 70 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73  >pBt)));.      s
3450: 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65 65  qlite3SchemaFree
3460: 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pDb->pSchema);.
3470: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
3480: 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b>0 ) return;.  
3490: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d  }.  assert( iDb=
34a0: 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  =0 );.  db->flag
34b0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
34c0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
34d0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
34e0: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ll(db);..  /* If
34f0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
3500: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
3510: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
3520: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
3530: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
3540: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
3550: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3560: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3570: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
3580: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
3590: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
35a0: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
35b0: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
35c0: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
35d0: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
35e0: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
35f0: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
3600: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
3610: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
3620: 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  /.  for(i=j=2; i
3630: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3640: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
3650: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3660: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3670: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
3680: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3690: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pDb->zName);.  
36a0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
36b0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
36c0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
36d0: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
36e0: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
36f0: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
3700: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d    j++;.  }.  mem
3710: 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c  set(&db->aDb[j],
3720: 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a   0, (db->nDb-j)*
3730: 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a  sizeof(db->aDb[j
3740: 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d  ]));.  db->nDb =
3750: 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44   j;.  if( db->nD
3760: 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21  b<=2 && db->aDb!
3770: 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29  =db->aDbStatic )
3780: 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d  {.    memcpy(db-
3790: 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e  >aDbStatic, db->
37a0: 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62  aDb, 2*sizeof(db
37b0: 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20  ->aDb[0]));.    
37c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
37d0: 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20  , db->aDb);.    
37e0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
37f0: 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a  bStatic;.  }.}..
3800: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3810: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
3820: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
3830: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3840: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
3850: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
3860: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
3870: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3880: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
3890: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
38a0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
38b0: 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77   a table or view
38c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38d0: 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75   sqliteResetColu
38e0: 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70  mnNames(Table *p
38f0: 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b  Table){.  int i;
3900: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
3910: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
3920: 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a   pTable->dbMem;.
3930: 20 20 74 65 73 74 63 61 73 65 28 20 64 62 3d 3d    testcase( db==
3940: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
3950: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
3960: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
3970: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
3980: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
3990: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
39a0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
39b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
39c0: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
39d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
39e0: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
39f0: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
3a00: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3a10: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20   pCol->zType);. 
3a20: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3a30: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
3a40: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
3a50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3a60: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
3a70: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43    }.  pTable->aC
3a80: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
3a90: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nCol = 0;.}../
3aa0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
3ab0: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
3ac0: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3ad0: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
3ae0: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
3af0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3b00: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
3b10: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
3b20: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
3b30: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
3b40: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
3b50: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
3b60: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
3b70: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
3b80: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3b90: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
3ba0: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
3bb0: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
3bc0: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
3bd0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
3be0: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
3bf0: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  the table..*/.vo
3c00: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
3c10: 54 61 62 6c 65 28 54 61 62 6c 65 20 2a 70 54 61  Table(Table *pTa
3c20: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
3c30: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
3c40: 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70   FKey *pFKey, *p
3c50: 4e 65 78 74 46 4b 65 79 3b 0a 20 20 73 71 6c 69  NextFKey;.  sqli
3c60: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
3c70: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
3c80: 72 6e 3b 0a 20 20 64 62 20 3d 20 70 54 61 62 6c  rn;.  db = pTabl
3c90: 65 2d 3e 64 62 4d 65 6d 3b 0a 20 20 74 65 73 74  e->dbMem;.  test
3ca0: 63 61 73 65 28 20 64 62 3d 3d 30 20 29 3b 0a 0a  case( db==0 );..
3cb0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65    /* Do not dele
3cc0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74  te the table unt
3cd0: 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  il the reference
3ce0: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
3cf0: 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c 65  ero. */.  pTable
3d00: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
3d10: 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29  pTable->nRef>0 )
3d20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
3d30: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  }.  assert( pTab
3d40: 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  le->nRef==0 );..
3d50: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20    /* Delete all 
3d60: 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74  indices associat
3d70: 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61 62  ed with this tab
3d80: 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49  le.  */.  for(pI
3d90: 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e 70  ndex = pTable->p
3da0: 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
3db0: 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20 20  Index=pNext){.  
3dc0: 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78    pNext = pIndex
3dd0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73 73  ->pNext;.    ass
3de0: 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53 63  ert( pIndex->pSc
3df0: 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70 53  hema==pTable->pS
3e00: 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71 6c  chema );.    sql
3e10: 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78 28  ite3DeleteIndex(
3e20: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23 69  pIndex);.  }..#i
3e30: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3e40: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
3e50: 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66 6f  /* Delete all fo
3e60: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3e70: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
3e80: 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28  table. */.  for(
3e90: 70 46 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46  pFKey=pTable->pF
3ea0: 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65  Key; pFKey; pFKe
3eb0: 79 3d 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20  y=pNextFKey){.  
3ec0: 20 20 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46    pNextFKey = pF
3ed0: 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a  Key->pNextFrom;.
3ee0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
3ef0: 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 20 20  e(db, pFKey);.  
3f00: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44  }.#endif..  /* D
3f10: 65 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20  elete the Table 
3f20: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
3f30: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 52  ..  */.  sqliteR
3f40: 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  esetColumnNames(
3f50: 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  pTable);.  sqlit
3f60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
3f70: 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 73  ble->zName);.  s
3f80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3f90: 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41 66 66   pTable->zColAff
3fa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
3fb0: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  ctDelete(db, pTa
3fc0: 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 23  ble->pSelect);.#
3fd0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3fe0: 49 54 5f 43 48 45 43 4b 0a 20 20 73 71 6c 69 74  IT_CHECK.  sqlit
3ff0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4000: 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29   pTable->pCheck)
4010: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
4020: 65 33 56 74 61 62 43 6c 65 61 72 28 70 54 61 62  e3VtabClear(pTab
4030: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  le);.  sqlite3Db
4040: 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 29  Free(db, pTable)
4050: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  ;.}../*.** Unlin
4060: 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62 6c  k the given tabl
4070: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
4080: 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20 64  tables and the d
4090: 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61 62  elete the.** tab
40a0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69 74  le structure wit
40b0: 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63 65  h all its indice
40c0: 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65  s and foreign ke
40d0: 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ys..*/.void sqli
40e0: 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c 65  te3UnlinkAndDele
40f0: 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20  teTable(sqlite3 
4100: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63 6f  *db, int iDb, co
4110: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e 61  nst char *zTabNa
4120: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
4130: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61  .  Db *pDb;..  a
4140: 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a  ssert( db!=0 );.
4150: 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30    assert( iDb>=0
4160: 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20   && iDb<db->nDb 
4170: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61  );.  assert( zTa
4180: 62 4e 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d  bName && zTabNam
4190: 65 5b 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20  e[0] );.  pDb = 
41a0: 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20  &db->aDb[iDb];. 
41b0: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
41c0: 49 6e 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63  Insert(&pDb->pSc
41d0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a  hema->tblHash, z
41e0: 54 61 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  TabName,.       
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
4210: 28 7a 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20  (zTabName),0);. 
4220: 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
4230: 62 6c 65 28 70 29 3b 0a 20 20 64 62 2d 3e 66 6c  ble(p);.  db->fl
4240: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
4250: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
4260: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
4270: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
4280: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
4290: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
42a0: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e  f that.** token.
42b0: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
42c0: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
42d0: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
42e0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
42f0: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
4300: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
4310: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
4320: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71  ion..**.** Any q
4330: 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28  uotation marks (
4340: 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61  ex:  "name", 'na
4350: 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20  me', [name], or 
4360: 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20  `name`) that.** 
4370: 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64  surround the bod
4380: 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61  y of the token a
4390: 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a  re removed..**.*
43a0: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
43b0: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
43c0: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
43d0: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
43e0: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
43f0: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
4400: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
4410: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
4420: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
4430: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
4440: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
4450: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
4460: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4470: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  n(sqlite3 *db, T
4480: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
4490: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
44a0: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
44b0: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
44c0: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
44d0: 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  ar*)pName->z, pN
44e0: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 69 66 28  ame->n);.    if(
44f0: 20 70 4e 61 6d 65 2d 3e 71 75 6f 74 65 64 20 29   pName->quoted )
4500: 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
4510: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zName);.  }else{
4520: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a  .    zName = 0;.
4530: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61    }.  return zNa
4540: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  me;.}../*.** Ope
4550: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
4560: 74 65 72 20 74 61 62 6c 65 20 73 74 6f 72 65 64  ter table stored
4570: 20 69 6e 20 64 61 74 61 62 61 73 65 20 6e 75 6d   in database num
4580: 62 65 72 20 69 44 62 20 66 6f 72 0a 2a 2a 20 77  ber iDb for.** w
4590: 72 69 74 69 6e 67 2e 20 54 68 65 20 74 61 62 6c  riting. The tabl
45a0: 65 20 69 73 20 6f 70 65 6e 65 64 20 75 73 69 6e  e is opened usin
45b0: 67 20 63 75 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76  g cursor 0..*/.v
45c0: 6f 69 64 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d  oid sqlite3OpenM
45d0: 61 73 74 65 72 54 61 62 6c 65 28 50 61 72 73 65  asterTable(Parse
45e0: 20 2a 70 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20   *p, int iDb){. 
45f0: 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74   Vdbe *v = sqlit
4600: 65 33 47 65 74 56 64 62 65 28 70 29 3b 0a 20 20  e3GetVdbe(p);.  
4610: 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
4620: 28 70 2c 20 69 44 62 2c 20 4d 41 53 54 45 52 5f  (p, iDb, MASTER_
4630: 52 4f 4f 54 2c 20 31 2c 20 53 43 48 45 4d 41 5f  ROOT, 1, SCHEMA_
4640: 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20 73  TABLE(iDb));.  s
4650: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
4660: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
4670: 2c 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  , 0, MASTER_ROOT
4680: 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
4690: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
46a0: 20 2d 31 2c 20 28 63 68 61 72 20 2a 29 35 2c 20   -1, (char *)5, 
46b0: 50 34 5f 49 4e 54 33 32 29 3b 20 20 2f 2a 20 35  P4_INT32);  /* 5
46c0: 20 63 6f 6c 75 6d 6e 20 74 61 62 6c 65 20 2a 2f   column table */
46d0: 0a 20 20 69 66 28 20 70 2d 3e 6e 54 61 62 3d 3d  .  if( p->nTab==
46e0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 54 61 62  0 ){.    p->nTab
46f0: 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
4700: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4e 61  ** Parameter zNa
4710: 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 6e  me points to a n
4720: 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 62 75  ul-terminated bu
4730: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
4740: 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
4750: 20 64 61 74 61 62 61 73 65 20 28 22 6d 61 69 6e   database ("main
4760: 22 2c 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65  ", "temp" or the
4770: 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61   name of an atta
4780: 63 68 65 64 20 64 62 29 2e 20 54 68 69 73 0a 2a  ched db). This.*
4790: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
47a0: 6e 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ns the index of 
47b0: 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61  the named databa
47c0: 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c  se in db->aDb[],
47d0: 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20 74 68 65   or.** -1 if the
47e0: 20 6e 61 6d 65 64 20 64 62 20 63 61 6e 6e 6f 74   named db cannot
47f0: 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e   be found..*/.in
4800: 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  t sqlite3FindDbN
4810: 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
4820: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
4830: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
4840: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  1;         /* Da
4850: 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
4860: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a  .  if( zName ){.
4870: 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 20      Db *pDb;.   
4880: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
4890: 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b  Strlen30(zName);
48a0: 0a 20 20 20 20 66 6f 72 28 69 3d 28 64 62 2d 3e  .    for(i=(db->
48b0: 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26 64 62 2d  nDb-1), pDb=&db-
48c0: 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30 3b 20 69  >aDb[i]; i>=0; i
48d0: 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20 20 20 20  --, pDb--){.    
48e0: 20 20 69 66 28 20 28 21 4f 4d 49 54 5f 54 45 4d    if( (!OMIT_TEM
48f0: 50 44 42 20 7c 7c 20 69 21 3d 31 20 29 20 26 26  PDB || i!=1 ) &&
4900: 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   n==sqlite3Strle
4910: 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d 65 29 20  n30(pDb->zName) 
4920: 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 30 3d  && .          0=
4930: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
4940: 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  pDb->zName, zNam
4950: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  e) ){.        br
4960: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
4970: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4980: 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  i;.}../*.** The 
4990: 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20 63 6f 6e  token *pName con
49a0: 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 20 6f  tains the name o
49b0: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 65 69  f a database (ei
49c0: 74 68 65 72 20 22 6d 61 69 6e 22 20 6f 72 0a 2a  ther "main" or.*
49d0: 2a 20 22 74 65 6d 70 22 20 6f 72 20 74 68 65 20  * "temp" or the 
49e0: 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74 74 61 63  name of an attac
49f0: 68 65 64 20 64 62 29 2e 20 54 68 69 73 20 72 6f  hed db). This ro
4a00: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68  utine returns th
4a10: 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66 20 74 68  e.** index of th
4a20: 65 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73 65  e named database
4a30: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f   in db->aDb[], o
4a40: 72 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  r -1 if the name
4a50: 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f  d db .** does no
4a60: 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69 6e 74 20  t exist..*/.int 
4a70: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 73 71  sqlite3FindDb(sq
4a80: 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e  lite3 *db, Token
4a90: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *pName){.  int 
4aa0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
4ad0: 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ber */.  char *z
4ae0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4b00: 20 4e 61 6d 65 20 77 65 20 61 72 65 20 73 65 61   Name we are sea
4b10: 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20  rching for */.  
4b20: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
4b30: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
4b40: 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20 3d 20 73   pName);.  i = s
4b50: 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65  qlite3FindDbName
4b60: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  (db, zName);.  s
4b70: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
4b80: 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72   zName);.  retur
4b90: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 74  n i;.}../* The t
4ba0: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6f 72 20  able or view or 
4bb0: 74 72 69 67 67 65 72 20 6e 61 6d 65 20 69 73 20  trigger name is 
4bc0: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 72  passed to this r
4bd0: 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65 6e  outine via token
4be0: 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20  s.** pName1 and 
4bf0: 70 4e 61 6d 65 32 2e 20 49 66 20 74 68 65 20 74  pName2. If the t
4c00: 61 62 6c 65 20 6e 61 6d 65 20 77 61 73 20 66 75  able name was fu
4c10: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 66  lly qualified, f
4c20: 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
4c30: 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78  * CREATE TABLE x
4c40: 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 2a 2a  xx.yyy (...);.**
4c50: 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31   .** Then pName1
4c60: 20 69 73 20 73 65 74 20 74 6f 20 22 78 78 78 22   is set to "xxx"
4c70: 20 61 6e 64 20 70 4e 61 6d 65 32 20 22 79 79 79   and pName2 "yyy
4c80: 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  ". On the other 
4c90: 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68 65 20 74  hand if.** the t
4ca0: 61 62 6c 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74  able name is not
4cb0: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4cc0: 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52  , i.e.:.**.** CR
4cd0: 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28 2e  EATE TABLE yyy(.
4ce0: 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ..);.**.** Then 
4cf0: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
4d00: 20 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65   "yyy" and pName
4d10: 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a 2a 20 54  2 is ""..**.** T
4d20: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
4d30: 20 74 68 65 20 2a 70 70 55 6e 71 75 61 6c 20 70   the *ppUnqual p
4d40: 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20  ointer to point 
4d50: 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e  at the token (pN
4d60: 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e 61 6d 65  ame1 or.** pName
4d70: 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20 74  2) that stores t
4d80: 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20 74  he unqualified t
4d90: 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54 68 65 20  able name.  The 
4da0: 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20  index of the.** 
4db0: 64 61 74 61 62 61 73 65 20 22 78 78 78 22 20 69  database "xxx" i
4dc0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
4dd0: 6e 74 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  nt sqlite3TwoPar
4de0: 74 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  tName(.  Parse *
4df0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20  pParse,      /* 
4e00: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
4e10: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
4e20: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
4e30: 70 4e 61 6d 65 31 2c 20 20 20 20 20 20 2f 2a 20  pName1,      /* 
4e40: 54 68 65 20 22 78 78 78 22 20 69 6e 20 74 68 65  The "xxx" in the
4e50: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4e60: 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20 20 54 6f  or "xxx" */.  To
4e70: 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20  ken *pName2,    
4e80: 20 20 2f 2a 20 54 68 65 20 22 79 79 79 22 20 69    /* The "yyy" i
4e90: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4ea0: 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  yyy" */.  Token 
4eb0: 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20 20 2f 2a  **pUnqual     /*
4ec0: 20 57 72 69 74 65 20 74 68 65 20 75 6e 71 75 61   Write the unqua
4ed0: 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 6e 61  lified object na
4ee0: 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  me here */.){.  
4ef0: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4f10: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
4f20: 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  the object */.  
4f30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
4f40: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
4f50: 20 41 4c 57 41 59 53 28 70 4e 61 6d 65 32 21 3d   ALWAYS(pName2!=
4f60: 30 29 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  0) && pName2->n>
4f70: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 ){.    if( db-
4f80: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20  >init.busy ) {. 
4f90: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4fa0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
4fb0: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29  rrupt database")
4fc0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4fd0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
4fe0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
4ff0: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
5000: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
5010: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
5020: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
5030: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
5040: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
5050: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
5060: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
5070: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
5080: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5090: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
50a0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
50b0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
50c0: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
50d0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
50e0: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
50f0: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
5100: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
5110: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
5120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5130: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
5140: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
5150: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
5160: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
5170: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
5180: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
5190: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
51a0: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
51b0: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
51c0: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
51d0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
51e0: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
51f0: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
5200: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
5210: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
5220: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
5230: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
5240: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
5250: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
5260: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
5270: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
5280: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
5290: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
52a0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
52b0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
52c0: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
52d0: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
52e0: 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e      && (pParse->
52f0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5300: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
5310: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
5320: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
5330: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5340: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
5350: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5360: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
5370: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
5380: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
5390: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
53a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
53b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
53c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
53d0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
53e0: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
53f0: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
5400: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
5410: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
5420: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
5430: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
5440: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
5450: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
5460: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
5470: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
5480: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
5490: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
54a0: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
54b0: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
54c0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
54d0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
54e0: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
54f0: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
5500: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
5510: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
5520: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
5530: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
5540: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
5550: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
5560: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
5570: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
5580: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
5590: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
55a0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
55b0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
55c0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
55d0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
55e0: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
55f0: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
5600: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
5610: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
5620: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
5630: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5640: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
5650: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
5660: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
5670: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
5680: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
5690: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
56a0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
56b0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
56c0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
56d0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
56e0: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
56f0: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
5700: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
5710: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
5720: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
5730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
5740: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
5750: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
5760: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5770: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5780: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
5790: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
57a0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
57b0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
57c0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
57d0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
57e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
57f0: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
5800: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
5810: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5820: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
5830: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
5840: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5850: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
5860: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
5870: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
5880: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
5890: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
58a0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
58b0: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
58c0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
58d0: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
58e0: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
58f0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
5900: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
5910: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
5920: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5930: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
5940: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
5950: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5960: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
5970: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
5980: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
5990: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
59a0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
59b0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
59c0: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
59d0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
59e0: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
59f0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
5a00: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
5a10: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
5a20: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5a30: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5a40: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5a50: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
5a60: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5a70: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
5a80: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
5a90: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5aa0: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
5ab0: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
5ac0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
5ad0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
5ae0: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5af0: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5b00: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
5b10: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
5b20: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
5b30: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5b40: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5b50: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
5b60: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
5b70: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
5b80: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
5b90: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
5ba0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
5bb0: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
5bc0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5bd0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5be0: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
5bf0: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
5c00: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
5c10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
5c20: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
5c30: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
5c40: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
5c50: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
5c60: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
5c70: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
5c80: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
5c90: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
5ca0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
5cb0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5cc0: 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20  mp && iDb>1 ){. 
5cd0: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
5ce0: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
5cf0: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
5d00: 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f   be qualified */
5d10: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5d20: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
5d30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
5d40: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
5d50: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
5d60: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5d70: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5d80: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
5d90: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
5da0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
5db0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
5dc0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5dd0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5de0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
5df0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
5e00: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
5e10: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
5e20: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
5e30: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5e40: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
5e50: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
5e60: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
5e70: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
5e80: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5e90: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
5ea0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
5eb0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
5ec0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
5ed0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
5ee0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
5ef0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
5f00: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
5f10: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
5f20: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
5f30: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
5f40: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5f50: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5f60: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
5f70: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
5f80: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5f90: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
5fa0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5fb0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
5fc0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5fd0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5fe0: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
5ff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6000: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
6010: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
6020: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
6030: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6040: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
6050: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
6060: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
6070: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
6080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6090: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
60a0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
60b0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
60c0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
60d0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
60e0: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
60f0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
6100: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
6110: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
6120: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
6130: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
6140: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
6150: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
6160: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
6170: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
6180: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
6190: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
61a0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
61b0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
61c0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
61d0: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
61e0: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
61f0: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
6200: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
6210: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
6220: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
6230: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
6240: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
6250: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
6260: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
6270: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
6280: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
6290: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
62a0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
62b0: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
62c0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
62d0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
62e0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
62f0: 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20   }.    pTable = 
6300: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
6310: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
6320: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
6330: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
6340: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
6350: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
6360: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6370: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
6380: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
6390: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
63a0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
63b0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
63c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
63d0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
63e0: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
63f0: 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64  && (iDb==0 || !d
6400: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
6410: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6420: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6430: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
6440: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
6450: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
6460: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6470: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
6480: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
6490: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
64a0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
64b0: 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
64c0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
64d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
64e0: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   = 1;.    pParse
64f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6500: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
6510: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
6520: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6530: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
6540: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
6550: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
6560: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
6570: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
6580: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
6590: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
65a0: 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 1;.  pTable->
65b0: 64 62 4d 65 6d 20 3d 20 30 3b 0a 20 20 61 73 73  dbMem = 0;.  ass
65c0: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70 4e 65  ert( pParse->pNe
65d0: 77 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 70  wTable==0 );.  p
65e0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
65f0: 20 3d 20 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a   = pTable;..  /*
6600: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
6610: 6d 61 67 69 63 20 73 71 6c 69 74 65 5f 73 65 71  magic sqlite_seq
6620: 75 65 6e 63 65 20 74 61 62 6c 65 20 75 73 65 64  uence table used
6630: 20 62 79 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e   by autoincremen
6640: 74 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 72 65 63  t,.  ** then rec
6650: 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ord a pointer to
6660: 20 74 68 69 73 20 74 61 62 6c 65 20 69 6e 20 74   this table in t
6670: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
6680: 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a 20   structure.  ** 
6690: 73 6f 20 74 68 61 74 20 49 4e 53 45 52 54 20 63  so that INSERT c
66a0: 61 6e 20 66 69 6e 64 20 74 68 65 20 74 61 62 6c  an find the tabl
66b0: 65 20 65 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23  e easily..  */.#
66c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
66d0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
66e0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
66f0: 6e 65 73 74 65 64 20 26 26 20 73 74 72 63 6d 70  nested && strcmp
6700: 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  (zName, "sqlite_
6710: 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
6720: 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  .    pTable->pSc
6730: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 20 3d 20  hema->pSeqTab = 
6740: 70 54 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64  pTable;.  }.#end
6750: 69 66 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67  if..  /* Begin g
6760: 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20 63 6f  enerating the co
6770: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 73  de that will ins
6780: 65 72 74 20 74 68 65 20 74 61 62 6c 65 20 72 65  ert the table re
6790: 63 6f 72 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74  cord into.  ** t
67a0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
67b0: 20 74 61 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e   table.  Note in
67c0: 20 70 61 72 74 69 63 75 6c 61 72 20 74 68 61 74   particular that
67d0: 20 77 65 20 6d 75 73 74 20 67 6f 20 61 68 65 61   we must go ahea
67e0: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63  d.  ** and alloc
67f0: 61 74 65 20 74 68 65 20 72 65 63 6f 72 64 20 6e  ate the record n
6800: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
6810: 62 6c 65 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20  ble entry now.  
6820: 42 65 66 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20  Before any.  ** 
6830: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
6840: 4e 49 51 55 45 20 6b 65 79 77 6f 72 64 73 20 61  NIQUE keywords a
6850: 72 65 20 70 61 72 73 65 64 2e 20 20 54 68 6f 73  re parsed.  Thos
6860: 65 20 6b 65 79 77 6f 72 64 73 20 77 69 6c 6c 20  e keywords will 
6870: 63 61 75 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63  cause.  ** indic
6880: 65 73 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  es to be created
6890: 20 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 72   and the table r
68a0: 65 63 6f 72 64 20 6d 75 73 74 20 63 6f 6d 65 20  ecord must come 
68b0: 62 65 66 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a  before the .  **
68c0: 20 69 6e 64 69 63 65 73 2e 20 20 48 65 6e 63 65   indices.  Hence
68d0: 2c 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d  , the record num
68e0: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
68f0: 65 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  e must be alloca
6900: 74 65 64 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20  ted.  ** now..  
6910: 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e  */.  if( !db->in
6920: 69 74 2e 62 75 73 79 20 26 26 20 28 76 20 3d 20  it.busy && (v = 
6930: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
6940: 50 61 72 73 65 29 29 21 3d 30 20 29 7b 0a 20 20  Parse))!=0 ){.  
6950: 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e    int j1;.    in
6960: 74 20 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20  t fileFormat;.  
6970: 20 20 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32    int reg1, reg2
6980: 2c 20 72 65 67 33 3b 0a 20 20 20 20 73 71 6c 69  , reg3;.    sqli
6990: 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65  te3BeginWriteOpe
69a0: 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30  ration(pParse, 0
69b0: 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66  , iDb);..#ifndef
69c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
69d0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
69e0: 28 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20  ( isVirtual ){. 
69f0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
6a00: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65  AddOp0(v, OP_VBe
6a10: 67 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gin);.    }.#end
6a20: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
6a30: 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e  e file format an
6a40: 64 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68  d encoding in th
6a50: 65 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20  e database have 
6a60: 6e 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20  not been set, . 
6a70: 20 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e     ** set them n
6a80: 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ow..    */.    r
6a90: 65 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65  eg1 = pParse->re
6aa0: 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73  gRowid = ++pPars
6ab0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67  e->nMem;.    reg
6ac0: 32 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52  2 = pParse->regR
6ad0: 6f 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oot = ++pParse->
6ae0: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d  nMem;.    reg3 =
6af0: 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
6b00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6b10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  AddOp3(v, OP_Rea
6b20: 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65  dCookie, iDb, re
6b30: 67 33 2c 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c  g3, 1);   /* fil
6b40: 65 5f 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20  e_format */.    
6b50: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
6b60: 74 72 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20  tree(v, iDb);.  
6b70: 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
6b80: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49  beAddOp1(v, OP_I
6b90: 66 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 66 69  f, reg3);.    fi
6ba0: 6c 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e  leFormat = (db->
6bb0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c  flags & SQLITE_L
6bc0: 65 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30  egacyFileFmt)!=0
6bd0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
6be0: 20 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f       1 : SQLITE_
6bf0: 4d 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b  MAX_FILE_FORMAT;
6c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6c10: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
6c20: 65 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74  eger, fileFormat
6c30: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
6c40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
6c50: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
6c60: 69 44 62 2c 20 31 2c 20 72 65 67 33 29 3b 0a 20  iDb, 1, reg3);. 
6c70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
6c80: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
6c90: 65 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67  er, ENC(db), reg
6ca0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
6cb0: 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
6cc0: 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  SetCookie, iDb, 
6cd0: 34 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71  4, reg3);.    sq
6ce0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
6cf0: 65 28 76 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f  e(v, j1);..    /
6d00: 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65 61  * This just crea
6d10: 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64  tes a place-hold
6d20: 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68 65  er record in the
6d30: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
6d40: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  able..    ** The
6d50: 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64 20   record created 
6d60: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
6d70: 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20 20   anything yet.  
6d80: 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61  It will be repla
6d90: 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ced.    ** by th
6da0: 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e 20  e real entry in 
6db0: 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 61  code generated a
6dc0: 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  t sqlite3EndTabl
6dd0: 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  e()..    **.    
6de0: 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72  ** The rowid for
6df0: 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
6e00: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73 74  s left in regist
6e10: 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  er pParse->regRo
6e20: 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  wid..    ** The 
6e30: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
6e40: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
6e50: 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  e is left in reg
6e60: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
6e70: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77  ..    ** The row
6e80: 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  id and root page
6e90: 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20 61   number values a
6ea0: 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68 65  re needed by the
6eb0: 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20 2a   code that.    *
6ec0: 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  * sqlite3EndTabl
6ed0: 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e  e will generate.
6ee0: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65 66  .    */.#if !def
6ef0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6f00: 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e  _VIEW) || !defin
6f10: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
6f20: 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20 20  IRTUALTABLE).   
6f30: 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20 69   if( isView || i
6f40: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
6f50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6f60: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6f70: 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20 20  r, 0, reg2);.   
6f80: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
6f90: 20 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65    {.      sqlite
6fa0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6fb0: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 2c 20 69  P_CreateTable, i
6fc0: 44 62 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d  Db, reg2);.    }
6fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e  .    sqlite3Open
6fe0: 4d 61 73 74 65 72 54 61 62 6c 65 28 70 50 61 72  MasterTable(pPar
6ff0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  se, iDb);.    sq
7000: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7010: 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20  v, OP_NewRowid, 
7020: 30 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  0, reg1);.    sq
7030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7040: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
7050: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
7060: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
7070: 50 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67  P_Insert, 0, reg
7080: 33 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71  3, reg1);.    sq
7090: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
70a0: 35 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45  5(v, OPFLAG_APPE
70b0: 4e 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ND);.    sqlite3
70c0: 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50  VdbeAddOp0(v, OP
70d0: 5f 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20  _Close);.  }..  
70e0: 2f 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65  /* Normal (non-e
70f0: 72 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f  rror) return. */
7100: 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a  .  return;..  /*
7110: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7120: 75 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72  urs, we jump her
7130: 65 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65  e */.begin_table
7140: 5f 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65  _error:.  sqlite
7150: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
7160: 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  e);.  return;.}.
7170: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
7180: 6f 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  o is used to com
7190: 70 61 72 65 20 74 77 6f 20 73 74 72 69 6e 67 73  pare two strings
71a0: 20 69 6e 20 61 20 63 61 73 65 2d 69 6e 73 65 6e   in a case-insen
71b0: 73 69 74 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a  sitive manner..*
71c0: 2a 20 49 74 20 69 73 20 73 6c 69 67 68 74 6c 79  * It is slightly
71d0: 20 66 61 73 74 65 72 20 74 68 61 6e 20 63 61 6c   faster than cal
71e0: 6c 69 6e 67 20 73 71 6c 69 74 65 33 53 74 72 49  ling sqlite3StrI
71f0: 43 6d 70 28 29 20 64 69 72 65 63 74 6c 79 2c 20  Cmp() directly, 
7200: 62 75 74 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20  but.** produces 
7210: 6c 61 72 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a  larger code..**.
7220: 2a 2a 20 57 41 52 4e 49 4e 47 3a 20 54 68 69 73  ** WARNING: This
7230: 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f   macro is not co
7240: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
7250: 65 20 73 74 72 63 6d 70 28 29 20 66 61 6d 69 6c  e strcmp() famil
7260: 79 2e 20 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73  y. It.** returns
7270: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 77 6f   true if the two
7280: 20 73 74 72 69 6e 67 73 20 61 72 65 20 65 71 75   strings are equ
7290: 61 6c 2c 20 6f 74 68 65 72 77 69 73 65 20 66 61  al, otherwise fa
72a0: 6c 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  lse..*/.#define 
72b0: 53 54 52 49 43 4d 50 28 78 2c 20 79 29 20 28 5c  STRICMP(x, y) (\
72c0: 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c  .sqlite3UpperToL
72d0: 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20  ower[*(unsigned 
72e0: 63 68 61 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20  char *)(x)]==   
72f0: 5c 0a 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f  \.sqlite3UpperTo
7300: 4c 6f 77 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64  Lower[*(unsigned
7310: 20 63 68 61 72 20 2a 29 28 79 29 5d 20 20 20 20   char *)(y)]    
7320: 20 5c 0a 26 26 20 73 71 6c 69 74 65 33 53 74 72   \.&& sqlite3Str
7330: 49 43 6d 70 28 28 78 29 2b 31 2c 28 79 29 2b 31  ICmp((x)+1,(y)+1
7340: 29 3d 3d 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64  )==0 )../*.** Ad
7350: 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74  d a new column t
7360: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
7370: 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73  ently being cons
7380: 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  tructed..**.** T
7390: 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20  he parser calls 
73a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63  this routine onc
73b0: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
73c0: 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a  n declaration.**
73d0: 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42   in a CREATE TAB
73e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 73  LE statement.  s
73f0: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
7400: 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a  () gets called.*
7410: 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  * first to get t
7420: 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54 68  hings going.  Th
7430: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
7440: 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65 61  is called for ea
7450: 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f  ch.** column..*/
7460: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
7470: 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70 50  Column(Parse *pP
7480: 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
7490: 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  me){.  Table *p;
74a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
74b0: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
74c0: 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Col;.  sqlite3 *
74d0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
74e0: 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72  .  if( (p = pPar
74f0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
7500: 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 20  0 ) return;.#if 
7510: 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d  SQLITE_MAX_COLUM
7520: 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b  N.  if( p->nCol+
7530: 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  1>db->aLimit[SQL
7540: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
7550: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
7560: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7570: 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d   "too many colum
7580: 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e  ns on %s", p->zN
7590: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
75a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a  ;.  }.#endif.  z
75b0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
75c0: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
75d0: 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29  e);.  if( z==0 )
75e0: 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69   return;.  for(i
75f0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
7600: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 54 52  ++){.    if( STR
7610: 49 43 4d 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b  ICMP(z, p->aCol[
7620: 69 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  i].zName) ){.   
7630: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7640: 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c  sg(pParse, "dupl
7650: 69 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  icate column nam
7660: 65 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  e: %s", z);.    
7670: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7680: 64 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65  db, z);.      re
7690: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
76a0: 20 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26    if( (p->nCol &
76b0: 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20   0x7)==0 ){.    
76c0: 43 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20  Column *aNew;.  
76d0: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
76e0: 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e  DbRealloc(db,p->
76f0: 61 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29  aCol,(p->nCol+8)
7700: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b  *sizeof(p->aCol[
7710: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e  0]));.    if( aN
7720: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ew==0 ){.      s
7730: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7740: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
7750: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  n;.    }.    p->
7760: 61 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d  aCol = aNew;.  }
7770: 0a 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43  .  pCol = &p->aC
7780: 6f 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d  ol[p->nCol];.  m
7790: 65 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73  emset(pCol, 0, s
77a0: 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d  izeof(p->aCol[0]
77b0: 29 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d  ));.  pCol->zNam
77c0: 65 20 3d 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66  e = z;. .  /* If
77d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 74 79 70   there is no typ
77e0: 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 6f 6c  e specified, col
77f0: 75 6d 6e 73 20 68 61 76 65 20 74 68 65 20 64 65  umns have the de
7800: 66 61 75 6c 74 20 61 66 66 69 6e 69 74 79 0a 20  fault affinity. 
7810: 20 2a 2a 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74   ** 'NONE'. If t
7820: 68 65 72 65 20 69 73 20 61 20 74 79 70 65 20 73  here is a type s
7830: 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 73  pecified, then s
7840: 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54  qlite3AddColumnT
7850: 79 70 65 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20  ype() will.  ** 
7860: 62 65 20 63 61 6c 6c 65 64 20 6e 65 78 74 20 74  be called next t
7870: 6f 20 73 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69  o set pCol->affi
7880: 6e 69 74 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a  nity correctly..
7890: 20 20 2a 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66    */.  pCol->aff
78a0: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
78b0: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43  FF_NONE;.  p->nC
78c0: 6f 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ol++;.}../*.** T
78d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
78e0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
78f0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
7900: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
7910: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
7920: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20  ABLE statement. 
7930: 20 41 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f   A "NOT NULL" co
7940: 6e 73 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20  nstraint has.** 
7950: 62 65 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63  been seen on a c
7960: 6f 6c 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75  olumn.  This rou
7970: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f  tine sets the no
7980: 74 4e 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a  tNull flag on.**
7990: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72   the column curr
79a0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
79b0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
79c0: 64 20 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e  d sqlite3AddNotN
79d0: 75 6c 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73  ull(Parse *pPars
79e0: 65 2c 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b  e, int onError){
79f0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70  .  Table *p;.  p
7a00: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7a10: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
7a20: 20 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f   || NEVER(p->nCo
7a30: 6c 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  l<1) ) return;. 
7a40: 20 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c   p->aCol[p->nCol
7a50: 2d 31 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75  -1].notNull = (u
7a60: 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a  8)onError;.}../*
7a70: 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c  .** Scan the col
7a80: 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54  umn type name zT
7a90: 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70  ype (length nTyp
7aa0: 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  e) and return th
7ab0: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
7ac0: 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a  affinity type..*
7ad0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7ae0: 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e  e does a case-in
7af0: 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68  dependent search
7b00: 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68   of zType for th
7b10: 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73  e .** substrings
7b20: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
7b30: 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20  g table. If one 
7b40: 6f 66 20 74 68 65 20 73 75 62 73 74 72 69 6e 67  of the substring
7b50: 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74  s is.** found, t
7b60: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
7b70: 20 61 66 66 69 6e 69 74 79 20 69 73 20 72 65 74   affinity is ret
7b80: 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20  urned. If zType 
7b90: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65  contains.** more
7ba0: 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65   than one of the
7bb0: 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74   substrings, ent
7bc0: 72 69 65 73 20 74 6f 77 61 72 64 20 74 68 65 20  ries toward the 
7bd0: 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74  top of .** the t
7be0: 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69  able take priori
7bf0: 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ty. For example,
7c00: 20 69 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c   if zType is 'BL
7c10: 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49  OBINT', .** SQLI
7c20: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69  TE_AFF_INTEGER i
7c30: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
7c40: 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20 20 20  * Substring     
7c50: 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d  | Affinity.** --
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
7c80: 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20 20 20  * 'INT'         
7c90: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  | SQLITE_AFF_INT
7ca0: 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20  EGER.** 'CHAR'  
7cb0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7cc0: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42  FF_TEXT.** 'CLOB
7cd0: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7ce0: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54  E_AFF_TEXT.** 'T
7cf0: 45 58 54 27 20 20 20 20 20 20 20 20 7c 20 53 51  EXT'        | SQ
7d00: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7d10: 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c   'BLOB'        |
7d20: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
7d30: 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20  .** 'REAL'      
7d40: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7d50: 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20  EAL.** 'FLOA'   
7d60: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7d70: 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27  F_REAL.** 'DOUB'
7d80: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7d90: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20  _AFF_REAL.**.** 
7da0: 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73  If none of the s
7db0: 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65  ubstrings in the
7dc0: 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65   above table are
7dd0: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54   found,.** SQLIT
7de0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73  E_AFF_NUMERIC is
7df0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68   returned..*/.ch
7e00: 61 72 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  ar sqlite3Affini
7e10: 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b  tyType(const Tok
7e20: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 75 33  en *pType){.  u3
7e30: 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  2 h = 0;.  char 
7e40: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7e50: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73  _NUMERIC;.  cons
7e60: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
7e70: 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b  *zIn = pType->z;
7e80: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
7e90: 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26  d char *zEnd = &
7ea0: 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e  pType->z[pType->
7eb0: 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49  n];..  while( zI
7ec0: 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68  n!=zEnd ){.    h
7ed0: 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69   = (h<<8) + sqli
7ee0: 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b  te3UpperToLower[
7ef0: 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b  *zIn];.    zIn++
7f00: 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28 28 27  ;.    if( h==(('
7f10: 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36  c'<<24)+('h'<<16
7f20: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27 29 20  )+('a'<<8)+'r') 
7f30: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){             /
7f40: 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20 20 20  * CHAR */.      
7f50: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
7f60: 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73  _TEXT; .    }els
7f70: 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c  e if( h==(('c'<<
7f80: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
7f90: 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b 20 20  o'<<8)+'b') ){  
7fa0: 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a       /* CLOB */.
7fb0: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
7fc0: 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20  TE_AFF_TEXT;.   
7fd0: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
7fe0: 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  't'<<24)+('e'<<1
7ff0: 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74 27 29  6)+('x'<<8)+'t')
8000: 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54 45 58   ){       /* TEX
8010: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
8020: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
8030: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8040: 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b 28 27  h==(('b'<<24)+('
8050: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8060: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
8070: 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20  * BLOB */.      
8080: 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c 49 54    && (aff==SQLIT
8090: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c  E_AFF_NUMERIC ||
80a0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
80b0: 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  _REAL) ){.      
80c0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
80d0: 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53  _NONE;.#ifndef S
80e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
80f0: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65  ING_POINT.    }e
8100: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 72 27  lse if( h==(('r'
8110: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
8120: 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20  ('a'<<8)+'l')   
8130: 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a         /* REAL *
8140: 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66  /.        && aff
8150: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
8160: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66  ERIC ){.      af
8170: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52  f = SQLITE_AFF_R
8180: 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EAL;.    }else i
8190: 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29  f( h==(('f'<<24)
81a0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
81b0: 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20 20 20  <8)+'a')        
81c0: 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20    /* FLOA */.   
81d0: 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c       && aff==SQL
81e0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
81f0: 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  ){.      aff = S
8200: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a  QLITE_AFF_REAL;.
8210: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
8220: 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27  =(('d'<<24)+('o'
8230: 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27  <<16)+('u'<<8)+'
8240: 62 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b')          /* 
8250: 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20 20 20  DOUB */.        
8260: 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  && aff==SQLITE_A
8270: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
8280: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
8290: 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69  _AFF_REAL;.#endi
82a0: 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
82b0: 28 68 26 30 78 30 30 46 46 46 46 46 46 29 3d 3d  (h&0x00FFFFFF)==
82c0: 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c  (('i'<<16)+('n'<
82d0: 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 2f  <8)+'t') ){    /
82e0: 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61  * INT */.      a
82f0: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
8300: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62  INTEGER;.      b
8310: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
8320: 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d  .  return aff;.}
8330: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
8340: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
8350: 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68 69  y the parser whi
8360: 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  le in the middle
8370: 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61   of.** parsing a
8380: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
8390: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 70 46  atement.  The pF
83a0: 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20 74 68  irst token is th
83b0: 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e  e first.** token
83c0: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
83d0: 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   of tokens that 
83e0: 64 65 73 63 72 69 62 65 20 74 68 65 20 74 79 70  describe the typ
83f0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75  e of the.** colu
8400: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
8410: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8420: 20 20 20 70 4c 61 73 74 20 69 73 20 74 68 65 20     pLast is the 
8430: 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e  last token.** in
8440: 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e 20 20   the sequence.  
8450: 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  Use this informa
8460: 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63  tion to construc
8470: 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68  t a string.** th
8480: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
8490: 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  typename of the 
84a0: 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65  column and store
84b0: 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20   that string.** 
84c0: 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f  in zType..*/ .vo
84d0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
84e0: 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20 2a 70  umnType(Parse *p
84f0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
8500: 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ype){.  Table *p
8510: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
8520: 3b 0a 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d  ;..  p = pParse-
8530: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
8540: 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45 52 28  ( p==0 || NEVER(
8550: 70 2d 3e 6e 43 6f 6c 3c 31 29 20 29 20 72 65 74  p->nCol<1) ) ret
8560: 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d 20 26 70  urn;.  pCol = &p
8570: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8580: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  ];.  assert( pCo
8590: 6c 2d 3e 7a 54 79 70 65 3d 3d 30 20 29 3b 0a 20  l->zType==0 );. 
85a0: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73   pCol->zType = s
85b0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
85c0: 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
85d0: 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  pType);.  pCol->
85e0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
85f0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
8600: 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Type);.}../*.** 
8610: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
8620: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61  s the default va
8630: 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73 74  lue for the most
8640: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
8650: 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65  column.** of the
8660: 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
8670: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8680: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75  ion..**.** Defau
8690: 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73 73  lt value express
86a0: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f 6e  ions must be con
86b0: 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61 6e  stant.  Raise an
86c0: 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68   exception if th
86d0: 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68 65  is.** is not the
86e0: 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   case..**.** Thi
86f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8700: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8710: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8720: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8730: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8740: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  LE statement..*/
8750: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8760: 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61 72  DefaultValue(Par
8770: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
8780: 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62 6c   *pExpr){.  Tabl
8790: 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  e *p;.  Column *
87a0: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
87b0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
87c0: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
87d0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
87e0: 20 70 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f   p!=0 ){.    pCo
87f0: 6c 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d  l = &(p->aCol[p-
8800: 3e 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69  >nCol-1]);.    i
8810: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
8820: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
8830: 69 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20  ion(pExpr) ){.  
8840: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8850: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66  Msg(pParse, "def
8860: 61 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f  ault value of co
8870: 6c 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74  lumn [%s] is not
8880: 20 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20   constant",.    
8890: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d        pCol->zNam
88a0: 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
88b0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
88c0: 66 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20  f pExpr is used 
88d0: 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f  instead of the o
88e0: 72 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70  riginal, as pExp
88f0: 72 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20  r contains.     
8900: 20 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20   ** tokens that 
8910: 70 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c  point to volatil
8920: 65 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73  e memory. The 's
8930: 70 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72  pan' of the expr
8940: 65 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  ession.      ** 
8950: 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70  is required by p
8960: 72 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f  ragma table_info
8970: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
8980: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
8990: 74 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66  te(db, pCol->pDf
89a0: 6c 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d  lt);.      pCol-
89b0: 3e 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33  >pDflt = sqlite3
89c0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70  ExprDup(db, pExp
89d0: 72 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43  r, EXPRDUP_REDUC
89e0: 45 7c 45 58 50 52 44 55 50 5f 53 50 41 4e 29 3b  E|EXPRDUP_SPAN);
89f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
8a00: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
8a10: 62 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  b, pExpr);.}../*
8a20: 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68  .** Designate th
8a30: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f  e PRIMARY KEY fo
8a40: 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c  r the table.  pL
8a50: 69 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66  ist is a list of
8a60: 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f   names .** of co
8a70: 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20  lumns that form 
8a80: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
8a90: 20 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55    If pList is NU
8aa0: 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  LL, then the.** 
8ab0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64  most recently ad
8ac0: 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  ded column of th
8ad0: 65 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70  e table is the p
8ae0: 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a  rimary key..**.*
8af0: 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61  * A table can ha
8b00: 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70  ve at most one p
8b10: 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20  rimary key.  If 
8b20: 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64  the table alread
8b30: 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61  y has.** a prima
8b40: 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73  ry key (and this
8b50: 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   is the second p
8b60: 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e  rimary key) then
8b70: 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72   create an.** er
8b80: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ror..**.** If th
8b90: 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73  e PRIMARY KEY is
8ba0: 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c   on a single col
8bb0: 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79  umn whose dataty
8bc0: 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a  pe is INTEGER,.*
8bd0: 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74  * then we will t
8be0: 72 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63  ry to use that c
8bf0: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77  olumn as the row
8c00: 69 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62  id.  Set the Tab
8c10: 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c  le.iPKey.** fiel
8c20: 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75  d of the table u
8c30: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8c40: 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65  n to be the inde
8c50: 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45  x of the.** INTE
8c60: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
8c70: 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69  column.  Table.i
8c80: 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d  PKey is set to -
8c90: 31 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a  1 if there is.**
8ca0: 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d   no INTEGER PRIM
8cb0: 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49  ARY KEY..**.** I
8cc0: 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74  f the key is not
8cd0: 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
8ce0: 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72  ARY KEY, then cr
8cf0: 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a  eate a unique.**
8d00: 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b   index for the k
8d10: 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73  ey.  No index is
8d20: 20 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54   created for INT
8d30: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8d40: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
8d50: 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28  e3AddPrimaryKey(
8d60: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
8d70: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
8d80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
8d90: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f  rList *pList,  /
8da0: 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20  * List of field 
8db0: 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65  names to be inde
8dc0: 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45  xed */.  int onE
8dd0: 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68  rror,      /* Wh
8de0: 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20  at to do with a 
8df0: 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c  uniqueness confl
8e00: 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74  ict */.  int aut
8e10: 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72  oInc,      /* Tr
8e20: 75 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e  ue if the AUTOIN
8e30: 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20  CREMENT keyword 
8e40: 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
8e50: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20  int sortOrder   
8e60: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41    /* SQLITE_SO_A
8e70: 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f  SC or SQLITE_SO_
8e80: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  DESC */.){.  Tab
8e90: 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73  le *pTab = pPars
8ea0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
8eb0: 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b  char *zType = 0;
8ec0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31  .  int iCol = -1
8ed0: 2c 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d  , i;.  if( pTab=
8ee0: 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45  =0 || IN_DECLARE
8ef0: 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69  _VTAB ) goto pri
8f00: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20  mary_key_exit;. 
8f10: 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
8f20: 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d  ags & TF_HasPrim
8f30: 61 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71  aryKey ){.    sq
8f40: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8f50: 61 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61  arse, .      "ta
8f60: 62 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d  ble \"%s\" has m
8f70: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69  ore than one pri
8f80: 6d 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d  mary key", pTab-
8f90: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
8fa0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
8fb0: 69 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e  it;.  }.  pTab->
8fc0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48  tabFlags |= TF_H
8fd0: 61 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20  asPrimaryKey;.  
8fe0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
8ff0: 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d      iCol = pTab-
9000: 3e 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70  >nCol - 1;.    p
9010: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e  Tab->aCol[iCol].
9020: 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20  isPrimKey = 1;. 
9030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
9040: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
9050: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
9060: 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
9070: 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
9080: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  ol++){.        i
9090: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
90a0: 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  p(pList->a[i].zN
90b0: 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ame, pTab->aCol[
90c0: 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  iCol].zName)==0 
90d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
90e0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
90f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
9100: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20  iCol<pTab->nCol 
9110: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d  ){.        pTab-
9120: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72  >aCol[iCol].isPr
9130: 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20  imKey = 1;.     
9140: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9150: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20   pList->nExpr>1 
9160: 29 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d  ) iCol = -1;.  }
9170: 0a 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26  .  if( iCol>=0 &
9180: 26 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  & iCol<pTab->nCo
9190: 6c 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  l ){.    zType =
91a0: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c   pTab->aCol[iCol
91b0: 5d 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69  ].zType;.  }.  i
91c0: 66 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69  f( zType && sqli
91d0: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65  te3StrICmp(zType
91e0: 2c 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a  , "INTEGER")==0.
91f0: 20 20 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f          && sortO
9200: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
9210: 41 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d  ASC ){.    pTab-
9220: 3e 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20  >iPKey = iCol;. 
9230: 20 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66     pTab->keyConf
9240: 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a   = (u8)onError;.
9250: 20 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f      assert( auto
9260: 49 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e  Inc==0 || autoIn
9270: 63 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62  c==1 );.    pTab
9280: 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75  ->tabFlags |= au
9290: 74 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63  toInc*TF_Autoinc
92a0: 72 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65 20  rement;.  }else 
92b0: 69 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23  if( autoInc ){.#
92c0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
92d0: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
92e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
92f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55  rMsg(pParse, "AU
9300: 54 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f  TOINCREMENT is o
9310: 6e 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61  nly allowed on a
9320: 6e 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45  n ".       "INTE
9330: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22  GER PRIMARY KEY"
9340: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
9350: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72  e{.    sqlite3Cr
9360: 65 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65  eateIndex(pParse
9370: 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74  , 0, 0, 0, pList
9380: 2c 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c  , onError, 0, 0,
9390: 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a   sortOrder, 0);.
93a0: 20 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20      pList = 0;. 
93b0: 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f   }..primary_key_
93c0: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45  exit:.  sqlite3E
93d0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50  xprListDelete(pP
93e0: 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29  arse->db, pList)
93f0: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
9400: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43  *.** Add a new C
9410: 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20  HECK constraint 
9420: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
9430: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
9440: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
9450: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65  id sqlite3AddChe
9460: 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20  ckConstraint(.  
9470: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
9480: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
9490: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a  text */.  Expr *
94a0: 70 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54  pCheckExpr  /* T
94b0: 68 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73  he check express
94c0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ion */.){.  sqli
94d0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
94e0: 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
94f0: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a  LITE_OMIT_CHECK.
9500: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9510: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9520: 65 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26  e;.  if( pTab &&
9530: 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41   !IN_DECLARE_VTA
9540: 42 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  B ){.    /* The 
9550: 43 48 45 43 4b 20 65 78 70 72 65 73 73 69 6f 6e  CHECK expression
9560: 20 6d 75 73 74 20 62 65 20 64 75 70 6c 69 63 61   must be duplica
9570: 74 65 64 20 73 6f 20 74 68 61 74 20 74 6f 6b 65  ted so that toke
9580: 6e 73 20 72 65 66 65 72 0a 20 20 20 20 2a 2a 20  ns refer.    ** 
9590: 74 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63  to malloced spac
95a0: 65 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 28 65  e and not the (e
95b0: 70 68 65 6d 65 72 61 6c 29 20 74 65 78 74 20 6f  phemeral) text o
95c0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
95d0: 4c 45 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  LE.    ** statem
95e0: 65 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d  ent */.    pTab-
95f0: 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65  >pCheck = sqlite
9600: 33 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61  3ExprAnd(db, pTa
9610: 62 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20  b->pCheck, .    
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
9640: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9650: 20 70 43 68 65 63 6b 45 78 70 72 2c 20 30 29 29   pCheckExpr, 0))
9660: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
9670: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
9680: 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29  (db, pCheckExpr)
9690: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
96a0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
96b0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
96c0: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
96d0: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
96e0: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
96f0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
9700: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
9710: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
9720: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
9730: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
9740: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
9750: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
9760: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
9770: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
9780: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
9790: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
97a0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
97b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
97c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
97d0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
97e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
97f0: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
9800: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
9810: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
9820: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
9830: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
9840: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
9850: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
9860: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
9870: 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  .    p->aCol[i].
9880: 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  zColl = zColl;. 
9890: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
98a0: 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63 6c 61 72  column is declar
98b0: 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52  ed as "<name> PR
98c0: 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54  IMARY KEY COLLAT
98d0: 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a  E <type>",.    *
98e0: 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64 65 78 20  * then an index 
98f0: 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 72  may have been cr
9900: 65 61 74 65 64 20 6f 6e 20 74 68 69 73 20 63 6f  eated on this co
9910: 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74 68 65 0a  lumn before the.
9920: 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e      ** collation
9930: 20 74 79 70 65 20 77 61 73 20 61 64 64 65 64 2e   type was added.
9940: 20 43 6f 72 72 65 63 74 20 74 68 69 73 20 69 66   Correct this if
9950: 20 69 74 20 69 73 20 74 68 65 20 63 61 73 65 2e   it is the case.
9960: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
9970: 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20  pIdx=p->pIndex; 
9980: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
9990: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 61  >pNext){.      a
99a0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
99b0: 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20  lumn==1 );.     
99c0: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
99d0: 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20  umn[0]==i ){.   
99e0: 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
99f0: 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69  l[0] = p->aCol[i
9a00: 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d  ].zColl;.      }
9a10: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
9a20: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
9a30: 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20  e(db, zColl);.  
9a40: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
9a50: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
9a60: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
9a70: 65 71 75 65 6e 63 65 20 66 6f 72 20 64 61 74 61  equence for data
9a80: 62 61 73 65 20 6e 61 74 69 76 65 20 74 65 78 74  base native text
9a90: 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20 69 64 65  .** encoding ide
9aa0: 6e 74 69 66 69 65 64 20 62 79 20 74 68 65 20 73  ntified by the s
9ab0: 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e  tring zName, len
9ac0: 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  gth nName..**.**
9ad0: 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74 65   If the requeste
9ae0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
9af0: 65 6e 63 65 20 69 73 20 6e 6f 74 20 61 76 61 69  ence is not avai
9b00: 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76  lable, or not av
9b10: 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68  ailable.** in th
9b20: 65 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  e database nativ
9b30: 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20  e encoding, the 
9b40: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9b50: 79 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a  y is invoked to.
9b60: 2a 2a 20 72 65 71 75 65 73 74 20 69 74 2e 20 49  ** request it. I
9b70: 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  f the collation 
9b80: 66 61 63 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74  factory does not
9b90: 20 73 75 70 70 6c 79 20 73 75 63 68 20 61 20 73   supply such a s
9ba0: 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20  equence,.** and 
9bb0: 74 68 65 20 73 65 71 75 65 6e 63 65 20 69 73 20  the sequence is 
9bc0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f  available in ano
9bd0: 74 68 65 72 20 74 65 78 74 20 65 6e 63 6f 64 69  ther text encodi
9be0: 6e 67 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  ng, then that is
9bf0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 73  .** returned ins
9c00: 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  tead..**.** If n
9c10: 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
9c20: 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c  e requested coll
9c30: 61 74 69 6f 6e 73 20 73 65 71 75 65 6e 63 65 20  ations sequence 
9c40: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f  are available, o
9c50: 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 65 72 72  r.** another err
9c60: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
9c70: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
9c80: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9c90: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
9ca0: 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54   pParse..**.** T
9cb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
9cc0: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
9cd0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
9ce0: 65 71 28 29 2e 20 20 54 68 69 73 20 72 6f 75 74  eq().  This rout
9cf0: 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74  ine.** invokes t
9d00: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9d10: 74 6f 72 79 20 69 66 20 74 68 65 20 6e 61 6d 65  tory if the name
9d20: 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e  d collation cann
9d30: 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61  ot be found.** a
9d40: 6e 64 20 67 65 6e 65 72 61 74 65 73 20 61 6e 20  nd generates an 
9d50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a  error message..*
9d60: 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 73  *.** See also: s
9d70: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
9d80: 71 28 29 2c 20 73 71 6c 69 74 65 33 47 65 74 43  q(), sqlite3GetC
9d90: 6f 6c 6c 53 65 71 28 29 0a 2a 2f 0a 43 6f 6c 6c  ollSeq().*/.Coll
9da0: 53 65 71 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  Seq *sqlite3Loca
9db0: 74 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20  teCollSeq(Parse 
9dc0: 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63  *pParse, const c
9dd0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 73  har *zName){.  s
9de0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
9df0: 72 73 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e  rse->db;.  u8 en
9e00: 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75  c = ENC(db);.  u
9e10: 38 20 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d  8 initbusy = db-
9e20: 3e 69 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f  >init.busy;.  Co
9e30: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20  llSeq *pColl;.. 
9e40: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
9e50: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
9e60: 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20 69 6e 69 74  enc, zName, init
9e70: 62 75 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e  busy);.  if( !in
9e80: 69 74 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c  itbusy && (!pCol
9e90: 6c 20 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d  l || !pColl->xCm
9ea0: 70 29 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20  p) ){.    pColl 
9eb0: 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c  = sqlite3GetColl
9ec0: 53 65 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a  Seq(db, pColl, z
9ed0: 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Name);.    if( !
9ee0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73  pColl ){.      s
9ef0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
9f00: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
9f10: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
9f20: 63 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  ce: %s", zName);
9f30: 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  .      pColl = 0
9f40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
9f50: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
9f60: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
9f70: 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69  code that will i
9f80: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68  ncrement the sch
9f90: 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a  ema cookie..**.*
9fa0: 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  * The schema coo
9fb0: 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20 64  kie is used to d
9fc0: 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68  etermine when th
9fd0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
9fe0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
9ff0: 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61 63  nges.  After eac
a000: 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c  h schema change,
a010: 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75   the cookie valu
a020: 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57  e.** changes.  W
a030: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69  hen a process fi
a040: 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73 63  rst reads the sc
a050: 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20  hema it records 
a060: 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20  the.** cookie.  
a070: 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e  Thereafter, when
a080: 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20  ever it goes to 
a090: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
a0a0: 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b  ase,.** it check
a0b0: 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20  s the cookie to 
a0c0: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73 63  make sure the sc
a0d0: 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61  hema has not cha
a0e0: 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74  nged.** since it
a0f0: 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a   was last read..
a100: 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20  **.** This plan 
a110: 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c  is not completel
a120: 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20  y bullet-proof. 
a130: 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   It is possible 
a140: 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d  for.** the schem
a150: 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74  a to change mult
a160: 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66  iple times and f
a170: 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  or the cookie to
a180: 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20   be.** set back 
a190: 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20  to prior value. 
a1a0: 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e   But schema chan
a1b0: 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75 65  ges are infreque
a1c0: 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72  nt.** and the pr
a1d0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74  obability of hit
a1e0: 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f  ting the same co
a1f0: 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e  okie value is on
a200: 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69  ly.** 1 chance i
a210: 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72  n 2^32.  So we'r
a220: 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a  e safe enough..*
a230: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68  /.void sqlite3Ch
a240: 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65  angeCookie(Parse
a250: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
a260: 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  b){.  int r1 = s
a270: 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
a280: 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69  (pParse);.  sqli
a290: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
a2a0: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
a2b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
a2c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
a2d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
a2e0: 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  er, db->aDb[iDb]
a2f0: 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
a300: 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a  _cookie+1, r1);.
a310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a320: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
a330: 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20 72 31 29  kie, iDb, 0, r1)
a340: 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  ;.  sqlite3Relea
a350: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
a360: 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , r1);.}../*.** 
a370: 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d 62  Measure the numb
a380: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
a390: 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70 75   needed to outpu
a3a0: 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 69  t the given.** i
a3b0: 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65 20  dentifier.  The 
a3c0: 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20  number returned 
a3d0: 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75 6f  includes any quo
a3e0: 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74 20  tes used.** but 
a3f0: 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65  does not include
a400: 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69 6e   the null termin
a410: 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ator..**.** The 
a420: 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e 73  estimate is cons
a430: 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d 69  ervative.  It mi
a440: 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74 68  ght be larger th
a450: 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72 65  at what is.** re
a460: 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  ally needed..*/.
a470: 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e 74  static int ident
a480: 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68 61  Length(const cha
a490: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a  r *z){.  int n;.
a4a0: 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e    for(n=0; *z; n
a4b0: 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, z++){.    if
a4c0: 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b  ( *z=='"' ){ n++
a4d0: 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ; }.  }.  return
a4e0: 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   n + 2;.}../*.**
a4f0: 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
a500: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
a510: 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20 62  r to an output b
a520: 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f 6e  uffer. The secon
a530: 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  d .** parameter 
a540: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
a550: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
a560: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66 66  contains the off
a570: 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68 20  set at.** which 
a580: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
a590: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e  e output buffer.
a5a0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
a5b0: 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75 6c  opies the.** nul
a5c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
a5d0: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
a5e0: 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61 6d   the third param
a5f0: 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64 65  eter, zSignedIde
a600: 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73 70  nt,.** to the sp
a610: 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20 69  ecified offset i
a620: 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e 64  n the buffer and
a630: 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20 74   updates *pIdx t
a640: 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74 68  o refer.** to th
a650: 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66 74  e first byte aft
a660: 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74 65  er the last byte
a670: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
a680: 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a  returning..** .*
a690: 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67 20  * If the string 
a6a0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f 6e  zSignedIdent con
a6b0: 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
a6c0: 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63 0a  f alpha-numeric.
a6d0: 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20 64  ** characters, d
a6e0: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
a6f0: 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20 69  th a digit and i
a700: 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65 79  s not an SQL key
a710: 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  word,.** then it
a720: 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68   is copied to th
a730: 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
a740: 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69 73  exactly as it is
a750: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20  . Otherwise,.** 
a760: 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73 69  it is quoted usi
a770: 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73  ng double-quotes
a780: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a790: 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a   identPut(char *
a7a0: 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68  z, int *pIdx, ch
a7b0: 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74  ar *zSignedIdent
a7c0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
a7d0: 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e  ar *zIdent = (un
a7e0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69  signed char*)zSi
a7f0: 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74  gnedIdent;.  int
a800: 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65   i, j, needQuote
a810: 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 0a  ;.  i = *pIdx;..
a820: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
a830: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
a840: 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61 6c  if( !sqlite3Isal
a850: 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26  num(zIdent[j]) &
a860: 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27  & zIdent[j]!='_'
a870: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
a880: 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c 69  needQuote = sqli
a890: 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e  te3Isdigit(zIden
a8a0: 74 5b 30 5d 29 20 7c 7c 20 73 71 6c 69 74 65 33  t[0]) || sqlite3
a8b0: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
a8c0: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
a8d0: 20 69 66 28 20 21 6e 65 65 64 51 75 6f 74 65 20   if( !needQuote 
a8e0: 29 7b 0a 20 20 20 20 6e 65 65 64 51 75 6f 74 65  ){.    needQuote
a8f0: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
a900: 7d 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f  }..  if( needQuo
a910: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
a920: 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ';.  for(j=0; zI
a930: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
a940: 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65     z[i++] = zIde
a950: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a  nt[j];.    if( z
a960: 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20  Ident[j]=='"' ) 
a970: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
a980: 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  }.  if( needQuot
a990: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
a9a0: 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20  ;.  z[i] = 0;.  
a9b0: 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a  *pIdx = i;.}../*
a9c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43  .** Generate a C
a9d0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
a9e0: 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74  ement appropriat
a9f0: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
aa00: 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72  ** table.  Memor
aa10: 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65  y to hold the te
aa20: 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  xt of the statem
aa30: 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a  ent is obtained.
aa40: 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ** from sqliteMa
aa50: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
aa60: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
aa70: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
aa80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
aa90: 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d   *createTableStm
aaa0: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  t(sqlite3 *db, T
aab0: 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  able *p){.  int 
aac0: 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, k, n;.  char 
aad0: 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a  *zStmt;.  char *
aae0: 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a  zSep, *zSep2, *z
aaf0: 45 6e 64 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70  End;.  Column *p
ab00: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
ab10: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
ab20: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
ab30: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
ab40: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
ab50: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
ab60: 6d 65 29 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e  me) + 5;.  }.  n
ab70: 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68 28   += identLength(
ab80: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28  p->zName);.  if(
ab90: 20 6e 3c 35 30 20 29 7b 20 0a 20 20 20 20 7a 53   n<50 ){ .    zS
aba0: 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65  ep = "";.    zSe
abb0: 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45  p2 = ",";.    zE
abc0: 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73  nd = ")";.  }els
abd0: 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 5c  e{.    zSep = "\
abe0: 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  n  ";.    zSep2 
abf0: 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a  = ",\n  ";.    z
ac00: 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d  End = "\n)";.  }
ac10: 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70  .  n += 35 + 6*p
ac20: 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20  ->nCol;.  zStmt 
ac30: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
ac40: 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d   n );.  if( zStm
ac50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
ac60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
ac70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
ac80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
ac90: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
aca0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
acb0: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
acc0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
acd0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
ace0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
acf0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
ad00: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
ad10: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
ad20: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
ad30: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
ad40: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
ad50: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
ad60: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
ad70: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20 20 20  LITE_AFF_TEXT   
ad80: 20 2a 2f 20 22 20 54 45 58 54 22 2c 0a 20 20 20   */ " TEXT",.   
ad90: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41       /* SQLITE_A
ada0: 46 46 5f 4e 4f 4e 45 20 20 20 20 2a 2f 20 22 22  FF_NONE    */ ""
adb0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
adc0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
add0: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
ade0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
adf0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
ae00: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
ae10: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
ae20: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
ae30: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
ae40: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
ae50: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
ae60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
ae70: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
ae80: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
ae90: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
aea0: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
aeb0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
aec0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
aed0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
aee0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
aef0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
af00: 49 54 45 5f 41 46 46 5f 54 45 58 54 20 3e 3d 20  ITE_AFF_TEXT >= 
af10: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
af20: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
af30: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 20  SQLITE_AFF_TEXT 
af40: 3c 20 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 29  < sizeof(azType)
af50: 2f 73 69 7a 65 6f 66 28 61 7a 54 79 70 65 5b 30  /sizeof(azType[0
af60: 5d 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ]) );.    testca
af70: 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  se( pCol->affini
af80: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
af90: 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63  EXT );.    testc
afa0: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
afb0: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
afc0: 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 74 65 73 74  NONE );.    test
afd0: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
afe0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
aff0: 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20 20  _NUMERIC );.    
b000: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
b010: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
b020: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b 0a  _AFF_INTEGER );.
b030: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
b040: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
b050: 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29 3b  LITE_AFF_REAL );
b060: 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65 20  .    .    zType 
b070: 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e 61  = azType[pCol->a
b080: 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54 45  ffinity - SQLITE
b090: 5f 41 46 46 5f 54 45 58 54 5d 3b 0a 20 20 20 20  _AFF_TEXT];.    
b0a0: 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  len = sqlite3Str
b0b0: 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 23 69  len30(zType);.#i
b0c0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
b0d0: 20 69 66 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e   if( pCol->affin
b0e0: 69 74 79 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity!=SQLITE_AFF_
b0f0: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 54  NONE ){.       T
b100: 6f 6b 65 6e 20 74 79 70 65 54 6f 6b 65 6e 3b 0a  oken typeToken;.
b110: 20 20 20 20 20 20 20 74 79 70 65 54 6f 6b 65 6e         typeToken
b120: 2e 7a 20 3d 20 28 75 38 2a 29 7a 54 79 70 65 3b  .z = (u8*)zType;
b130: 0a 20 20 20 20 20 20 20 74 79 70 65 54 6f 6b 65  .       typeToke
b140: 6e 2e 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  n.n = len;.     
b150: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d 3e    assert( pCol->
b160: 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74 65  affinity==sqlite
b170: 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 26 74  3AffinityType(&t
b180: 79 70 65 54 6f 6b 65 6e 29 20 29 3b 0a 20 20 20  ypeToken) );.   
b190: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 6d 65   }.#endif.    me
b1a0: 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d 2c 20  mcpy(&zStmt[k], 
b1b0: 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20 20 20  zType, len);.   
b1c0: 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 61   k += len;.    a
b1d0: 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b 0a 20  ssert( k<=n );. 
b1e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
b1f0: 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d  rintf(n-k, &zStm
b200: 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45 6e 64  t[k], "%s", zEnd
b210: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53 74 6d  );.  return zStm
b220: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  t;.}../*.** This
b230: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
b240: 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 65  ed to report the
b250: 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61 74 20   final ")" that 
b260: 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20 61 20  terminates.** a 
b270: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b280: 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  tement..**.** Th
b290: 65 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  e table structur
b2a0: 65 20 74 68 61 74 20 6f 74 68 65 72 20 61 63 74  e that other act
b2b0: 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68 61 76  ion routines hav
b2c0: 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e 67 0a  e been building.
b2d0: 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ** is added to t
b2e0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61 73 68  he internal hash
b2f0: 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d 69 6e   tables, assumin
b300: 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61 76 65  g no errors have
b310: 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a 2a 2a  .** occurred..**
b320: 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66 6f 72  .** An entry for
b330: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 6d 61   the table is ma
b340: 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  de in the master
b350: 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b 2c 20   table on disk, 
b360: 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73 20 69  unless.** this i
b370: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  s a temporary ta
b380: 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69 74 2e  ble or db->init.
b390: 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e 20 64  busy==1.  When d
b3a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 0a  b->init.busy==1.
b3b0: 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61  ** it means we a
b3c0: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 73  re reading the s
b3d0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
b3e0: 6c 65 20 62 65 63 61 75 73 65 20 77 65 20 6a 75  le because we ju
b3f0: 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20  st.** connected 
b400: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
b410: 6f 72 20 62 65 63 61 75 73 65 20 74 68 65 20 73  or because the s
b420: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
b430: 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65 6e 74  le has.** recent
b440: 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f 20 74  ly changed, so t
b450: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 69  he entry for thi
b460: 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20  s table already 
b470: 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74 68 65  exists in.** the
b480: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
b490: 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74  able.  We do not
b4a0: 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74 65 20   want to create 
b4b0: 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  it again..**.** 
b4c0: 49 66 20 74 68 65 20 70 53 65 6c 65 63 74 20 61  If the pSelect a
b4d0: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e  rgument is not N
b4e0: 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  ULL, it means th
b4f0: 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  at this routine.
b500: 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ** was called to
b510: 20 63 72 65 61 74 65 20 61 20 74 61 62 6c 65 20   create a table 
b520: 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 61  generated from a
b530: 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54 41 42   .** "CREATE TAB
b540: 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43 54  LE ... AS SELECT
b550: 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e 74 2e   ..." statement.
b560: 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d    The column nam
b570: 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  es of.** the new
b580: 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61 74 63   table will matc
b590: 68 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  h the result set
b5a0: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 2e 0a   of the SELECT..
b5b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
b5c0: 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  ndTable(.  Parse
b5d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b5e0: 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74     /* Parse cont
b5f0: 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ext */.  Token *
b600: 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20 20 20  pCons,          
b610: 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f 6b 65   /* The ',' toke
b620: 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  n after the last
b630: 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f   column defn. */
b640: 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
b650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b660: 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f 6b 65  e final ')' toke
b670: 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  n in the CREATE 
b680: 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c 65 63  TABLE */.  Selec
b690: 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20 20  t *pSelect      
b6a0: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66 72 6f     /* Select fro
b6b0: 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e 2e 20  m a "CREATE ... 
b6c0: 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a 29 7b  AS SELECT" */.){
b6d0: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 73  .  Table *p;.  s
b6e0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b6f0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
b700: 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45 6e 64  Db;..  if( (pEnd
b710: 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74 3d 3d  ==0 && pSelect==
b720: 30 29 20 7c 7c 20 4e 45 56 45 52 28 70 50 61 72  0) || NEVER(pPar
b730: 73 65 2d 3e 6e 45 72 72 29 20 7c 7c 20 64 62 2d  se->nErr) || db-
b740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
b750: 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
b760: 7d 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  }.  p = pParse->
b770: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
b780: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
b790: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
b7a0: 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 21 70 53  init.busy || !pS
b7b0: 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69 44 62 20  elect );..  iDb 
b7c0: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
b7d0: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
b7e0: 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66  chema);..#ifndef
b7f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45   SQLITE_OMIT_CHE
b800: 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  CK.  /* Resolve 
b810: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45  names in all CHE
b820: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  CK constraint ex
b830: 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  pressions..  */.
b840: 20 20 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20    if( p->pCheck 
b850: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 73  ){.    SrcList s
b860: 53 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Src;            
b870: 20 20 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 53         /* Fake S
b880: 72 63 4c 69 73 74 20 66 6f 72 20 70 50 61 72 73  rcList for pPars
b890: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
b8a0: 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20      NameContext 
b8b0: 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20 20  sNC;            
b8c0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
b8d0: 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e  ext for pParse->
b8e0: 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 0a 20 20  pNewTable */..  
b8f0: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
b900: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
b910: 20 20 20 20 6d 65 6d 73 65 74 28 26 73 53 72 63      memset(&sSrc
b920: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 53 72 63  , 0, sizeof(sSrc
b930: 29 29 3b 0a 20 20 20 20 73 53 72 63 2e 6e 53 72  ));.    sSrc.nSr
b940: 63 20 3d 20 31 3b 0a 20 20 20 20 73 53 72 63 2e  c = 1;.    sSrc.
b950: 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70 2d 3e  a[0].zName = p->
b960: 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e  zName;.    sSrc.
b970: 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70 3b 0a 20  a[0].pTab = p;. 
b980: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75     sSrc.a[0].iCu
b990: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73  rsor = -1;.    s
b9a0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
b9b0: 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63  se;.    sNC.pSrc
b9c0: 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20  List = &sSrc;.  
b9d0: 20 20 73 4e 43 2e 69 73 43 68 65 63 6b 20 3d 20    sNC.isCheck = 
b9e0: 31 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  1;.    if( sqlit
b9f0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
ba00: 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 43 68 65  es(&sNC, p->pChe
ba10: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ck) ){.      ret
ba20: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  urn;.    }.  }.#
ba30: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
ba40: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  d(SQLITE_OMIT_CH
ba50: 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  ECK) */..  /* If
ba60: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75   the db->init.bu
ba70: 73 79 20 69 73 20 31 20 69 74 20 6d 65 61 6e 73  sy is 1 it means
ba80: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
ba90: 74 68 65 20 53 51 4c 20 6f 66 66 20 74 68 65 0a  the SQL off the.
baa0: 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f 6d 61 73    ** "sqlite_mas
bab0: 74 65 72 22 20 6f 72 20 22 73 71 6c 69 74 65 5f  ter" or "sqlite_
bac0: 74 65 6d 70 5f 6d 61 73 74 65 72 22 20 74 61 62  temp_master" tab
bad0: 6c 65 20 6f 6e 20 74 68 65 20 64 69 73 6b 2e 0a  le on the disk..
bae0: 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f 74 20 77    ** So do not w
baf0: 72 69 74 65 20 74 6f 20 74 68 65 20 64 69 73 6b  rite to the disk
bb00: 20 61 67 61 69 6e 2e 20 20 45 78 74 72 61 63 74   again.  Extract
bb10: 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e   the root page n
bb20: 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74  umber.  ** for t
bb30: 68 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68  he table from th
bb40: 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  e db->init.newTn
bb50: 75 6d 20 66 69 65 6c 64 2e 20 20 28 54 68 65 20  um field.  (The 
bb60: 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  page number.  **
bb70: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 62 65 65   should have bee
bb80: 6e 20 70 75 74 20 74 68 65 72 65 20 62 79 20 74  n put there by t
bb90: 68 65 20 73 71 6c 69 74 65 4f 70 65 6e 43 62 20  he sqliteOpenCb 
bba0: 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a 2f 0a 20  routine.).  */. 
bbb0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
bbc0: 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75  sy ){.    p->tnu
bbd0: 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77  m = db->init.new
bbe0: 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Tnum;.  }..  /* 
bbf0: 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  If not initializ
bc00: 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ing, then create
bc10: 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20 74 68   a record for th
bc20: 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20 2a 2a  e new table.  **
bc30: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
bc40: 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66 20 74  ASTER table of t
bc50: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  he database..  *
bc60: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69  *.  ** If this i
bc70: 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20 74 61  s a TEMPORARY ta
bc80: 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65 20 65  ble, write the e
bc90: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 61 75  ntry into the au
bca0: 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66 69 6c  xiliary.  ** fil
bcb0: 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69 6e 74  e instead of int
bcc0: 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
bcd0: 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
bce0: 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
bcf0: 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  usy ){.    int n
bd00: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a 20  ;.    Vdbe *v;. 
bd10: 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 20     char *zType; 
bd20: 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f 72 20     /* "view" or 
bd30: 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20 20 63  "table" */.    c
bd40: 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20 20 2f  har *zType2;   /
bd50: 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54 41 42  * "VIEW" or "TAB
bd60: 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  LE" */.    char 
bd70: 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20 54 65  *zStmt;    /* Te
bd80: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
bd90: 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41 54 45   TABLE or CREATE
bda0: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 20   VIEW statement 
bdb0: 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  */..    v = sqli
bdc0: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
bdd0: 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45  e);.    if( NEVE
bde0: 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72 6e  R(v==0) ) return
bdf0: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ;..    sqlite3Vd
be00: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
be10: 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f  lose, 0);..    /
be20: 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61  * .    ** Initia
be30: 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74  lize zType for t
be40: 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74  he new view or t
be50: 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
be60: 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d   if( p->pSelect=
be70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
be80: 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a   regular table *
be90: 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  /.      zType = 
bea0: 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a  "table";.      z
beb0: 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b  Type2 = "TABLE";
bec0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bed0: 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65  OMIT_VIEW.    }e
bee0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20  lse{.      /* A 
bef0: 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54  view */.      zT
bf00: 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20  ype = "view";.  
bf10: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49      zType2 = "VI
bf20: 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  EW";.#endif.    
bf30: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
bf40: 73 20 69 73 20 61 20 43 52 45 41 54 45 20 54 41  s is a CREATE TA
bf50: 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45 43 54  BLE xx AS SELECT
bf60: 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68   ..., execute th
bf70: 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20  e SELECT.    ** 
bf80: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70  statement to pop
bf90: 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20 74 61  ulate the new ta
bfa0: 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61  ble. The root-pa
bfb0: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
bfc0: 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62  e.    ** new tab
bfd0: 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  le is in registe
bfe0: 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  r pParse->regRoo
bff0: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
c000: 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54   Once the SELECT
c010: 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20   has been coded 
c020: 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  by sqlite3Select
c030: 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20  (), it is in a. 
c040: 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73     ** suitable s
c050: 74 61 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f  tate to query fo
c060: 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  r the column nam
c070: 65 73 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20  es and types to 
c080: 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62  be used.    ** b
c090: 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  y the new table.
c0a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
c0b0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 77 72   shared-cache wr
c0c0: 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  ite-lock is not 
c0d0: 72 65 71 75 69 72 65 64 20 74 6f 20 77 72 69 74  required to writ
c0e0: 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62  e to the new tab
c0f0: 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20  le,.    ** as a 
c100: 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74  schema-lock must
c110: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
c120: 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63  en obtained to c
c130: 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a  reate it. Since.
c140: 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d      ** a schema-
c150: 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c  lock excludes al
c160: 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  l other database
c170: 20 75 73 65 72 73 2c 20 74 68 65 20 77 72 69 74   users, the writ
c180: 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20  e-lock would.   
c190: 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74   ** be redundant
c1a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c1b0: 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20   pSelect ){.    
c1c0: 20 20 53 65 6c 65 63 74 44 65 73 74 20 64 65 73    SelectDest des
c1d0: 74 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  t;.      Table *
c1e0: 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20  pSelTab;..      
c1f0: 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
c200: 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
c210: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
c220: 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65  (v, OP_OpenWrite
c230: 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67  , 1, pParse->reg
c240: 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20  Root, iDb);.    
c250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
c260: 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20  ngeP5(v, 1);.   
c270: 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20     pParse->nTab 
c280: 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 2;.      sqlit
c290: 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74  e3SelectDestInit
c2a0: 28 26 64 65 73 74 2c 20 53 52 54 5f 54 61 62 6c  (&dest, SRT_Tabl
c2b0: 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  e, 1);.      sql
c2c0: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
c2d0: 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73  e, pSelect, &des
c2e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c2f0: 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
c300: 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20  P_Close, 1);.   
c310: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
c320: 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Err==0 ){.      
c330: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
c340: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
c350: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
c360: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69  lect);.        i
c370: 66 28 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20  f( pSelTab==0 ) 
c380: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
c390: 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d  assert( p->aCol=
c3a0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =0 );.        p-
c3b0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
c3c0: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70  >nCol;.        p
c3d0: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
c3e0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
c3f0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20  pSelTab->nCol = 
c400: 30 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  0;.        pSelT
c410: 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
c420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c        sqlite3Del
c430: 65 74 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62  eteTable(pSelTab
c440: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c450: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
c460: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65   the complete te
c470: 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  xt of the CREATE
c480: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
c490: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
c4a0: 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63  .      zStmt = c
c4b0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64  reateTableStmt(d
c4c0: 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  b, p);.    }else
c4d0: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74  {.      n = (int
c4e0: 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72  )(pEnd->z - pPar
c4f0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
c500: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74  ) + 1;.      zSt
c510: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
c520: 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
c530: 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
c540: 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
c550: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
c560: 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
c570: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
c580: 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
c590: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
c5a0: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
c5b0: 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
c5c0: 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
c5d0: 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
c5e0: 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
c5f0: 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
c600: 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
c610: 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
c620: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
c630: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
c640: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
c650: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
c660: 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
c670: 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
c680: 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
c690: 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
c6a0: 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
c6b0: 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
c6c0: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
c6d0: 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
c6e0: 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
c6f0: 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
c700: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
c710: 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
c720: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
c730: 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
c740: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
c750: 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
c760: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
c770: 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  , zStmt);.    sq
c780: 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
c790: 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
c7a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c7b0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
c7c0: 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
c7d0: 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
c7e0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
c7f0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
c800: 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
c810: 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
c820: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
c830: 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
c840: 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  if( p->tabFlags 
c850: 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
c860: 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nt ){.      Db *
c870: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
c880: 44 62 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Db];.      if( p
c890: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  Db->pSchema->pSe
c8a0: 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  qTab==0 ){.     
c8b0: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
c8c0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
c8d0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
c8e0: 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f  TABLE %Q.sqlite_
c8f0: 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65  sequence(name,se
c900: 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  q)",.          p
c910: 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20  Db->zName.      
c920: 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
c930: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
c940: 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79 74  * Reparse everyt
c950: 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f  hing to update o
c960: 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61  ur internal data
c970: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
c980: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c990: 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65  dOp4(v, OP_Parse
c9a0: 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20  Schema, iDb, 0, 
c9b0: 30 2c 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0,.        sqlit
c9c0: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74  e3MPrintf(db, "t
c9d0: 62 6c 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d  bl_name='%q'",p-
c9e0: 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41  >zName), P4_DYNA
c9f0: 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  MIC);.  }...  /*
ca00: 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20 74   Add the table t
ca10: 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o the in-memory 
ca20: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
ca30: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
ca40: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69    */.  if( db->i
ca50: 6e 69 74 2e 62 75 73 79 20 26 26 20 41 4c 57 41  nit.busy && ALWA
ca60: 59 53 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  YS(pParse->nErr=
ca70: 3d 30 29 20 29 7b 0a 20 20 20 20 54 61 62 6c 65  =0) ){.    Table
ca80: 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 53 63 68 65   *pOld;.    Sche
ca90: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 70 2d  ma *pSchema = p-
caa0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 70 4f  >pSchema;.    pO
cab0: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
cac0: 49 6e 73 65 72 74 28 26 70 53 63 68 65 6d 61 2d  Insert(&pSchema-
cad0: 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e 7a 4e 61  >tblHash, p->zNa
cae0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb00: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
cb10: 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20  (p->zName),p);. 
cb20: 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a 20     if( pOld ){. 
cb30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
cb40: 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  pOld );  /* Mall
cb50: 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
cb60: 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68 49  led inside HashI
cb70: 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20 20  nsert() */.     
cb80: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
cb90: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  d = 1;.      ret
cba0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  urn;.    }.    p
cbb0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
cbc0: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 54   = 0;.    db->nT
cbd0: 61 62 6c 65 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e  able++;.    db->
cbe0: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
cbf0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a  InternChanges;..
cc00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cc10: 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20  MIT_ALTERTABLE. 
cc20: 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65     if( !p->pSele
cc30: 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ct ){.      cons
cc40: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
cc50: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50  (const char *)pP
cc60: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
cc70: 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e  .z;.      int nN
cc80: 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ame;.      asser
cc90: 74 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70  t( !pSelect && p
cca0: 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a  Cons && pEnd );.
ccb0: 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d        if( pCons-
ccc0: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  >z==0 ){.       
ccd0: 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20   pCons = pEnd;. 
cce0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61       }.      nNa
ccf0: 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73  me = (int)((cons
cd00: 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e  t char *)pCons->
cd10: 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  z - zName);.    
cd20: 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65    p->addColOffse
cd30: 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33  t = 13 + sqlite3
cd40: 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d  Utf8CharLen(zNam
cd50: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
cd60: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23  .#endif.  }.}..#
cd70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cd80: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68  IT_VIEW./*.** Th
cd90: 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74  e parser calls t
cda0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f  his routine in o
cdb0: 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61  rder to create a
cdc0: 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69   new VIEW.*/.voi
cdd0: 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56  d sqlite3CreateV
cde0: 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50  iew(.  Parse *pP
cdf0: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65  arse,     /* The
ce00: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
ce10: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65   */.  Token *pBe
ce20: 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  gin,     /* The 
ce30: 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
ce40: 74 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61  t begins the sta
ce50: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
ce60: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f  n *pName1,     /
ce70: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74  * The token that
ce80: 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20   holds the name 
ce90: 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  of the view */. 
cea0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
ceb0: 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e      /* The token
cec0: 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20   that holds the 
ced0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77  name of the view
cee0: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
cef0: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
cf00: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
cf10: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
cf20: 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
cf30: 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
cf40: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
cf50: 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
cf60: 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  w */.  int noErr
cf70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70            /* Sup
cf80: 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73  press error mess
cf90: 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72  ages if VIEW alr
cfa0: 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
cfb0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
cfc0: 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 75  int n;.  const u
cfd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b  nsigned char *z;
cfe0: 0a 20 20 54 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20  .  Token sEnd;. 
cff0: 20 44 62 46 69 78 65 72 20 73 46 69 78 3b 0a 20   DbFixer sFix;. 
d000: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20   Token *pName;. 
d010: 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71 6c 69   int iDb;.  sqli
d020: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d030: 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 50 61  ->db;..  if( pPa
d040: 72 73 65 2d 3e 6e 56 61 72 3e 30 20 29 7b 0a 20  rse->nVar>0 ){. 
d050: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d060: 73 67 28 70 50 61 72 73 65 2c 20 22 70 61 72 61  sg(pParse, "para
d070: 6d 65 74 65 72 73 20 61 72 65 20 6e 6f 74 20 61  meters are not a
d080: 6c 6c 6f 77 65 64 20 69 6e 20 76 69 65 77 73 22  llowed in views"
d090: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  );.    sqlite3Se
d0a0: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
d0b0: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72 65 74  Select);.    ret
d0c0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
d0d0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50 61  e3StartTable(pPa
d0e0: 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
d0f0: 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c 20  me2, isTemp, 1, 
d100: 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20 3d  0, noErr);.  p =
d110: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
d120: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
d130: 7c 20 4e 45 56 45 52 28 70 50 61 72 73 65 2d 3e  | NEVER(pParse->
d140: 6e 45 72 72 3e 30 29 20 29 7b 0a 20 20 20 20 73  nErr>0) ){.    s
d150: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65  qlite3SelectDele
d160: 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b  te(db, pSelect);
d170: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d180: 0a 20 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72  .  sqlite3TwoPar
d190: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
d1a0: 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
d1b0: 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73  Name);.  iDb = s
d1c0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
d1d0: 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65  dex(db, p->pSche
d1e0: 6d 61 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ma);.  if( sqlit
d1f0: 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
d200: 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76   pParse, iDb, "v
d210: 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20  iew", pName).   
d220: 20 26 26 20 73 71 6c 69 74 65 33 46 69 78 53 65   && sqlite3FixSe
d230: 6c 65 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c  lect(&sFix, pSel
d240: 65 63 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ect).  ){.    sq
d250: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d260: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d270: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d280: 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70  .  /* Make a cop
d290: 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  y of the entire 
d2a0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d2b0: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
d2c0: 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69  e view..  ** Thi
d2d0: 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c  s will force all
d2e0: 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e   the Expr.token.
d2f0: 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64  z values to be d
d300: 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20  ynamically.  ** 
d310: 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72  allocated rather
d320: 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74   than point to t
d330: 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20  he input string 
d340: 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  - which means th
d350: 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c  at.  ** they wil
d360: 6c 20 70 65 72 73 69 73 74 20 61 66 74 65 72 20  l persist after 
d370: 74 68 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69  the current sqli
d380: 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20  te3_exec() call 
d390: 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20  returns..  */.  
d3a0: 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  p->pSelect = sql
d3b0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
d3c0: 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50 52 44  , pSelect, EXPRD
d3d0: 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 73 71  UP_REDUCE);.  sq
d3e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d3f0: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d400: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
d410: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
d420: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
d430: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
d440: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 69 65  {.    sqlite3Vie
d450: 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
d460: 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a  pParse, p);.  }.
d470: 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
d480: 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
d490: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
d4a0: 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
d4b0: 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
d4c0: 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
d4d0: 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
d4e0: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 41 4c 57  Token;.  if( ALW
d4f0: 41 59 53 28 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30  AYS(sEnd.z[0]!=0
d500: 29 20 26 26 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d  ) && sEnd.z[0]!=
d510: 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e  ';' ){.    sEnd.
d520: 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d  z += sEnd.n;.  }
d530: 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20  .  sEnd.n = 0;. 
d540: 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e   n = (int)(sEnd.
d550: 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a  z - pBegin->z);.
d560: 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73    z = (const uns
d570: 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 65 67  igned char*)pBeg
d580: 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20  in->z;.  while( 
d590: 41 4c 57 41 59 53 28 6e 3e 30 29 20 26 26 20 73  ALWAYS(n>0) && s
d5a0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
d5b0: 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
d5c0: 20 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d    sEnd.z = &z[n-
d5d0: 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31  1];.  sEnd.n = 1
d5e0: 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69  ;..  /* Use sqli
d5f0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f  te3EndTable() to
d600: 20 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f   add the view to
d610: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54   the SQLITE_MAST
d620: 45 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ER table */.  sq
d630: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50  lite3EndTable(pP
d640: 61 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20  arse, 0, &sEnd, 
d650: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
d660: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d670: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23  _OMIT_VIEW */..#
d680: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d690: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
d6a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
d6b0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
d6c0: 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61  LE)./*.** The Ta
d6d0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54  ble structure pT
d6e0: 61 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61  able is really a
d6f0: 20 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20   VIEW.  Fill in 
d700: 74 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20  the names of.** 
d710: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  the columns of t
d720: 68 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70  he view in the p
d730: 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e  Table structure.
d740: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
d750: 62 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73  ber.** of errors
d760: 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
d770: 73 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20  s seen leave an 
d780: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
d790: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
d7a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d7b0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
d7c0: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
d7d0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29  , Table *pTable)
d7e0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54  {.  Table *pSelT
d7f0: 61 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20  ab;   /* A fake 
d800: 74 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68  table from which
d810: 20 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75   we get the resu
d820: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65  lt set */.  Sele
d830: 63 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a  ct *pSel;     /*
d840: 20 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c   Copy of the SEL
d850: 45 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ECT that impleme
d860: 6e 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a  nts the view */.
d870: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20    int nErr = 0; 
d880: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d890: 20 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65   errors encounte
d8a0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  red */.  int n; 
d8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
d8c0: 6d 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20  mporarily holds 
d8d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
d8e0: 72 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a  rsors assigned *
d8f0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
d900: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
d910: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
d920: 63 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63  ction for malloc
d930: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
d940: 20 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c   (*xAuth)(void*,
d950: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  int,const char*,
d960: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
d970: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
d980: 61 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  ar*);..  assert(
d990: 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
d9a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d9b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
d9c0: 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61  f( sqlite3VtabCa
d9d0: 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
d9e0: 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  , pTable) ){.   
d9f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
da00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
da10: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
da20: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
da30: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
da40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
da50: 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
da60: 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
da70: 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
da80: 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
da90: 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
daa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
dab0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
dac0: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
dad0: 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
dae0: 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
daf0: 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
db00: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
db10: 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
db20: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
db30: 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
db40: 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
db50: 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
db60: 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
db70: 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
db80: 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
db90: 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
dba0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
dbb0: 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
dbc0: 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
dbd0: 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
dbe0: 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
dbf0: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
dc00: 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
dc10: 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f  tually, the erro
dc20: 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63  r above is now c
dc30: 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
dc40: 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
dc50: 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  nt..  ** But the
dc60: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
dc70: 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61  is still importa
dc80: 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f  nt as it does co
dc90: 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68  me up.  ** in th
dca0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
dcb0: 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  * .  **     CREA
dcc0: 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78  TE TABLE main.ex
dcd0: 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43  1(a);.  **     C
dce0: 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20  REATE TEMP VIEW 
dcf0: 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20  ex1 AS SELECT a 
dd00: 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20  FROM ex1;.  **  
dd10: 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
dd20: 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a   temp.ex1;.  */.
dd30: 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
dd40: 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
dd50: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
dd60: 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
dd70: 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
dd80: 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
dd90: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
dda0: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
ddb0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
ddc0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
ddd0: 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
dde0: 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
ddf0: 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
de00: 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
de10: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
de20: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
de30: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
de40: 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
de50: 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
de60: 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
de70: 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
de80: 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
de90: 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
dea0: 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
deb0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
dec0: 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
ded0: 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
dee0: 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
def0: 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
df00: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
df10: 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
df20: 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
df30: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
df40: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
df50: 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
df60: 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
df70: 65 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20  ect );.  pSel = 
df80: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
df90: 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
dfa0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
dfb0: 70 53 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65  pSel ){.    u8 e
dfc0: 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d  nableLookaside =
dfd0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
dfe0: 45 6e 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d  Enabled;.    n =
dff0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
e000: 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
e010: 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70  tAssignCursors(p
e020: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72  Parse, pSel->pSr
e030: 63 29 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e  c);.    pTable->
e040: 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64  nCol = -1;.    d
e050: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e060: 61 62 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64  abled = 0;.#ifnd
e070: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e080: 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20  UTHORIZATION.   
e090: 20 78 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75   xAuth = db->xAu
e0a0: 74 68 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74  th;.    db->xAut
e0b0: 68 20 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54  h = 0;.    pSelT
e0c0: 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75  ab = sqlite3Resu
e0d0: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50  ltSetOfSelect(pP
e0e0: 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20  arse, pSel);.   
e0f0: 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75   db->xAuth = xAu
e100: 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53  th;.#else.    pS
e110: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
e120: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
e130: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
e140: 23 65 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c  #endif.    db->l
e150: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e160: 64 20 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73  d = enableLookas
e170: 69 64 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  ide;.    pParse-
e180: 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69  >nTab = n;.    i
e190: 66 28 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20  f( pSelTab ){.  
e1a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
e1b0: 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20  le->aCol==0 );. 
e1c0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f       pTable->nCo
e1d0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
e1e0: 6c 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  l;.      pTable-
e1f0: 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >aCol = pSelTab-
e200: 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65  >aCol;.      pSe
e210: 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  lTab->nCol = 0;.
e220: 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
e230: 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  Col = 0;.      s
e240: 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c  qlite3DeleteTabl
e250: 65 28 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20  e(pSelTab);.    
e260: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
e270: 61 2d 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55  a->flags |= DB_U
e280: 6e 72 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20  nresetViews;.   
e290: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
e2a0: 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a  able->nCol = 0;.
e2b0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
e2c0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
e2d0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
e2e0: 70 53 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20  pSel);.  } else 
e2f0: 7b 0a 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20  {.    nErr++;.  
e300: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e310: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a  TE_OMIT_VIEW */.
e320: 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20    return nErr;  
e330: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
e340: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
e350: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
e360: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
e370: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f  VIRTUALTABLE) */
e380: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e390: 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a  _OMIT_VIEW./*.**
e3a0: 20 43 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d   Clear the colum
e3b0: 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65  n names from eve
e3c0: 72 79 20 56 49 45 57 20 69 6e 20 64 61 74 61 62  ry VIEW in datab
e3d0: 61 73 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74  ase idx..*/.stat
e3e0: 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69  ic void sqliteVi
e3f0: 65 77 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74  ewResetAll(sqlit
e400: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29  e3 *db, int idx)
e410: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
e420: 0a 20 20 69 66 28 20 21 44 62 48 61 73 50 72 6f  .  if( !DbHasPro
e430: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
e440: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 20  B_UnresetViews) 
e450: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
e460: 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  i=sqliteHashFirs
e470: 74 28 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e  t(&db->aDb[idx].
e480: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
e490: 29 3b 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73  ); i;i=sqliteHas
e4a0: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54  hNext(i)){.    T
e4b0: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
e4c0: 69 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a  iteHashData(i);.
e4d0: 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53      if( pTab->pS
e4e0: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73  elect ){.      s
e4f0: 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e  qliteResetColumn
e500: 4e 61 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20  Names(pTab);.   
e510: 20 7d 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72   }.  }.  DbClear
e520: 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78  Property(db, idx
e530: 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77  , DB_UnresetView
e540: 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  s);.}.#else.# de
e550: 66 69 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52  fine sqliteViewR
e560: 65 73 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e  esetAll(A,B).#en
e570: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
e580: 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a  IT_VIEW */../*.*
e590: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e5a0: 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65  is called by the
e5b0: 20 56 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20   VDBE to adjust 
e5c0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  the internal sch
e5d0: 65 6d 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53  ema.** used by S
e5e0: 51 4c 69 74 65 20 77 68 65 6e 20 74 68 65 20 62  QLite when the b
e5f0: 74 72 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73  tree layer moves
e600: 20 61 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61   a table root pa
e610: 67 65 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d  ge. The.** root-
e620: 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20  page of a table 
e630: 6f 72 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61  or index in data
e640: 62 61 73 65 20 69 44 62 20 68 61 73 20 63 68 61  base iDb has cha
e650: 6e 67 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a  nged from iFrom.
e660: 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a  ** to iTo..**.**
e670: 20 54 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20   Ticket #1728:  
e680: 54 68 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65  The symbol table
e690: 20 6d 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e   might still con
e6a0: 74 61 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  tain information
e6b0: 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e  .** on tables an
e6c0: 64 2f 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61  d/or indices tha
e6d0: 74 20 61 72 65 20 74 68 65 20 70 72 6f 63 65 73  t are the proces
e6e0: 73 20 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74  s of being delet
e6f0: 65 64 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72  ed..** If you ar
e700: 65 20 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f  e unlucky, one o
e710: 66 20 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20  f those deleted 
e720: 69 6e 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65  indices or table
e730: 73 20 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20  s might.** have 
e740: 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67  the same rootpag
e750: 65 20 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20  e number as the 
e760: 72 65 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e  real table or in
e770: 64 65 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62  dex that is.** b
e780: 65 69 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20  eing moved.  So 
e790: 77 65 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73  we cannot stop s
e7a0: 65 61 72 63 68 69 6e 67 20 61 66 74 65 72 20 74  earching after t
e7b0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a  he first match .
e7c0: 2a 2a 20 62 65 63 61 75 73 65 20 74 68 65 20 66  ** because the f
e7d0: 69 72 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74  irst match might
e7e0: 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74   be for one of t
e7f0: 68 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63  he deleted indic
e800: 65 73 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20  es.** or tables 
e810: 61 6e 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c  and not the tabl
e820: 65 2f 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  e/index that is 
e830: 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d  actually being m
e840: 6f 76 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74  oved..** We must
e850: 20 63 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e   continue loopin
e860: 67 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c  g until all tabl
e870: 65 73 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77  es and indices w
e880: 69 74 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d  ith.** rootpage=
e890: 3d 69 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e  =iFrom have been
e8a0: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61   converted to ha
e8b0: 76 65 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66  ve a rootpage of
e8c0: 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72   iTo.** in order
e8d0: 20 74 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74   to be certain t
e8e0: 68 61 74 20 77 65 20 67 6f 74 20 74 68 65 20 72  hat we got the r
e8f0: 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66  ight one..*/.#if
e900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e910: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64  _AUTOVACUUM.void
e920: 20 73 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65   sqlite3RootPage
e930: 4d 6f 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69  Moved(Db *pDb, i
e940: 6e 74 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54  nt iFrom, int iT
e950: 6f 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a  o){.  HashElem *
e960: 70 45 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70  pElem;.  Hash *p
e970: 48 61 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d  Hash;..  pHash =
e980: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
e990: 74 62 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  tblHash;.  for(p
e9a0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
e9b0: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
e9c0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
e9d0: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
e9e0: 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  {.    Table *pTa
e9f0: 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  b = sqliteHashDa
ea00: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
ea10: 66 28 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69  f( pTab->tnum==i
ea20: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54  From ){.      pT
ea30: 61 62 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  ab->tnum = iTo;.
ea40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73      }.  }.  pHas
ea50: 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d  h = &pDb->pSchem
ea60: 61 2d 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f  a->idxHash;.  fo
ea70: 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  r(pElem=sqliteHa
ea80: 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b 20  shFirst(pHash); 
ea90: 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c  pElem; pElem=sql
eaa0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65  iteHashNext(pEle
eab0: 6d 29 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  m)){.    Index *
eac0: 70 49 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73  pIdx = sqliteHas
ead0: 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20  hData(pElem);.  
eae0: 20 20 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d    if( pIdx->tnum
eaf0: 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
eb00: 20 70 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54   pIdx->tnum = iT
eb10: 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  o;.    }.  }.}.#
eb20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
eb30: 74 65 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65  te code to erase
eb40: 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
eb50: 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65  root-page iTable
eb60: 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69   from database i
eb70: 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74  Db..** Also writ
eb80: 65 20 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79  e code to modify
eb90: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
eba0: 65 72 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74  er table and int
ebb0: 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20  ernal schema.** 
ebc0: 69 66 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f  if a root-page o
ebd0: 66 20 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20  f another table 
ebe0: 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20  is moved by the 
ebf0: 62 74 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c  btree-layer whil
ec00: 73 74 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54  st.** erasing iT
ec10: 61 62 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68  able (this can h
ec20: 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75  appen with an au
ec30: 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
ec40: 73 65 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  se)..*/ .static 
ec50: 76 6f 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74  void destroyRoot
ec60: 50 61 67 65 28 50 61 72 73 65 20 2a 70 50 61 72  Page(Parse *pPar
ec70: 73 65 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  se, int iTable, 
ec80: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
ec90: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
eca0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
ecb0: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
ecc0: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
ecd0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e);.  sqlite3Vdb
ece0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65  eAddOp3(v, OP_De
ecf0: 73 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72  stroy, iTable, r
ed00: 31 2c 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66  1, iDb);.#ifndef
ed10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ed20: 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f  OVACUUM.  /* OP_
ed30: 44 65 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61  Destroy stores a
ed40: 6e 20 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e  n in integer r1.
ed50: 20 49 66 20 74 68 69 73 20 69 6e 74 65 67 65 72   If this integer
ed60: 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  .  ** is non-zer
ed70: 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
ed80: 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  e root page numb
ed90: 65 72 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f  er of a table mo
eda0: 76 65 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61  ved to.  ** loca
edb0: 74 69 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65  tion iTable. The
edc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20   following code 
edd0: 6d 6f 64 69 66 69 65 73 20 74 68 65 20 73 71 6c  modifies the sql
ede0: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
edf0: 20 74 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74   to.  ** reflect
ee00: 20 74 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   this..  **.  **
ee10: 20 54 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74   The "#NNN" in t
ee20: 68 65 20 53 51 4c 20 69 73 20 61 20 73 70 65 63  he SQL is a spec
ee30: 69 61 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61  ial constant tha
ee40: 74 20 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72  t means whatever
ee50: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69   value.  ** is i
ee60: 6e 20 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20  n register NNN. 
ee70: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 67 69   See sqlite3Regi
ee80: 73 74 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f  sterExpr()..  */
ee90: 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
eea0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
eeb0: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
eec0: 73 20 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25  s SET rootpage=%
eed0: 64 20 57 48 45 52 45 20 23 25 64 20 41 4e 44 20  d WHERE #%d AND 
eee0: 72 6f 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20  rootpage=#%d",. 
eef0: 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e      pParse->db->
ef00: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
ef10: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
ef20: 29 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72  ), iTable, r1, r
ef30: 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  1);.#endif.  sql
ef40: 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
ef50: 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
ef60: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56  }../*.** Write V
ef70: 44 42 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73  DBE code to eras
ef80: 65 20 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64  e table pTab and
ef90: 20 61 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20   all associated 
efa0: 69 6e 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e  indices on disk.
efb0: 0a 2a 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61  .** Code to upda
efc0: 74 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  te the sqlite_ma
efd0: 73 74 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20  ster tables and 
efe0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20  internal schema 
eff0: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69  definitions.** i
f000: 6e 20 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61  n case a root-pa
f010: 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
f020: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
f030: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
f040: 72 65 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20  ree layer.** is 
f050: 61 6c 73 6f 20 61 64 64 65 64 20 28 74 68 69 73  also added (this
f060: 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
f070: 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
f080: 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74  database)..*/.st
f090: 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f  atic void destro
f0a0: 79 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  yTable(Parse *pP
f0b0: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
f0c0: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
f0d0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
f0e0: 4d 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  M.  Index *pIdx;
f0f0: 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c  .  int iDb = sql
f100: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f110: 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
f120: 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
f130: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
f140: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e  pParse, pTab->tn
f150: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28  um, iDb);.  for(
f160: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
f170: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
f180: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
f190: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
f1a0: 70 50 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e  pParse, pIdx->tn
f1b0: 75 6d 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65  um, iDb);.  }.#e
f1c0: 6c 73 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  lse.  /* If the 
f1d0: 64 61 74 61 62 61 73 65 20 6d 61 79 20 62 65 20  database may be 
f1e0: 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61  auto-vacuum capa
f1f0: 62 6c 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f  ble (if SQLITE_O
f200: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
f210: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e   ** is not defin
f220: 65 64 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ed), then it is 
f230: 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c  important to cal
f240: 6c 20 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20  l OP_Destroy on 
f250: 74 68 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61  the.  ** table a
f260: 6e 64 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61  nd index root-pa
f270: 67 65 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74  ges in order, st
f280: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
f290: 6e 75 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a  numerically .  *
f2a0: 2a 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  * largest root-p
f2b0: 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73  age number. This
f2c0: 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 61 74   guarantees that
f2d0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f   none of the roo
f2e0: 74 2d 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20  t-pages.  ** to 
f2f0: 62 65 20 64 65 73 74 72 6f 79 65 64 20 69 73 20  be destroyed is 
f300: 72 65 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20  relocated by an 
f310: 65 61 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72  earlier OP_Destr
f320: 6f 79 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a  oy. i.e. if the.
f330: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77    ** following w
f340: 65 72 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a  ere coded:.  **.
f350: 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20    ** OP_Destroy 
f360: 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a  4 0.  ** ....  *
f370: 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30  * OP_Destroy 5 0
f380: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72  .  **.  ** and r
f390: 6f 6f 74 20 70 61 67 65 20 35 20 68 61 70 70 65  oot page 5 happe
f3a0: 6e 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61  ned to be the la
f3b0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
f3c0: 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20  number in the.  
f3d0: 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
f3e0: 6e 20 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f  n root page 5 wo
f3f0: 75 6c 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20  uld be moved to 
f400: 70 61 67 65 20 34 20 62 79 20 74 68 65 20 0a 20  page 4 by the . 
f410: 20 2a 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20   ** "OP_Destroy 
f420: 34 20 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65  4 0" opcode. The
f430: 20 73 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f   subsequent "OP_
f440: 44 65 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75  Destroy 5 0" wou
f450: 6c 64 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72  ld hit.  ** a fr
f460: 65 65 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20  ee-list page..  
f470: 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20  */.  int iTab = 
f480: 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e  pTab->tnum;.  in
f490: 74 20 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30  t iDestroyed = 0
f4a0: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  ;..  while( 1 ){
f4b0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
f4c0: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65  ;.    int iLarge
f4d0: 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28  st = 0;..    if(
f4e0: 20 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c   iDestroyed==0 |
f4f0: 7c 20 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65  | iTab<iDestroye
f500: 64 20 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67  d ){.      iLarg
f510: 65 73 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  est = iTab;.    
f520: 7d 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70  }.    for(pIdx=p
f530: 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  Tab->pIndex; pId
f540: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
f550: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ext){.      int 
f560: 69 49 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75  iIdx = pIdx->tnu
f570: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  m;.      assert(
f580: 20 70 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d   pIdx->pSchema==
f590: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
f5a0: 0a 20 20 20 20 20 20 69 66 28 20 28 69 44 65 73  .      if( (iDes
f5b0: 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49  troyed==0 || (iI
f5c0: 64 78 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20  dx<iDestroyed)) 
f5d0: 26 26 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74  && iIdx>iLargest
f5e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72   ){.        iLar
f5f0: 67 65 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20  gest = iIdx;.   
f600: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
f610: 66 28 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29  f( iLargest==0 )
f620: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
f630: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f640: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f650: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f660: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f670: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
f680: 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
f690: 65 28 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65  e(pParse, iLarge
f6a0: 73 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  st, iDb);.      
f6b0: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61  iDestroyed = iLa
f6c0: 72 67 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  rgest;.    }.  }
f6d0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
f6e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f6f0: 20 63 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68   called to do th
f700: 65 20 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50  e work of a DROP
f710: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
f720: 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68  ..** pName is th
f730: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
f740: 62 6c 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65  ble to be droppe
f750: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
f760: 65 33 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73  e3DropTable(Pars
f770: 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
f780: 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
f790: 73 56 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72  sView, int noErr
f7a0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
f7b0: 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73  ;.  Vdbe *v;.  s
f7c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
f7d0: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69  rse->db;.  int i
f7e0: 44 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 52  Db;..  if( NEVER
f7f0: 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 20 7c  (pParse->nErr) |
f800: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
f810: 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
f820: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
f830: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e    }.  assert( pN
f840: 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
f850: 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
f860: 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72  LocateTable(pPar
f870: 73 65 2c 20 69 73 56 69 65 77 2c 20 0a 20 20 20  se, isView, .   
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 20 20 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e           pName->
f8a0: 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  a[0].zName, pNam
f8b0: 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73  e->a[0].zDatabas
f8c0: 65 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 3d  e);..  if( pTab=
f8d0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  =0 ){.    if( no
f8e0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
f8f0: 69 74 65 33 45 72 72 6f 72 43 6c 65 61 72 28 70  ite3ErrorClear(p
f900: 50 61 72 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Parse);.    }.  
f910: 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
f920: 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44  _table;.  }.  iD
f930: 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
f940: 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61  aToIndex(db, pTa
f950: 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 61  b->pSchema);.  a
f960: 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26  ssert( iDb>=0 &&
f970: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a   iDb<db->nDb );.
f980: 0a 20 20 2f 2a 20 49 66 20 70 54 61 62 20 69 73  .  /* If pTab is
f990: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
f9a0: 2c 20 63 61 6c 6c 20 56 69 65 77 47 65 74 43 6f  , call ViewGetCo
f9b0: 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65  lumnNames() to e
f9c0: 6e 73 75 72 65 0a 20 20 2a 2a 20 69 74 20 69 73  nsure.  ** it is
f9d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
f9e0: 2a 2f 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  */.  if( IsVirtu
f9f0: 61 6c 28 70 54 61 62 29 20 26 26 20 73 71 6c 69  al(pTab) && sqli
fa00: 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e  te3ViewGetColumn
fa10: 4e 61 6d 65 73 28 70 50 61 72 73 65 2c 20 70 54  Names(pParse, pT
fa20: 61 62 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ab) ){.    goto 
fa30: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
fa40: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c  .  }.#ifndef SQL
fa50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
fa60: 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
fa70: 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt code;.    con
fa80: 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
fa90: 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
faa0: 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
fab0: 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62  r *zDb = db->aDb
fac0: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  [iDb].zName;.   
fad0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
fae0: 67 32 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  g2 = 0;.    if( 
faf0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
fb00: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
fb10: 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c  DELETE, zTab, 0,
fb20: 20 7a 44 62 29 29 7b 0a 20 20 20 20 20 20 67 6f   zDb)){.      go
fb30: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fb40: 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  le;.    }.    if
fb50: 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20 20  ( isView ){.    
fb60: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
fb70: 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
fb80: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
fb90: 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f  QLITE_DROP_TEMP_
fba0: 56 49 45 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73  VIEW;.      }els
fbb0: 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  e{.        code 
fbc0: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49  = SQLITE_DROP_VI
fbd0: 45 57 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  EW;.      }.#ifn
fbe0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fbf0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
fc00: 20 7d 65 6c 73 65 20 69 66 28 20 49 73 56 69 72   }else if( IsVir
fc10: 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
fc20: 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54      code = SQLIT
fc30: 45 5f 44 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20  E_DROP_VTABLE;. 
fc40: 20 20 20 20 20 7a 41 72 67 32 20 3d 20 70 54 61       zArg2 = pTa
fc50: 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  b->pMod->zName;.
fc60: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
fc70: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
fc80: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
fc90: 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
fca0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
fcb0: 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
fcc0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fcd0: 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
fce0: 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
fcf0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
fd00: 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
fd10: 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
fd20: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
fd30: 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
fd40: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
fd50: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
fd60: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
fd70: 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
fd80: 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
fd90: 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
fda0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
fdb0: 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
fdc0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
fdd0: 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
fde0: 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
fdf0: 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
fe00: 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , 7)==0 ){.    s
fe10: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fe20: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73  Parse, "table %s
fe30: 20 6d 61 79 20 6e 6f 74 20 62 65 20 64 72 6f 70   may not be drop
fe40: 70 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  ped", pTab->zNam
fe50: 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
fe60: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
fe70: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fe80: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
fe90: 20 45 6e 73 75 72 65 20 44 52 4f 50 20 54 41 42   Ensure DROP TAB
fea0: 4c 45 20 69 73 20 6e 6f 74 20 75 73 65 64 20 6f  LE is not used o
feb0: 6e 20 61 20 76 69 65 77 2c 20 61 6e 64 20 44 52  n a view, and DR
fec0: 4f 50 20 56 49 45 57 20 69 73 20 6e 6f 74 20 75  OP VIEW is not u
fed0: 73 65 64 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61  sed.  ** on a ta
fee0: 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ble..  */.  if( 
fef0: 69 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e  isView && pTab->
ff00: 70 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20  pSelect==0 ){.  
ff10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
ff20: 67 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44  g(pParse, "use D
ff30: 52 4f 50 20 54 41 42 4c 45 20 74 6f 20 64 65 6c  ROP TABLE to del
ff40: 65 74 65 20 74 61 62 6c 65 20 25 73 22 2c 20 70  ete table %s", p
ff50: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
ff60: 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
ff70: 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28  table;.  }.  if(
ff80: 20 21 69 73 56 69 65 77 20 26 26 20 70 54 61 62   !isView && pTab
ff90: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
ffa0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ffb0: 28 70 50 61 72 73 65 2c 20 22 75 73 65 20 44 52  (pParse, "use DR
ffc0: 4f 50 20 56 49 45 57 20 74 6f 20 64 65 6c 65 74  OP VIEW to delet
ffd0: 65 20 76 69 65 77 20 25 73 22 2c 20 70 54 61 62  e view %s", pTab
ffe0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
fff0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
10000 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  le;.  }.#endif..
10010 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
10020 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  de to remove the
10030 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
10040 6d 61 73 74 65 72 20 74 61 62 6c 65 0a 20 20 2a  master table.  *
10050 2a 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  * on disk..  */.
10060 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
10070 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
10080 69 66 28 20 76 20 29 7b 0a 20 20 20 20 54 72 69  if( v ){.    Tri
10090 67 67 65 72 20 2a 70 54 72 69 67 67 65 72 3b 0a  gger *pTrigger;.
100a0 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
100b0 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20  b->aDb[iDb];.   
100c0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
100d0 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
100e0 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 1, iDb);..#i
100f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10100 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
10110 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
10120 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
10130 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10140 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b  0(v, OP_VBegin);
10150 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
10160 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
10170 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
10180 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
10190 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
101a0 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   Code.    ** is 
101b0 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
101c0 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
101d0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
101e0 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  nd/or.    ** sql
101f0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
10200 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  if required..   
10210 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
10220 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
10230 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  rList(pParse, pT
10240 61 62 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ab);.    while( 
10250 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
10260 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
10270 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
10280 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
10290 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
102a0 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
102b0 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
102c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
102d0 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
102e0 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
102f0 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20  .      pTrigger 
10300 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
10310 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
10320 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10330 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
10340 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
10350 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
10360 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
10370 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
10380 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
10390 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
103a0 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
103b0 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
103c0 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20   is dropped.    
103d0 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
103e0 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
103f0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
10400 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
10410 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73  o.    ** move as
10420 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10430 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
10440 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
10450 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   mode)..    */. 
10460 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62     if( pTab->tab
10470 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
10480 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
10490 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
104a0 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
104b0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
104c0 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %s.sqlite_sequ
104d0 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
104e0 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62  %Q",.        pDb
104f0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
10500 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
10510 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
10520 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
10530 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
10540 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
10550 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
10560 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
10570 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
10580 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
10590 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
105a0 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
105b0 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
105c0 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
105d0 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
105e0 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
105f0 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
10600 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
10610 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
10620 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
10630 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
10640 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
10650 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
10660 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
10670 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
10680 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
10690 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
106a0 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
106b0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
106c0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
106d0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
106e0 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
106f0 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
10700 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
10710 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
10720 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
10730 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  Name);..    /* D
10740 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73 74 69  rop any statisti
10750 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  cs from the sqli
10760 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2c 20  te_stat1 table, 
10770 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
10780 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
10790 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
107a0 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d  lite_stat1", db-
107b0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
107c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
107d0 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
107e0 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
107f0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
10800 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45 20  ite_stat1 WHERE 
10810 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a 4e  tbl=%Q", pDb->zN
10820 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
10830 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
10840 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
10850 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
10860 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65  Tab) ){.      de
10870 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
10880 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
10890 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
108a0 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
108b0 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
108c0 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
108d0 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74   modify.    ** t
108e0 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
108f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10900 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
10910 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
10920 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
10930 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c  P_VDestroy, iDb,
10940 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
10950 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
10960 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
10970 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
10980 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
10990 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
109a0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
109b0 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
109c0 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   iDb);.  }.  sql
109d0 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
109e0 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f  db, iDb);..exit_
109f0 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
10a00 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
10a10 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
10a20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
10a30 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
10a40 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
10a50 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
10a60 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
10a70 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
10a80 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
10a90 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
10aa0 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
10ab0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
10ac0 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
10ad0 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
10ae0 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
10af0 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
10b00 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
10b10 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
10b20 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
10b30 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
10b40 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
10b50 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
10b60 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
10b70 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
10b80 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
10b90 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
10ba0 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
10bb0 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
10bc0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
10bd0 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
10be0 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
10bf0 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
10c00 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
10c10 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
10c20 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
10c30 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
10c40 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
10c50 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
10c60 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
10c70 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
10c80 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
10c90 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
10ca0 54 61 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a  Table field..**.
10cb0 2a 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b  ** The foreign k
10cc0 65 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d  ey is set for IM
10cd0 4d 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69  MEDIATE processi
10ce0 6e 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e  ng.  A subsequen
10cf0 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c  t call.** to sql
10d00 69 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e  ite3DeferForeign
10d10 4b 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e  Key() might chan
10d20 67 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52  ge this to DEFER
10d30 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  RED..*/.void sql
10d40 69 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67  ite3CreateForeig
10d50 6e 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  nKey(.  Parse *p
10d60 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
10d70 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
10d80 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10d90 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c  FromCol,  /* Col
10da0 75 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62  umns in this tab
10db0 6c 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  le that point to
10dc0 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
10dd0 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20    Token *pTo,   
10de0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10df0 66 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c  f the other tabl
10e00 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
10e10 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  *pToCol,    /* C
10e20 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74  olumns in the ot
10e30 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  her table */.  i
10e40 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
10e50 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
10e60 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
10e70 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73  ithms. */.){.  s
10e80 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
10e90 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66  rse->db;.#ifndef
10ea0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
10eb0 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20  EIGN_KEY.  FKey 
10ec0 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61  *pFKey = 0;.  Ta
10ed0 62 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d  ble *p = pParse-
10ee0 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e  >pNewTable;.  in
10ef0 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69  t nByte;.  int i
10f00 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20  ;.  int nCol;.  
10f10 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65  char *z;..  asse
10f20 72 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20  rt( pTo!=0 );.  
10f30 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e 45 56 45  if( p==0 || NEVE
10f40 52 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 29 20  R(pParse->nErr) 
10f50 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  || IN_DECLARE_VT
10f60 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  AB ) goto fk_end
10f70 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c  ;.  if( pFromCol
10f80 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
10f90 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b  Col = p->nCol-1;
10fa0 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 69  .    if( NEVER(i
10fb0 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66 6b  Col<0) ) goto fk
10fc0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
10fd0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
10fe0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
10ff0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11000 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
11010 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
11020 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
11030 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
11040 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
11050 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
11060 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
11070 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
11080 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11090 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
110a0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
110b0 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
110c0 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
110d0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
110e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
110f0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
11100 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11110 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
11120 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
11130 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
11140 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
11150 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
11160 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
11170 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
11180 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
11190 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
111a0 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
111b0 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
111c0 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
111d0 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
111e0 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
111f0 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
11200 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
11210 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
11220 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
11230 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11240 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
11250 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
11260 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
11270 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
11280 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
11290 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
112a0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
112b0 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
112c0 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
112d0 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
112e0 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
112f0 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
11300 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
11310 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
11320 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
11330 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
11340 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
11350 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
11360 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
11370 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
11380 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
11390 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
113a0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
113b0 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
113c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
113d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
113e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
113f0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
11400 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
11410 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11420 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
11430 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
11440 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
11450 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
11460 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
11470 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
11480 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11490 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
114a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
114b0 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
114c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
114d0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
114e0 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
114f0 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
11500 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
11510 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
11520 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
11530 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
11540 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
11550 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11560 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
11570 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
11580 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
11590 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
115a0 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
115b0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
115c0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
115d0 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
115e0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
115f0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
11600 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
11610 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
11620 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
11630 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
11640 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
11650 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
11660 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
11670 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  f);.  pFKey->upd
11680 61 74 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 28  ateConf = (u8)((
11690 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
116a0 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  xff);.  pFKey->i
116b0 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 75 38 29  nsertConf = (u8)
116c0 28 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20  ((flags >> 16 ) 
116d0 26 20 30 78 66 66 29 3b 0a 0a 20 20 2f 2a 20 4c  & 0xff);..  /* L
116e0 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
116f0 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
11700 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
11710 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
11720 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
11730 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
11740 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
11750 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
11760 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
11770 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
11780 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
11790 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
117a0 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
117b0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
117c0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
117d0 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
117e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
117f0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
11800 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
11810 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
11820 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
11830 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
11840 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
11850 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
11860 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
11870 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
11880 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
11890 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
118a0 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
118b0 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
118c0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
118d0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
118e0 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
118f0 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
11900 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
11910 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
11920 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
11930 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11940 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
11950 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11960 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
11970 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
11980 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
11990 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
119a0 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
119b0 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
119c0 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
119d0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
119e0 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
119f0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
11a00 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
11a10 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
11a20 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
11a30 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11a40 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
11a50 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
11a60 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
11a70 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
11a80 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
11a90 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
11aa0 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
11ab0 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
11ac0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
11ad0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
11ae0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
11af0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
11b00 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
11b10 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
11b20 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
11b30 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
11b40 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
11b50 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
11b60 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
11b70 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
11b80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
11b90 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
11ba0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
11bb0 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
11bc0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
11bd0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
11be0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
11bf0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
11c00 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
11c10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
11c20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
11c30 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
11c40 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
11c50 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
11c60 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
11c70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
11c80 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
11c90 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
11ca0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
11cb0 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
11cc0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
11cd0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
11ce0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
11cf0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
11d00 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
11d10 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
11d20 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
11d30 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
11d40 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
11d50 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
11d60 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d80 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
11d90 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
11da0 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11dc0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
11dd0 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
11de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11df0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
11e00 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
11e10 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
11e20 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
11e30 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
11e40 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
11e50 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
11e60 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20   int regIdxKey; 
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e  /* Registers con
11e90 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
11ea0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72  x key */.  int r
11eb0 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
11ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
11ed0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
11ee0 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72  semblied index r
11ef0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
11f00 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
11f10 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
11f20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11f30 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
11f40 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
11f50 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
11f60 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
11f70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11f80 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
11f90 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
11fa0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
11fb0 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
11fc0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
11fd0 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
11fe0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
11ff0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12000 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
12010 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
12020 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
12030 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
12040 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
12050 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
12060 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
12070 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
12080 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
12090 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
120a0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
120b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
120c0 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
120d0 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
120e0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
120f0 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
12100 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
12110 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12120 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61  ddOp2(v, OP_Clea
12130 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  r, tnum, iDb);. 
12140 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
12150 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
12160 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
12170 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12180 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
12190 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
121a0 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
121b0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
121c0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
121d0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
121e0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
121f0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
12200 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12210 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 1);.  }.  sqli
12220 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
12230 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
12240 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
12250 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
12260 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12270 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
12280 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63  ab, 0);.  regRec
12290 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
122a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
122b0 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73  .  regIdxKey = s
122c0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
122d0 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
122e0 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67  Index, iTab, reg
122f0 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66  Record, 1);.  if
12300 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
12310 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
12320 20 20 63 6f 6e 73 74 20 69 6e 74 20 72 65 67 52    const int regR
12330 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65 79  owid = regIdxKey
12340 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   + pIndex->nColu
12350 6d 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  mn;.    const in
12360 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
12370 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
12380 20 2b 20 32 3b 0a 20 20 20 20 76 6f 69 64 20 2a   + 2;.    void *
12390 20 63 6f 6e 73 74 20 70 52 65 67 4b 65 79 20 3d   const pRegKey =
123a0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
123b0 54 52 28 72 65 67 49 64 78 4b 65 79 29 3b 0a 0a  TR(regIdxKey);..
123c0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 67 69 73      /* The regis
123d0 74 65 72 73 20 61 63 63 65 73 73 65 64 20 62 79  ters accessed by
123e0 20 74 68 65 20 4f 50 5f 49 73 55 6e 69 71 75 65   the OP_IsUnique
123f0 20 6f 70 63 6f 64 65 20 77 65 72 65 20 61 6c 6c   opcode were all
12400 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 75 73  ocated.    ** us
12410 69 6e 67 20 73 71 6c 69 74 65 33 47 65 74 54 65  ing sqlite3GetTe
12420 6d 70 52 61 6e 67 65 28 29 20 69 6e 73 69 64 65  mpRange() inside
12430 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 47   of the sqlite3G
12440 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28  enerateIndexKey(
12450 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 61 62  ).    ** call ab
12460 6f 76 65 2e 20 4a 75 73 74 20 62 65 66 6f 72 65  ove. Just before
12470 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 77   that function w
12480 61 73 20 66 72 65 65 64 20 74 68 65 79 20 77 65  as freed they we
12490 72 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  re released.    
124a0 2a 2a 20 28 6d 61 64 65 20 61 76 61 69 6c 61 62  ** (made availab
124b0 6c 65 20 74 6f 20 74 68 65 20 63 6f 6d 70 69 6c  le to the compil
124c0 65 72 20 66 6f 72 20 72 65 75 73 65 29 20 75 73  er for reuse) us
124d0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ing .    ** sqli
124e0 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61  te3ReleaseTempRa
124f0 6e 67 65 28 29 2e 20 53 6f 20 69 6e 20 73 6f 6d  nge(). So in som
12500 65 20 77 61 79 73 20 68 61 76 69 6e 67 20 74 68  e ways having th
12510 65 20 4f 50 5f 49 73 55 6e 69 71 75 65 0a 20 20  e OP_IsUnique.  
12520 20 20 2a 2a 20 6f 70 63 6f 64 65 20 75 73 65 20    ** opcode use 
12530 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
12540 64 20 77 69 74 68 69 6e 20 73 65 65 6d 73 20 64  d within seems d
12550 61 6e 67 65 72 6f 75 73 2e 20 48 6f 77 65 76 65  angerous. Howeve
12560 72 2c 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20  r, since.    ** 
12570 77 65 20 63 61 6e 20 62 65 20 73 75 72 65 20 74  we can be sure t
12580 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 74 65 6d  hat no other tem
12590 70 20 72 65 67 69 73 74 65 72 73 20 68 61 76 65  p registers have
125a0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
125b0 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 73 71 6c      ** since sql
125c0 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
125d0 61 6e 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65  ange() was calle
125e0 64 2c 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  d, it is safe to
125f0 20 64 6f 20 73 6f 2e 0a 20 20 20 20 2a 2f 0a 20   do so..    */. 
12600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12610 64 4f 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69  dOp4(v, OP_IsUni
12620 71 75 65 2c 20 69 49 64 78 2c 20 6a 32 2c 20 72  que, iIdx, j2, r
12630 65 67 52 6f 77 69 64 2c 20 70 52 65 67 4b 65 79  egRowid, pRegKey
12640 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20  , P4_INT32);.   
12650 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12660 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53  p4(v, OP_Halt, S
12670 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12680 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 30 2c 0a 20  , OE_Abort, 0,. 
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126a0 20 20 20 22 69 6e 64 65 78 65 64 20 63 6f 6c 75     "indexed colu
126b0 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75 6e 69 71  mns are not uniq
126c0 75 65 22 2c 20 50 34 5f 53 54 41 54 49 43 29 3b  ue", P4_STATIC);
126d0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
126e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
126f0 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
12700 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71  regRecord);.  sq
12710 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
12720 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
12730 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
12740 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
12750 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
12760 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
12770 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12780 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c 20 61 64  P_Next, iTab, ad
12790 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65  dr1+1);.  sqlite
127a0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
127b0 20 61 64 64 72 31 29 3b 0a 20 20 73 71 6c 69 74   addr1);.  sqlit
127c0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
127d0 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b  OP_Close, iTab);
127e0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
127f0 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
12800 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , iIdx);.}../*.*
12810 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 69  * Create a new i
12820 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20  ndex for an SQL 
12830 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70  table.  pName1.p
12840 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d  Name2 is the nam
12850 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a  e of the index .
12860 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20  ** and pTblList 
12870 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
12880 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
12890 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
128a0 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62   Both will .** b
128b0 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69  e NULL for a pri
128c0 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69  mary key or an i
128d0 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72 65  ndex that is cre
128e0 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  ated to satisfy 
128f0 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73  a.** UNIQUE cons
12900 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62  traint.  If pTab
12910 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72  le and pIndex ar
12920 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72  e NULL, use pPar
12930 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a  se->pNewTable.**
12940 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f   as the table to
12950 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50   be indexed.  pP
12960 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
12970 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74 20  is a table that 
12980 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  is.** currently 
12990 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65  being constructe
129a0 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54 41  d by a CREATE TA
129b0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
129c0 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20  *.** pList is a 
129d0 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  list of columns 
129e0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20  to be indexed.  
129f0 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55  pList will be NU
12a00 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73  LL if this.** is
12a10 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
12a20 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61  r unique-constra
12a30 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  int on the most 
12a40 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64  recent column ad
12a50 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61  ded.** to the ta
12a60 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e  ble currently un
12a70 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
12a80 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .  .*/.void sqli
12a90 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
12aa0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
12ab0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
12ac0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
12ad0 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
12ae0 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
12af0 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
12b00 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
12b10 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
12b20 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
12b30 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
12b40 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
12b50 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
12b60 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
12b70 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
12b80 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
12b90 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
12ba0 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
12bb0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
12bc0 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
12bd0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
12be0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
12bf0 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
12c00 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
12c10 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
12c20 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
12c30 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
12c40 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
12c50 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73  that begins this
12c60 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
12c70 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20  Token *pEnd,    
12c80 20 20 20 2f 2a 20 54 68 65 20 22 29 22 20 74 68     /* The ")" th
12c90 61 74 20 63 6c 6f 73 65 73 20 74 68 65 20 43 52  at closes the CR
12ca0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
12cb0 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  ment */.  int so
12cc0 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20  rtOrder,     /* 
12cd0 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72  Sort order of pr
12ce0 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70  imary key when p
12cf0 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20  List==NULL */.  
12d00 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20  int ifNotExist  
12d10 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72     /* Omit error
12d20 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64   if index alread
12d30 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
12d40 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
12d50 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74  ;     /* Table t
12d60 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
12d70 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20    Index *pIndex 
12d80 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  = 0;   /* The in
12d90 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74 65  dex to be create
12da0 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61  d */.  char *zNa
12db0 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e  me = 0;     /* N
12dc0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
12dd0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b   */.  int nName;
12de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12df0 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
12e00 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20  rs in zName */. 
12e10 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b   int i, j;.  Tok
12e20 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20  en nullId;      
12e30 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20    /* Fake token 
12e40 66 6f 72 20 61 6e 20 65 6d 70 74 79 20 49 44 20  for an empty ID 
12e50 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46 69 78 65  list */.  DbFixe
12e60 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20 2f  r sFix;        /
12e70 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67 20  * For assigning 
12e80 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20 74  database names t
12e90 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  o pTable */.  in
12ea0 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b  t sortOrderMask;
12eb0 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72     /* 1 to honor
12ec0 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e 20   DESC in index. 
12ed0 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f   0 to ignore. */
12ee0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12ef0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44   pParse->db;.  D
12f00 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20 20  b *pDb;         
12f10 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
12f20 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  fic table contai
12f30 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65 64  ning the indexed
12f40 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
12f50 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
12f60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
12f70 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
12f80 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  t is being writt
12f90 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
12fa0 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Name = 0;    /* 
12fb0 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  Unqualified name
12fc0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74 6f   of the index to
12fd0 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74 72   create */.  str
12fe0 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
12ff0 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a  m *pListItem; /*
13000 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
13010 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  r pList */.  int
13020 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78   nCol;.  int nEx
13030 74 72 61 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tra = 0;.  char 
13040 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 61 73 73 65  *zExtra;..  asse
13050 72 74 28 20 70 53 74 61 72 74 3d 3d 30 20 7c 7c  rt( pStart==0 ||
13060 20 70 45 6e 64 21 3d 30 20 29 3b 20 2f 2a 20 70   pEnd!=0 ); /* p
13070 45 6e 64 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d  End must be non-
13080 4e 55 4c 4c 20 69 66 20 70 53 74 61 72 74 20 69  NULL if pStart i
13090 73 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52  s */.  if( NEVER
130a0 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29  (pParse->nErr>0)
130b0 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
130c0 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41  iled || IN_DECLA
130d0 52 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67  RE_VTAB ){.    g
130e0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
130f0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28  index;.  }.  if(
13100 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
13110 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
13120 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f 74  arse) ){.    got
13130 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13140 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  dex;.  }..  /*. 
13150 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61 62   ** Find the tab
13160 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  le that is to be
13170 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75 72   indexed.  Retur
13180 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20 66  n early if not f
13190 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ound..  */.  if(
131a0 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a   pTblName!=0 ){.
131b0 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65 20  .    /* Use the 
131c0 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20 6e  two-part index n
131d0 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  ame to determine
131e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20   the database . 
131f0 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68 20     ** to search 
13200 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 27  for the table. '
13210 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20 6e  Fix' the table n
13220 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a 20  ame to this db. 
13230 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f 6f     ** before loo
13240 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62 6c  king up the tabl
13250 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
13260 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26 20  sert( pName1 && 
13270 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69 44  pName2 );.    iD
13280 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
13290 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
132a0 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
132b0 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
132c0 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78 69  iDb<0 ) goto exi
132d0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
132e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
132f0 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20 20  OMIT_TEMPDB.    
13300 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  /* If the index 
13310 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c 69  name was unquali
13320 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20 74  fied, check if t
13330 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  he the table.   
13340 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
13350 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
13360 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
13370 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
13380 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
13390 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
133a0 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
133b0 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
133c0 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
133d0 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
133e0 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
133f0 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
13400 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
13410 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
13420 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
13430 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
13440 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
13450 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20   iDb = 1;.      
13460 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
13470 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
13480 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
13490 61 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65  arse, iDb, "inde
134a0 78 22 2c 20 70 4e 61 6d 65 29 20 26 26 0a 20 20  x", pName) &&.  
134b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 78        sqlite3Fix
134c0 53 72 63 4c 69 73 74 28 26 73 46 69 78 2c 20 70  SrcList(&sFix, p
134d0 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20 29 7b 0a  TblName).    ){.
134e0 20 20 20 20 20 20 2f 2a 20 42 65 63 61 75 73 65        /* Because
134f0 20 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 73   the parser cons
13500 74 72 75 63 74 73 20 70 54 62 6c 4e 61 6d 65 20  tructs pTblName 
13510 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 69 64  from a single id
13520 65 6e 74 69 66 69 65 72 2c 0a 20 20 20 20 20 20  entifier,.      
13530 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
13540 4c 69 73 74 20 63 61 6e 20 6e 65 76 65 72 20 66  List can never f
13550 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  ail. */.      as
13560 73 65 72 74 28 30 29 3b 0a 20 20 20 20 7d 0a 20  sert(0);.    }. 
13570 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
13580 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61  3LocateTable(pPa
13590 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e 61 6d 65  rse, 0, pTblName
135a0 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 0a 20  ->a[0].zName, . 
135b0 20 20 20 20 20 20 20 70 54 62 6c 4e 61 6d 65 2d         pTblName-
135c0 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29  >a[0].zDatabase)
135d0 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62 20  ;.    if( !pTab 
135e0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
135f0 6c 65 64 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  led ) goto exit_
13600 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13610 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
13620 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3d 3d  b[iDb].pSchema==
13630 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b  pTab->pSchema );
13640 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
13650 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
13660 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 50 61  ;.    pTab = pPa
13670 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
13680 20 20 20 20 69 66 28 20 21 70 54 61 62 20 29 20      if( !pTab ) 
13690 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
136a0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 44 62 20  _index;.    iDb 
136b0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
136c0 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d  oIndex(db, pTab-
136d0 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
136e0 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b   pDb = &db->aDb[
136f0 69 44 62 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  iDb];..  assert(
13700 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61 73   pTab!=0 );.  as
13710 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45  sert( pParse->nE
13720 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 73  rr==0 );.  if( s
13730 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
13740 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
13750 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20 20  ite_", 7)==0 .  
13760 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 26       && memcmp(&
13770 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c 22  pTab->zName[7],"
13780 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d 30  altertab_",9)!=0
13790 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
137a0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
137b0 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f  "table %s may no
137c0 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20 70  t be indexed", p
137d0 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
137e0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
137f0 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69 66  e_index;.  }.#if
13800 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13810 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61 62  _VIEW.  if( pTab
13820 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
13830 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13840 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73 20  (pParse, "views 
13850 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78  may not be index
13860 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ed");.    goto e
13870 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13880 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
13890 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
138a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
138b0 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
138c0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
138d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
138e0 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62 6c  e, "virtual tabl
138f0 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  es may not be in
13900 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74  dexed");.    got
13910 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13920 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  dex;.  }.#endif.
13930 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
13940 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
13950 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75 72  index.  Make sur
13960 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 61  e there is not a
13970 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a 20  lready another. 
13980 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
13990 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  le with the same
139a0 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20 20   name.  .  **.  
139b0 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20 49  ** Exception:  I
139c0 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67  f we are reading
139d0 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70 65   the names of pe
139e0 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73 20  rmanent indices 
139f0 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73 71  from the.  ** sq
13a00 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
13a10 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65 20  e (because some 
13a20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63 68  other process ch
13a30 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d 61  anged the schema
13a40 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20 6f  ) and.  ** one o
13a50 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65  f the index name
13a60 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68 20  s collides with 
13a70 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 65  the name of a te
13a80 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
13a90 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68 65  .  ** index, the
13aa0 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e  n we will contin
13ab0 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ue to process th
13ac0 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20  is index..  **. 
13ad0 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30 20   ** If pName==0 
13ae0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  it means that we
13af0 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69 6e   are.  ** dealin
13b00 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72 79  g with a primary
13b10 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20 63   key or UNIQUE c
13b20 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20 68  onstraint.  We h
13b30 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f 75  ave to invent ou
13b40 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65 2e  r.  ** own name.
13b50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61 6d  .  */.  if( pNam
13b60 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  e ){.    zName =
13b70 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
13b80 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
13b90 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
13ba0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
13bb0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13bc0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13bd0 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
13be0 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
13bf0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
13c00 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13c10 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
13c20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
13c30 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
13c40 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
13c50 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
13c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
13c70 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
13c80 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
13c90 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
13ca0 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
13cb0 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
13cc0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13cd0 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
13ce0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
13cf0 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
13d00 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  ame, pDb->zName)
13d10 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
13d20 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
13d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13d40 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13d50 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
13d60 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
13d70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13d80 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13d90 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
13da0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
13db0 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 4c  n;.    Index *pL
13dc0 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f  oop;.    for(pLo
13dd0 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c  op=pTab->pIndex,
13de0 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f   n=1; pLoop; pLo
13df0 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c  op=pLoop->pNext,
13e00 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d   n++){}.    zNam
13e10 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  e = sqlite3MPrin
13e20 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 61  tf(db, "sqlite_a
13e30 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c  utoindex_%s_%d",
13e40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29   pTab->zName, n)
13e50 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
13e60 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
13e70 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13e80 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ex;.    }.  }.. 
13e90 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 75   /* Check for au
13ea0 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63  thorization to c
13eb0 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a  reate an index..
13ec0 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
13ed0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
13ee0 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63  ZATION.  {.    c
13ef0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
13f00 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20   pDb->zName;.   
13f10 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
13f20 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
13f30 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43 48  LITE_INSERT, SCH
13f40 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20  EMA_TABLE(iDb), 
13f50 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
13f60 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13f70 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
13f80 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43 52     i = SQLITE_CR
13f90 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20  EATE_INDEX;.    
13fa0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
13fb0 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20 3d   && iDb==1 ) i =
13fc0 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
13fd0 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
13fe0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
13ff0 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20 7a  eck(pParse, i, z
14000 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  Name, pTab->zNam
14010 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  e, zDb) ){.     
14020 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14030 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14040 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
14050 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20  If pList==0, it 
14060 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74 69  means this routi
14070 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  ne was called to
14080 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79 0a   make a primary.
14090 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20    ** key out of 
140a0 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
140b0 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
140c0 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
140d0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63  ction..  ** So c
140e0 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69 73  reate a fake lis
140f0 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74 68  t to simulate th
14100 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  is..  */.  if( p
14110 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  List==0 ){.    n
14120 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29 70  ullId.z = (u8*)p
14130 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e  Tab->aCol[pTab->
14140 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20  nCol-1].zName;. 
14150 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73 71     nullId.n = sq
14160 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28 63  lite3Strlen30((c
14170 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b 0a  har*)nullId.z);.
14180 20 20 20 20 6e 75 6c 6c 49 64 2e 71 75 6f 74 65      nullId.quote
14190 64 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  d = 0;.    pList
141a0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
141b0 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
141c0 20 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64 29 3b   0, 0, &nullId);
141d0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
141e0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
141f0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
14200 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
14210 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f 72 74  Order = (u8)sort
14220 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Order;.  }..  /*
14230 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
14240 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73 70  many bytes of sp
14250 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65 64  ace are required
14260 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69 63   to store explic
14270 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69 66  itly.  ** specif
14280 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ied collation se
14290 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20 20  quence names..  
142a0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
142b0 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
142c0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
142d0 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  xpr = pList->a[i
142e0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
142f0 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20   pExpr ){.      
14300 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
14310 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20   pExpr->pColl;. 
14320 20 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 70       /* Either p
14330 43 6f 6c 6c 21 3d 30 20 6f 72 20 74 68 65 72 65  Coll!=0 or there
14340 20 77 61 73 20 61 6e 20 4f 4f 4d 20 66 61 69 6c   was an OOM fail
14350 75 72 65 2e 20 20 42 75 74 20 69 66 20 61 6e 20  ure.  But if an 
14360 4f 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 66 61 69  OOM.      ** fai
14370 6c 75 72 65 20 77 65 20 68 61 76 65 20 71 75 69  lure we have qui
14380 74 20 62 65 66 6f 72 65 20 72 65 61 63 68 69 6e  t before reachin
14390 67 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 2a 2f  g this point. */
143a0 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
143b0 53 28 70 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20  S(pColl) ){.    
143c0 20 20 20 20 6e 45 78 74 72 61 20 2b 3d 20 28 31      nExtra += (1
143d0 20 2b 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   + sqlite3Strlen
143e0 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  30(pColl->zName)
143f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14400 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
14410 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
14420 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
14430 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
14440 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
14450 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20  Name);.  nCol = 
14460 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
14470 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  pIndex = sqlite3
14480 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
14490 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49   .      sizeof(I
144a0 6e 64 65 78 29 20 2b 20 20 20 20 20 20 20 20 20  ndex) +         
144b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
144c0 72 75 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20  ructure  */.    
144d0 20 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43    sizeof(int)*nC
144e0 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  ol +           /
144f0 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e  * Index.aiColumn
14500 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
14510 6f 66 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29  of(int)*(nCol+1)
14520 20 2b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65   +       /* Inde
14530 78 2e 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a  x.aiRowEst   */.
14540 20 20 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61        sizeof(cha
14550 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20  r *)*nCol +     
14560 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f     /* Index.azCo
14570 6c 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  ll     */.      
14580 73 69 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20  sizeof(u8)*nCol 
14590 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  +            /* 
145a0 49 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72  Index.aSortOrder
145b0 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20   */.      nName 
145c0 2b 20 31 20 2b 20 20 20 20 20 20 20 20 20 20 20  + 1 +           
145d0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
145e0 7a 4e 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20  zName      */.  
145f0 20 20 20 20 6e 45 78 74 72 61 20 20 20 20 20 20      nExtra      
14600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14610 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
14620 71 75 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a  quence names */.
14630 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
14640 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14650 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
14660 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
14670 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20   pIndex->azColl 
14680 3d 20 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64  = (char**)(&pInd
14690 65 78 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78  ex[1]);.  pIndex
146a0 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e  ->aiColumn = (in
146b0 74 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a  t *)(&pIndex->az
146c0 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  Coll[nCol]);.  p
146d0 49 6e 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20  Index->aiRowEst 
146e0 3d 20 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26  = (unsigned *)(&
146f0 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
14700 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
14710 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
14720 28 75 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e  (u8 *)(&pIndex->
14730 61 69 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d  aiRowEst[nCol+1]
14740 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  );.  pIndex->zNa
14750 6d 65 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70  me = (char *)(&p
14760 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
14770 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74  r[nCol]);.  zExt
14780 72 61 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70  ra = (char *)(&p
14790 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61  Index->zName[nNa
147a0 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  me+1]);.  memcpy
147b0 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20  (pIndex->zName, 
147c0 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b  zName, nName+1);
147d0 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  .  pIndex->pTabl
147e0 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64  e = pTab;.  pInd
147f0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c  ex->nColumn = pL
14800 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
14810 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20  ndex->onError = 
14820 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70  (u8)onError;.  p
14830 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78  Index->autoIndex
14840 20 3d 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30   = (u8)(pName==0
14850 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63  );.  pIndex->pSc
14860 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
14870 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20  Db].pSchema;..  
14880 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
14890 69 66 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e  if we should hon
148a0 6f 72 20 44 45 53 43 20 72 65 71 75 65 73 74 73  or DESC requests
148b0 20 6f 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   on index column
148c0 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  s.  */.  if( pDb
148d0 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f  ->pSchema->file_
148e0 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20  format>=4 ){.   
148f0 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
14900 20 2d 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20   -1;   /* Honor 
14910 44 45 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  DESC */.  }else{
14920 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
14930 73 6b 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67  sk = 0;    /* Ig
14940 6e 6f 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d  nore DESC */.  }
14950 0a 0a 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20  ..  /* Scan the 
14960 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c  names of the col
14970 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c  umns of the tabl
14980 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
14990 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68  and.  ** load th
149a0 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  e column indices
149b0 20 69 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20   into the Index 
149c0 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f  structure.  Repo
149d0 72 74 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a  rt an error.  **
149e0 20 69 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69   if any column i
149f0 73 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a  s not found..  *
14a00 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 20 41 64  *.  ** TODO:  Ad
14a10 64 20 61 20 74 65 73 74 20 74 6f 20 6d 61 6b 65  d a test to make
14a20 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73   sure that the s
14a30 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  ame column is no
14a40 74 20 6e 61 6d 65 64 0a 20 20 2a 2a 20 6d 6f 72  t named.  ** mor
14a50 65 20 74 68 61 6e 20 6f 6e 63 65 20 77 69 74 68  e than once with
14a60 69 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 64 65  in the same inde
14a70 78 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66 69 72  x.  Only the fir
14a80 73 74 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20  st instance of. 
14a90 20 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77   ** the column w
14aa0 69 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64  ill ever be used
14ab0 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65   by the optimize
14ac0 72 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73  r.  Note that us
14ad0 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 73 61 6d  ing the.  ** sam
14ae0 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74 68  e column more th
14af0 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20 62  an once cannot b
14b00 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  e an error becau
14b10 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a 20  se that would . 
14b20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63 6b 77 61   ** break backwa
14b30 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
14b40 79 20 2d 20 69 74 20 6e 65 65 64 73 20 74 6f 20  y - it needs to 
14b50 62 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20  be a warning..  
14b60 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  */.  for(i=0, pL
14b70 69 73 74 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  istItem=pList->a
14b80 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
14b90 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d  ; i++, pListItem
14ba0 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
14bb0 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20  har *zColName = 
14bc0 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65  pListItem->zName
14bd0 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54  ;.    Column *pT
14be0 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72  abCol;.    int r
14bf0 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
14c00 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f  r;.    char *zCo
14c10 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
14c20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69        /* Collati
14c30 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
14c40 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30   */..    for(j=0
14c50 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e  , pTabCol=pTab->
14c60 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
14c70 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c  ol; j++, pTabCol
14c80 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
14c90 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 43  qlite3StrICmp(zC
14ca0 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d  olName, pTabCol-
14cb0 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  >zName)==0 ) bre
14cc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
14cd0 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( j>=pTab->nCol 
14ce0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
14cf0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14d00 20 22 74 61 62 6c 65 20 25 73 20 68 61 73 20 6e   "table %s has n
14d10 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25  o column named %
14d20 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  s",.        pTab
14d30 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d  ->zName, zColNam
14d40 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  e);.      goto e
14d50 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14d60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64  ;.    }.    pInd
14d70 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
14d80 3d 20 6a 3b 0a 20 20 20 20 2f 2a 20 4a 75 73 74  = j;.    /* Just
14d90 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 74 68 65  ification of the
14da0 20 41 4c 57 41 59 53 28 70 4c 69 73 74 49 74 65   ALWAYS(pListIte
14db0 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29  m->pExpr->pColl)
14dc0 3a 20 20 42 65 63 61 75 73 65 20 6f 66 0a 20 20  :  Because of.  
14dd0 20 20 2a 2a 20 74 68 65 20 77 61 79 20 74 68 65    ** the way the
14de0 20 22 69 64 78 6c 69 73 74 22 20 6e 6f 6e 2d 74   "idxlist" non-t
14df0 65 72 6d 69 6e 61 6c 20 69 73 20 63 6f 6e 73 74  erminal is const
14e00 72 75 63 74 65 64 20 62 79 20 74 68 65 20 70 61  ructed by the pa
14e10 72 73 65 72 2c 0a 20 20 20 20 2a 2a 20 69 66 20  rser,.    ** if 
14e20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
14e30 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 74 68 65   is not null the
14e40 6e 20 65 69 74 68 65 72 20 70 4c 69 73 74 49 74  n either pListIt
14e50 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
14e60 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 65 78 69  .    ** must exi
14e70 73 74 20 6f 72 20 65 6c 73 65 20 74 68 65 72 65  st or else there
14e80 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
14e90 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
14ea0 75 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  ut if there.    
14eb0 2a 2a 20 77 61 73 20 61 6e 20 4f 4f 4d 20 65 72  ** was an OOM er
14ec0 72 6f 72 2c 20 77 65 20 77 6f 75 6c 64 20 6e 65  ror, we would ne
14ed0 76 65 72 20 72 65 61 63 68 20 74 68 69 73 20 70  ver reach this p
14ee0 6f 69 6e 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  oint. */.    if(
14ef0 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
14f00 72 20 26 26 20 41 4c 57 41 59 53 28 70 4c 69 73  r && ALWAYS(pLis
14f10 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43  tItem->pExpr->pC
14f20 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  oll) ){.      in
14f30 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7a  t nColl;.      z
14f40 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74 65 6d  Coll = pListItem
14f50 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d 3e  ->pExpr->pColl->
14f60 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 6e 43 6f  zName;.      nCo
14f70 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ll = sqlite3Strl
14f80 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b  en30(zColl) + 1;
14f90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
14fa0 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a  Extra>=nColl );.
14fb0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78        memcpy(zEx
14fc0 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c  tra, zColl, nCol
14fd0 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20  l);.      zColl 
14fe0 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20  = zExtra;.      
14ff0 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b  zExtra += nColl;
15000 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d  .      nExtra -=
15010 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73   nColl;.    }els
15020 65 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  e{.      zColl =
15030 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a   pTab->aCol[j].z
15040 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  Coll;.      if( 
15050 21 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !zColl ){.      
15060 20 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44    zColl = db->pD
15070 66 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a  fltColl->zName;.
15080 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15090 20 20 69 66 28 20 4e 45 56 45 52 28 21 64 62 2d    if( NEVER(!db-
150a0 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73  >init.busy && !s
150b0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
150c0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
150d0 6c 29 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  l)) ){.      got
150e0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
150f0 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
15100 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
15110 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65   = zColl;.    re
15120 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
15130 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f   = pListItem->so
15140 72 74 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72  rtOrder & sortOr
15150 64 65 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e  derMask;.    pIn
15160 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
15170 69 5d 20 3d 20 28 75 38 29 72 65 71 75 65 73 74  i] = (u8)request
15180 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  edSortOrder;.  }
15190 0a 20 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c  .  sqlite3Defaul
151a0 74 52 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b  tRowEst(pIndex);
151b0 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50  ..  if( pTab==pP
151c0 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
151d0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72  ){.    /* This r
151e0 6f 75 74 69 6e 65 20 68 61 73 20 62 65 65 6e 20  outine has been 
151f0 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65  called to create
15200 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e   an automatic in
15210 64 65 78 20 61 73 20 61 0a 20 20 20 20 2a 2a 20  dex as a.    ** 
15220 72 65 73 75 6c 74 20 6f 66 20 61 20 50 52 49 4d  result of a PRIM
15230 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55  ARY KEY or UNIQU
15240 45 20 63 6c 61 75 73 65 20 6f 6e 20 61 20 63 6f  E clause on a co
15250 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  lumn definition,
15260 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20 50 52 49   or.    ** a PRI
15270 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
15280 55 45 20 63 6c 61 75 73 65 20 66 6f 6c 6c 6f 77  UE clause follow
15290 69 6e 67 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64  ing the column d
152a0 65 66 69 6e 69 74 69 6f 6e 73 2e 0a 20 20 20 20  efinitions..    
152b0 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a  ** i.e. one of:.
152c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 52      **.    ** CR
152d0 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 20 50  EATE TABLE t(x P
152e0 52 49 4d 41 52 59 20 4b 45 59 2c 20 79 29 3b 0a  RIMARY KEY, y);.
152f0 20 20 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41      ** CREATE TA
15300 42 4c 45 20 74 28 78 2c 20 79 2c 20 55 4e 49 51  BLE t(x, y, UNIQ
15310 55 45 28 78 2c 20 79 29 29 3b 0a 20 20 20 20 2a  UE(x, y));.    *
15320 2a 0a 20 20 20 20 2a 2a 20 45 69 74 68 65 72 20  *.    ** Either 
15330 77 61 79 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  way, check to se
15340 65 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 61  e if the table a
15350 6c 72 65 61 64 79 20 68 61 73 20 73 75 63 68 20  lready has such 
15360 61 6e 20 69 6e 64 65 78 2e 20 49 66 0a 20 20 20  an index. If.   
15370 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27 74 20 62 6f   ** so, don't bo
15380 74 68 65 72 20 63 72 65 61 74 69 6e 67 20 74 68  ther creating th
15390 69 73 20 6f 6e 65 2e 20 54 68 69 73 20 6f 6e 6c  is one. This onl
153a0 79 20 61 70 70 6c 69 65 73 20 74 6f 0a 20 20 20  y applies to.   
153b0 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   ** automaticall
153c0 79 20 63 72 65 61 74 65 64 20 69 6e 64 69 63 65  y created indice
153d0 73 2e 20 55 73 65 72 73 20 63 61 6e 20 64 6f 20  s. Users can do 
153e0 61 73 20 74 68 65 79 20 77 69 73 68 20 77 69 74  as they wish wit
153f0 68 0a 20 20 20 20 2a 2a 20 65 78 70 6c 69 63 69  h.    ** explici
15400 74 20 69 6e 64 69 63 65 73 2e 0a 20 20 20 20 2a  t indices..    *
15410 2a 0a 20 20 20 20 2a 2a 20 54 77 6f 20 55 4e 49  *.    ** Two UNI
15420 51 55 45 20 6f 72 20 50 52 49 4d 41 52 59 20 4b  QUE or PRIMARY K
15430 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  EY constraints a
15440 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
15450 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 2a 2a 20  uivalent.    ** 
15460 28 61 6e 64 20 74 68 75 73 20 73 75 70 70 72 65  (and thus suppre
15470 73 73 69 6e 67 20 74 68 65 20 73 65 63 6f 6e 64  ssing the second
15480 20 6f 6e 65 29 20 65 76 65 6e 20 69 66 20 74 68   one) even if th
15490 65 79 20 68 61 76 65 20 64 69 66 66 65 72 65 6e  ey have differen
154a0 74 0a 20 20 20 20 2a 2a 20 73 6f 72 74 20 6f 72  t.    ** sort or
154b0 64 65 72 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ders..    **.   
154c0 20 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   ** If there are
154d0 20 64 69 66 66 65 72 65 6e 74 20 63 6f 6c 6c 61   different colla
154e0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f  ting sequences o
154f0 72 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  r if the columns
15500 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
15510 6f 6e 73 74 72 61 69 6e 74 20 6f 63 63 75 72 20  onstraint occur 
15520 69 6e 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64  in different ord
15530 65 72 73 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ers, then the co
15540 6e 73 74 72 61 69 6e 74 73 20 61 72 65 0a 20 20  nstraints are.  
15550 20 20 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20    ** considered 
15560 64 69 73 74 69 6e 63 74 20 61 6e 64 20 62 6f 74  distinct and bot
15570 68 20 72 65 73 75 6c 74 20 69 6e 20 73 65 70 61  h result in sepa
15580 72 61 74 65 20 69 6e 64 69 63 65 73 2e 0a 20 20  rate indices..  
15590 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a    */.    Index *
155a0 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70 49  pIdx;.    for(pI
155b0 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
155c0 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
155d0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
155e0 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73 73  int k;.      ass
155f0 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72  ert( pIdx->onErr
15600 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 20  or!=OE_None );. 
15610 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
15620 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b 0a  x->autoIndex );.
15630 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
15640 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  ndex->onError!=O
15650 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20 20  E_None );..     
15660 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
15670 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  mn!=pIndex->nCol
15680 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  umn ) continue;.
15690 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
156a0 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
156b0 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  k++){.        co
156c0 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b 0a 20 20  nst char *z1;.  
156d0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
156e0 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20 20 69 66   *z2;.        if
156f0 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
15700 5b 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43  [k]!=pIndex->aiC
15710 6f 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b  olumn[k] ) break
15720 3b 0a 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70  ;.        z1 = p
15730 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  Idx->azColl[k];.
15740 20 20 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e          z2 = pIn
15750 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a  dex->azColl[k];.
15760 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d          if( z1!=
15770 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  z2 && sqlite3Str
15780 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62  ICmp(z1, z2) ) b
15790 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
157a0 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d      if( k==pIdx-
157b0 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
157c0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e      if( pIdx->on
157d0 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f  Error!=pIndex->o
157e0 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  nError ){.      
157f0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73      /* This cons
15800 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20 74  traint creates t
15810 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73  he same index as
15820 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20   a previous.    
15830 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
15840 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73 6f  int specified so
15850 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20 43  mewhere in the C
15860 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
15870 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20  ement..         
15880 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20   ** However the 
15890 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75  ON CONFLICT clau
158a0 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ses are differen
158b0 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73 20  t. If both this 
158c0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
158d0 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
158e0 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76 61   previous equiva
158f0 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20  lent constraint 
15900 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20  have explicit.  
15910 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f          ** ON CO
15920 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74  NFLICT clauses t
15930 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e  his is an error.
15940 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
15950 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
15960 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63   explicitly spec
15970 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72 20  ified behaviour 
15980 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  for the index.. 
15990 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
159a0 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64 78        if( !(pIdx
159b0 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
159c0 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d  fault || pIndex-
159d0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66  >onError==OE_Def
159e0 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ault) ){.       
159f0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
15a00 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
15a20 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f  onflicting ON CO
15a30 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 73  NFLICT clauses s
15a40 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a 20  pecified", 0);. 
15a50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
15a60 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
15a70 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
15a80 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  lt ){.          
15a90 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20    pIdx->onError 
15aa0 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  = pIndex->onErro
15ab0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  r;.          }. 
15ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15ad0 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
15ae0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d  e_index;.      }
15af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
15b00 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e   Link the new In
15b10 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f  dex structure to
15b20 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74   its table and t
15b30 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a  o the other.  **
15b40 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
15b50 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20  ase structures. 
15b60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
15b70 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
15b80 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70   Index *p;.    p
15b90 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
15ba0 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70 53  sert(&pIndex->pS
15bb0 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20  chema->idxHash, 
15bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15bd0 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64 65             pInde
15be0 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  x->zName, sqlite
15bf0 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64 65 78  3Strlen30(pIndex
15c00 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20 20  ->zName),.      
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20 20      pIndex);.   
15c30 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
15c40 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
15c50 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
15c60 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
15c70 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   */.      db->ma
15c80 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
15c90 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
15ca0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
15cb0 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
15cc0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
15cd0 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
15ce0 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
15cf0 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
15d00 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
15d10 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
15d20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
15d30 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
15d40 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20 74   0 then create t
15d50 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73 6b  he index on disk
15d60 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e 76  .  This.  ** inv
15d70 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74 68  olves writing th
15d80 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65  e index into the
15d90 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
15da0 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  d filling in the
15db0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74 68  .  ** index with
15dc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62   the current tab
15dd0 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a  le contents..  *
15de0 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e 69  *.  ** The db->i
15df0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77 68  nit.busy is 0 wh
15e00 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72 73  en the user firs
15e10 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41 54  t enters a CREAT
15e20 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63 6f  E INDEX .  ** co
15e30 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69 74  mmand.  db->init
15e40 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e 20  .busy is 1 when 
15e50 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  a database is op
15e60 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20 43  ened and .  ** C
15e70 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
15e80 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64 20  ements are read 
15e90 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74 65  out of the maste
15ea0 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20 2a  r table.  In.  *
15eb0 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61 73  * the latter cas
15ec0 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65  e the index alre
15ed0 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64 69  ady exists on di
15ee0 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68 79  sk, which is why
15ef0 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
15f00 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20  ant to recreate 
15f10 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  it..  **.  ** If
15f20 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
15f30 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
15f40 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
15f50 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 20   a primary key. 
15f60 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63 6f   ** or UNIQUE co
15f70 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43 52  nstraint of a CR
15f80 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
15f90 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68 65  ment.  Since the
15fa0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73 20   table.  ** has 
15fb0 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74 65  just been create
15fc0 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e  d, it contains n
15fd0 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 69  o data and the i
15fe0 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61 74  ndex initializat
15ff0 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63 61  ion.  ** step ca
16000 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20 20  n be skipped..  
16010 2a 2f 0a 20 20 65 6c 73 65 7b 20 2f 2a 20 69 66  */.  else{ /* if
16020 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ( db->init.busy=
16030 3d 30 20 29 20 2a 2f 0a 20 20 20 20 56 64 62 65  =0 ) */.    Vdbe
16040 20 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   *v;.    char *z
16050 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d  Stmt;.    int iM
16060 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  em = ++pParse->n
16070 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71  Mem;..    v = sq
16080 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16090 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d  rse);.    if( v=
160a0 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
160b0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 0a 20  reate_index;... 
160c0 20 20 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65     /* Create the
160d0 20 72 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68   rootpage for th
160e0 65 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  e index.    */. 
160f0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
16100 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
16110 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
16120 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16130 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74  dOp2(v, OP_Creat
16140 65 49 6e 64 65 78 2c 20 69 44 62 2c 20 69 4d 65  eIndex, iDb, iMe
16150 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 61 74 68  m);..    /* Gath
16160 65 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  er the complete 
16170 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  text of the CREA
16180 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
16190 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 74  nt into.    ** t
161a0 68 65 20 7a 53 74 6d 74 20 76 61 72 69 61 62 6c  he zStmt variabl
161b0 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  e.    */.    if(
161c0 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
161d0 20 61 73 73 65 72 74 28 20 70 45 6e 64 21 3d 30   assert( pEnd!=0
161e0 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e   );.      /* A n
161f0 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20  amed index with 
16200 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41  an explicit CREA
16210 54 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65  TE INDEX stateme
16220 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  nt */.      zStm
16230 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  t = sqlite3MPrin
16240 74 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73  tf(db, "CREATE%s
16250 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20   INDEX %.*s",.  
16260 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f        onError==O
16270 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20  E_None ? "" : " 
16280 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20 20 20  UNIQUE",.       
16290 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61 6d 65   pEnd->z - pName
162a0 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20 20 20  ->z + 1,.       
162b0 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20   pName->z);.    
162c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
162d0 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  An automatic ind
162e0 65 78 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ex created by a 
162f0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
16300 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
16310 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74   */.      /* zSt
16320 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
16330 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20  ntf(""); */.    
16340 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    zStmt = 0;.   
16350 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 61   }..    /* Add a
16360 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c 69 74  n entry in sqlit
16370 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74 68 69  e_master for thi
16380 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20  s index.    */. 
16390 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
163a0 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
163b0 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49         "INSERT I
163c0 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55 45 53  NTO %Q.%s VALUES
163d0 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23  ('index',%Q,%Q,#
163e0 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20 20 20  %d,%Q);",.      
163f0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
16400 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
16410 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
16420 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a   pIndex->zName,.
16430 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
16440 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69 4d 65  ame,.        iMe
16450 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74 6d 74  m,.        zStmt
16460 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
16470 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
16480 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69  tmt);..    /* Fi
16490 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  ll the index wit
164a0 68 20 64 61 74 61 20 61 6e 64 20 72 65 70 61 72  h data and repar
164b0 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e 20 43  se the schema. C
164c0 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69 72 65  ode an OP_Expire
164d0 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c  .    ** to inval
164e0 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f  idate all pre-co
164f0 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
16500 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
16510 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20  ( pTblName ){.  
16520 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
16530 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
16540 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20  Index, iMem);.  
16550 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67      sqlite3Chang
16560 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20  eCookie(pParse, 
16570 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
16580 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16590 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
165a0 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20   iDb, 0, 0,.    
165b0 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69       sqlite3MPri
165c0 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25  ntf(db, "name='%
165d0 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  q'", pIndex->zNa
165e0 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  me), P4_DYNAMIC)
165f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
16600 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
16610 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20 20 20  Expire, 0);.    
16620 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  }.  }..  /* When
16630 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78   adding an index
16640 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
16650 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74 61  indices for a ta
16660 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  ble, make.  ** s
16670 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ure all indices 
16680 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61  labeled OE_Repla
16690 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c  ce come after al
166a0 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a  l those labeled.
166b0 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20    ** OE_Ignore. 
166c0 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61   This is necessa
166d0 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65  ry for the corre
166e0 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68  ct constraint ch
166f0 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  eck.  ** process
16700 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47  ing (in sqlite3G
16710 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e  enerateConstrain
16720 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70 61  tChecks()) as pa
16730 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54  rt of.  ** UPDAT
16740 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61  E and INSERT sta
16750 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a  tements.  .  */.
16760 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
16770 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d  usy || pTblName=
16780 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e  =0 ){.    if( on
16790 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63  Error!=OE_Replac
167a0 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65  e || pTab->pInde
167b0 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c  x==0.         ||
167c0 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f   pTab->pIndex->o
167d0 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61  nError==OE_Repla
167e0 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  ce){.      pInde
167f0 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d  x->pNext = pTab-
16800 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70  >pIndex;.      p
16810 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49  Tab->pIndex = pI
16820 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ndex;.    }else{
16830 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f  .      Index *pO
16840 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e  ther = pTab->pIn
16850 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  dex;.      while
16860 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20  ( pOther->pNext 
16870 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  && pOther->pNext
16880 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65  ->onError!=OE_Re
16890 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  place ){.       
168a0 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72   pOther = pOther
168b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
168c0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70  .      pIndex->p
168d0 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70  Next = pOther->p
168e0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68  Next;.      pOth
168f0 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64  er->pNext = pInd
16900 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  ex;.    }.    pI
16910 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ndex = 0;.  }.. 
16920 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66   /* Clean up bef
16930 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65  ore exiting */.e
16940 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16950 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  :.  if( pIndex )
16960 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
16970 65 65 28 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41  ee(pIndex->zColA
16980 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ff);.    sqlite3
16990 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65  DbFree(db, pInde
169a0 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  x);.  }.  sqlite
169b0 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
169c0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71  db, pList);.  sq
169d0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
169e0 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29  te(db, pTblName)
169f0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16a00 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
16a10 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
16a20 20 46 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e   Fill the Index.
16a30 61 69 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79  aiRowEst[] array
16a40 20 77 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e   with default in
16a50 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f  formation - info
16a60 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  rmation.** to be
16a70 20 75 73 65 64 20 77 68 65 6e 20 77 65 20 68 61   used when we ha
16a80 76 65 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41  ve not run the A
16a90 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a  NALYZE command..
16aa0 2a 2a 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30  **.** aiRowEst[0
16ab0 5d 20 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20  ] is suppose to 
16ac0 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62  contain the numb
16ad0 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69  er of elements i
16ae0 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  n the index..** 
16af0 53 69 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20  Since we do not 
16b00 6b 6e 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69  know, guess 1 mi
16b10 6c 6c 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74  llion.  aiRowEst
16b20 5b 31 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61  [1] is an estima
16b30 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d  te of the.** num
16b40 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
16b50 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61  he table that ma
16b60 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
16b70 61 72 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  ar value of the.
16b80 2a 2a 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20  ** first column 
16b90 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61  of the index.  a
16ba0 69 52 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e  iRowEst[2] is an
16bb0 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65   estimate of the
16bc0 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f   number.** of ro
16bd0 77 73 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  ws that match an
16be0 79 20 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d  y particular com
16bf0 62 69 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65  biniation of the
16c00 20 66 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73   first 2 columns
16c10 0a 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78  .** of the index
16c20 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
16c30 20 20 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73    It must always
16c40 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61   be the case tha
16c50 74 0a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  t.*.**          
16c60 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69   aiRowEst[N]<=ai
16c70 52 6f 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20  RowEst[N-1].**  
16c80 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
16c90 74 5b 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70  t[N]>=1.**.** Ap
16ca0 61 72 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77  art from that, w
16cb0 65 20 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f  e have little to
16cc0 20 67 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69   go on besides i
16cd0 6e 74 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a  ntuition as to.*
16ce0 2a 20 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d  * how aiRowEst[]
16cf0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69   should be initi
16d00 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d  alized.  The num
16d10 62 65 72 73 20 67 65 6e 65 72 61 74 65 64 20 68  bers generated h
16d20 65 72 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64  ere.** are based
16d30 20 6f 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75   on typical valu
16d40 65 73 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75  es found in actu
16d50 61 6c 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76  al indices..*/.v
16d60 6f 69 64 20 73 71 6c 69 74 65 33 44 65 66 61 75  oid sqlite3Defau
16d70 6c 74 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a  ltRowEst(Index *
16d80 70 49 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pIdx){.  unsigne
16d90 64 20 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52  d *a = pIdx->aiR
16da0 6f 77 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a  owEst;.  int i;.
16db0 20 20 61 73 73 65 72 74 28 20 61 21 3d 30 20 29    assert( a!=0 )
16dc0 3b 0a 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30  ;.  a[0] = 10000
16dd0 30 30 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78  00;.  for(i=pIdx
16de0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b  ->nColumn; i>=5;
16df0 20 69 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i--){.    a[i] 
16e00 3d 20 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  = 5;.  }.  while
16e10 28 20 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b  ( i>=1 ){.    a[
16e20 69 5d 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20  i] = 11 - i;.   
16e30 20 69 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20   i--;.  }.  if( 
16e40 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f  pIdx->onError!=O
16e50 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b  E_None ){.    a[
16e60 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d  pIdx->nColumn] =
16e70 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
16e80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
16e90 6c 6c 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74  ll drop an exist
16ea0 69 6e 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  ing named index.
16eb0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
16ec0 2a 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65  * implements the
16ed0 20 44 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74   DROP INDEX stat
16ee0 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ement..*/.void s
16ef0 71 6c 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28  qlite3DropIndex(
16f00 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
16f10 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
16f20 6e 74 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20  nt ifExists){.  
16f30 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20  Index *pIndex;. 
16f40 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69   Vdbe *v;.  sqli
16f50 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
16f60 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b  ->db;.  int iDb;
16f70 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50  ..  if( NEVER(pP
16f80 61 72 73 65 2d 3e 6e 45 72 72 3e 30 29 20 7c 7c  arse->nErr>0) ||
16f90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
16fa0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78  d ){.    goto ex
16fb0 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20  it_drop_index;. 
16fc0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61   }.  assert( pNa
16fd0 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20  me->nSrc==1 );. 
16fe0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
16ff0 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
17000 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20  a(pParse) ){.   
17010 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
17020 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
17030 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
17040 64 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65  dIndex(db, pName
17050 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e  ->a[0].zName, pN
17060 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
17070 61 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64  ase);.  if( pInd
17080 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ex==0 ){.    if(
17090 20 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20   !ifExists ){.  
170a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
170b0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
170c0 73 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c  such index: %S",
170d0 20 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20   pName, 0);.    
170e0 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
170f0 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
17100 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
17110 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69  p_index;.  }.  i
17120 66 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  f( pIndex->autoI
17130 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69  ndex ){.    sqli
17140 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
17150 73 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63  se, "index assoc
17160 69 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55  iated with UNIQU
17170 45 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52  E ".      "or PR
17180 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
17190 61 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64  aint cannot be d
171a0 72 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20  ropped", 0);.   
171b0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
171c0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62  index;.  }.  iDb
171d0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
171e0 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  ToIndex(db, pInd
171f0 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69  ex->pSchema);.#i
17200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17210 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
17220 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
17230 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49   = SQLITE_DROP_I
17240 4e 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20  NDEX;.    Table 
17250 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
17260 70 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  pTable;.    cons
17270 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
17280 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
17290 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
172a0 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f   *zTab = SCHEMA_
172b0 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20  TABLE(iDb);.    
172c0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
172d0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
172e0 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62  ITE_DELETE, zTab
172f0 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  , 0, zDb) ){.   
17300 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
17310 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  p_index;.    }. 
17320 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
17330 50 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64  PDB && iDb ) cod
17340 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
17350 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
17360 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
17370 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64  heck(pParse, cod
17380 65 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  e, pIndex->zName
17390 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
173a0 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
173b0 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
173c0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
173d0 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
173e0 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
173f0 65 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  e the index and 
17400 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20  from the master 
17410 74 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73  table */.  v = s
17420 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
17430 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
17440 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
17450 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
17460 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
17470 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73  ;.    sqlite3Nes
17480 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
17490 0a 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  .       "DELETE 
174a0 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45  FROM %Q.%s WHERE
174b0 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
174c0 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
174d0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
174e0 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20  LE(iDb),.       
174f0 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20  pIndex->zName.  
17500 20 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c    );.    if( sql
17510 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62  ite3FindTable(db
17520 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
17530 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  , db->aDb[iDb].z
17540 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
17550 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
17560 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
17570 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
17580 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57  Q.sqlite_stat1 W
17590 48 45 52 45 20 69 64 78 3d 25 51 22 2c 0a 20 20  HERE idx=%Q",.  
175a0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
175b0 62 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78  b].zName, pIndex
175c0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b  ->zName.      );
175d0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
175e0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
175f0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
17600 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
17610 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d  (pParse, pIndex-
17620 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20  >tnum, iDb);.   
17630 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
17640 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64  p4(v, OP_DropInd
17650 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70  ex, iDb, 0, 0, p
17660 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29  Index->zName, 0)
17670 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70  ;.  }..exit_drop
17680 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65  _index:.  sqlite
17690 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64  3SrcListDelete(d
176a0 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a  b, pName);.}../*
176b0 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20  .** pArray is a 
176c0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72  pointer to an ar
176d0 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
176e0 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   Each object in 
176f0 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20  the.** array is 
17700 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e  szEntry bytes in
17710 20 73 69 7a 65 2e 20 20 54 68 69 73 20 72 6f 75   size.  This rou
17720 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61  tine allocates a
17730 20 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f   new.** object o
17740 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  n the end of the
17750 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70   array..**.** *p
17760 6e 45 6e 74 72 79 20 69 73 20 74 68 65 20 6e 75  nEntry is the nu
17770 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
17780 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 2e 20  already in use. 
17790 20 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20   *pnAlloc is.** 
177a0 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61  the previously a
177b0 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
177c0 20 74 68 65 20 61 72 72 61 79 2e 20 20 69 6e 69   the array.  ini
177d0 74 53 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20  tSize is the.** 
177e0 73 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61  suggested initia
177f0 6c 20 61 72 72 61 79 20 73 69 7a 65 20 61 6c 6c  l array size all
17800 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
17810 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
17820 6e 65 77 20 65 6e 74 72 79 20 69 73 20 72 65 74  new entry is ret
17830 75 72 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a  urned in *pIdx..
17840 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17850 6e 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ne returns a poi
17860 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
17870 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 54  y of objects.  T
17880 68 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20  his.** might be 
17890 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
178a0 70 41 72 72 61 79 20 70 61 72 61 6d 65 74 65 72  pArray parameter
178b0 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20   or it might be 
178c0 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70  a different.** p
178d0 6f 69 6e 74 65 72 20 69 66 20 74 68 65 20 61 72  ointer if the ar
178e0 72 61 79 20 77 61 73 20 72 65 73 69 7a 65 64 2e  ray was resized.
178f0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
17900 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a  3ArrayAllocate(.
17910 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
17920 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
17930 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
17940 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
17950 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79  /.  void *pArray
17960 2c 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ,     /* Array o
17970 66 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68  f objects.  Migh
17980 74 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  t be reallocated
17990 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72   */.  int szEntr
179a0 79 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  y,      /* Size 
179b0 6f 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69  of each object i
179c0 6e 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20  n the array */. 
179d0 20 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20 20   int initSize,  
179e0 20 20 20 2f 2a 20 53 75 67 67 65 73 74 65 64 20     /* Suggested 
179f0 69 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69  initial allocati
17a00 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  on, in elements 
17a10 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72  */.  int *pnEntr
17a20 79 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  y,     /* Number
17a30 20 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72   of objects curr
17a40 65 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a  ently in use */.
17a50 20 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20    int *pnAlloc, 
17a60 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
17a70 69 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63  ize of the alloc
17a80 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e  ation, in elemen
17a90 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64  ts */.  int *pId
17aa0 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  x         /* Wri
17ab0 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  te the index of 
17ac0 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20  a new slot here 
17ad0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b  */.){.  char *z;
17ae0 0a 20 20 69 66 28 20 2a 70 6e 45 6e 74 72 79 20  .  if( *pnEntry 
17af0 3e 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20  >= *pnAlloc ){. 
17b00 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20     void *pNew;. 
17b10 20 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a     int newSize;.
17b20 20 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a      newSize = (*
17b30 70 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69  pnAlloc)*2 + ini
17b40 74 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20  tSize;.    pNew 
17b50 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
17b60 6f 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 6e  oc(db, pArray, n
17b70 65 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b  ewSize*szEntry);
17b80 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
17b90 20 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   ){.      *pIdx 
17ba0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
17bb0 72 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d  rn pArray;.    }
17bc0 0a 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20  .    *pnAlloc = 
17bd0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53  sqlite3DbMallocS
17be0 69 7a 65 28 64 62 2c 20 70 4e 65 77 29 2f 73 7a  ize(db, pNew)/sz
17bf0 45 6e 74 72 79 3b 0a 20 20 20 20 70 41 72 72 61  Entry;.    pArra
17c00 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20  y = pNew;.  }.  
17c10 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61  z = (char*)pArra
17c20 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a  y;.  memset(&z[*
17c30 70 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72  pnEntry * szEntr
17c40 79 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b  y], 0, szEntry);
17c50 0a 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e  .  *pIdx = *pnEn
17c60 74 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72  try;.  ++*pnEntr
17c70 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72  y;.  return pArr
17c80 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ay;.}../*.** App
17c90 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
17ca0 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
17cb0 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
17cc0 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
17cd0 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
17ce0 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
17cf0 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
17d00 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
17d10 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
17d20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
17d30 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  pend(sqlite3 *db
17d40 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
17d50 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
17d60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17d70 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
17d80 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
17d90 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
17da0 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
17db0 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
17dc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17dd0 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
17de0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73   = 0;.  }.  pLis
17df0 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72  t->a = sqlite3Ar
17e00 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20  rayAllocate(.   
17e10 20 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69     db,.      pLi
17e20 73 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a  st->a,.      siz
17e30 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
17e40 2c 0a 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20  ,.      5,.     
17e50 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20   &pList->nId,.  
17e60 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c      &pList->nAll
17e70 6f 63 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29  oc,.      &i.  )
17e80 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20  ;.  if( i<0 ){. 
17e90 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74     sqlite3IdList
17ea0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
17eb0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
17ec0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b  .  }.  pList->a[
17ed0 69 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  i].zName = sqlit
17ee0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
17ef0 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72  db, pToken);.  r
17f00 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
17f10 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
17f20 49 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  IdList..*/.void 
17f30 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
17f40 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ete(sqlite3 *db,
17f50 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b   IdList *pList){
17f60 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17f70 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
17f80 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  n;.  for(i=0; i<
17f90 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
17fa0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
17fb0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  ree(db, pList->a
17fc0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
17fd0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17fe0 64 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20  db, pList->a);. 
17ff0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18000 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  b, pList);.}../*
18010 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
18020 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66  ndex in pList of
18030 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20   the identifier 
18040 6e 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75  named zId.  Retu
18050 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20  rn -1.** if not 
18060 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  found..*/.int sq
18070 6c 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78  lite3IdListIndex
18080 28 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  (IdList *pList, 
18090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
180a0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
180b0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
180c0 74 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69  turn -1;.  for(i
180d0 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64  =0; i<pList->nId
180e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
180f0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
18100 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
18110 2c 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65  , zName)==0 ) re
18120 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
18130 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
18140 2a 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61  * Expand the spa
18150 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
18160 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
18170 73 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20  st object by.** 
18180 63 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20  creating nExtra 
18190 6e 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e  new slots beginn
181a0 69 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20  ing at iStart.  
181b0 69 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62  iStart is zero b
181c0 61 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f  ased..** New slo
181d0 74 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ts are zeroed..*
181e0 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
181f0 2c 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c  , suppose a SrcL
18200 69 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f  ist initially co
18210 6e 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69  ntains two entri
18220 65 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61  es: A,B..** To a
18230 70 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72  ppend 3 new entr
18240 69 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64  ies onto the end
18250 2c 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  , do this:.**.**
18260 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69      sqlite3SrcLi
18270 73 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53  stEnlarge(db, pS
18280 72 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a  rclist, 3, 2);.*
18290 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63  *.** After the c
182a0 61 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75  all above it wou
182b0 6c 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20  ld contain:  A, 
182c0 42 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c  B, nil, nil, nil
182d0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61  ..** If the iSta
182e0 72 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20  rt argument had 
182f0 62 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f  been 1 instead o
18300 66 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65  f 2, then the re
18310 73 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61  sult.** would ha
18320 76 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c  ve been:  A, nil
18330 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20  , nil, nil, B.  
18340 54 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e  To prepend the n
18350 65 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65  ew slots,.** the
18360 20 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f   iStart value wo
18370 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72  uld be 0.  The r
18380 65 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64  esult then would
18390 0a 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c  .** be: nil, nil
183a0 2c 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a  , nil, A, B..**.
183b0 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
183c0 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20  llocation fails 
183d0 74 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75  the SrcList is u
183e0 6e 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a  nchanged.  The.*
183f0 2a 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  * db->mallocFail
18400 65 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20  ed flag will be 
18410 73 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a  set to true..*/.
18420 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
18430 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a  SrcListEnlarge(.
18440 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
18450 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
18460 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e   connection to n
18470 6f 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72  otify of OOM err
18480 6f 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ors */.  SrcList
18490 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54   *pSrc,     /* T
184a0 68 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65  he SrcList to be
184b0 20 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69   enlarged */.  i
184c0 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
184d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e    /* Number of n
184e0 65 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20  ew slots to add 
184f0 74 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a  to pSrc->a[] */.
18500 20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20    int iStart    
18510 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
18520 20 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69   pSrc->a[] of fi
18530 72 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a  rst new slot */.
18540 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
18550 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
18560 67 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72  g on calling par
18570 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73  ameters */.  ass
18580 65 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29  ert( iStart>=0 )
18590 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74  ;.  assert( nExt
185a0 72 61 3e 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ra>=1 );.  if( p
185b0 53 72 63 3d 3d 30 20 7c 7c 20 69 53 74 61 72 74  Src==0 || iStart
185c0 3e 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20  >pSrc->nSrc ){. 
185d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
185e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
185f0 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a     return pSrc;.
18600 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61    }..  /* Alloca
18610 74 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70  te additional sp
18620 61 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ace if needed */
18630 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72  .  if( pSrc->nSr
18640 63 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e  c+nExtra>pSrc->n
18650 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63  Alloc ){.    Src
18660 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20  List *pNew;.    
18670 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72  int nAlloc = pSr
18680 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a  c->nSrc+nExtra;.
18690 20 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20      int nGot;.  
186a0 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
186b0 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53  DbRealloc(db, pS
186c0 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
186d0 20 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29     sizeof(*pSrc)
186e0 20 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69   + (nAlloc-1)*si
186f0 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
18700 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77   );.    if( pNew
18710 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
18720 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
18730 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72  ailed );.      r
18740 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20  eturn pSrc;.    
18750 7d 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65  }.    pSrc = pNe
18760 77 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73  w;.    nGot = (s
18770 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
18780 7a 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73  ze(db, pNew) - s
18790 69 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69  izeof(*pSrc))/si
187a0 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29  zeof(pSrc->a[0])
187b0 2b 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41  +1;.    pSrc->nA
187c0 6c 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74  lloc = (u16)nGot
187d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65  ;.  }..  /* Move
187e0 20 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20   existing slots 
187f0 74 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20  that come after 
18800 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74  the newly insert
18810 65 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75  ed slots.  ** ou
18820 74 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a  t of the way */.
18830 20 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53    for(i=pSrc->nS
18840 72 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b  rc-1; i>=iStart;
18850 20 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d   i--){.    pSrc-
18860 3e 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70  >a[i+nExtra] = p
18870 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20  Src->a[i];.  }. 
18880 20 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28   pSrc->nSrc += (
18890 69 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f  i16)nExtra;..  /
188a0 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79  * Zero the newly
188b0 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73   allocated slots
188c0 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   */.  memset(&pS
188d0 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30  rc->a[iStart], 0
188e0 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61  , sizeof(pSrc->a
188f0 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20  [0])*nExtra);.  
18900 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c  for(i=iStart; i<
18910 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69  iStart+nExtra; i
18920 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61  ++){.    pSrc->a
18930 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [i].iCursor = -1
18940 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75  ;.  }..  /* Retu
18950 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
18960 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63  the enlarged Src
18970 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e  List */.  return
18980 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pSrc;.}.../*.**
18990 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61   Append a new ta
189a0 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20  ble name to the 
189b0 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20  given SrcList.  
189c0 43 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63  Create a new Src
189d0 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20  List if.** need 
189e0 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79  be.  A new entry
189f0 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74   is created in t
18a00 68 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20  he SrcList even 
18a10 69 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  if pToken is NUL
18a20 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69  L..**.** A SrcLi
18a30 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
18a40 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65  or NULL if there
18a50 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   is an OOM error
18a60 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a  .  The returned.
18a70 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  ** SrcList might
18a80 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
18a90 74 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74  the SrcList that
18aa0 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74   was input or it
18ab0 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e   might be.** a n
18ac0 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f  ew one.  If an O
18ad0 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  OM error does oc
18ae0 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70  curs, then the p
18af0 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c  rior value of pL
18b00 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69  ist.** that is i
18b10 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
18b20 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69  tine is automati
18b30 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a  cally freed..**.
18b40 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20  ** If pDatabase 
18b50 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20  is not null, it 
18b60 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74  means that the t
18b70 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69  able has an opti
18b80 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  onal.** database
18b90 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c   name prefix.  L
18ba0 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61  ike this:  "data
18bb0 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68  base.table".  Th
18bc0 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70  e pDatabase.** p
18bd0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62  oints to the tab
18be0 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
18bf0 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f  pTable points to
18c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
18c10 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69  me..** The SrcLi
18c20 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65  st.a[].zName fie
18c30 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  ld is filled wit
18c40 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  h the table name
18c50 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20   which might.** 
18c60 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65  come from pTable
18c70 20 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69   (if pDatabase i
18c80 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20  s NULL) or from 
18c90 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20  pDatabase.  .** 
18ca0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74  SrcList.a[].zDat
18cb0 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20  abase is filled 
18cc0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
18cd0 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62  e name from pTab
18ce0 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e  le,.** or with N
18cf0 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61  ULL if no databa
18d00 73 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e  se is specified.
18d10 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20  .**.** In other 
18d20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c  words, if call l
18d30 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
18d40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
18d50 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
18d60 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  ,B,0);.**.** The
18d70 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e  n B is a table n
18d80 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
18d90 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73  base name is uns
18da0 70 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61  pecified.  If ca
18db0 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69  lled.** like thi
18dc0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
18dd0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
18de0 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a  ppend(D,A,B,C);.
18df0 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20  **.** Then C is 
18e00 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  the table name a
18e10 6e 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61  nd B is the data
18e20 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43  base name.  If C
18e30 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74   is defined.** t
18e40 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e  hen so is B.  In
18e50 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65   other words, we
18e60 20 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61   never have a ca
18e70 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20  se where:.**.** 
18e80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53          sqlite3S
18e90 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41  rcListAppend(D,A
18ea0 2c 30 2c 43 29 3b 0a 2a 2f 0a 53 72 63 4c 69 73  ,0,C);.*/.SrcLis
18eb0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
18ec0 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69 74  tAppend(.  sqlit
18ed0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f  e3 *db,        /
18ee0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
18ef0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
18f00 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 53   failures */.  S
18f10 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20  rcList *pList,  
18f20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
18f30 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e 55  this SrcList. NU
18f40 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  LL creates a new
18f50 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54 6f   SrcList */.  To
18f60 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20  ken *pTable,    
18f70 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61 70    /* Table to ap
18f80 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  pend */.  Token 
18f90 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f 2a  *pDatabase    /*
18fa0 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68 65   Database of the
18fb0 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
18fc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
18fd0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73  em *pItem;.  ass
18fe0 65 72 74 28 20 70 44 61 74 61 62 61 73 65 3d 3d  ert( pDatabase==
18ff0 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30 20 29  0 || pTable!=0 )
19000 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 76  ;  /* Cannot hav
19010 65 20 43 20 77 69 74 68 6f 75 74 20 42 20 2a 2f  e C without B */
19020 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
19030 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
19040 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
19050 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 53 72  ro(db, sizeof(Sr
19060 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  cList) );.    if
19070 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
19080 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  urn 0;.    pList
19090 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  ->nAlloc = 1;.  
190a0 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69  }.  pList = sqli
190b0 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61 72 67  te3SrcListEnlarg
190c0 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20  e(db, pList, 1, 
190d0 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20  pList->nSrc);.  
190e0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
190f0 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  iled ){.    sqli
19100 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
19110 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
19120 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
19130 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d   pItem = &pList-
19140 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31  >a[pList->nSrc-1
19150 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61 62 61  ];.  if( pDataba
19160 73 65 20 26 26 20 70 44 61 74 61 62 61 73 65 2d  se && pDatabase-
19170 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70 44 61  >z==0 ){.    pDa
19180 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a  tabase = 0;.  }.
19190 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
191a0 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54  ){.    Token *pT
191b0 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73 65 3b  emp = pDatabase;
191c0 0a 20 20 20 20 70 44 61 74 61 62 61 73 65 20 3d  .    pDatabase =
191d0 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70 54 61   pTable;.    pTa
191e0 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d  ble = pTemp;.  }
191f0 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  .  pItem->zName 
19200 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
19210 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c  mToken(db, pTabl
19220 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61  e);.  pItem->zDa
19230 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74 65 33  tabase = sqlite3
19240 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
19250 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a 20 20  , pDatabase);.  
19260 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
19270 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64  ./*.** Assign Vd
19280 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78 20 6e  beCursor index n
19290 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20 74 61  umbers to all ta
192a0 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c 69 73  bles in a SrcLis
192b0 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  t.*/.void sqlite
192c0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
192d0 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70 50 61  rsors(Parse *pPa
192e0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  rse, SrcList *pL
192f0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
19300 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19310 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
19320 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c 20 70  ssert(pList || p
19330 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
19340 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28  cFailed );.  if(
19350 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f   pList ){.    fo
19360 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69  r(i=0, pItem=pLi
19370 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e  st->a; i<pList->
19380 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
19390 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
193a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30  Item->iCursor>=0
193b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
193c0 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  pItem->iCursor =
193d0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
193e0 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
193f0 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
19400 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
19410 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
19420 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
19430 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a  pSelect->pSrc);.
19440 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19450 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
19460 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72 63 4c  e an entire SrcL
19470 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c  ist including al
19480 6c 20 69 74 73 20 73 75 62 73 74 72 75 63 74 75  l its substructu
19490 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  re..*/.void sqli
194a0 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
194b0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53 72  (sqlite3 *db, Sr
194c0 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  cList *pList){. 
194d0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
194e0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
194f0 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73  Item;.  if( pLis
19500 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
19510 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
19520 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
19530 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49  t->nSrc; i++, pI
19540 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
19550 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
19560 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
19570 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
19580 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e  ee(db, pItem->zN
19590 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ame);.    sqlite
195a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
195b0 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
195c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
195d0 2c 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29  , pItem->zIndex)
195e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c  ;.    sqlite3Del
195f0 65 74 65 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e  eteTable(pItem->
19600 70 54 61 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  pTab);.    sqlit
19610 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
19620 62 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  b, pItem->pSelec
19630 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  t);.    sqlite3E
19640 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 49  xprDelete(db, pI
19650 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73  tem->pOn);.    s
19660 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
19670 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55  te(db, pItem->pU
19680 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sing);.  }.  sql
19690 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
196a0 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
196b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
196c0 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
196d0 72 73 65 72 20 74 6f 20 61 64 64 20 61 20 6e 65  rser to add a ne
196e0 77 20 74 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a  w term to the.**
196f0 20 65 6e 64 20 6f 66 20 61 20 67 72 6f 77 69 6e   end of a growin
19700 67 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  g FROM clause.  
19710 54 68 65 20 22 70 22 20 70 61 72 61 6d 65 74 65  The "p" paramete
19720 72 20 69 73 20 74 68 65 20 70 61 72 74 20 6f 66  r is the part of
19730 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
19740 75 73 65 20 74 68 61 74 20 68 61 73 20 61 6c 72  use that has alr
19750 65 61 64 79 20 62 65 65 6e 20 63 6f 6e 73 74 72  eady been constr
19760 75 63 74 65 64 2e 20 20 22 70 22 20 69 73 20 4e  ucted.  "p" is N
19770 55 4c 4c 0a 2a 2a 20 69 66 20 74 68 69 73 20 69  ULL.** if this i
19780 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
19790 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
197a0 75 73 65 2e 20 20 70 54 61 62 6c 65 20 61 6e 64  use.  pTable and
197b0 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 61 72   pDatabase.** ar
197c0 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
197d0 65 20 74 61 62 6c 65 20 61 6e 64 20 64 61 74 61  e table and data
197e0 62 61 73 65 20 6e 61 6d 65 64 20 69 6e 20 74 68  base named in th
197f0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
19800 72 6d 2e 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  rm..** pDatabase
19810 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20   is NULL if the 
19820 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 71 75  database name qu
19830 61 6c 69 66 69 65 72 20 69 73 20 6d 69 73 73 69  alifier is missi
19840 6e 67 20 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61  ng - the.** usua
19850 6c 20 63 61 73 65 2e 20 20 49 66 20 74 68 65 20  l case.  If the 
19860 74 65 72 6d 20 68 61 73 20 61 20 61 6c 69 61 73  term has a alias
19870 2c 20 74 68 65 6e 20 70 41 6c 69 61 73 20 70 6f  , then pAlias po
19880 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61  ints to the.** a
19890 6c 69 61 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20  lias token.  If 
198a0 74 68 65 20 74 65 72 6d 20 69 73 20 61 20 73 75  the term is a su
198b0 62 71 75 65 72 79 2c 20 74 68 65 6e 20 70 53 75  bquery, then pSu
198c0 62 71 75 65 72 79 20 69 73 20 74 68 65 0a 2a 2a  bquery is the.**
198d0 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
198e0 74 20 74 68 61 74 20 74 68 65 20 73 75 62 71 75  t that the subqu
198f0 65 72 79 20 65 6e 63 6f 64 65 73 2e 20 20 54 68  ery encodes.  Th
19900 65 20 70 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20  e pTable and.** 
19910 70 44 61 74 61 62 61 73 65 20 70 61 72 61 6d 65  pDatabase parame
19920 74 65 72 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f  ters are NULL fo
19930 72 20 73 75 62 71 75 65 72 69 65 73 2e 20 20 54  r subqueries.  T
19940 68 65 20 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e  he pOn and pUsin
19950 67 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20  g.** parameters 
19960 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  are the content 
19970 6f 66 20 74 68 65 20 4f 4e 20 61 6e 64 20 55 53  of the ON and US
19980 49 4e 47 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ING clauses..**.
19990 2a 2a 20 52 65 74 75 72 6e 20 61 20 6e 65 77 20  ** Return a new 
199a0 53 72 63 4c 69 73 74 20 77 68 69 63 68 20 65 6e  SrcList which en
199b0 63 6f 64 65 73 20 69 73 20 74 68 65 20 46 52 4f  codes is the FRO
199c0 4d 20 77 69 74 68 20 74 68 65 20 6e 65 77 0a 2a  M with the new.*
199d0 2a 20 74 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f  * term added..*/
199e0 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65  .SrcList *sqlite
199f0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 46 72  3SrcListAppendFr
19a00 6f 6d 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  omTerm(.  Parse 
19a10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
19a20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
19a30 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
19a40 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  t *p,           
19a50 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 70 61    /* The left pa
19a60 72 74 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  rt of the FROM c
19a70 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 73 65  lause already se
19a80 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  en */.  Token *p
19a90 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
19aa0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
19ab0 61 62 6c 65 20 74 6f 20 61 64 64 20 74 6f 20 74  able to add to t
19ac0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
19ad0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61  /.  Token *pData
19ae0 62 61 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e  base,       /* N
19af0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
19b00 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  ase containing p
19b10 54 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  Table */.  Token
19b20 20 2a 70 41 6c 69 61 73 2c 20 20 20 20 20 20 20   *pAlias,       
19b30 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 2d     /* The right-
19b40 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
19b50 20 41 53 20 73 75 62 65 78 70 72 65 73 73 69 6f   AS subexpressio
19b60 6e 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  n */.  Select *p
19b70 53 75 62 71 75 65 72 79 2c 20 20 20 20 20 20 2f  Subquery,      /
19b80 2a 20 41 20 73 75 62 71 75 65 72 79 20 75 73 65  * A subquery use
19b90 64 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 61 20  d in place of a 
19ba0 74 61 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  table name */.  
19bb0 45 78 70 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20  Expr *pOn,      
19bc0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
19bd0 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  N clause of a jo
19be0 69 6e 20 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a  in */.  IdList *
19bf0 70 55 73 69 6e 67 20 20 20 20 20 20 20 20 20 20  pUsing          
19c00 2f 2a 20 54 68 65 20 55 53 49 4e 47 20 63 6c 61  /* The USING cla
19c10 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f  use of a join */
19c20 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63  .){.  struct Src
19c30 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19c40 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
19c50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
19c60 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  p = sqlite3SrcLi
19c70 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20  stAppend(db, p, 
19c80 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73  pTable, pDatabas
19c90 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  e);.  if( p==0 |
19ca0 7c 20 70 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a  | p->nSrc==0 ){.
19cb0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
19cc0 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a  elete(db, pOn);.
19cd0 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
19ce0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
19cf0 6e 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ng);.    sqlite3
19d00 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
19d10 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20   pSubquery);.   
19d20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20   return p;.  }. 
19d30 20 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70   pItem = &p->a[p
19d40 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28  ->nSrc-1];.  if(
19d50 20 70 41 6c 69 61 73 20 26 26 20 70 41 6c 69 61   pAlias && pAlia
19d60 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65  s->n ){.    pIte
19d70 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
19d80 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
19d90 28 64 62 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20  (db, pAlias);.  
19da0 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65  }.  pItem->pSele
19db0 63 74 20 3d 20 70 53 75 62 71 75 65 72 79 3b 0a  ct = pSubquery;.
19dc0 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70    pItem->pOn = p
19dd0 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73  On;.  pItem->pUs
19de0 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20  ing = pUsing;.  
19df0 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
19e00 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
19e10 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
19e20 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
19e30 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
19e40 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
19e50 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
19e60 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
19e70 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19e80 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
19e90 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
19ea0 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
19eb0 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
19ec0 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
19ed0 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 65  ){.  if( pIndexe
19ee0 64 42 79 20 26 26 20 70 20 26 26 20 70 2d 3e 6e  dBy && p && p->n
19ef0 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 73 74 72  Src>0 ){.    str
19f00 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
19f10 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b   *pItem = &p->a[
19f20 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20  p->nSrc-1];.    
19f30 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e  assert( pItem->n
19f40 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20 26 26 20  otIndexed==0 && 
19f50 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30  pItem->zIndex==0
19f60 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   );.    if( pInd
19f70 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20  exedBy->n==1 && 
19f80 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29  !pIndexedBy->z )
19f90 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f  {.      /* A "NO
19fa0 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73  T INDEXED" claus
19fb0 65 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20  e was supplied. 
19fc0 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20  See parse.y .   
19fd0 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20     ** construct 
19fe0 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f  "indexed_opt" fo
19ff0 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20  r details. */.  
1a000 20 20 20 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e      pItem->notIn
1a010 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  dexed = 1;.    }
1a020 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
1a030 6d 2d 3e 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69  m->zIndex = sqli
1a040 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1a050 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e  (pParse->db, pIn
1a060 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a  dexedBy);.    }.
1a070 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65    }.}../*.** Whe
1a080 6e 20 62 75 69 6c 64 69 6e 67 20 75 70 20 61 20  n building up a 
1a090 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74  FROM clause in t
1a0a0 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 6a  he parser, the j
1a0b0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20  oin operator.** 
1a0c0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 61 74 74  is initially att
1a0d0 61 63 68 65 64 20 74 6f 20 74 68 65 20 6c 65 66  ached to the lef
1a0e0 74 20 6f 70 65 72 61 6e 64 2e 20 20 42 75 74 20  t operand.  But 
1a0f0 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
1a100 6f 72 0a 2a 2a 20 65 78 70 65 63 74 73 20 74 68  or.** expects th
1a110 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20  e join operator 
1a120 74 6f 20 62 65 20 6f 6e 20 74 68 65 20 72 69 67  to be on the rig
1a130 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
1a140 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69  s routine.** Shi
1a150 66 74 73 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65  fts all join ope
1a160 72 61 74 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74  rators from left
1a170 20 74 6f 20 72 69 67 68 74 20 66 6f 72 20 61 6e   to right for an
1a180 20 65 6e 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20   entire FROM.** 
1a190 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78  clause..**.** Ex
1a1a0 61 6d 70 6c 65 3a 20 53 75 70 70 6f 73 65 20 74  ample: Suppose t
1a1b0 68 65 20 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20  he join is like 
1a1c0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
1a1d0 20 20 20 20 20 20 41 20 6e 61 74 75 72 61 6c 20        A natural 
1a1e0 63 72 6f 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a  cross join B.**.
1a1f0 2a 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20  ** The operator 
1a200 69 73 20 22 6e 61 74 75 72 61 6c 20 63 72 6f 73  is "natural cros
1a210 73 20 6a 6f 69 6e 22 2e 20 20 54 68 65 20 41 20  s join".  The A 
1a220 61 6e 64 20 42 20 6f 70 65 72 61 6e 64 73 20 61  and B operands a
1a230 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  re stored.** in 
1a240 70 2d 3e 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61  p->a[0] and p->a
1a250 5b 31 5d 2c 20 72 65 73 70 65 63 74 69 76 65 6c  [1], respectivel
1a260 79 2e 20 20 54 68 65 20 70 61 72 73 65 72 20 69  y.  The parser i
1a270 6e 69 74 69 61 6c 6c 79 20 73 74 6f 72 65 73 20  nitially stores 
1a280 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20  the.** operator 
1a290 77 69 74 68 20 41 2e 20 20 54 68 69 73 20 72 6f  with A.  This ro
1a2a0 75 74 69 6e 65 20 73 68 69 66 74 73 20 74 68 61  utine shifts tha
1a2b0 74 20 6f 70 65 72 61 74 6f 72 20 6f 76 65 72 20  t operator over 
1a2c0 74 6f 20 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  to B..*/.void sq
1a2d0 6c 69 74 65 33 53 72 63 4c 69 73 74 53 68 69 66  lite3SrcListShif
1a2e0 74 4a 6f 69 6e 54 79 70 65 28 53 72 63 4c 69 73  tJoinType(SrcLis
1a2f0 74 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 26  t *p){.  if( p &
1a300 26 20 70 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e  & p->a ){.    in
1a310 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70  t i;.    for(i=p
1a320 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69  ->nSrc-1; i>0; i
1a330 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b  --){.      p->a[
1a340 69 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d  i].jointype = p-
1a350 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65  >a[i-1].jointype
1a360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
1a370 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30  [0].jointype = 0
1a380 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
1a390 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
1a3a0 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1a3b0 65 33 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e3BeginTransacti
1a3c0 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1a3d0 2c 20 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73  , int type){.  s
1a3e0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64  qlite3 *db;.  Vd
1a3f0 62 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a  be *v;.  int i;.
1a400 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
1a410 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  e!=0 );.  db = p
1a420 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73  Parse->db;.  ass
1a430 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a  ert( db!=0 );./*
1a440 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d    if( db->aDb[0]
1a450 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1a460 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  ; */.  if( sqlit
1a470 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1a480 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1a490 41 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c  ACTION, "BEGIN",
1a4a0 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
1a4b0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
1a4c0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1a4d0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76  Parse);.  if( !v
1a4e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1a4f0 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52   type!=TK_DEFERR
1a500 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ED ){.    for(i=
1a510 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1a520 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
1a530 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1a540 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69  P_Transaction, i
1a550 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c  , (type==TK_EXCL
1a560 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20  USIVE)+1);.     
1a570 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
1a580 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20  Btree(v, i);.   
1a590 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1a5a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a5b0 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20  _AutoCommit, 0, 
1a5c0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  0);.}../*.** Com
1a5d0 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  mit a transactio
1a5e0 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  n.*/.void sqlite
1a5f0 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69  3CommitTransacti
1a600 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1a610 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1a620 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20  ;.  Vdbe *v;..  
1a630 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
1a640 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  0 );.  db = pPar
1a650 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  se->db;.  assert
1a660 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69  ( db!=0 );./*  i
1a670 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  f( db->aDb[0].pB
1a680 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a  t==0 ) return; *
1a690 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  /.  if( sqlite3A
1a6a0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
1a6b0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
1a6c0 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30  ION, "COMMIT", 0
1a6d0 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
1a6e0 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
1a6f0 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
1a700 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
1a710 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1a720 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74  AddOp2(v, OP_Aut
1a730 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a  oCommit, 1, 0);.
1a740 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c    }.}../*.** Rol
1a750 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63 74  lback a transact
1a760 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ion.*/.void sqli
1a770 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73  te3RollbackTrans
1a780 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70 50  action(Parse *pP
1a790 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  arse){.  sqlite3
1a7a0 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1a7b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ..  assert( pPar
1a7c0 73 65 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  se!=0 );.  db = 
1a7d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73  pParse->db;.  as
1a7e0 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f  sert( db!=0 );./
1a7f0 2a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 30  *  if( db->aDb[0
1a800 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1a810 6e 3b 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69  n; */.  if( sqli
1a820 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
1a830 72 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  rse, SQLITE_TRAN
1a840 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41  SACTION, "ROLLBA
1a850 43 4b 22 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  CK", 0, 0) ){.  
1a860 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1a870 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1a880 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1a890 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
1a8a0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a8b0 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 31  OP_AutoCommit, 1
1a8c0 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , 1);.  }.}../*.
1a8d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1a8e0 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68   is called by th
1a8f0 65 20 70 61 72 73 65 72 20 77 68 65 6e 20 69 74  e parser when it
1a900 20 70 61 72 73 65 73 20 61 20 63 6f 6d 6d 61 6e   parses a comman
1a910 64 20 74 6f 20 63 72 65 61 74 65 2c 0a 2a 2a 20  d to create,.** 
1a920 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
1a930 61 63 6b 20 61 6e 20 53 51 4c 20 73 61 76 65 70  ack an SQL savep
1a940 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  oint. .*/.void s
1a950 71 6c 69 74 65 33 53 61 76 65 70 6f 69 6e 74 28  qlite3Savepoint(
1a960 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1a970 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e  nt op, Token *pN
1a980 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
1a990 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
1a9a0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1a9b0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  e->db, pName);. 
1a9c0 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
1a9d0 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
1a9e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1a9f0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
1aa00 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
1aa10 41 54 49 4f 4e 0a 20 20 20 20 73 74 61 74 69 63  ATION.    static
1aa20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b   const char *az[
1aa30 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
1aa40 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
1aa50 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
1aa60 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
1aa70 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
1aa80 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
1aa90 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
1aaa0 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
1aab0 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
1aac0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1aad0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
1aae0 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
1aaf0 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
1ab00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
1ab10 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
1ab20 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
1ab30 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
1ab40 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1ab50 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
1ab60 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
1ab70 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
1ab80 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1ab90 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
1aba0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
1abb0 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
1abc0 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
1abd0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
1abe0 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
1abf0 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
1ac00 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
1ac10 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
1ac20 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
1ac30 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
1ac40 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
1ac50 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1ac60 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
1ac70 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
1ac80 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
1ac90 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
1aca0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1acb0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
1acc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1acd0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1ace0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
1acf0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
1ad00 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1ad10 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1ad20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
1ad30 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1ad40 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
1ad50 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
1ad60 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
1ad70 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61 63   sqlite3BtreeFac
1ad80 74 6f 72 79 28 64 62 2c 20 30 2c 20 30 2c 20 53  tory(db, 0, 0, S
1ad90 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
1ada0 43 48 45 5f 53 49 5a 45 2c 20 66 6c 61 67 73 2c  CHE_SIZE, flags,
1adb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1add0 20 20 26 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42    &db->aDb[1].pB
1ade0 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
1adf0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ae00 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1ae10 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
1ae20 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
1ae30 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
1ae40 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
1ae50 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
1ae60 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
1ae70 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
1ae80 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
1ae90 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
1aea0 20 61 73 73 65 72 74 28 20 28 64 62 2d 3e 66 6c   assert( (db->fl
1aeb0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 54  ags & SQLITE_InT
1aec0 72 61 6e 73 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  rans)==0 || db->
1aed0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 3b 0a 20 20  autoCommit );.  
1aee0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44    assert( db->aD
1aef0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
1af00 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1af10 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 73 71 6c 69  JournalMode(sqli
1af20 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
1af30 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 2c 0a 20  ->aDb[1].pBt),. 
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af50 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 64             db->d
1af60 66 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29 3b  fltJournalMode);
1af70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1af80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
1af90 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61  te VDBE code tha
1afa0 74 20 77 69 6c 6c 20 76 65 72 69 66 79 20 74 68  t will verify th
1afb0 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
1afc0 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20 61 20 72  and start.** a r
1afd0 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1afe0 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64 20 64 61  for all named da
1aff0 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2a  tabase files..**
1b000 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70 6f 72 74  .** It is import
1b010 61 6e 74 20 74 68 61 74 20 61 6c 6c 20 73 63 68  ant that all sch
1b020 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62 65 20 76  ema cookies be v
1b030 65 72 69 66 69 65 64 20 61 6e 64 20 61 6c 6c 0a  erified and all.
1b040 2a 2a 20 72 65 61 64 20 74 72 61 6e 73 61 63 74  ** read transact
1b050 69 6f 6e 73 20 62 65 20 73 74 61 72 74 65 64 20  ions be started 
1b060 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 20  before anything 
1b070 65 6c 73 65 20 68 61 70 70 65 6e 73 20 69 6e 0a  else happens in.
1b080 2a 2a 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  ** the VDBE prog
1b090 72 61 6d 2e 20 20 42 75 74 20 74 68 69 73 20 72  ram.  But this r
1b0a0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 63 61  outine can be ca
1b0b0 6c 6c 65 64 20 61 66 74 65 72 20 6d 75 63 68 20  lled after much 
1b0c0 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65 20 68 61  other.** code ha
1b0d0 73 20 62 65 65 6e 20 67 65 6e 65 72 61 74 65 64  s been generated
1b0e0 2e 20 20 53 6f 20 68 65 72 65 20 69 73 20 77 68  .  So here is wh
1b0f0 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20  at we do:.**.** 
1b100 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
1b110 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1b120 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64 65 20 61  alled, we code a
1b130 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61 74 0a 2a  n OP_Goto that.*
1b140 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74 6f 20 61  * will jump to a
1b150 20 73 75 62 72 6f 75 74 69 6e 65 20 61 74 20 74   subroutine at t
1b160 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 72  he end of the pr
1b170 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20 77 65 0a  ogram.  Then we.
1b180 2a 2a 20 72 65 63 6f 72 64 20 65 76 65 72 79 20  ** record every 
1b190 64 61 74 61 62 61 73 65 20 74 68 61 74 20 6e 65  database that ne
1b1a0 65 64 73 20 69 74 73 20 73 63 68 65 6d 61 20 76  eds its schema v
1b1b0 65 72 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  erified in the.*
1b1c0 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65  * pParse->cookie
1b1d0 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20 4c 61 74  Mask field.  Lat
1b1e0 65 72 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 74  er, after all ot
1b1f0 68 65 72 20 63 6f 64 65 20 68 61 73 20 62 65 65  her code has bee
1b200 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65 64 2c 20  n.** generated, 
1b210 74 68 65 20 73 75 62 72 6f 75 74 69 6e 65 20 74  the subroutine t
1b220 68 61 74 20 64 6f 65 73 20 74 68 65 20 63 6f 6f  hat does the coo
1b230 6b 69 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  kie verification
1b240 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72 74 73 20  s and.** starts 
1b250 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  the transactions
1b260 20 77 69 6c 6c 20 62 65 20 63 6f 64 65 64 20 61   will be coded a
1b270 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 50  nd the OP_Goto P
1b280 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20  2 value.** will 
1b290 62 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74  be made to point
1b2a0 20 74 6f 20 74 68 61 74 20 73 75 62 72 6f 75 74   to that subrout
1b2b0 69 6e 65 2e 20 20 54 68 65 20 67 65 6e 65 72 61  ine.  The genera
1b2c0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 63  tion of the.** c
1b2d0 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74 69  ookie verificati
1b2e0 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65 20 63 6f  on subroutine co
1b2f0 64 65 20 68 61 70 70 65 6e 73 20 69 6e 20 73 71  de happens in sq
1b300 6c 69 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e  lite3FinishCodin
1b310 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44  g()..**.** If iD
1b320 62 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 74 68  b<0 then code th
1b330 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c 79 20 2d  e OP_Goto only -
1b340 20 64 6f 6e 27 74 20 73 65 74 20 66 6c 61 67 20   don't set flag 
1b350 74 6f 20 76 65 72 69 66 79 20 74 68 65 0a 2a 2a  to verify the.**
1b360 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e 79 20 64   schema on any d
1b370 61 74 61 62 61 73 65 73 2e 20 20 54 68 69 73 20  atabases.  This 
1b380 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 70  can be used to p
1b390 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f 50 5f 47  osition the OP_G
1b3a0 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20 69 6e 20  oto.** early in 
1b3b0 74 68 65 20 63 6f 64 65 2c 20 62 65 66 6f 72 65  the code, before
1b3c0 20 77 65 20 6b 6e 6f 77 20 69 66 20 61 6e 79 20   we know if any 
1b3d0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 73 20  database tables 
1b3e0 77 69 6c 6c 20 62 65 20 75 73 65 64 2e 0a 2a 2f  will be used..*/
1b3f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 64  .void sqlite3Cod
1b400 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 50 61  eVerifySchema(Pa
1b410 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b420 20 69 44 62 29 7b 0a 20 20 73 71 6c 69 74 65 33   iDb){.  sqlite3
1b430 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b   *db;.  Vdbe *v;
1b440 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 0a 20 20  .  int mask;..  
1b450 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
1b460 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
1b470 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
1b480 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68    /* This only h
1b490 61 70 70 65 6e 73 20 69 66 20 74 68 65 72 65 20  appens if there 
1b4a0 77 61 73 20 61 20 70 72 69 6f 72 20 65 72 72 6f  was a prior erro
1b4b0 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61 72  r */.  db = pPar
1b4c0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 50  se->db;.  if( pP
1b4d0 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1b4e0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 72 73  ==0 ){.    pPars
1b4f0 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20  e->cookieGoto = 
1b500 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1b510 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
1b520 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20 69 66 28   0)+1;.  }.  if(
1b530 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20 20 20 61   iDb>=0 ){.    a
1b540 73 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e  ssert( iDb<db->n
1b550 44 62 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Db );.    assert
1b560 28 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  ( db->aDb[iDb].p
1b570 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d 3d 31 20  Bt!=0 || iDb==1 
1b580 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
1b590 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  Db<SQLITE_MAX_AT
1b5a0 54 41 43 48 45 44 2b 32 20 29 3b 0a 20 20 20 20  TACHED+2 );.    
1b5b0 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62 3b 0a 20  mask = 1<<iDb;. 
1b5c0 20 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e     if( (pParse->
1b5d0 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20 6d 61 73  cookieMask & mas
1b5e0 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  k)==0 ){.      p
1b5f0 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73  Parse->cookieMas
1b600 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
1b610 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 56   pParse->cookieV
1b620 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64 62 2d 3e  alue[iDb] = db->
1b630 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
1b640 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 3b  ->schema_cookie;
1b650 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
1b660 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
1b670 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
1b680 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1b690 62 61 73 65 28 70 50 61 72 73 65 29 3b 0a 20 20  base(pParse);.  
1b6a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b6b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b6c0 65 20 56 44 42 45 20 63 6f 64 65 20 74 68 61 74  e VDBE code that
1b6d0 20 70 72 65 70 61 72 65 73 20 66 6f 72 20 64 6f   prepares for do
1b6e0 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1b6f0 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74 20 63   that.** might c
1b700 68 61 6e 67 65 20 74 68 65 20 64 61 74 61 62 61  hange the databa
1b710 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  se..**.** This r
1b720 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20 61 20  outine starts a 
1b730 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
1b740 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20 61 6c  if we are not al
1b750 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a 2a 20  ready within.** 
1b760 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  a transaction.  
1b770 49 66 20 77 65 20 61 72 65 20 61 6c 72 65 61 64  If we are alread
1b780 79 20 77 69 74 68 69 6e 20 61 20 74 72 61 6e 73  y within a trans
1b790 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61 20 63  action, then a c
1b7a0 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69 73 20  heckpoint.** is 
1b7b0 73 65 74 20 69 66 20 74 68 65 20 73 65 74 53 74  set if the setSt
1b7c0 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65 74 65  atement paramete
1b7d0 72 20 69 73 20 74 72 75 65 2e 20 20 41 20 63 68  r is true.  A ch
1b7e0 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 0a  eckpoint should.
1b7f0 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20 6f 70  ** be set for op
1b800 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20 6d 69  erations that mi
1b810 67 68 74 20 66 61 69 6c 20 28 64 75 65 20 74 6f  ght fail (due to
1b820 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29 20 70   a constraint) p
1b830 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 77 61  art of.** the wa
1b840 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20 77 68  y through and wh
1b850 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  ich will need to
1b860 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69 74 65   undo some write
1b870 73 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  s without having
1b880 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20   to.** rollback 
1b890 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e 73 61  the whole transa
1b8a0 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70 65 72  ction.  For oper
1b8b0 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61 6c 6c  ations where all
1b8c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
1b8d0 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64 20 62  can be checked b
1b8e0 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65  efore any change
1b8f0 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68  s are made to th
1b900 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20 69  e database, it i
1b910 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63 65 73  s never.** neces
1b920 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61 20 77  sary to undo a w
1b930 72 69 74 65 20 61 6e 64 20 74 68 65 20 63 68 65  rite and the che
1b940 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64 20 6e  ckpoint should n
1b950 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a 76 6f  ot be set..*/.vo
1b960 69 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  id sqlite3BeginW
1b970 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 50 61  riteOperation(Pa
1b980 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1b990 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c 20 69   setStatement, i
1b9a0 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20  nt iDb){.  Vdbe 
1b9b0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
1b9c0 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
1b9d0 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
1b9e0 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  ;.  sqlite3CodeV
1b9f0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
1ba00 73 65 2c 20 69 44 62 29 3b 0a 20 20 70 50 61 72  se, iDb);.  pPar
1ba10 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b 20 7c 3d  se->writeMask |=
1ba20 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66 28 20 73   1<<iDb;.  if( s
1ba30 65 74 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70  etStatement && p
1ba40 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
1ba50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
1ba60 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
1ba70 53 74 61 74 65 6d 65 6e 74 2c 20 69 44 62 29 3b  Statement, iDb);
1ba80 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
1ba90 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49  eck to see if pI
1baa0 6e 64 65 78 20 75 73 65 73 20 74 68 65 20 63 6f  ndex uses the co
1bab0 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
1bac0 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a   pColl.  Return.
1bad0 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  ** true if it do
1bae0 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  es and false if 
1baf0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a  it does not..*/.
1bb00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bb10 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
1bb20 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e  ic int collation
1bb30 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
1bb40 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a   *zColl, Index *
1bb50 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69  pIndex){.  int i
1bb60 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  ;.  assert( zCol
1bb70 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d  l!=0 );.  for(i=
1bb80 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f  0; i<pIndex->nCo
1bb90 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
1bba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1bbb0 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  pIndex->azColl[i
1bbc0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  ];.    assert( z
1bbd0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 30  !=0 );.    if( 0
1bbe0 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
1bbf0 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20  (z, zColl) ){.  
1bc00 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1bc10 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1bc20 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
1bc30 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c  .** Recompute al
1bc40 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1bc50 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20 63  b that use the c
1bc60 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1bc70 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70  e pColl..** If p
1bc80 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63  Coll==0 then rec
1bc90 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63  ompute all indic
1bca0 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23  es of pTab..*/.#
1bcb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bcc0 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69  IT_REINDEX.stati
1bcd0 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54 61  c void reindexTa
1bce0 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
1bcf0 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
1bd00 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
1bd10 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  l){.  Index *pIn
1bd20 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1bd30 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61 73    /* An index as
1bd40 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 54  sociated with pT
1bd50 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e  ab */..  for(pIn
1bd60 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  dex=pTab->pIndex
1bd70 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
1bd80 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b  =pIndex->pNext){
1bd90 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d  .    if( zColl==
1bda0 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61  0 || collationMa
1bdb0 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65  tch(zColl, pInde
1bdc0 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  x) ){.      int 
1bdd0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
1bde0 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
1bdf0 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  e->db, pTab->pSc
1be00 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  hema);.      sql
1be10 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1be20 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1be30 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73  0, iDb);.      s
1be40 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65  qlite3RefillInde
1be50 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  x(pParse, pIndex
1be60 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , -1);.    }.  }
1be70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1be80 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1be90 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74 61  ndices of all ta
1bea0 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61  bles in all data
1beb0 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65 0a  bases where the.
1bec0 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20 74  ** indices use t
1bed0 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1bee0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66  uence pColl.  If
1bef0 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72   pColl==0 then r
1bf00 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20  ecompute.** all 
1bf10 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68 65  indices everywhe
1bf20 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  re..*/.#ifndef S
1bf30 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
1bf40 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  EX.static void r
1bf50 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
1bf60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
1bf70 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c  har const *zColl
1bf80 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20  ){.  Db *pDb;   
1bf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfa0 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61 74   /* A single dat
1bfb0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
1bfc0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
1bfd0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1bfe0 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
1bff0 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
1c000 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c010 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
1c020 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1c030 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b  */.  HashElem *k
1c040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c050 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1c060 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20 70  over tables in p
1c070 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  Db */.  Table *p
1c080 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1c090 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69      /* A table i
1c0a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
1c0b0 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
1c0c0 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
1c0d0 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
1c0e0 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73   pDb++){.    ass
1c0f0 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20  ert( pDb!=0 );. 
1c100 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48     for(k=sqliteH
1c110 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70  ashFirst(&pDb->p
1c120 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29  Schema->tblHash)
1c130 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61  ;  k; k=sqliteHa
1c140 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20  shNext(k)){.    
1c150 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a    pTab = (Table*
1c160 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
1c170 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65  k);.      reinde
1c180 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
1c190 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  Tab, zColl);.   
1c1a0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
1c1b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1c1c0 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52 45 49  code for the REI
1c1d0 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  NDEX command..**
1c1e0 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
1c1f0 45 58 20 20 20 20 20 20 20 20 20 20 20 20 20 20  EX              
1c200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
1c210 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   1.**        REI
1c220 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e  NDEX  <collation
1c230 3e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >               
1c240 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 2.**        R
1c250 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
1c260 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e  se>.?<tablename>
1c270 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20    -- 3.**       
1c280 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
1c290 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d  base>.?<indexnam
1c2a0 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46  e>  -- 4.**.** F
1c2b0 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c  orm 1 causes all
1c2c0 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20   indices in all 
1c2d0 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73  attached databas
1c2e0 65 73 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74  es to be rebuilt
1c2f0 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75  ..** Form 2 rebu
1c300 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73  ilds all indices
1c310 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65   in all database
1c320 73 20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e  s that use the n
1c330 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e  amed.** collatin
1c340 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72  g function.  For
1c350 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62 75 69  ms 3 and 4 rebui
1c360 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  ld the named ind
1c370 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64  ex or all.** ind
1c380 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
1c390 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74  with the named t
1c3a0 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
1c3b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49   SQLITE_OMIT_REI
1c3c0 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65  NDEX.void sqlite
1c3d0 33 52 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a  3Reindex(Parse *
1c3e0 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70  pParse, Token *p
1c3f0 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Name1, Token *pN
1c400 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  ame2){.  CollSeq
1c410 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *pColl;        
1c420 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e       /* Collatin
1c430 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65  g sequence to be
1c440 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e   reindexed, or N
1c450 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ULL */.  char *z
1c460 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c470 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1c480 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  a table or index
1c490 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1c4a0 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
1c4b0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1c4c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54   database */.  T
1c4d0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1c4e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1c4f0 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1c500 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
1c510 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1c520 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1c530 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1c540 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  th pTab */.  int
1c550 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   iDb;           
1c560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c570 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e  database index n
1c580 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  umber */.  sqlit
1c590 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1c5a0 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61  >db;   /* The da
1c5b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
1c5c0 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f  n */.  Token *pO
1c5d0 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  bjName;         
1c5e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1c5f0 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  e table or index
1c600 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1c610 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
1c620 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
1c630 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ma. If an error 
1c640 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e  occurs, leave an
1c650 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20   error message. 
1c660 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20   ** and code in 
1c670 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75 72  pParse and retur
1c680 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28  n NULL. */.  if(
1c690 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
1c6a0 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
1c6b0 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74  arse) ){.    ret
1c6c0 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  urn;.  }..  if( 
1c6d0 70 4e 61 6d 65 31 3d 3d 30 20 7c 7c 20 4e 45 56  pName1==0 || NEV
1c6e0 45 52 28 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 29  ER(pName1->z==0)
1c6f0 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1c700 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1c710 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1c720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4e 45 56  .  }else if( NEV
1c730 45 52 28 70 4e 61 6d 65 32 3d 3d 30 29 20 7c 7c  ER(pName2==0) ||
1c740 20 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b   pName2->z==0 ){
1c750 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  .    char *zColl
1c760 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1c770 61 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a  ame1->z );.    z
1c780 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61  Coll = sqlite3Na
1c790 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72  meFromToken(pPar
1c7a0 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b  se->db, pName1);
1c7b0 0a 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20  .    if( !zColl 
1c7c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43  ) return;.    pC
1c7d0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
1c7e0 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43  dCollSeq(db, ENC
1c7f0 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30 29 3b  (db), zColl, 0);
1c800 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29  .    if( pColl )
1c810 7b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 44  {.      reindexD
1c820 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1c830 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 73   zColl);.      s
1c840 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1c850 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 72   zColl);.      r
1c860 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1c870 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c880 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, zColl);.  }. 
1c890 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
1c8a0 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
1c8b0 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
1c8c0 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  , &pObjName);.  
1c8d0 69 66 28 20 69 44 62 3c 30 20 29 20 72 65 74 75  if( iDb<0 ) retu
1c8e0 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  rn;.  z = sqlite
1c8f0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
1c900 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20  b, pObjName);.  
1c910 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
1c920 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d 3e 61  n;.  zDb = db->a
1c930 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
1c940 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
1c950 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 2c 20  indTable(db, z, 
1c960 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54 61 62  zDb);.  if( pTab
1c970 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 54   ){.    reindexT
1c980 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
1c990 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  b, 0);.    sqlit
1c9a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
1c9b0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
1c9c0 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
1c9d0 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c  te3FindIndex(db,
1c9e0 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71 6c 69   z, zDb);.  sqli
1c9f0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
1ca00 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
1ca10 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  {.    sqlite3Beg
1ca20 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1ca30 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29  (pParse, 0, iDb)
1ca40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 66  ;.    sqlite3Ref
1ca50 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1ca60 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1ca70 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
1ca80 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
1ca90 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20  pParse, "unable 
1caa0 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 65 20  to identify the 
1cab0 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72 65 69  object to be rei
1cac0 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65 6e 64  ndexed");.}.#end
1cad0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
1cae0 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61 6c 6c   a dynamicly all
1caf0 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f 20 73  ocated KeyInfo s
1cb00 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 61  tructure that ca
1cb10 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77 69 74  n be used.** wit
1cb20 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20 6f 72  h OP_OpenRead or
1cb30 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 74 6f   OP_OpenWrite to
1cb40 20 61 63 63 65 73 73 20 64 61 74 61 62 61 73 65   access database
1cb50 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 0a   index pIdx..**.
1cb60 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
1cb70 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  , a pointer to t
1cb80 68 65 20 6e 65 77 20 73 74 72 75 63 74 75 72 65  he new structure
1cb90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e   is returned. In
1cba0 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20 74 68   this case.** th
1cbb0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1cbc0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1cbd0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65  ing sqlite3DbFre
1cbe0 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65 20 72  e(db, ) on the r
1cbf0 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e  eturned .** poin
1cc00 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ter. If an error
1cc10 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f 66 20   occurs (out of 
1cc20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73 69 6e  memory or missin
1cc30 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20  g collation .** 
1cc40 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c 4c 20  sequence), NULL 
1cc50 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1cc60 74 68 65 20 73 74 61 74 65 20 6f 66 20 70 50 61  the state of pPa
1cc70 72 73 65 20 75 70 64 61 74 65 64 20 74 6f 20 72  rse updated to r
1cc80 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20 65 72  eflect.** the er
1cc90 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20  ror..*/.KeyInfo 
1cca0 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79  *sqlite3IndexKey
1ccb0 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  info(Parse *pPar
1ccc0 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29  se, Index *pIdx)
1ccd0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
1cce0 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 6e 43   nCol = pIdx->nC
1ccf0 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e 42 79  olumn;.  int nBy
1cd00 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b 65 79  tes = sizeof(Key
1cd10 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d 31 29  Info) + (nCol-1)
1cd20 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65 71 2a  *sizeof(CollSeq*
1cd30 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69  ) + nCol;.  sqli
1cd40 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
1cd50 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66 6f 20  ->db;.  KeyInfo 
1cd60 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e 66 6f  *pKey = (KeyInfo
1cd70 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1cd80 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
1cd90 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20  s);..  if( pKey 
1cda0 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64 62 20  ){.    pKey->db 
1cdb0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1cdc0 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
1cdd0 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70 4b 65  er = (u8 *)&(pKe
1cde0 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  y->aColl[nCol]);
1cdf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 70 4b  .    assert( &pK
1ce00 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ey->aSortOrder[n
1ce10 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a 29 70  Col]==&(((u8 *)p
1ce20 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20 29 3b  Key)[nBytes]) );
1ce30 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1ce40 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
1ce50 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20    char *zColl = 
1ce60 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  pIdx->azColl[i];
1ce70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
1ce80 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 4b  Coll );.      pK
1ce90 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73  ey->aColl[i] = s
1cea0 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c  qlite3LocateColl
1ceb0 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  Seq(pParse, zCol
1cec0 6c 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  l);.      pKey->
1ced0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1cee0 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1cef0 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [i];.    }.    p
1cf00 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Key->nField = (u
1cf10 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20  16)nCol;.  }..  
1cf20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1cf30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1cf40 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b  bFree(db, pKey);
1cf50 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20  .    pKey = 0;. 
1cf60 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
1cf70 3b 0a 7d 0a                                      ;.}.