/ Hex Artifact Content
Login

Artifact 9f00cc9cc0a3e7271dad30cd11915ea1f323174d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 35 33 34 20 32 30 30 39 2f 30 35 2f 30 32  1.534 2009/05/02
02f0: 20 31 33 3a 32 39 3a 33 38 20 64 72 68 20 45 78   13:29:38 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0320: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0330: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
0340: 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74 65   a new SQL state
0350: 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69 6e  ment is beginnin
0360: 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73 65  g to.** be parse
0370: 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  d.  Initialize t
0380: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
0390: 75 72 65 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ure as needed..*
03a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
03b0: 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20 2a  ginParse(Parse *
03c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70 6c  pParse, int expl
03d0: 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70 50 61 72  ainFlag){.  pPar
03e0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 28 75  se->explain = (u
03f0: 38 29 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20  8)explainFlag;. 
0400: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
0410: 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
0420: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0430: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0440: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0450: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0460: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0470: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0480: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0490: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
04a0: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
04b0: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
04d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
04e0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
04f0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0500: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
0510: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
0520: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0530: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0540: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0550: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0560: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0570: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0580: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
05a0: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
05b0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
05c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
05d0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
05e0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
05f0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
0600: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
0610: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0620: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0630: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0640: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0650: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0660: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0670: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0680: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0690: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
06a0: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
06b0: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
06c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
06d0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
06e0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
06f0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
0700: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
0710: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
0720: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0730: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0740: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0750: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0760: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0770: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0780: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0790: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
07a0: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
07b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
07c0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
07d0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
07e0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
07f0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
0800: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
0810: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
0820: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0830: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0840: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0850: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0860: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0870: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0880: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0890: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
08a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
08b0: 42 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f  Bytes;.  TableLo
08c0: 63 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 69 44  ck *p;..  if( iD
08d0: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
08e0: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
08f0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0900: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0910: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0920: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0930: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0940: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0950: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
0960: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
0970: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
0980: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
0990: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09a0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09b0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
09c0: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
09d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
09e0: 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
09f0: 6f 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c  ock = .      sql
0a00: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
0a10: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
0a20: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a30: 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69  ck, nBytes);.  i
0a40: 66 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  f( pParse->aTabl
0a50: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d  eLock ){.    p =
0a60: 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65   &pParse->aTable
0a70: 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61  Lock[pParse->nTa
0a80: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a90: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0aa0: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0ab0: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0ac0: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0ad0: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ck;.    p->zName
0ae0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73   = zName;.  }els
0af0: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e{.    pParse->n
0b00: 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  TableLock = 0;. 
0b10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
0b20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
0b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0b40: 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f  de an OP_TableLo
0b50: 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ck instruction f
0b60: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f  or each table lo
0b70: 63 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  cked by the.** s
0b80: 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67  tatement (config
0b90: 75 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ured by calls to
0ba0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0bb0: 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  k())..*/.static 
0bc0: 76 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f  void codeTableLo
0bd0: 63 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  cks(Parse *pPars
0be0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  e){.  int i;.  V
0bf0: 64 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20  dbe *pVdbe; ..  
0c00: 69 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20  if( 0==(pVdbe = 
0c10: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
0c20: 50 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72  Parse)) ){.    r
0c30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
0c40: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
0c50: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b  >nTableLock; i++
0c60: 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b  ){.    TableLock
0c70: 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
0c80: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0c90: 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44    int p1 = p->iD
0ca0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  b;.    sqlite3Vd
0cb0: 62 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20  beAddOp4(pVdbe, 
0cc0: 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31  OP_TableLock, p1
0cd0: 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73  , p->iTab, p->is
0ce0: 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  WriteLock,.     
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54   p->zName, P4_ST
0d10: 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ATIC);.  }.}.#el
0d20: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64  se.  #define cod
0d30: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23  eTableLocks(x).#
0d40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
0d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0d60: 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67  led after a sing
0d70: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
0d80: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72   has been.** par
0d90: 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70  sed and a VDBE p
0da0: 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
0db0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
0dc0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65   has been.** pre
0dd0: 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75  pared.  This rou
0de0: 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69  tine puts the fi
0df0: 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20  nishing touches 
0e00: 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  on the.** VDBE p
0e10: 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74  rogram and reset
0e20: 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  s the pParse str
0e30: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e  ucture for the n
0e40: 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a  ext.** parse..**
0e50: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0e60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0e70: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0e80: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0e90: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0ea0: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
0ec0: 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a  shCoding(Parse *
0ed0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0ee0: 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
0ef0: 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  v;..  db = pPars
0f00: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
0f10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
0f20: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f30: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0f40: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f50: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
0f60: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  rn;..  /* Begin 
0f70: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
0f80: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
0f90: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
0fa0: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
0fb0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 76  program.  */.  v
0fc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
0fd0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
0fe0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
0ff0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1000: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
1010: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
1020: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
1030: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1040: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1050: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1060: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1070: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1080: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1090: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
10a0: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
10b0: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
10c0: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
10d0: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
10e0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
10f0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1100: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
1110: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
1120: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
1130: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1140: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1150: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1160: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
1170: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
1180: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
1190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11a0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
11b0: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
11c0: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
11d0: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
11e0: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
11f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1200: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1210: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
1220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1240: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
1250: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1260: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f  VdbeAddOp2(v,OP_
1270: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
1280: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
1290: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
12a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
12b0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
12f0: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
1300: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
1310: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1320: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1330: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1340: 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BLE.      {.    
1350: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1360: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
1370: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b  arse->nVtabLock;
1380: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1390: 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63   char *vtab = (c
13a0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 61 70  har *)pParse->ap
13b0: 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d 3e 70 56 74  VtabLock[i]->pVt
13c0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ab;.          sq
13d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13e0: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
13f0: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1400: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 20 20 7d  VTAB);.        }
1410: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1420: 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a  >nVtabLock = 0;.
1430: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1440: 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c        /* Once al
1450: 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61  l the cookies ha
1460: 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  ve been verified
1470: 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   and transaction
1480: 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20  s opened, .     
1490: 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72   ** obtain the r
14a0: 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f  equired table-lo
14b0: 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e  cks. This is a n
14c0: 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20  o-op unless the 
14d0: 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64  .      ** shared
14e0: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
14f0: 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20  s enabled..     
1500: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61   */.      codeTa
1510: 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29  bleLocks(pParse)
1520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1530: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1540: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
1550: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20  >cookieGoto);.  
1560: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47    }.  }...  /* G
1570: 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  et the VDBE prog
1580: 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78  ram ready for ex
1590: 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69  ecution.  */.  i
15a0: 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e  f( v && pParse->
15b0: 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e  nErr==0 && !db->
15c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
15e0: 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72  BUG.    FILE *tr
15f0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
1600: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
1610: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
1620: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
1630: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
1640: 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ace);.#endif.   
1650: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1660: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20  >iCacheLevel==0 
1670: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1680: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1690: 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71 6c 69  atch */.    sqli
16a0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
16b0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
16c0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a  , pParse->nMem,.
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
16f0: 3e 6e 54 61 62 2c 20 70 50 61 72 73 65 2d 3e 65  >nTab, pParse->e
1700: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
1710: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1720: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
1730: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
1740: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1750: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
1760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
1770: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1780: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
1790: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
17a0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
17b0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
17c0: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
17d0: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50  ->nVar = 0;.  pP
17e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
17f0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1800: 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a  cookieGoto = 0;.
1810: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1820: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1830: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1840: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1850: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1860: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1870: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1880: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1890: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
18a0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
18b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18c0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
18d0: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
18e0: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
18f0: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1900: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1910: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1920: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1930: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1940: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1950: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1960: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1970: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1980: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1990: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
19a0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
19b0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
19c0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
19d0: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
19e0: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
19f0: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1a00: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1a10: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1a20: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1a30: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1a40: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1a50: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1a60: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1a70: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1a80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1a90: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1aa0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1ab0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ac0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1ad0: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
1ae0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1af0: 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  >db;.# define SA
1b00: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1b10: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1b20: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1b30: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1b40: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1b50: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1b60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1b70: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1b80: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1b90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1ba0: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1bb0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1bc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1bd0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1be0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
1bf0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1c00: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1c10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c20: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1c30: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c40: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1c50: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1c60: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1c70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1c80: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1c90: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1ca0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1cb0: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1cc0: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
1cd0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1ce0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1cf0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1d00: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
1d10: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1d20: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1d30: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1d40: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1d60: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1d70: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1d80: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1d90: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1da0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1db0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1dc0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1dd0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1de0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1df0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1e00: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1e10: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1e30: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1e40: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1e50: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1e60: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1e70: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1e80: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1e90: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1ea0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1eb0: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1ec0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1ed0: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1ee0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1ef0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1f00: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1f10: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1f20: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1f30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1f40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1f50: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
1f60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1f70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1f80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1fa0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
1fb0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1fc0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
1fd0: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1fe0: 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  0 );.  nName = s
1ff0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c  qlite3Strlen(db,
2000: 20 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69   zName);.  for(i
2010: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2020: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2030: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
2040: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
2050: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
2060: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
2070: 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  if( zDatabase!=0
2080: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2090: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
20a0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
20b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20c0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
20d0: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
20e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
20f0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
2100: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
2110: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2120: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
2130: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2140: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
2150: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
2160: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
2170: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
2180: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2190: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
21a0: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
21b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
21c0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
21d0: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
21e0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
21f0: 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65  und.  Also leave
2200: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73   an.** error mes
2210: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2220: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2230: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2240: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
2250: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69  ne and sqlite3Fi
2260: 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61  ndTable() is tha
2270: 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  t this.** routin
2280: 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  e leaves an erro
2290: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
22a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65  rse->zErrMsg whe
22b0: 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  re.** sqlite3Fin
22c0: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
22d0: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
22e0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
22f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2300: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e  ,         /* con
2310: 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f  text in which to
2320: 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a   report errors *
2330: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2350: 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ue if looking fo
2360: 72 20 61 20 56 49 45 57 20 72 61 74 68 65 72 20  r a VIEW rather 
2370: 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a  than a TABLE */.
2380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2390: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
23a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
23b0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
23c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
23d0: 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20   *zDbase     /* 
23e0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
23f0: 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20  base.  Might be 
2400: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  NULL */.){.  Tab
2410: 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61  le *p;..  /* Rea
2420: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2430: 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
2440: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
2450: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2460: 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
2470: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
2480: 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
2490: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
24a0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
24b0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
24c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
24d0: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
24e0: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
24f0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2500: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2510: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2520: 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20  zMsg = isView ? 
2530: 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a  "no such view" :
2540: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22   "no such table"
2550: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  ;.    if( zDbase
2560: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2570: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2580: 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a  , "%s: %s.%s", z
2590: 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  Msg, zDbase, zNa
25a0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
25b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
25d0: 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e  s: %s", zMsg, zN
25e0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
25f0: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
2600: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
2610: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2620: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2630: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2640: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2650: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
2660: 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65   index given the
2670: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e   name of that in
2680: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  dex.** and the n
2690: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
26a0: 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
26b0: 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  s the index..** 
26c0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
26d0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
26e0: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
26f0: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
2700: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
2710: 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61  r the.** table a
2720: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  nd the first mat
2730: 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72  ching index is r
2740: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
2750: 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75  ecking.** for du
2760: 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61  plicate index na
2770: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
2780: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
2790: 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74  is.** TEMP first
27a0: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
27b0: 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20  n any auxiliary 
27c0: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a  databases added.
27d0: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ** using the ATT
27e0: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ACH command..*/.
27f0: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69  Index *sqlite3Fi
2800: 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  ndIndex(sqlite3 
2810: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
2820: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
2830: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65  ar *zDb){.  Inde
2840: 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  x *p = 0;.  int 
2850: 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  i;.  int nName =
2860: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64   sqlite3Strlen(d
2870: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  b, zName);.  for
2880: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2890: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
28a0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
28b0: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
28c0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
28d0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
28e0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
28f0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
2900: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a  chema;.    if( z
2910: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
2920: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
2930: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2940: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2950: 72 74 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28  rt( pSchema || (
2960: 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62  j==1 && !db->aDb
2970: 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20  [1].pBt) );.    
2980: 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20  if( pSchema ){. 
2990: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
29a0: 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d  HashFind(&pSchem
29b0: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
29c0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
29d0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
29e0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
29f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   p;.}../*.** Rec
2a00: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
2a10: 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
2a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a30: 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20  freeIndex(Index 
2a40: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
2a50: 64 62 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  db = p->pTable->
2a60: 64 62 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  dbMem;.  sqlite3
2a70: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2a80: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2a90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
2ab0: 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20  the given index 
2ac0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
2ad0: 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66  ash table, and f
2ae0: 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72  ree.** its memor
2af0: 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  y structures..**
2b00: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73  .** The index is
2b10: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2b20: 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20  e database hash 
2b30: 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74  tables but.** it
2b40: 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64   is not unlinked
2b50: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
2b60: 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e  that it indexes.
2b70: 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72  .** Unlinking fr
2b80: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73  om the Table mus
2b90: 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65  t be done by the
2ba0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2bb0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2bc0: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49  d sqlite3DeleteI
2bd0: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a  ndex(Index *p){.
2be0: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20    Index *pOld;. 
2bf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2c00: 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a  me = p->zName;..
2c10: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
2c20: 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
2c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
2c40: 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20   zName,.        
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e     sqlite3Strlen
2c70: 33 30 28 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20  30(zName), 0);. 
2c80: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
2c90: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
2ca0: 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d   freeIndex(p);.}
2cb0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
2cc0: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
2cd0: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
2ce0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
2cf0: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
2d00: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
2d10: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
2d20: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
2d30: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
2d40: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
2d50: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
2d60: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2d70: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
2d80: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
2d90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
2da0: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
2db0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
2dc0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
2dd0: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
2de0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
2df0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73    int len;.  Has
2e00: 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e  h *pHash = &db->
2e10: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
2e20: 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65  ->idxHash;..  le
2e30: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
2e40: 6e 28 64 62 2c 20 7a 49 64 78 4e 61 6d 65 29 3b  n(db, zIdxName);
2e50: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2e60: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2e70: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2e80: 65 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  en, 0);.  if( pI
2e90: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2ea0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2eb0: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
2ec0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
2ed0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2ee0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2ef0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f00: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
2f10: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
2f20: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2f30: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
2f40: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
2f50: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
2f60: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
2f70: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
2f80: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
2f90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
2fb0: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
2fc0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
2fd0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
2fe0: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2ff0: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
3000: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
3010: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
3020: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
3030: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
3040: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
3050: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
3060: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
3070: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
3080: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
3090: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
30a0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
30b0: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
30c0: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
30d0: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
30e0: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
30f0: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
3100: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
3110: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
3120: 3d 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  ==0 then reset t
3130: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
3140: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
3150: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
3160: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 31 20  les.  If iDb>=1 
3170: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
3180: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
3190: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
31a0: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
31b0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
31c0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
31d0: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
31e0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
31f0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73    int i, j;.  as
3200: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
3210: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
3220: 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a    if( iDb==0 ){.
3230: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3240: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
3250: 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  }.  for(i=iDb; i
3260: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3270: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3280: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
3290: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
32a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
32b0: 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42  i==1 || (pDb->pB
32c0: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
32d0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d  eHoldsMutex(pDb-
32e0: 3e 70 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73  >pBt)));.      s
32f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65 65  qlite3SchemaFree
3300: 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pDb->pSchema);.
3310: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
3320: 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b>0 ) return;.  
3330: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d  }.  assert( iDb=
3340: 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  =0 );.  db->flag
3350: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3360: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
3370: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
3380: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ll(db);..  /* If
3390: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
33a0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
33b0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
33c0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
33d0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
33e0: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
33f0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3400: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3410: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
3420: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
3430: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
3440: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
3450: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
3460: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
3470: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
3480: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
3490: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
34a0: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
34b0: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
34c0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
34d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
34e0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
34f0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3500: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
3520: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
3530: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
3540: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
3550: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
3560: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
3570: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
3580: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3590: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
35a0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
35b0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
35c0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
35d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
35e0: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  e(db, pDb->zName
35f0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
3600: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
3610: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
3620: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
3630: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
3640: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
3650: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
3660: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
3670: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
3680: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
3690: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
36a0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
36b0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
36c0: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
36d0: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
36e0: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
36f0: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3700: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3710: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3720: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3730: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3740: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3750: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
3760: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3770: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
3780: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
3790: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
37a0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
37b0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
37c0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
37d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
37e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
37f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
3800: 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72   from a table or
3810: 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63   view..*/.static
3820: 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65   void sqliteRese
3830: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
3840: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
3850: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
3860: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
3870: 2a 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62  *db = pTable->db
3880: 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Mem;.  assert( p
3890: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
38a0: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
38b0: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
38c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
38d0: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
38e0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
38f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3900: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
3910: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3920: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
3930: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
3940: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3950: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20   pCol->zType);. 
3960: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3970: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
3980: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
3990: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
39a0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
39b0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43    }.  pTable->aC
39c0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
39d0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nCol = 0;.}../
39e0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
39f0: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
3a00: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3a10: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
3a20: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
3a30: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3a40: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
3a50: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
3a60: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
3a70: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
3a80: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
3a90: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
3aa0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
3ab0: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
3ac0: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3ad0: 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64  .  But it does d
3ae0: 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79  estroy.** memory
3af0: 20 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74   structures of t
3b00: 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66  he indices and f
3b10: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
3b20: 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
3b30: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f  the table..*/.vo
3b40: 69 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65  id sqlite3Delete
3b50: 54 61 62 6c 65 28 54 61 62 6c 65 20 2a 70 54 61  Table(Table *pTa
3b60: 62 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  ble){.  Index *p
3b70: 49 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20  Index, *pNext;. 
3b80: 20 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70   FKey *pFKey, *p
3b90: 4e 65 78 74 46 4b 65 79 3b 0a 20 20 73 71 6c 69  NextFKey;.  sqli
3ba0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
3bb0: 70 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75  pTable==0 ) retu
3bc0: 72 6e 3b 0a 20 20 64 62 20 3d 20 70 54 61 62 6c  rn;.  db = pTabl
3bd0: 65 2d 3e 64 62 4d 65 6d 3b 0a 0a 20 20 2f 2a 20  e->dbMem;..  /* 
3be0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
3bf0: 65 20 74 61 62 6c 65 20 75 6e 74 69 6c 20 74 68  e table until th
3c00: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
3c10: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  t reaches zero. 
3c20: 2a 2f 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65  */.  pTable->nRe
3c30: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 54 61 62 6c  f--;.  if( pTabl
3c40: 65 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  e->nRef>0 ){.   
3c50: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
3c60: 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e  ssert( pTable->n
3c70: 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
3c80: 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63  Delete all indic
3c90: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
3ca0: 74 68 20 74 68 69 73 20 74 61 62 6c 65 0a 20 20  th this table.  
3cb0: 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20  */.  for(pIndex 
3cc0: 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  = pTable->pIndex
3cd0: 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78  ; pIndex; pIndex
3ce0: 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65  =pNext){.    pNe
3cf0: 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65  xt = pIndex->pNe
3d00: 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  xt;.    assert( 
3d10: 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d  pIndex->pSchema=
3d20: 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61  =pTable->pSchema
3d30: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   );.    sqlite3D
3d40: 65 6c 65 74 65 49 6e 64 65 78 28 70 49 6e 64 65  eleteIndex(pInde
3d50: 78 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  x);.  }..#ifndef
3d60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
3d70: 45 49 47 4e 5f 4b 45 59 0a 20 20 2f 2a 20 44 65  EIGN_KEY.  /* De
3d80: 6c 65 74 65 20 61 6c 6c 20 66 6f 72 65 69 67 6e  lete all foreign
3d90: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
3da0: 20 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65   with this table
3db0: 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79  . */.  for(pFKey
3dc0: 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20  =pTable->pFKey; 
3dd0: 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65  pFKey; pFKey=pNe
3de0: 78 74 46 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65  xtFKey){.    pNe
3df0: 78 74 46 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e  xtFKey = pFKey->
3e00: 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20 20 20 73  pNextFrom;.    s
3e10: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3e20: 20 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e   pFKey);.  }.#en
3e30: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
3e40: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
3e50: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
3e60: 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43  /.  sqliteResetC
3e70: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c  olumnNames(pTabl
3e80: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
3e90: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
3ea0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
3eb0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
3ec0: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  le->zColAff);.  
3ed0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
3ee0: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
3ef0: 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65  pSelect);.#ifnde
3f00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
3f10: 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ECK.  sqlite3Exp
3f20: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  rDelete(db, pTab
3f30: 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e  le->pCheck);.#en
3f40: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 74 61  dif.  sqlite3Vta
3f50: 62 43 6c 65 61 72 28 70 54 61 62 6c 65 29 3b 0a  bClear(pTable);.
3f60: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3f70: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
3f80: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
3f90: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
3fa0: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3fb0: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
3fc0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
3fd0: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
3fe0: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
3ff0: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
4000: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
4010: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
4020: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
4030: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
4040: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
4050: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 44 62    Table *p;.  Db
4060: 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74   *pDb;..  assert
4070: 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( db!=0 );.  ass
4080: 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69  ert( iDb>=0 && i
4090: 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20  Db<db->nDb );.  
40a0: 61 73 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65  assert( zTabName
40b0: 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b 30 5d 20   && zTabName[0] 
40c0: 29 3b 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  );.  pDb = &db->
40d0: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
40e0: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
40f0: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
4100: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
4110: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
4120: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
4130: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 61 62  te3Strlen30(zTab
4140: 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 73 71 6c 69  Name),0);.  sqli
4150: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
4160: 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  );.  db->flags |
4170: 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  = SQLITE_InternC
4180: 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  hanges;.}../*.**
4190: 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e 2c 20   Given a token, 
41a0: 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  return a string 
41b0: 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  that consists of
41c0: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 61   the text of tha
41d0: 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53 70 61  t.** token.  Spa
41e0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
41f0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
4200: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
4210: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
4220: 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72  ) and must be fr
4230: 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  eed by the calli
4240: 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ng.** function..
4250: 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74 61 74  **.** Any quotat
4260: 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a 20 20  ion marks (ex:  
4270: 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27 2c 20  "name", 'name', 
4280: 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61 6d 65  [name], or `name
4290: 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72 72 6f  `) that.** surro
42a0: 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f 66 20  und the body of 
42b0: 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20 72 65  the token are re
42c0: 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b  moved..**.** Tok
42d0: 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20 6a 75  ens are often ju
42e0: 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f  st pointers into
42f0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51   the original SQ
4300: 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a  L text and so.**
4310: 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20 74 65   are not \000 te
4320: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61 72 65  rminated and are
4330: 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e 74 2e   not persistent.
4340: 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 73    The returned s
4350: 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30  tring.** is \000
4360: 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20   terminated and 
4370: 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a  is persistent..*
4380: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4e  /.char *sqlite3N
4390: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c  ameFromToken(sql
43a0: 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20  ite3 *db, Token 
43b0: 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
43c0: 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e  *zName;.  if( pN
43d0: 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
43e0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
43f0: 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70  Dup(db, (char*)p
4400: 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e  Name->z, pName->
4410: 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  n);.    if( pNam
4420: 65 2d 3e 71 75 6f 74 65 64 20 29 20 73 71 6c 69  e->quoted ) sqli
4430: 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65  te3Dequote(zName
4440: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4450: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zName = 0;.  }. 
4460: 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d   return zName;.}
4470: 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
4480: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
4490: 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64  able stored in d
44a0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69  atabase number i
44b0: 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  Db for.** writin
44c0: 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  g. The table is 
44d0: 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72  opened using cur
44e0: 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73  sor 0..*/.void s
44f0: 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72  qlite3OpenMaster
4500: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20  Table(Parse *p, 
4510: 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65  int iDb){.  Vdbe
4520: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
4530: 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  Vdbe(p);.  sqlit
4540: 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  e3TableLock(p, i
4550: 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c  Db, MASTER_ROOT,
4560: 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45   1, SCHEMA_TABLE
4570: 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65  (iDb));.  sqlite
4580: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
4590: 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c 20  P_OpenWrite, 0, 
45a0: 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44 62  MASTER_ROOT, iDb
45b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
45c0: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
45d0: 28 63 68 61 72 20 2a 29 35 2c 20 50 34 5f 49 4e  (char *)5, P4_IN
45e0: 54 33 32 29 3b 20 20 2f 2a 20 35 20 63 6f 6c 75  T32);  /* 5 colu
45f0: 6d 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 66  mn table */.  if
4600: 28 20 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a  ( p->nTab==0 ){.
4610: 20 20 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b      p->nTab = 1;
4620: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  .  }.}../*.** Pa
4630: 72 61 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f  rameter zName po
4640: 69 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65  ints to a nul-te
4650: 72 6d 69 6e 61 74 65 64 20 62 75 66 66 65 72 20  rminated buffer 
4660: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
4670: 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61  ame.** of a data
4680: 62 61 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  base ("main", "t
4690: 65 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65  emp" or the name
46a0: 20 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20   of an attached 
46b0: 64 62 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  db). This.** fun
46c0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
46d0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
46e0: 61 6d 65 64 20 64 61 74 61 62 61 73 65 20 69 6e  amed database in
46f0: 20 64 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a   db->aDb[], or.*
4700: 2a 20 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65  * -1 if the name
4710: 64 20 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66  d db cannot be f
4720: 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
4730: 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73  ite3FindDbName(s
4740: 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
4750: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
4760: 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20    int i = -1;   
4770: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4780: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66  e number */.  if
4790: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44  ( zName ){.    D
47a0: 62 20 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20  b *pDb;.    int 
47b0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
47c0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n30(zName);.    
47d0: 66 6f 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31  for(i=(db->nDb-1
47e0: 29 2c 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b  ), pDb=&db->aDb[
47f0: 69 5d 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70  i]; i>=0; i--, p
4800: 44 62 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28  Db--){.      if(
4810: 20 28 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c   (!OMIT_TEMPDB |
4820: 7c 20 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73  | i!=1 ) && n==s
4830: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
4840: 44 62 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20  Db->zName) && . 
4850: 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69           0==sqli
4860: 74 65 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e  te3StrICmp(pDb->
4870: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  zName, zName) ){
4880: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4890: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
48a0: 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  }.  return i;.}.
48b0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e  ./*.** The token
48c0: 20 2a 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73   *pName contains
48d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
48e0: 61 74 61 62 61 73 65 20 28 65 69 74 68 65 72 20  atabase (either 
48f0: 22 6d 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65  "main" or.** "te
4900: 6d 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20  mp" or the name 
4910: 6f 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  of an attached d
4920: 62 29 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  b). This routine
4930: 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20   returns the.** 
4940: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
4950: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
4960: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20  b->aDb[], or -1 
4970: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
4980: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
4990: 73 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  st..*/.int sqlit
49a0: 65 33 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33  e3FindDb(sqlite3
49b0: 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61   *db, Token *pNa
49c0: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  me){.  int i;   
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
49f0: 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a  atabase number *
4a00: 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  /.  char *zName;
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
4a30: 20 77 65 20 61 72 65 20 73 65 61 72 63 68 69 6e   we are searchin
4a40: 67 20 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65  g for */.  zName
4a50: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
4a60: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
4a70: 65 29 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65  e);.  i = sqlite
4a80: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
4a90: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
4aa0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
4ab0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a  e);.  return i;.
4ac0: 7d 0a 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20  }../* The table 
4ad0: 6f 72 20 76 69 65 77 20 6f 72 20 74 72 69 67 67  or view or trigg
4ae0: 65 72 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65  er name is passe
4af0: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
4b00: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e via tokens.** 
4b10: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
4b20: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
4b30: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
4b40: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
4b50: 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  ample:.**.** CRE
4b60: 41 54 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79  ATE TABLE xxx.yy
4b70: 79 20 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20  y (...);.** .** 
4b80: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4b90: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
4ba0: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
4bb0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
4bc0: 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  if.** the table 
4bd0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c  name is not full
4be0: 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65  y qualified, i.e
4bf0: 2e 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  .:.**.** CREATE 
4c00: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
4c10: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65  **.** Then pName
4c20: 31 20 69 73 20 73 65 74 20 74 6f 20 22 79 79 79  1 is set to "yyy
4c30: 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20  " and pName2 is 
4c40: 22 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ""..**.** This r
4c50: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
4c60: 2a 70 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65  *ppUnqual pointe
4c70: 72 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68  r to point at th
4c80: 65 20 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20  e token (pName1 
4c90: 6f 72 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68  or.** pName2) th
4ca0: 61 74 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e  at stores the un
4cb0: 71 75 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20  qualified table 
4cc0: 6e 61 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78  name.  The index
4cd0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
4ce0: 61 73 65 20 22 78 78 78 22 20 69 73 20 72 65 74  ase "xxx" is ret
4cf0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
4d00: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
4d10: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
4d20: 65 2c 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  e,      /* Parsi
4d30: 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
4d40: 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
4d50: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
4d60: 31 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  1,      /* The "
4d70: 78 78 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  xxx" in the name
4d80: 20 22 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78   "xxx.yyy" or "x
4d90: 78 78 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  xx" */.  Token *
4da0: 70 4e 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20  pName2,      /* 
4db0: 54 68 65 20 22 79 79 79 22 20 69 6e 20 74 68 65  The "yyy" in the
4dc0: 20 6e 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20   name "xxx.yyy" 
4dd0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e  */.  Token **pUn
4de0: 71 75 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74  qual     /* Writ
4df0: 65 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  e the unqualifie
4e00: 64 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65  d object name he
4e10: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  re */.){.  int i
4e20: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
4e30: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4e40: 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f  se holding the o
4e50: 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74  bject */.  sqlit
4e60: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
4e70: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70 4e 61 6d  >db;..  if( pNam
4e80: 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e 3e  e2 && pName2->n>
4e90: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  0 ){.    if( db-
4ea0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 7b 0a 20  >init.busy ) {. 
4eb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
4ec0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 6f  rMsg(pParse, "co
4ed0: 72 72 75 70 74 20 64 61 74 61 62 61 73 65 22 29  rrupt database")
4ee0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
4ef0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
4f00: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
4f10: 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70 4e     *pUnqual = pN
4f20: 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20 3d 20  ame2;.    iDb = 
4f30: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28 64 62  sqlite3FindDb(db
4f40: 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69  , pName1);.    i
4f50: 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
4f60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4f70: 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b 6e 6f  g(pParse, "unkno
4f80: 77 6e 20 64 61 74 61 62 61 73 65 20 25 54 22 2c  wn database %T",
4f90: 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 20 20   pName1);.      
4fa0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
4fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
4fc0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
4fd0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
4fe0: 69 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64  init.iDb==0 || d
4ff0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a  b->init.busy );.
5000: 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e      iDb = db->in
5010: 69 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e  it.iDb;.    *pUn
5020: 71 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20  qual = pName1;. 
5030: 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b   }.  return iDb;
5040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5050: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
5060: 6f 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55  o check if the U
5070: 54 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d  TF-8 string zNam
5080: 65 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20  e is a legal.** 
5090: 75 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  unqualified name
50a0: 20 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d   for a new schem
50b0: 61 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c  a object (table,
50c0: 20 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a   index, view or.
50d0: 2a 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c  ** trigger). All
50e0: 20 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c   names are legal
50f0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68   except those th
5100: 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  at begin with th
5110: 65 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c  e string.** "sql
5120: 69 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c  ite_" (in upper,
5130: 20 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20   lower or mixed 
5140: 63 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74  case). This port
5150: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73  ion of the names
5160: 70 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72  pace.** is reser
5170: 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ved for internal
5180: 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
5190: 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
51a0: 61 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ame(Parse *pPars
51b0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
51c0: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50  Name){.  if( !pP
51d0: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
51e0: 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  usy && pParse->n
51f0: 65 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ested==0 .      
5200: 20 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e      && (pParse->
5210: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
5220: 54 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d  TE_WriteSchema)=
5230: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
5240: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43  0==sqlite3StrNIC
5250: 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  mp(zName, "sqlit
5260: 65 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73  e_", 7) ){.    s
5270: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5280: 50 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e  Parse, "object n
5290: 61 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72  ame reserved for
52a0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25   internal use: %
52b0: 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
52c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
52d0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
52e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
52f0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73  /*.** Begin cons
5300: 74 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74  tructing a new t
5310: 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
5320: 69 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  ion in memory.  
5330: 54 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  This is.** the f
5340: 69 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20  irst of several 
5350: 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20  action routines 
5360: 74 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20  that get called 
5370: 69 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74  in response.** t
5380: 6f 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  o a CREATE TABLE
5390: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20   statement.  In 
53a0: 70 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73  particular, this
53b0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
53c0: 65 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69  ed.** after seei
53d0: 6e 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54  ng tokens "CREAT
53e0: 45 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61  E" and "TABLE" a
53f0: 6e 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  nd the table nam
5400: 65 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a  e. The isTemp.**
5410: 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66   flag is true if
5420: 20 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c   the table shoul
5430: 64 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74  d be stored in t
5440: 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  he auxiliary dat
5450: 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e  abase.** file in
5460: 73 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20  stead of in the 
5470: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
5480: 6c 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72  le.  This is nor
5490: 6d 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a  mally the case.*
54a0: 2a 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50  * when the "TEMP
54b0: 22 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22  " or "TEMPORARY"
54c0: 20 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20   keyword occurs 
54d0: 69 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52  in between.** CR
54e0: 45 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a  EATE and TABLE..
54f0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61  **.** The new ta
5500: 62 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e  ble record is in
5510: 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75  itialized and pu
5520: 74 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65  t in pParse->pNe
5530: 77 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f  wTable..** As mo
5540: 72 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  re of the CREATE
5550: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
5560: 20 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69   is parsed, addi
5570: 74 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a  tional action.**
5580: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62   routines will b
5590: 65 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20  e called to add 
55a0: 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  more information
55b0: 20 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e   to this record.
55c0: 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
55d0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
55e0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  LE statement, th
55f0: 65 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  e sqlite3EndTabl
5600: 65 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  e() routine.** i
5610: 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
5620: 6c 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75  lete the constru
5630: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ction of the new
5640: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a   table record..*
5650: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  /.void sqlite3St
5660: 61 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73  artTable(.  Pars
5670: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20  e *pParse,   /* 
5680: 50 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a  Parser context *
5690: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
56a0: 31 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61  1,   /* First pa
56b0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
56c0: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
56d0: 69 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  iew */.  Token *
56e0: 70 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63  pName2,   /* Sec
56f0: 6f 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ond part of the 
5700: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5710: 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69  e or view */.  i
5720: 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
5730: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5740: 69 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20  is a TEMP table 
5750: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c  */.  int isView,
5760: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5770: 20 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20   this is a VIEW 
5780: 2a 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75  */.  int isVirtu
5790: 61 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66  al,   /* True if
57a0: 20 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55   this is a VIRTU
57b0: 41 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  AL table */.  in
57c0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f  t noErr        /
57d0: 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20  * Do nothing if 
57e0: 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78  table already ex
57f0: 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
5800: 6c 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68  le *pTable;.  ch
5810: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f  ar *zName = 0; /
5820: 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  * The name of th
5830: 65 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20  e new table */. 
5840: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
5850: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
5860: 65 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b  e *v;.  int iDb;
5870: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
5880: 62 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63  base number to c
5890: 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  reate the table 
58a0: 69 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  in */.  Token *p
58b0: 4e 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75  Name;    /* Unqu
58c0: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
58d0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65  the table to cre
58e0: 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ate */..  /* The
58f0: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 6e   table or view n
5900: 61 6d 65 20 74 6f 20 63 72 65 61 74 65 20 69 73  ame to create is
5910: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
5920: 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f 6b 65  routine via toke
5930: 6e 73 0a 20 20 2a 2a 20 70 4e 61 6d 65 31 20 61  ns.  ** pName1 a
5940: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
5950: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
5960: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
5970: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20  , for example:. 
5980: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5990: 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e  TABLE xxx.yyy (.
59a0: 2e 2e 29 3b 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ..);.  ** .  ** 
59b0: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
59c0: 65 74 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20  et to "xxx" and 
59d0: 70 4e 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e  pName2 "yyy". On
59e0: 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20   the other hand 
59f0: 69 66 0a 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  if.  ** the tabl
5a00: 65 20 6e 61 6d 65 20 69 73 20 6e 6f 74 20 66 75  e name is not fu
5a10: 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 2c 20 69  lly qualified, i
5a20: 2e 65 2e 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43  .e.:.  **.  ** C
5a30: 52 45 41 54 45 20 54 41 42 4c 45 20 79 79 79 28  REATE TABLE yyy(
5a40: 2e 2e 2e 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ...);.  **.  ** 
5a50: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
5a60: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
5a70: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 20 20  pName2 is ""..  
5a80: 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  **.  ** The call
5a90: 20 62 65 6c 6f 77 20 73 65 74 73 20 74 68 65 20   below sets the 
5aa0: 70 4e 61 6d 65 20 70 6f 69 6e 74 65 72 20 74 6f  pName pointer to
5ab0: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f   point at the to
5ac0: 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 20  ken (pName1 or. 
5ad0: 20 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74   ** pName2) that
5ae0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5af0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5b00: 6d 65 2e 20 54 68 65 20 76 61 72 69 61 62 6c 65  me. The variable
5b10: 20 69 44 62 20 69 73 0a 20 20 2a 2a 20 73 65 74   iDb is.  ** set
5b20: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
5b30: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
5b40: 61 74 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  at the table or 
5b50: 76 69 65 77 20 69 73 20 74 6f 20 62 65 0a 20 20  view is to be.  
5b60: 2a 2a 20 63 72 65 61 74 65 64 20 69 6e 2e 0a 20  ** created in.. 
5b70: 20 2a 2f 0a 20 20 69 44 62 20 3d 20 73 71 6c 69   */.  iDb = sqli
5b80: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70  te3TwoPartName(p
5b90: 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70  Parse, pName1, p
5ba0: 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a  Name2, &pName);.
5bb0: 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
5bc0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 4f 4d 49  turn;.  if( !OMI
5bd0: 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65  T_TEMPDB && isTe
5be0: 6d 70 20 26 26 20 69 44 62 3e 31 20 29 7b 0a 20  mp && iDb>1 ){. 
5bf0: 20 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e     /* If creatin
5c00: 67 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2c 20  g a temp table, 
5c10: 74 68 65 20 6e 61 6d 65 20 6d 61 79 20 6e 6f 74  the name may not
5c20: 20 62 65 20 71 75 61 6c 69 66 69 65 64 20 2a 2f   be qualified */
5c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
5c40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 65  rMsg(pParse, "te
5c50: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6e 61  mporary table na
5c60: 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71 75 61  me must be unqua
5c70: 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20 72 65  lified");.    re
5c80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
5c90: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
5ca0: 69 73 54 65 6d 70 20 29 20 69 44 62 20 3d 20 31  isTemp ) iDb = 1
5cb0: 3b 0a 0a 20 20 70 50 61 72 73 65 2d 3e 73 4e 61  ;..  pParse->sNa
5cc0: 6d 65 54 6f 6b 65 6e 20 3d 20 2a 70 4e 61 6d 65  meToken = *pName
5cd0: 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  ;.  zName = sqli
5ce0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
5cf0: 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69  (db, pName);.  i
5d00: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
5d10: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
5d20: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
5d30: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
5d40: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
5d50: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
5d60: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
5d70: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
5d80: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
5d90: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
5da0: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
5db0: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
5dc0: 28 69 73 54 65 6d 70 20 26 20 31 29 3d 3d 69 73  (isTemp & 1)==is
5dd0: 54 65 6d 70 20 29 3b 0a 20 20 7b 0a 20 20 20 20  Temp );.  {.    
5de0: 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20 63 68  int code;.    ch
5df0: 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44  ar *zDb = db->aD
5e00: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  b[iDb].zName;.  
5e10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
5e20: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
5e30: 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
5e40: 48 45 4d 41 5f 54 41 42 4c 45 28 69 73 54 65 6d  HEMA_TABLE(isTem
5e50: 70 29 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  p), 0, zDb) ){. 
5e60: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
5e70: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
5e80: 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69 65   }.    if( isVie
5e90: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  w ){.      if( !
5ea0: 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
5eb0: 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20  sTemp ){.       
5ec0: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43   code = SQLITE_C
5ed0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 3b  REATE_TEMP_VIEW;
5ee0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5ef0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5f00: 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 3b  ITE_CREATE_VIEW;
5f10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
5f20: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  se{.      if( !O
5f30: 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 73  MIT_TEMPDB && is
5f40: 54 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Temp ){.        
5f50: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5f60: 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 3b  EATE_TEMP_TABLE;
5f70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5f80: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c        code = SQL
5f90: 49 54 45 5f 43 52 45 41 54 45 5f 54 41 42 4c 45  ITE_CREATE_TABLE
5fa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
5fb0: 20 20 20 20 69 66 28 20 21 69 73 56 69 72 74 75      if( !isVirtu
5fc0: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 41 75 74  al && sqlite3Aut
5fd0: 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 63  hCheck(pParse, c
5fe0: 6f 64 65 2c 20 7a 4e 61 6d 65 2c 20 30 2c 20 7a  ode, zName, 0, z
5ff0: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
6000: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6010: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ror;.    }.  }.#
6020: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65  endif..  /* Make
6030: 20 73 75 72 65 20 74 68 65 20 6e 65 77 20 74 61   sure the new ta
6040: 62 6c 65 20 6e 61 6d 65 20 64 6f 65 73 20 6e 6f  ble name does no
6050: 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20 61  t collide with a
6060: 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
6070: 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 6e  index or table n
6080: 61 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ame in the same 
6090: 64 61 74 61 62 61 73 65 2e 20 20 49 73 73 75 65  database.  Issue
60a0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
60b0: 65 20 69 66 0a 20 20 2a 2a 20 69 74 20 64 6f 65  e if.  ** it doe
60c0: 73 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  s. The exception
60d0: 20 69 73 20 69 66 20 74 68 65 20 73 74 61 74 65   is if the state
60e0: 6d 65 6e 74 20 62 65 69 6e 67 20 70 61 72 73 65  ment being parse
60f0: 64 20 77 61 73 20 70 61 73 73 65 64 0a 20 20 2a  d was passed.  *
6100: 2a 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  * to an sqlite3_
6110: 64 65 63 6c 61 72 65 5f 76 74 61 62 28 29 20 63  declare_vtab() c
6120: 61 6c 6c 2e 20 49 6e 20 74 68 61 74 20 63 61 73  all. In that cas
6130: 65 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d  e only the colum
6140: 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a 20 61 6e 64  n names.  ** and
6150: 20 74 79 70 65 73 20 77 69 6c 6c 20 62 65 20 75   types will be u
6160: 73 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73  sed, so there is
6170: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 74 65 73 74   no need to test
6180: 20 66 6f 72 20 6e 61 6d 65 73 70 61 63 65 0a 20   for namespace. 
6190: 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a   ** collisions..
61a0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 49 4e 5f 44    */.  if( !IN_D
61b0: 45 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20  ECLARE_VTAB ){. 
61c0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
61d0: 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
61e0: 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
61f0: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
6200: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
6210: 20 7d 0a 20 20 20 20 70 54 61 62 6c 65 20 3d 20   }.    pTable = 
6220: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
6230: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 64 62 2d 3e  (db, zName, db->
6240: 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 3b  aDb[iDb].zName);
6250: 0a 20 20 20 20 69 66 28 20 70 54 61 62 6c 65 20  .    if( pTable 
6260: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 6e 6f  ){.      if( !no
6270: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Err ){.        s
6280: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6290: 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20 25 54  Parse, "table %T
62a0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 22   already exists"
62b0: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , pName);.      
62c0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  }.      goto beg
62d0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
62e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
62f0: 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
6300: 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
6310: 26 26 20 28 69 44 62 3d 3d 30 20 7c 7c 20 21 64  && (iDb==0 || !d
6320: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 29 20 29 7b  b->init.busy) ){
6330: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6340: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6350: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
6360: 20 61 6e 20 69 6e 64 65 78 20 6e 61 6d 65 64 20   an index named 
6370: 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
6380: 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61     goto begin_ta
6390: 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d  ble_error;.    }
63a0: 0a 20 20 7d 0a 0a 20 20 70 54 61 62 6c 65 20 3d  .  }..  pTable =
63b0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
63c0: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
63d0: 54 61 62 6c 65 29 29 3b 0a 20 20 69 66 28 20 70  Table));.  if( p
63e0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
63f0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6400: 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 72 73 65   = 1;.    pParse
6410: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
6420: 4d 45 4d 3b 0a 20 20 20 20 70 50 61 72 73 65 2d  MEM;.    pParse-
6430: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 67 6f 74  >nErr++;.    got
6440: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6450: 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 54 61 62 6c  ror;.  }.  pTabl
6460: 65 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  e->zName = zName
6470: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 69 50 4b 65  ;.  pTable->iPKe
6480: 79 20 3d 20 2d 31 3b 0a 20 20 70 54 61 62 6c 65  y = -1;.  pTable
6490: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e  ->pSchema = db->
64a0: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
64b0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66  ;.  pTable->nRef
64c0: 20 3d 20 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e   = 1;.  pTable->
64d0: 64 62 4d 65 6d 20 3d 20 64 62 2d 3e 6c 6f 6f 6b  dbMem = db->look
64e0: 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3f  aside.bEnabled ?
64f0: 20 64 62 20 3a 20 30 3b 0a 20 20 69 66 28 20 70   db : 0;.  if( p
6500: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
6510: 20 29 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65   ) sqlite3Delete
6520: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 70 4e  Table(pParse->pN
6530: 65 77 54 61 62 6c 65 29 3b 0a 20 20 70 50 61 72  ewTable);.  pPar
6540: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20  se->pNewTable = 
6550: 70 54 61 62 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66  pTable;..  /* If
6560: 20 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 67   this is the mag
6570: 69 63 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  ic sqlite_sequen
6580: 63 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  ce table used by
6590: 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a   autoincrement,.
65a0: 20 20 2a 2a 20 74 68 65 6e 20 72 65 63 6f 72 64    ** then record
65b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
65c0: 69 73 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  is table in the 
65d0: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
65e0: 72 75 63 74 75 72 65 0a 20 20 2a 2a 20 73 6f 20  ructure.  ** so 
65f0: 74 68 61 74 20 49 4e 53 45 52 54 20 63 61 6e 20  that INSERT can 
6600: 66 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 65  find the table e
6610: 61 73 69 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e  asily..  */.#ifn
6620: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6630: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20  AUTOINCREMENT.  
6640: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 65 73  if( !pParse->nes
6650: 74 65 64 20 26 26 20 73 74 72 63 6d 70 28 7a 4e  ted && strcmp(zN
6660: 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71  ame, "sqlite_seq
6670: 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  uence")==0 ){.  
6680: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
6690: 61 2d 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61  a->pSeqTab = pTa
66a0: 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ble;.  }.#endif.
66b0: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65  .  /* Begin gene
66c0: 72 61 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20  rating the code 
66d0: 74 68 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74  that will insert
66e0: 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72   the table recor
66f0: 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  d into.  ** the 
6700: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
6710: 62 6c 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61  ble.  Note in pa
6720: 72 74 69 63 75 6c 61 72 20 74 68 61 74 20 77 65  rticular that we
6730: 20 6d 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20   must go ahead. 
6740: 20 2a 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65   ** and allocate
6750: 20 74 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   the record numb
6760: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
6770: 20 65 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66   entry now.  Bef
6780: 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49  ore any.  ** PRI
6790: 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
67a0: 55 45 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20  UE keywords are 
67b0: 70 61 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b  parsed.  Those k
67c0: 65 79 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75  eywords will cau
67d0: 73 65 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20  se.  ** indices 
67e0: 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 61 6e  to be created an
67f0: 64 20 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f  d the table reco
6800: 72 64 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66  rd must come bef
6810: 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e  ore the .  ** in
6820: 64 69 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74  dices.  Hence, t
6830: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
6840: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d   for the table m
6850: 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
6860: 0a 20 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a  .  ** now..  */.
6870: 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
6880: 62 75 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c  busy && (v = sql
6890: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
68a0: 73 65 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  se))!=0 ){.    i
68b0: 6e 74 20 6a 31 3b 0a 20 20 20 20 69 6e 74 20 66  nt j1;.    int f
68c0: 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69  ileFormat;.    i
68d0: 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72  nt reg1, reg2, r
68e0: 65 67 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eg3;.    sqlite3
68f0: 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
6900: 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69  ion(pParse, 0, i
6910: 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Db);..#ifndef SQ
6920: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6930: 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69  LTABLE.    if( i
6940: 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20  sVirtual ){.    
6950: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6960: 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op0(v, OP_VBegin
6970: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
6980: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
6990: 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65  ile format and e
69a0: 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64  ncoding in the d
69b0: 61 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74  atabase have not
69c0: 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20   been set, .    
69d0: 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e  ** set them now.
69e0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31  .    */.    reg1
69f0: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
6a00: 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  wid = ++pParse->
6a10: 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d  nMem;.    reg2 =
6a20: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
6a30: 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
6a40: 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b  m;.    reg3 = ++
6a50: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
6a60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6a70: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f  Op3(v, OP_ReadCo
6a80: 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c  okie, iDb, reg3,
6a90: 20 31 29 3b 20 20 20 2f 2a 20 66 69 6c 65 5f 66   1);   /* file_f
6aa0: 6f 72 6d 61 74 20 2a 2f 0a 20 20 20 20 73 71 6c  ormat */.    sql
6ab0: 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65  ite3VdbeUsesBtre
6ac0: 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 6a  e(v, iDb);.    j
6ad0: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
6ae0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20  ddOp1(v, OP_If, 
6af0: 72 65 67 33 29 3b 0a 20 20 20 20 66 69 6c 65 46  reg3);.    fileF
6b00: 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61  ormat = (db->fla
6b10: 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61  gs & SQLITE_Lega
6b20: 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a  cyFileFmt)!=0 ?.
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58    1 : SQLITE_MAX
6b50: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20  _FILE_FORMAT;.  
6b60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6b70: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
6b80: 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72  r, fileFormat, r
6b90: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6ba0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6bb0: 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62  P_SetCookie, iDb
6bc0: 2c 20 31 2c 20 72 65 67 33 29 3b 0a 20 20 20 20  , 1, reg3);.    
6bd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6be0: 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
6bf0: 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b   ENC(db), reg3);
6c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6c10: 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74  AddOp3(v, OP_Set
6c20: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 34 2c 20  Cookie, iDb, 4, 
6c30: 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg3);.    sqlit
6c40: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
6c50: 2c 20 6a 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  , j1);..    /* T
6c60: 68 69 73 20 6a 75 73 74 20 63 72 65 61 74 65 73  his just creates
6c70: 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65 72 20   a place-holder 
6c80: 72 65 63 6f 72 64 20 69 6e 20 74 68 65 20 73 71  record in the sq
6c90: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
6ca0: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  e..    ** The re
6cb0: 63 6f 72 64 20 63 72 65 61 74 65 64 20 64 6f 65  cord created doe
6cc0: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 6e  s not contain an
6cd0: 79 74 68 69 6e 67 20 79 65 74 2e 20 20 49 74 20  ything yet.  It 
6ce0: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
6cf0: 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 72  .    ** by the r
6d00: 65 61 6c 20 65 6e 74 72 79 20 69 6e 20 63 6f 64  eal entry in cod
6d10: 65 20 67 65 6e 65 72 61 74 65 64 20 61 74 20 73  e generated at s
6d20: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29  qlite3EndTable()
6d30: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
6d40: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68  The rowid for th
6d50: 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 6c  e new entry is l
6d60: 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
6d70: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
6d80: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 6f  ..    ** The roo
6d90: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
6da0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 69   the new table i
6db0: 73 20 6c 65 66 74 20 69 6e 20 72 65 67 20 70 50  s left in reg pP
6dc0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
6dd0: 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20     ** The rowid 
6de0: 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  and root page nu
6df0: 6d 62 65 72 20 76 61 6c 75 65 73 20 61 72 65 20  mber values are 
6e00: 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f  needed by the co
6e10: 64 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 73  de that.    ** s
6e20: 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 20 77  qlite3EndTable w
6e30: 69 6c 6c 20 67 65 6e 65 72 61 74 65 2e 0a 20 20  ill generate..  
6e40: 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65    */.#if !define
6e50: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
6e60: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
6e70: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6e80: 55 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66  UALTABLE).    if
6e90: 28 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69  ( isView || isVi
6ea0: 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73  rtual ){.      s
6eb0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
6ec0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
6ed0: 30 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65  0, reg2);.    }e
6ee0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
6ef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
6f00: 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43  beAddOp2(v, OP_C
6f10: 72 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c  reateTable, iDb,
6f20: 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20   reg2);.    }.  
6f30: 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73    sqlite3OpenMas
6f40: 74 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c  terTable(pParse,
6f50: 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
6f60: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6f70: 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20  OP_NewRowid, 0, 
6f80: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
6f90: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
6fa0: 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33  OP_Null, 0, reg3
6fb0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
6fc0: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
6fd0: 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20  nsert, 0, reg3, 
6fe0: 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  reg1);.    sqlit
6ff0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
7000: 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29  , OPFLAG_APPEND)
7010: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7020: 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c  eAddOp0(v, OP_Cl
7030: 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ose);.  }..  /* 
7040: 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f  Normal (non-erro
7050: 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20  r) return. */.  
7060: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66  return;..  /* If
7070: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7080: 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a  , we jump here *
7090: 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  /.begin_table_er
70a0: 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  ror:.  sqlite3Db
70b0: 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b  Free(db, zName);
70c0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
70d0: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69  .** This macro i
70e0: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  s used to compar
70f0: 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e  e two strings in
7100: 20 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74   a case-insensit
7110: 69 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49  ive manner..** I
7120: 74 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  t is slightly fa
7130: 73 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e  ster than callin
7140: 67 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  g sqlite3StrICmp
7150: 28 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74  () directly, but
7160: 0a 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72  .** produces lar
7170: 67 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ger code..**.** 
7180: 57 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61  WARNING: This ma
7190: 63 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61  cro is not compa
71a0: 74 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73  tible with the s
71b0: 74 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20  trcmp() family. 
71c0: 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72  It.** returns tr
71d0: 75 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74  ue if the two st
71e0: 72 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c  rings are equal,
71f0: 20 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65   otherwise false
7200: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52  ..*/.#define STR
7210: 49 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71  ICMP(x, y) (\.sq
7220: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7230: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
7240: 72 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73  r *)(x)]==   \.s
7250: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7260: 65 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68  er[*(unsigned ch
7270: 61 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a  ar *)(y)]     \.
7280: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
7290: 70 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d  p((x)+1,(y)+1)==
72a0: 30 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  0 )../*.** Add a
72b0: 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74   new column to t
72c0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
72d0: 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
72e0: 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cted..**.** The 
72f0: 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69  parser calls thi
7300: 73 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66  s routine once f
7310: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64  or each column d
7320: 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e  eclaration.** in
7330: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
7340: 73 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69  statement.  sqli
7350: 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20  te3StartTable() 
7360: 67 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66  gets called.** f
7370: 69 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e  irst to get thin
7380: 67 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20  gs going.  Then 
7390: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
73a0: 63 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a  called for each.
73b0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f  ** column..*/.vo
73c0: 69 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c  id sqlite3AddCol
73d0: 75 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  umn(Parse *pPars
73e0: 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  e, Token *pName)
73f0: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
7400: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
7410: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
7420: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
7430: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
7440: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
7450: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
7460: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c   return;.#if SQL
7470: 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20  ITE_MAX_COLUMN. 
7480: 20 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64   if( p->nCol+1>d
7490: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
74a0: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29  _LIMIT_COLUMN] )
74b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
74c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
74d0: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
74e0: 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65  on %s", p->zName
74f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
7500: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20   }.#endif.  z = 
7510: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
7520: 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b  oken(db, pName);
7530: 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
7540: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
7550: 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29   i<p->nCol; i++)
7560: 7b 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d  {.    if( STRICM
7570: 50 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e  P(z, p->aCol[i].
7580: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
7590: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
75a0: 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
75b0: 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  te column name: 
75c0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73  %s", z);.      s
75d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
75e0: 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   z);.      retur
75f0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  n;.    }.  }.  i
7600: 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78  f( (p->nCol & 0x
7610: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c  7)==0 ){.    Col
7620: 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61  umn *aNew;.    a
7630: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
7640: 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f  ealloc(db,p->aCo
7650: 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69  l,(p->nCol+8)*si
7660: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
7670: 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d  );.    if( aNew=
7680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
7690: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29  te3DbFree(db, z)
76a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
76b0: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f      }.    p->aCo
76c0: 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20  l = aNew;.  }.  
76d0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
76e0: 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73  p->nCol];.  mems
76f0: 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65  et(pCol, 0, size
7700: 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b  of(p->aCol[0]));
7710: 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d  .  pCol->zName =
7720: 20 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68   z;. .  /* If th
7730: 65 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73  ere is no type s
7740: 70 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e  pecified, column
7750: 73 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75  s have the defau
7760: 6c 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a  lt affinity.  **
7770: 20 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72   'NONE'. If ther
7780: 65 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63  e is a type spec
7790: 69 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69  ified, then sqli
77a0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
77b0: 28 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  () will.  ** be 
77c0: 63 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73  called next to s
77d0: 65 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  et pCol->affinit
77e0: 79 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a  y correctly..  *
77f0: 2f 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  /.  pCol->affini
7800: 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ty = SQLITE_AFF_
7810: 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b  NONE;.  p->nCol+
7820: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
7830: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
7840: 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
7850: 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69   while in the mi
7860: 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69  ddle of.** parsi
7870: 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ng a CREATE TABL
7880: 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20  E statement.  A 
7890: 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
78a0: 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65  raint has.** bee
78b0: 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75  n seen on a colu
78c0: 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  mn.  This routin
78d0: 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75  e sets the notNu
78e0: 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68  ll flag on.** th
78f0: 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  e column current
7900: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
7910: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
7920: 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c  qlite3AddNotNull
7930: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7940: 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20  int onError){.  
7950: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
7960: 69 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  i;.  if( (p = pP
7970: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
7980: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
7990: 69 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20  i = p->nCol-1;. 
79a0: 20 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61   if( i>=0 ) p->a
79b0: 43 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d  Col[i].notNull =
79c0: 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a   (u8)onError;.}.
79d0: 0a 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20  ./*.** Scan the 
79e0: 63 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65  column type name
79f0: 20 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e   zType (length n
7a00: 54 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e  Type) and return
7a10: 20 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74   the.** associat
7a20: 65 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  ed affinity type
7a30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7a40: 74 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65  tine does a case
7a50: 2d 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61  -independent sea
7a60: 72 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72  rch of zType for
7a70: 20 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69   the .** substri
7a80: 6e 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ngs in the follo
7a90: 77 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f  wing table. If o
7aa0: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
7ab0: 69 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64  ings is.** found
7ac0: 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
7ad0: 69 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20  ing affinity is 
7ae0: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79  returned. If zTy
7af0: 70 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d  pe contains.** m
7b00: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20  ore than one of 
7b10: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20  the substrings, 
7b20: 65 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74  entries toward t
7b30: 68 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68  he top of .** th
7b40: 65 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69  e table take pri
7b50: 6f 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70  ority. For examp
7b60: 6c 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20  le, if zType is 
7b70: 27 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53  'BLOBINT', .** S
7b80: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7b90: 52 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  R is returned..*
7ba0: 2a 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20  *.** Substring  
7bb0: 20 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a     | Affinity.**
7bc0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7be0: 2d 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20  -.** 'INT'      
7bf0: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7c00: 49 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52  INTEGER.** 'CHAR
7c10: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7c20: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43  E_AFF_TEXT.** 'C
7c30: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7c40: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a  LITE_AFF_TEXT.**
7c50: 20 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c   'TEXT'        |
7c60: 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54   SQLITE_AFF_TEXT
7c70: 0a 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20  .** 'BLOB'      
7c80: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e    | SQLITE_AFF_N
7c90: 4f 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20  ONE.** 'REAL'   
7ca0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7cb0: 46 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27  F_REAL.** 'FLOA'
7cc0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7cd0: 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f  _AFF_REAL.** 'DO
7ce0: 55 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  UB'        | SQL
7cf0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a  ITE_AFF_REAL.**.
7d00: 2a 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68  ** If none of th
7d10: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20  e substrings in 
7d20: 74 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20  the above table 
7d30: 61 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51  are found,.** SQ
7d40: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
7d50: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
7d60: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66  .char sqlite3Aff
7d70: 69 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20  inityType(const 
7d80: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
7d90: 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68   u32 h = 0;.  ch
7da0: 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f  ar aff = SQLITE_
7db0: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63  AFF_NUMERIC;.  c
7dc0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
7dd0: 61 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d  ar *zIn = pType-
7de0: 3e 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  >z;.  const unsi
7df0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20  gned char *zEnd 
7e00: 3d 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70  = &pType->z[pTyp
7e10: 65 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  e->n];..  while(
7e20: 20 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20   zIn!=zEnd ){.  
7e30: 20 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73    h = (h<<8) + s
7e40: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
7e50: 65 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49  er[*zIn];.    zI
7e60: 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d  n++;.    if( h==
7e70: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c  (('c'<<24)+('h'<
7e80: 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72  <16)+('a'<<8)+'r
7e90: 27 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  ') ){           
7ea0: 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20    /* CHAR */.   
7eb0: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7ec0: 41 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d  AFF_TEXT; .    }
7ed0: 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63  else if( h==(('c
7ee0: 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29  '<<24)+('l'<<16)
7ef0: 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29  +('o'<<8)+'b') )
7f00: 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20  {       /* CLOB 
7f10: 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53  */.      aff = S
7f20: 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a  QLITE_AFF_TEXT;.
7f30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d      }else if( h=
7f40: 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27  =(('t'<<24)+('e'
7f50: 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27  <<16)+('x'<<8)+'
7f60: 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20  t') ){       /* 
7f70: 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66  TEXT */.      af
7f80: 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  f = SQLITE_AFF_T
7f90: 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  EXT;.    }else i
7fa0: 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29  f( h==(('b'<<24)
7fb0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7fc0: 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20  <8)+'b')        
7fd0: 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20    /* BLOB */.   
7fe0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
7ff0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
8000: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
8010: 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20  AFF_REAL) ){.   
8020: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8030: 41 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65  AFF_NONE;.#ifnde
8040: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
8050: 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20  OATING_POINT.   
8060: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8070: 27 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31  'r'<<24)+('e'<<1
8080: 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29  6)+('a'<<8)+'l')
8090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41            /* REA
80a0: 4c 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  L */.        && 
80b0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
80c0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
80d0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
80e0: 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73  F_REAL;.    }els
80f0: 65 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c  e if( h==(('f'<<
8100: 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27  24)+('l'<<16)+('
8110: 6f 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20  o'<<8)+'a')     
8120: 20 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a       /* FLOA */.
8130: 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d          && aff==
8140: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
8150: 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20  IC ){.      aff 
8160: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  = SQLITE_AFF_REA
8170: 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  L;.    }else if(
8180: 20 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28   h==(('d'<<24)+(
8190: 27 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38  'o'<<16)+('u'<<8
81a0: 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20  )+'b')          
81b0: 2f 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20  /* DOUB */.     
81c0: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
81d0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
81e0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
81f0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65  ITE_AFF_REAL;.#e
8200: 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
8210: 66 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46  f( (h&0x00FFFFFF
8220: 29 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27  )==(('i'<<16)+('
8230: 6e 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20  n'<<8)+'t') ){  
8240: 20 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20    /* INT */.    
8250: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8260: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
8270: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8280: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66   }..  return aff
8290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
82a0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
82b0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
82c0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
82d0: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
82e0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
82f0: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65   statement.  The
8300: 20 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73   pFirst token is
8310: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f   the first.** to
8320: 6b 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65  ken in the seque
8330: 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68  nce of tokens th
8340: 61 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20  at describe the 
8350: 74 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  type of the.** c
8360: 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20  olumn currently 
8370: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
8380: 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74  on.   pLast is t
8390: 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a  he last token.**
83a0: 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65   in the sequence
83b0: 2e 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f  .  Use this info
83c0: 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74  rmation to const
83d0: 72 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a  ruct a string.**
83e0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
83f0: 68 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74  he typename of t
8400: 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74  he column and st
8410: 6f 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a  ore that string.
8420: 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20  ** in zType..*/ 
8430: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
8440: 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65  ColumnType(Parse
8450: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8460: 2a 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65  *pType){.  Table
8470: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
8480: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20  Column *pCol;.  
8490: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
84a0: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
84b0: 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29  >pNewTable)==0 )
84c0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70   return;.  i = p
84d0: 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20  ->nCol-1;.  if( 
84e0: 69 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  i<0 ) return;.  
84f0: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
8500: 69 5d 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  i];.  db = pPars
8510: 65 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33  e->db;.  sqlite3
8520: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
8530: 3e 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d  >zType);.  pCol-
8540: 3e 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33  >zType = sqlite3
8550: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
8560: 2c 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c  , pType);.  pCol
8570: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c  ->affinity = sql
8580: 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65  ite3AffinityType
8590: 28 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pType);.}../*.*
85a0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
85b0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
85c0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
85d0: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
85e0: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
85f0: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
8600: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
8610: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
8620: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
8630: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
8640: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
8650: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
8660: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
8670: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
8680: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
8690: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
86a0: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
86b0: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
86c0: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
86d0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
86e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
86f0: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
8700: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
8710: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61  pr *pExpr){.  Ta
8720: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
8730: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
8740: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
8750: 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70  db;.  if( (p = p
8760: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
8770: 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c  )!=0 ){.    pCol
8780: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e   = &(p->aCol[p->
8790: 6e 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66  nCol-1]);.    if
87a0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
87b0: 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69  ConstantOrFuncti
87c0: 6f 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  on(pExpr) ){.   
87d0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
87e0: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
87f0: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
8800: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
8810: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
8820: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
8830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
8840: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
8850: 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69   pExpr is used i
8860: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72  nstead of the or
8870: 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72  iginal, as pExpr
8880: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
8890: 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70  ** tokens that p
88a0: 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65  oint to volatile
88b0: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70   memory. The 'sp
88c0: 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65  an' of the expre
88d0: 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ssion.      ** i
88e0: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72  s required by pr
88f0: 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e  agma table_info.
8900: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8910: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
8920: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
8930: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
8940: 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  pDflt = sqlite3E
8950: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
8960: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
8970: 7c 45 58 50 52 44 55 50 5f 53 50 41 4e 29 3b 0a  |EXPRDUP_SPAN);.
8980: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
8990: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
89a0: 2c 20 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pExpr);.}../*.
89b0: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
89c0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
89d0: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
89e0: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
89f0: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
8a00: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
8a10: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
8a20: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
8a30: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
8a40: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
8a50: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
8a60: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
8a70: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
8a80: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
8a90: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
8aa0: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
8ab0: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
8ac0: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
8ad0: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
8ae0: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
8af0: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
8b00: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
8b10: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
8b20: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
8b30: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
8b40: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
8b50: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
8b60: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
8b70: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
8b80: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
8b90: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
8ba0: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
8bb0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
8bc0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
8bd0: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
8be0: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
8bf0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
8c00: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
8c10: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
8c20: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
8c30: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
8c40: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
8c50: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
8c60: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
8c70: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
8c80: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
8c90: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
8ca0: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
8cb0: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
8cc0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
8cd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8ce0: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
8cf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8d00: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
8d10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
8d20: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
8d30: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
8d40: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
8d50: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
8d60: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
8d70: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
8d80: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
8d90: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
8da0: 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc,      /* Tru
8db0: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
8dc0: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
8dd0: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
8de0: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20  nt sortOrder    
8df0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   /* SQLITE_SO_AS
8e00: 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44  C or SQLITE_SO_D
8e10: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ESC */.){.  Tabl
8e20: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
8e30: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
8e40: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
8e50: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
8e60: 20 69 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d   i;.  if( pTab==
8e70: 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
8e80: 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d  VTAB ) goto prim
8e90: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
8ea0: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
8eb0: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
8ec0: 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  ryKey ){.    sql
8ed0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8ee0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
8ef0: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
8f00: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
8f10: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
8f20: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
8f30: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
8f40: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74  t;.  }.  pTab->t
8f50: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61  abFlags |= TF_Ha
8f60: 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69  sPrimaryKey;.  i
8f70: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
8f80: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
8f90: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
8fa0: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69  ab->aCol[iCol].i
8fb0: 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a 20 20  sPrimKey = 1;.  
8fc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69  }else{.    for(i
8fd0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
8fe0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
8ff0: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
9000: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
9010: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l++){.        if
9020: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
9030: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
9040: 6d 65 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  me, pTab->aCol[i
9050: 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  Col].zName)==0 )
9060: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  {.          brea
9070: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
9080: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
9090: 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29  Col<pTab->nCol )
90a0: 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  {.        pTab->
90b0: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69  aCol[iCol].isPri
90c0: 6d 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  mKey = 1;.      
90d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
90e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 31 20 29  pList->nExpr>1 )
90f0: 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 7d 0a   iCol = -1;.  }.
9100: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 26 26    if( iCol>=0 &&
9110: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
9120: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
9130: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
9140: 2e 7a 54 79 70 65 3b 0a 20 20 7d 0a 20 20 69 66  .zType;.  }.  if
9150: 28 20 7a 54 79 70 65 20 26 26 20 73 71 6c 69 74  ( zType && sqlit
9160: 65 33 53 74 72 49 43 6d 70 28 7a 54 79 70 65 2c  e3StrICmp(zType,
9170: 20 22 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20   "INTEGER")==0. 
9180: 20 20 20 20 20 20 20 26 26 20 73 6f 72 74 4f 72         && sortOr
9190: 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  der==SQLITE_SO_A
91a0: 53 43 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  SC ){.    pTab->
91b0: 69 50 4b 65 79 20 3d 20 69 43 6f 6c 3b 0a 20 20  iPKey = iCol;.  
91c0: 20 20 70 54 61 62 2d 3e 6b 65 79 43 6f 6e 66 20    pTab->keyConf 
91d0: 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
91e0: 20 20 20 61 73 73 65 72 74 28 20 61 75 74 6f 49     assert( autoI
91f0: 6e 63 3d 3d 30 20 7c 7c 20 61 75 74 6f 49 6e 63  nc==0 || autoInc
9200: 3d 3d 31 20 29 3b 0a 20 20 20 20 70 54 61 62 2d  ==1 );.    pTab-
9210: 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 61 75 74  >tabFlags |= aut
9220: 6f 49 6e 63 2a 54 46 5f 41 75 74 6f 69 6e 63 72  oInc*TF_Autoincr
9230: 65 6d 65 6e 74 3b 0a 20 20 7d 65 6c 73 65 20 69  ement;.  }else i
9240: 66 28 20 61 75 74 6f 49 6e 63 20 29 7b 0a 23 69  f( autoInc ){.#i
9250: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9260: 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
9270: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9280: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 41 55 54  Msg(pParse, "AUT
9290: 4f 49 4e 43 52 45 4d 45 4e 54 20 69 73 20 6f 6e  OINCREMENT is on
92a0: 6c 79 20 61 6c 6c 6f 77 65 64 20 6f 6e 20 61 6e  ly allowed on an
92b0: 20 22 0a 20 20 20 20 20 20 20 22 49 4e 54 45 47   ".       "INTEG
92c0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 22 29  ER PRIMARY KEY")
92d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
92e0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 72 65  {.    sqlite3Cre
92f0: 61 74 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ateIndex(pParse,
9300: 20 30 2c 20 30 2c 20 30 2c 20 70 4c 69 73 74 2c   0, 0, 0, pList,
9310: 20 6f 6e 45 72 72 6f 72 2c 20 30 2c 20 30 2c 20   onError, 0, 0, 
9320: 73 6f 72 74 4f 72 64 65 72 2c 20 30 29 3b 0a 20  sortOrder, 0);. 
9330: 20 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20     pList = 0;.  
9340: 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65  }..primary_key_e
9350: 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 45 78  xit:.  sqlite3Ex
9360: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 50 61  prListDelete(pPa
9370: 72 73 65 2d 3e 64 62 2c 20 70 4c 69 73 74 29 3b  rse->db, pList);
9380: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
9390: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 43 48  .** Add a new CH
93a0: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ECK constraint t
93b0: 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  o the table curr
93c0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
93d0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
93e0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 68 65 63  d sqlite3AddChec
93f0: 6b 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20 20 50  kConstraint(.  P
9400: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
9410: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
9420: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
9430: 43 68 65 63 6b 45 78 70 72 20 20 2f 2a 20 54 68  CheckExpr  /* Th
9440: 65 20 63 68 65 63 6b 20 65 78 70 72 65 73 73 69  e check expressi
9450: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  on */.){.  sqlit
9460: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9470: 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  >db;.#ifndef SQL
9480: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20  ITE_OMIT_CHECK. 
9490: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
94a0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
94b0: 3b 0a 20 20 69 66 28 20 70 54 61 62 20 26 26 20  ;.  if( pTab && 
94c0: 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42  !IN_DECLARE_VTAB
94d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 43   ){.    /* The C
94e0: 48 45 43 4b 20 65 78 70 72 65 73 73 69 6f 6e 20  HECK expression 
94f0: 6d 75 73 74 20 62 65 20 64 75 70 6c 69 63 61 74  must be duplicat
9500: 65 64 20 73 6f 20 74 68 61 74 20 74 6f 6b 65 6e  ed so that token
9510: 73 20 72 65 66 65 72 0a 20 20 20 20 2a 2a 20 74  s refer.    ** t
9520: 6f 20 6d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65  o malloced space
9530: 20 61 6e 64 20 6e 6f 74 20 74 68 65 20 28 65 70   and not the (ep
9540: 68 65 6d 65 72 61 6c 29 20 74 65 78 74 20 6f 66  hemeral) text of
9550: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
9560: 45 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65  E.    ** stateme
9570: 6e 74 20 2a 2f 0a 20 20 20 20 70 54 61 62 2d 3e  nt */.    pTab->
9580: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
9590: 45 78 70 72 41 6e 64 28 64 62 2c 20 70 54 61 62  ExprAnd(db, pTab
95a0: 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
95d0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
95e0: 70 43 68 65 63 6b 45 78 70 72 2c 20 30 29 29 3b  pCheckExpr, 0));
95f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
9600: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9610: 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b  db, pCheckExpr);
9620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
9630: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63  e collation func
9640: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
9650: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
9660: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a   table column.**
9670: 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20   to the CollSeq 
9680: 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  given..*/.void s
9690: 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65  qlite3AddCollate
96a0: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
96b0: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  se, Token *pToke
96c0: 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  n){.  Table *p;.
96d0: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
96e0: 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20  *zColl;         
96f0: 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64       /* Dequoted
9700: 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   name of collati
9710: 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20  on sequence */. 
9720: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
9730: 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65   if( (p = pParse
9740: 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
9750: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20  ) return;.  i = 
9760: 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20  p->nCol-1;.  db 
9770: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
9780: 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e  zColl = sqlite3N
9790: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
97a0: 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20   pToken);.  if( 
97b0: 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
97c0: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c  ..  if( sqlite3L
97d0: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
97e0: 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20  rse, zColl, -1) 
97f0: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
9800: 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43 6f 6c 5b  dx;.    p->aCol[
9810: 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43 6f 6c 6c  i].zColl = zColl
9820: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  ;.  .    /* If t
9830: 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 64 65 63  he column is dec
9840: 6c 61 72 65 64 20 61 73 20 22 3c 6e 61 6d 65 3e  lared as "<name>
9850: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 43 4f 4c   PRIMARY KEY COL
9860: 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c 0a 20 20  LATE <type>",.  
9870: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20 69 6e 64    ** then an ind
9880: 65 78 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  ex may have been
9890: 20 63 72 65 61 74 65 64 20 6f 6e 20 74 68 69 73   created on this
98a0: 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72 65 20 74   column before t
98b0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c 6c 61 74  he.    ** collat
98c0: 69 6f 6e 20 74 79 70 65 20 77 61 73 20 61 64 64  ion type was add
98d0: 65 64 2e 20 43 6f 72 72 65 63 74 20 74 68 69 73  ed. Correct this
98e0: 20 69 66 20 69 74 20 69 73 20 74 68 65 20 63 61   if it is the ca
98f0: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  se..    */.    f
9900: 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65  or(pIdx=p->pInde
9910: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
9920: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
9930: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
9940: 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b 0a 20 20  nColumn==1 );.  
9950: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 69      if( pIdx->ai
9960: 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20 29 7b 0a  Column[0]==i ){.
9970: 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
9980: 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e 61 43 6f  Coll[0] = p->aCo
9990: 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  l[i].zColl;.    
99a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
99b0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  e{.    sqlite3Db
99c0: 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b  Free(db, zColl);
99d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
99e0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
99f0: 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  rns the collatio
9a00: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 64  n sequence for d
9a10: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 74  atabase native t
9a20: 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69 6e 67 20  ext.** encoding 
9a30: 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74 68  identified by th
9a40: 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 2c 20  e string zName, 
9a50: 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e 0a 2a 2a  length nName..**
9a60: 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 71 75 65  .** If the reque
9a70: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  sted collation s
9a80: 65 71 75 65 6e 63 65 20 69 73 20 6e 6f 74 20 61  equence is not a
9a90: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 6e 6f 74  vailable, or not
9aa0: 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 69 6e   available.** in
9ab0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
9ac0: 74 69 76 65 20 65 6e 63 6f 64 69 6e 67 2c 20 74  tive encoding, t
9ad0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9ae0: 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b 65 64 20  tory is invoked 
9af0: 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74 20 69 74  to.** request it
9b00: 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  . If the collati
9b10: 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f 65 73 20  on factory does 
9b20: 6e 6f 74 20 73 75 70 70 6c 79 20 73 75 63 68 20  not supply such 
9b30: 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a 2a 20 61  a sequence,.** a
9b40: 6e 64 20 74 68 65 20 73 65 71 75 65 6e 63 65 20  nd the sequence 
9b50: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
9b60: 61 6e 6f 74 68 65 72 20 74 65 78 74 20 65 6e 63  another text enc
9b70: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74 68 61 74  oding, then that
9b80: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
9b90: 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
9ba0: 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66  f no versions of
9bb0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9bc0: 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71 75 65 6e  ollations sequen
9bd0: 63 65 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ce are available
9be0: 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  , or.** another 
9bf0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
9c00: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  LL is returned a
9c10: 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
9c20: 61 67 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  age written into
9c30: 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2a 0a 2a  .** pParse..**.*
9c40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9c50: 73 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75  s a wrapper arou
9c60: 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f  nd sqlite3FindCo
9c70: 6c 6c 53 65 71 28 29 2e 20 20 54 68 69 73 20 72  llSeq().  This r
9c80: 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76 6f 6b 65  outine.** invoke
9c90: 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
9ca0: 66 61 63 74 6f 72 79 20 69 66 20 74 68 65 20 6e  factory if the n
9cb0: 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 63  amed collation c
9cc0: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 0a 2a  annot be found.*
9cd0: 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 20  * and generates 
9ce0: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
9cf0: 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ..*/.CollSeq *sq
9d00: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
9d10: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
9d20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
9d30: 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d 65 29 7b  ame, int nName){
9d40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
9d50: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 75   pParse->db;.  u
9d60: 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b  8 enc = ENC(db);
9d70: 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79 20 3d  .  u8 initbusy =
9d80: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3b 0a   db->init.busy;.
9d90: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9da0: 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  ;..  pColl = sql
9db0: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9dc0: 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65 2c 20  db, enc, zName, 
9dd0: 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29  nName, initbusy)
9de0: 3b 0a 20 20 69 66 28 20 21 69 6e 69 74 62 75 73  ;.  if( !initbus
9df0: 79 20 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20  y && (!pColl || 
9e00: 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b  !pColl->xCmp) ){
9e10: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
9e20: 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64  ite3GetCollSeq(d
9e30: 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61 6d 65 2c  b, pColl, zName,
9e40: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   nName);.    if(
9e50: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
9e60: 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20 29 7b 0a   if( nName<0 ){.
9e70: 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d 20          nName = 
9e80: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62  sqlite3Strlen(db
9e90: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
9ea0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  }.      sqlite3E
9eb0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
9ec0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c 61 74 69  "no such collati
9ed0: 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20 25 2e 2a  on sequence: %.*
9ee0: 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e 61 6d 65  s", nName, zName
9ef0: 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d  );.      pColl =
9f00: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
9f10: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
9f20: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
9f30: 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
9f40: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73   increment the s
9f50: 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a  chema cookie..**
9f60: 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63  .** The schema c
9f70: 6f 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f  ookie is used to
9f80: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20   determine when 
9f90: 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74  the schema for t
9fa0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
9fb0: 68 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65  hanges.  After e
9fc0: 61 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ach schema chang
9fd0: 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  e, the cookie va
9fe0: 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  lue.** changes. 
9ff0: 20 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20   When a process 
a000: 66 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20  first reads the 
a010: 73 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64  schema it record
a020: 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e  s the.** cookie.
a030: 20 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68    Thereafter, wh
a040: 65 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74  enever it goes t
a050: 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
a060: 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65  abase,.** it che
a070: 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  cks the cookie t
a080: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
a090: 73 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63  schema has not c
a0a0: 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20  hanged.** since 
a0b0: 69 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64  it was last read
a0c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61  ..**.** This pla
a0d0: 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74  n is not complet
a0e0: 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66  ely bullet-proof
a0f0: 2e 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c  .  It is possibl
a100: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68  e for.** the sch
a110: 65 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75  ema to change mu
a120: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64  ltiple times and
a130: 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20   for the cookie 
a140: 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63  to be.** set bac
a150: 6b 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65  k to prior value
a160: 2e 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68  .  But schema ch
a170: 61 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71  anges are infreq
a180: 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20  uent.** and the 
a190: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68  probability of h
a1a0: 69 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20  itting the same 
a1b0: 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20  cookie value is 
a1c0: 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65  only.** 1 chance
a1d0: 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65   in 2^32.  So we
a1e0: 27 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e  're safe enough.
a1f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a200: 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72  ChangeCookie(Par
a210: 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
a220: 69 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d  iDb){.  int r1 =
a230: 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
a240: 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  eg(pParse);.  sq
a250: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a260: 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a  se->db;.  Vdbe *
a270: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
a280: 65 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  e;.  sqlite3Vdbe
a290: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
a2a0: 65 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44  eger, db->aDb[iD
a2b0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65  b].pSchema->sche
a2c0: 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29  ma_cookie+1, r1)
a2d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
a2e0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
a2f0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30 2c 20 72  ookie, iDb, 0, r
a300: 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c  1);.  sqlite3Rel
a310: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
a320: 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  se, r1);.}../*.*
a330: 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75  * Measure the nu
a340: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
a350: 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74  rs needed to out
a360: 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a  put the given.**
a370: 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68   identifier.  Th
a380: 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65  e number returne
a390: 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71  d includes any q
a3a0: 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75  uotes used.** bu
a3b0: 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75  t does not inclu
a3c0: 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d  de the null term
a3d0: 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  inator..**.** Th
a3e0: 65 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f  e estimate is co
a3f0: 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20  nservative.  It 
a400: 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20  might be larger 
a410: 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20  that what is.** 
a420: 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a  really needed..*
a430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65  /.static int ide
a440: 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  ntLength(const c
a450: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e  har *z){.  int n
a460: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b  ;.  for(n=0; *z;
a470: 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20   n++, z++){.    
a480: 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e  if( *z=='"' ){ n
a490: 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75  ++; }.  }.  retu
a4a0: 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a  rn n + 2;.}../*.
a4b0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
a4c0: 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61 72   is a wrapper ar
a4d0: 6f 75 6e 64 20 73 71 6c 69 74 65 33 47 65 74 54  ound sqlite3GetT
a4e0: 6f 6b 65 6e 28 29 20 75 73 65 64 20 62 79 20 0a  oken() used by .
a4f0: 2a 2a 20 69 73 56 61 6c 69 64 44 69 6d 65 6e 73  ** isValidDimens
a500: 69 6f 6e 28 29 2e 20 54 68 69 73 20 66 75 6e 63  ion(). This func
a510: 74 69 6f 6e 20 64 69 66 66 65 72 73 20 66 72 6f  tion differs fro
a520: 6d 20 73 71 6c 69 74 65 33 47 65 74 54 6f 6b 65  m sqlite3GetToke
a530: 6e 28 29 20 69 6e 0a 2a 2a 20 74 68 61 74 3a 0a  n() in.** that:.
a540: 2a 2a 0a 2a 2a 20 20 20 2a 20 57 68 69 74 65 73  **.**   * Whites
a550: 70 61 63 65 20 69 73 20 69 67 6e 6f 72 65 64 2c  pace is ignored,
a560: 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
a570: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 20  output variable 
a580: 2a 70 65 54 6f 6b 65 6e 20 69 73 20 73 65 74 20  *peToken is set 
a590: 74 6f 20 30 20 69 66 20 74 68 65 20 65 6e 64 20  to 0 if the end 
a5a0: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 6e 75  of the.**     nu
a5b0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 69 6e 70  l-terminated inp
a5c0: 75 74 20 73 74 72 69 6e 67 20 69 73 20 72 65 61  ut string is rea
a5d0: 63 68 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ched..*/.static 
a5e0: 69 6e 74 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70  int getTokenNoSp
a5f0: 61 63 65 28 75 6e 73 69 67 6e 65 64 20 63 68 61  ace(unsigned cha
a600: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 65 54 6f 6b  r *z, int *peTok
a610: 65 6e 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  en){.  int n = 0
a620: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
a630: 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 5d 29 20  e3Isspace(z[n]) 
a640: 29 20 6e 2b 2b 3b 0a 20 20 69 66 28 20 21 7a 5b  ) n++;.  if( !z[
a650: 6e 5d 20 29 7b 0a 20 20 20 20 2a 70 65 54 6f 6b  n] ){.    *peTok
a660: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  en = 0;.    retu
a670: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
a680: 72 6e 20 6e 20 2b 20 73 71 6c 69 74 65 33 47 65  rn n + sqlite3Ge
a690: 74 54 6f 6b 65 6e 28 26 7a 5b 6e 5d 2c 20 70 65  tToken(&z[n], pe
a6a0: 54 6f 6b 65 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Token);.}../*.**
a6b0: 20 50 61 72 61 6d 65 74 65 72 20 7a 20 70 6f 69   Parameter z poi
a6c0: 6e 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72  nts to a nul-ter
a6d0: 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20  minated string. 
a6e0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 2c 20  Return true if, 
a6f0: 77 68 65 6e 0a 2a 2a 20 77 68 69 74 65 73 70 61  when.** whitespa
a700: 63 65 20 69 73 20 69 67 6e 6f 72 65 64 2c 20 74  ce is ignored, t
a710: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
a720: 68 69 73 20 73 74 72 69 6e 67 20 6d 61 74 63 68  his string match
a730: 65 73 20 6f 6e 65 20 6f 66 20 0a 2a 2a 20 74 68  es one of .** th
a740: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 74 74  e following patt
a750: 65 72 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  erns:.**.**     
a760: 22 22 0a 2a 2a 20 20 20 20 20 22 28 6e 75 6d 62  "".**     "(numb
a770: 65 72 29 22 0a 2a 2a 20 20 20 20 20 22 28 6e 75  er)".**     "(nu
a780: 6d 62 65 72 2c 6e 75 6d 62 65 72 29 22 0a 2a 2f  mber,number)".*/
a790: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 56 61  .static int isVa
a7a0: 6c 69 64 44 69 6d 65 6e 73 69 6f 6e 28 75 6e 73  lidDimension(uns
a7b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b 0a  igned char *z){.
a7c0: 20 20 69 6e 74 20 65 54 6f 6b 65 6e 3b 0a 20 20    int eToken;.  
a7d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 20 2b  int n = 0;.  n +
a7e0: 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61 63  = getTokenNoSpac
a7f0: 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65 6e  e(&z[n], &eToken
a800: 29 3b 0a 20 20 69 66 28 20 65 54 6f 6b 65 6e 20  );.  if( eToken 
a810: 29 7b 0a 20 20 20 20 69 66 28 20 65 54 6f 6b 65  ){.    if( eToke
a820: 6e 21 3d 54 4b 5f 4c 50 20 29 20 72 65 74 75 72  n!=TK_LP ) retur
a830: 6e 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  n 0;.    n += ge
a840: 74 54 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a  tTokenNoSpace(&z
a850: 5b 6e 5d 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20  [n], &eToken);. 
a860: 20 20 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d 54     if( eToken==T
a870: 4b 5f 50 4c 55 53 20 7c 7c 20 65 54 6f 6b 65 6e  K_PLUS || eToken
a880: 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 7b 0a 20 20  ==TK_MINUS ){.  
a890: 20 20 20 20 6e 20 2b 3d 20 67 65 74 54 6f 6b 65      n += getToke
a8a0: 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20  nNoSpace(&z[n], 
a8b0: 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a  &eToken);.    }.
a8c0: 20 20 20 20 69 66 28 20 65 54 6f 6b 65 6e 21 3d      if( eToken!=
a8d0: 54 4b 5f 49 4e 54 45 47 45 52 20 26 26 20 65 54  TK_INTEGER && eT
a8e0: 6f 6b 65 6e 21 3d 54 4b 5f 46 4c 4f 41 54 20 29  oken!=TK_FLOAT )
a8f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 6e   return 0;.    n
a900: 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70   += getTokenNoSp
a910: 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b  ace(&z[n], &eTok
a920: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 65 54 6f  en);.    if( eTo
a930: 6b 65 6e 3d 3d 54 4b 5f 43 4f 4d 4d 41 20 29 7b  ken==TK_COMMA ){
a940: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 54  .      n += getT
a950: 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e  okenNoSpace(&z[n
a960: 5d 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20  ], &eToken);.   
a970: 20 20 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d 54     if( eToken==T
a980: 4b 5f 50 4c 55 53 20 7c 7c 20 65 54 6f 6b 65 6e  K_PLUS || eToken
a990: 3d 3d 54 4b 5f 4d 49 4e 55 53 20 29 7b 0a 20 20  ==TK_MINUS ){.  
a9a0: 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 54 6f        n += getTo
a9b0: 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d  kenNoSpace(&z[n]
a9c0: 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  , &eToken);.    
a9d0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54    }.      if( eT
a9e0: 6f 6b 65 6e 21 3d 54 4b 5f 49 4e 54 45 47 45 52  oken!=TK_INTEGER
a9f0: 20 26 26 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f 46   && eToken!=TK_F
aa00: 4c 4f 41 54 20 29 20 72 65 74 75 72 6e 20 30 3b  LOAT ) return 0;
aa10: 0a 20 20 20 20 20 20 6e 20 2b 3d 20 67 65 74 54  .      n += getT
aa20: 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e  okenNoSpace(&z[n
aa30: 5d 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20  ], &eToken);.   
aa40: 20 7d 0a 20 20 20 20 69 66 28 20 65 54 6f 6b 65   }.    if( eToke
aa50: 6e 21 3d 54 4b 5f 52 50 20 29 20 72 65 74 75 72  n!=TK_RP ) retur
aa60: 6e 20 30 3b 0a 20 20 20 20 67 65 74 54 6f 6b 65  n 0;.    getToke
aa70: 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20  nNoSpace(&z[n], 
aa80: 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 7d 0a 20 20  &eToken);.  }.  
aa90: 69 66 28 20 65 54 6f 6b 65 6e 20 29 20 72 65 74  if( eToken ) ret
aaa0: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
aab0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
aac0: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20  first parameter 
aad0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
aae0: 61 6e 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  an output buffer
aaf0: 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a  . The second .**
ab00: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20   parameter is a 
ab10: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
ab20: 74 65 67 65 72 20 74 68 61 74 20 63 6f 6e 74 61  teger that conta
ab30: 69 6e 73 20 74 68 65 20 6f 66 66 73 65 74 20 61  ins the offset a
ab40: 74 0a 2a 2a 20 77 68 69 63 68 20 74 6f 20 77 72  t.** which to wr
ab50: 69 74 65 20 69 6e 74 6f 20 74 68 65 20 6f 75 74  ite into the out
ab60: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 69 73  put buffer. This
ab70: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65 73   function copies
ab80: 20 74 68 65 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d   the.** nul-term
ab90: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 70 6f  inated string po
aba0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
abb0: 74 68 69 72 64 20 70 61 72 61 6d 65 74 65 72 2c  third parameter,
abc0: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 2c 0a 2a   zSignedIdent,.*
abd0: 2a 20 74 6f 20 74 68 65 20 73 70 65 63 69 66 69  * to the specifi
abe0: 65 64 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  ed offset in the
abf0: 20 62 75 66 66 65 72 20 61 6e 64 20 75 70 64 61   buffer and upda
ac00: 74 65 73 20 2a 70 49 64 78 20 74 6f 20 72 65 66  tes *pIdx to ref
ac10: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  er.** to the fir
ac20: 73 74 20 62 79 74 65 20 61 66 74 65 72 20 74 68  st byte after th
ac30: 65 20 6c 61 73 74 20 62 79 74 65 20 77 72 69 74  e last byte writ
ac40: 74 65 6e 20 62 65 66 6f 72 65 20 72 65 74 75 72  ten before retur
ac50: 6e 69 6e 67 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20  ning..** .** If 
ac60: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 69 67 6e  the string zSign
ac70: 65 64 49 64 65 6e 74 20 63 6f 6e 73 69 73 74 73  edIdent consists
ac80: 20 65 6e 74 69 72 65 6c 79 20 6f 66 20 61 6c 70   entirely of alp
ac90: 68 61 2d 6e 75 6d 65 72 69 63 0a 2a 2a 20 63 68  ha-numeric.** ch
aca0: 61 72 61 63 74 65 72 73 2c 20 64 6f 65 73 20 6e  aracters, does n
acb0: 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  ot begin with a 
acc0: 64 69 67 69 74 20 61 6e 64 20 69 73 20 6e 6f 74  digit and is not
acd0: 20 61 6e 20 53 51 4c 20 6b 65 79 77 6f 72 64 2c   an SQL keyword,
ace0: 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 63  .** then it is c
acf0: 6f 70 69 65 64 20 74 6f 20 74 68 65 20 6f 75 74  opied to the out
ad00: 70 75 74 20 62 75 66 66 65 72 20 65 78 61 63 74  put buffer exact
ad10: 6c 79 20 61 73 20 69 74 20 69 73 2e 20 4f 74 68  ly as it is. Oth
ad20: 65 72 77 69 73 65 2c 0a 2a 2a 20 69 74 20 69 73  erwise,.** it is
ad30: 20 71 75 6f 74 65 64 20 75 73 69 6e 67 20 64 6f   quoted using do
ad40: 75 62 6c 65 2d 71 75 6f 74 65 73 2e 0a 2a 2f 0a  uble-quotes..*/.
ad50: 73 74 61 74 69 63 20 76 6f 69 64 20 69 64 65 6e  static void iden
ad60: 74 50 75 74 28 63 68 61 72 20 2a 7a 2c 20 69 6e  tPut(char *z, in
ad70: 74 20 2a 70 49 64 78 2c 20 63 68 61 72 20 2a 7a  t *pIdx, char *z
ad80: 53 69 67 6e 65 64 49 64 65 6e 74 2c 20 69 6e 74  SignedIdent, int
ad90: 20 69 73 54 79 70 65 6e 61 6d 65 29 7b 0a 20 20   isTypename){.  
ada0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
adb0: 49 64 65 6e 74 20 3d 20 28 75 6e 73 69 67 6e 65  Ident = (unsigne
adc0: 64 20 63 68 61 72 2a 29 7a 53 69 67 6e 65 64 49  d char*)zSignedI
add0: 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  dent;.  int i, j
ade0: 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a 20 20 69  , needQuote;.  i
adf0: 20 3d 20 2a 70 49 64 78 3b 0a 0a 20 20 66 6f 72   = *pIdx;..  for
ae00: 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b  (j=0; zIdent[j];
ae10: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   j++){.    if( !
ae20: 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
ae30: 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a 49 64  Ident[j]) && zId
ae40: 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20 62 72  ent[j]!='_' ) br
ae50: 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65 64 51  eak;.  }.  needQ
ae60: 75 6f 74 65 20 3d 20 73 71 6c 69 74 65 33 49 73  uote = sqlite3Is
ae70: 64 69 67 69 74 28 7a 49 64 65 6e 74 5b 30 5d 29  digit(zIdent[0])
ae80: 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79 77 6f   || sqlite3Keywo
ae90: 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c 20 6a  rdCode(zIdent, j
aea0: 29 21 3d 54 4b 5f 49 44 3b 0a 20 20 69 66 28 20  )!=TK_ID;.  if( 
aeb0: 21 6e 65 65 64 51 75 6f 74 65 20 29 7b 0a 20 20  !needQuote ){.  
aec0: 20 20 69 66 28 20 69 73 54 79 70 65 6e 61 6d 65    if( isTypename
aed0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
aee0: 74 68 69 73 20 69 73 20 61 20 74 79 70 65 2d 6e  this is a type-n
aef0: 61 6d 65 2c 20 61 6c 6c 6f 77 20 61 20 6c 69 74  ame, allow a lit
af00: 74 6c 65 20 6d 6f 72 65 20 66 6c 65 78 69 62 69  tle more flexibi
af10: 6c 69 74 79 2e 20 49 6e 20 53 51 4c 69 74 65 2c  lity. In SQLite,
af20: 0a 20 20 20 20 20 20 2a 2a 20 61 20 74 79 70 65  .      ** a type
af30: 2d 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  -name is specifi
af40: 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
af50: 20 20 20 20 20 20 2a 2a 20 20 20 69 64 73 20 5b        **   ids [
af60: 69 64 73 5d 20 5b 28 6e 75 6d 62 65 72 20 5b 2c  ids] [(number [,
af70: 20 6e 75 6d 62 65 72 5d 29 5d 0a 20 20 20 20 20   number])].     
af80: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 77 68 65   **.      ** whe
af90: 72 65 20 22 69 64 73 22 20 69 73 20 65 69 74 68  re "ids" is eith
afa0: 65 72 20 61 20 71 75 6f 74 65 64 20 73 74 72 69  er a quoted stri
afb0: 6e 67 20 6f 72 20 61 20 73 69 6d 70 6c 65 20 69  ng or a simple i
afc0: 64 65 6e 74 69 66 69 65 72 20 28 69 6e 20 74 68  dentifier (in th
afd0: 65 0a 20 20 20 20 20 20 2a 2a 20 61 62 6f 76 65  e.      ** above
afe0: 20 6e 6f 74 61 74 69 6f 6e 2c 20 5b 5d 20 6d 65   notation, [] me
aff0: 61 6e 73 20 6f 70 74 69 6f 6e 61 6c 29 2e 20 49  ans optional). I
b000: 74 20 69 73 20 61 20 62 69 74 20 74 72 69 63 6b  t is a bit trick
b010: 79 20 74 6f 20 63 68 65 63 6b 0a 20 20 20 20 20  y to check.     
b020: 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 63 61 73 65   ** for all case
b030: 73 2c 20 62 75 74 20 69 74 20 69 73 20 67 6f 6f  s, but it is goo
b040: 64 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  d to avoid unnec
b050: 65 73 73 61 72 69 6c 79 20 71 75 6f 74 69 6e 67  essarily quoting
b060: 20 63 6f 6d 6d 6f 6e 0a 20 20 20 20 20 20 2a 2a   common.      **
b070: 20 74 79 70 65 6e 61 6d 65 73 20 6c 69 6b 65 20   typenames like 
b080: 56 41 52 43 48 41 52 28 31 30 29 2e 0a 20 20 20  VARCHAR(10)..   
b090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64     */.      need
b0a0: 51 75 6f 74 65 20 3d 20 21 69 73 56 61 6c 69 64  Quote = !isValid
b0b0: 44 69 6d 65 6e 73 69 6f 6e 28 26 7a 49 64 65 6e  Dimension(&zIden
b0c0: 74 5b 6a 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t[j]);.    }else
b0d0: 7b 0a 20 20 20 20 20 20 6e 65 65 64 51 75 6f 74  {.      needQuot
b0e0: 65 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20  e = zIdent[j];. 
b0f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
b100: 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b  needQuote ) z[i+
b110: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66 6f 72 28  +] = '"';.  for(
b120: 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a 5d 3b 20  j=0; zIdent[j]; 
b130: 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69 2b 2b 5d  j++){.    z[i++]
b140: 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b 0a 20 20   = zIdent[j];.  
b150: 20 20 69 66 28 20 7a 49 64 65 6e 74 5b 6a 5d 3d    if( zIdent[j]=
b160: 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20  ='"' ) z[i++] = 
b170: 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  '"';.  }.  if( n
b180: 65 65 64 51 75 6f 74 65 20 29 20 7a 5b 69 2b 2b  eedQuote ) z[i++
b190: 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b 69 5d 20  ] = '"';.  z[i] 
b1a0: 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20 3d 20 69  = 0;.  *pIdx = i
b1b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
b1c0: 61 74 65 20 61 20 43 52 45 41 54 45 20 54 41 42  ate a CREATE TAB
b1d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 61 70 70  LE statement app
b1e0: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74 68 65  ropriate for the
b1f0: 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62 6c 65 2e   given.** table.
b200: 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64    Memory to hold
b210: 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
b220: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 6f 62   statement is ob
b230: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 73  tained.** from s
b240: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
b250: 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
b260: 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
b270: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
b280: 69 63 20 63 68 61 72 20 2a 63 72 65 61 74 65 54  ic char *createT
b290: 61 62 6c 65 53 74 6d 74 28 73 71 6c 69 74 65 33  ableStmt(sqlite3
b2a0: 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a 70 29 7b   *db, Table *p){
b2b0: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 3b 0a  .  int i, k, n;.
b2c0: 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20    char *zStmt;. 
b2d0: 20 63 68 61 72 20 2a 7a 53 65 70 2c 20 2a 7a 53   char *zSep, *zS
b2e0: 65 70 32 2c 20 2a 7a 45 6e 64 2c 20 2a 7a 3b 0a  ep2, *zEnd, *z;.
b2f0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
b300: 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70    n = 0;.  for(p
b310: 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69  Col = p->aCol, i
b320: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69  =0; i<p->nCol; i
b330: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
b340: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
b350: 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a  h(pCol->zName);.
b360: 20 20 20 20 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54      z = pCol->zT
b370: 79 70 65 3b 0a 20 20 20 20 69 66 28 20 7a 20 29  ype;.    if( z )
b380: 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 69 64 65  {.      n += ide
b390: 6e 74 4c 65 6e 67 74 68 28 7a 29 3b 0a 20 20 20  ntLength(z);.   
b3a0: 20 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64   }.  }.  n += id
b3b0: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
b3c0: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
b3d0: 29 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22  ){.    zSep = ""
b3e0: 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c  ;.    zSep2 = ",
b3f0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29  ";.    zEnd = ")
b400: 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ";.  }else{.    
b410: 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20  zSep = "\n  ";. 
b420: 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20     zSep2 = ",\n 
b430: 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22   ";.    zEnd = "
b440: 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d  \n)";.  }.  n +=
b450: 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b   35 + 6*p->nCol;
b460: 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  zStmt = sqlit
b470: 65 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20  e3Malloc( n );. 
b480: 20 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b   if( zStmt==0 ){
b490: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
b4a0: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72  ailed = 1;.    r
b4b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
b4c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b4d0: 6e 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54  n, zStmt, "CREAT
b4e0: 45 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20  E TABLE ");.  k 
b4f0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
b500: 30 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e  0(zStmt);.  iden
b510: 74 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20  tPut(zStmt, &k, 
b520: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
b530: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27  zStmt[k++] = '('
b540: 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e  ;.  for(pCol=p->
b550: 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e  aCol, i=0; i<p->
b560: 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b  nCol; i++, pCol+
b570: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  +){.    sqlite3_
b580: 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a  snprintf(n-k, &z
b590: 53 74 6d 74 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a  Stmt[k], zSep);.
b5a0: 20 20 20 20 6b 20 2b 3d 20 73 71 6c 69 74 65 33      k += sqlite3
b5b0: 53 74 72 6c 65 6e 33 30 28 26 7a 53 74 6d 74 5b  Strlen30(&zStmt[
b5c0: 6b 5d 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  k]);.    zSep = 
b5d0: 7a 53 65 70 32 3b 0a 20 20 20 20 69 64 65 6e 74  zSep2;.    ident
b5e0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
b5f0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  Col->zName, 0);.
b600: 20 20 20 20 69 66 28 20 28 7a 20 3d 20 70 43 6f      if( (z = pCo
b610: 6c 2d 3e 7a 54 79 70 65 29 21 3d 30 20 29 7b 0a  l->zType)!=0 ){.
b620: 20 20 20 20 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d        zStmt[k++]
b630: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 61 73   = ' ';.      as
b640: 73 65 72 74 28 20 28 69 6e 74 29 28 73 71 6c 69  sert( (int)(sqli
b650: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2b 6b  te3Strlen30(z)+k
b660: 2b 31 29 3c 3d 6e 20 29 3b 0a 20 20 20 20 20 20  +1)<=n );.      
b670: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
b680: 26 6b 2c 20 7a 2c 20 31 29 3b 0a 20 20 20 20 7d  &k, z, 1);.    }
b690: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
b6a0: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
b6b0: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
b6c0: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
b6d0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  tmt;.}../*.** Th
b6e0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
b6f0: 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74  lled to report t
b700: 68 65 20 66 69 6e 61 6c 20 22 29 22 20 74 68 61  he final ")" tha
b710: 74 20 74 65 72 6d 69 6e 61 74 65 73 0a 2a 2a 20  t terminates.** 
b720: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
b730: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
b740: 54 68 65 20 74 61 62 6c 65 20 73 74 72 75 63 74  The table struct
b750: 75 72 65 20 74 68 61 74 20 6f 74 68 65 72 20 61  ure that other a
b760: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 68  ction routines h
b770: 61 76 65 20 62 65 65 6e 20 62 75 69 6c 64 69 6e  ave been buildin
b780: 67 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74 6f  g.** is added to
b790: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 68 61   the internal ha
b7a0: 73 68 20 74 61 62 6c 65 73 2c 20 61 73 73 75 6d  sh tables, assum
b7b0: 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73 20 68 61  ing no errors ha
b7c0: 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65 64 2e 0a  ve.** occurred..
b7d0: 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72 79 20 66  **.** An entry f
b7e0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  or the table is 
b7f0: 6d 61 64 65 20 69 6e 20 74 68 65 20 6d 61 73 74  made in the mast
b800: 65 72 20 74 61 62 6c 65 20 6f 6e 20 64 69 73 6b  er table on disk
b810: 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74 68 69 73  , unless.** this
b820: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
b830: 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e 69 6e 69  table or db->ini
b840: 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57 68 65 6e  t.busy==1.  When
b850: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
b860: 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73 20 77 65  1.** it means we
b870: 20 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65   are reading the
b880: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
b890: 61 62 6c 65 20 62 65 63 61 75 73 65 20 77 65 20  able because we 
b8a0: 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65  just.** connecte
b8b0: 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  d to the databas
b8c0: 65 20 6f 72 20 62 65 63 61 75 73 65 20 74 68 65  e or because the
b8d0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
b8e0: 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72 65 63 65  able has.** rece
b8f0: 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c 20 73 6f  ntly changed, so
b900: 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
b910: 68 69 73 20 74 61 62 6c 65 20 61 6c 72 65 61 64  his table alread
b920: 79 20 65 78 69 73 74 73 20 69 6e 0a 2a 2a 20 74  y exists in.** t
b930: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
b940: 20 74 61 62 6c 65 2e 20 20 57 65 20 64 6f 20 6e   table.  We do n
b950: 6f 74 20 77 61 6e 74 20 74 6f 20 63 72 65 61 74  ot want to creat
b960: 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a  e it again..**.*
b970: 2a 20 49 66 20 74 68 65 20 70 53 65 6c 65 63 74  * If the pSelect
b980: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
b990: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
b9a0: 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
b9b0: 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c 65 64 20  e.** was called 
b9c0: 74 6f 20 63 72 65 61 74 65 20 61 20 74 61 62 6c  to create a tabl
b9d0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d  e generated from
b9e0: 20 61 20 0a 2a 2a 20 22 43 52 45 41 54 45 20 54   a .** "CREATE T
b9f0: 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45  ABLE ... AS SELE
ba00: 43 54 20 2e 2e 2e 22 20 73 74 61 74 65 6d 65 6e  CT ..." statemen
ba10: 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d 6e 20 6e  t.  The column n
ba20: 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  ames of.** the n
ba30: 65 77 20 74 61 62 6c 65 20 77 69 6c 6c 20 6d 61  ew table will ma
ba40: 74 63 68 20 74 68 65 20 72 65 73 75 6c 74 20 73  tch the result s
ba50: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
ba60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ba70: 33 45 6e 64 54 61 62 6c 65 28 0a 20 20 50 61 72  3EndTable(.  Par
ba80: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ba90: 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63 6f       /* Parse co
baa0: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ntext */.  Token
bab0: 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20 20 20 20   *pCons,        
bac0: 20 20 20 2f 2a 20 54 68 65 20 27 2c 27 20 74 6f     /* The ',' to
bad0: 6b 65 6e 20 61 66 74 65 72 20 74 68 65 20 6c 61  ken after the la
bae0: 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66 6e 2e 20  st column defn. 
baf0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64  */.  Token *pEnd
bb00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
bb10: 54 68 65 20 66 69 6e 61 6c 20 27 29 27 20 74 6f  The final ')' to
bb20: 6b 65 6e 20 69 6e 20 74 68 65 20 43 52 45 41 54  ken in the CREAT
bb30: 45 20 54 41 42 4c 45 20 2a 2f 0a 20 20 53 65 6c  E TABLE */.  Sel
bb40: 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20  ect *pSelect    
bb50: 20 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 66       /* Select f
bb60: 72 6f 6d 20 61 20 22 43 52 45 41 54 45 20 2e 2e  rom a "CREATE ..
bb70: 2e 20 41 53 20 53 45 4c 45 43 54 22 20 2a 2f 0a  . AS SELECT" */.
bb80: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
bb90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
bba0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74  Parse->db;.  int
bbb0: 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 28 70 45   iDb;..  if( (pE
bbc0: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
bbd0: 3d 3d 30 29 20 7c 7c 20 70 50 61 72 73 65 2d 3e  ==0) || pParse->
bbe0: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
bbf0: 6f 63 46 61 69 6c 65 64 20 29 20 7b 0a 20 20 20  ocFailed ) {.   
bc00: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
bc10: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
bc20: 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  able;.  if( p==0
bc30: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73   ) return;..  as
bc40: 73 65 72 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e  sert( !db->init.
bc50: 62 75 73 79 20 7c 7c 20 21 70 53 65 6c 65 63 74  busy || !pSelect
bc60: 20 29 3b 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c   );..  iDb = sql
bc70: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
bc80: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
bc90: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
bca0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
bcb0: 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
bcc0: 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f   in all CHECK co
bcd0: 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73  nstraint express
bce0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
bcf0: 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20   p->pCheck ){.  
bd00: 20 20 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20    SrcList sSrc; 
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73    /* Fake SrcLis
bd30: 74 20 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e  t for pParse->pN
bd40: 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20 20 20 4e  ewTable */.    N
bd50: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd70: 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66  * Name context f
bd80: 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  or pParse->pNewT
bd90: 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d  able */..    mem
bda0: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
bdb0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 6d  eof(sNC));.    m
bdc0: 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20  emset(&sSrc, 0, 
bdd0: 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20  sizeof(sSrc));. 
bde0: 20 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31     sSrc.nSrc = 1
bdf0: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
be00: 7a 4e 61 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65  zName = p->zName
be10: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
be20: 70 54 61 62 20 3d 20 70 3b 0a 20 20 20 20 73 53  pTab = p;.    sS
be30: 72 63 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20  rc.a[0].iCursor 
be40: 3d 20 2d 31 3b 0a 20 20 20 20 73 4e 43 2e 70 50  = -1;.    sNC.pP
be50: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
be60: 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20     sNC.pSrcList 
be70: 3d 20 26 73 53 72 63 3b 0a 20 20 20 20 73 4e 43  = &sSrc;.    sNC
be80: 2e 69 73 43 68 65 63 6b 20 3d 20 31 3b 0a 20 20  .isCheck = 1;.  
be90: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
bea0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
beb0: 4e 43 2c 20 70 2d 3e 70 43 68 65 63 6b 29 20 29  NC, p->pCheck) )
bec0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  {.      return;.
bed0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
bee0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
bef0: 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20  ITE_OMIT_CHECK) 
bf00: 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  */..  /* If the 
bf10: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69 73  db->init.busy is
bf20: 20 31 20 69 74 20 6d 65 61 6e 73 20 77 65 20 61   1 it means we a
bf30: 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 53  re reading the S
bf40: 51 4c 20 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20  QL off the.  ** 
bf50: 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 20  "sqlite_master" 
bf60: 6f 72 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  or "sqlite_temp_
bf70: 6d 61 73 74 65 72 22 20 74 61 62 6c 65 20 6f 6e  master" table on
bf80: 20 74 68 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20   the disk..  ** 
bf90: 53 6f 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  So do not write 
bfa0: 74 6f 20 74 68 65 20 64 69 73 6b 20 61 67 61 69  to the disk agai
bfb0: 6e 2e 20 20 45 78 74 72 61 63 74 20 74 68 65 20  n.  Extract the 
bfc0: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
bfd0: 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 74 61  .  ** for the ta
bfe0: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 2d  ble from the db-
bff0: 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69  >init.newTnum fi
c000: 65 6c 64 2e 20 20 28 54 68 65 20 70 61 67 65 20  eld.  (The page 
c010: 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75  number.  ** shou
c020: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 70 75 74  ld have been put
c030: 20 74 68 65 72 65 20 62 79 20 74 68 65 20 73 71   there by the sq
c040: 6c 69 74 65 4f 70 65 6e 43 62 20 72 6f 75 74 69  liteOpenCb routi
c050: 6e 65 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ne.).  */.  if( 
c060: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b  db->init.busy ){
c070: 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20 64  .    p->tnum = d
c080: 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3b  b->init.newTnum;
c090: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
c0a0: 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 2c 20  t initializing, 
c0b0: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 72 65  then create a re
c0c0: 63 6f 72 64 20 66 6f 72 20 74 68 65 20 6e 65 77  cord for the new
c0d0: 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e 20 74   table.  ** in t
c0e0: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
c0f0: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 64 61   table of the da
c100: 74 61 62 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  tabase..  **.  *
c110: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 54  * If this is a T
c120: 45 4d 50 4f 52 41 52 59 20 74 61 62 6c 65 2c 20  EMPORARY table, 
c130: 77 72 69 74 65 20 74 68 65 20 65 6e 74 72 79 20  write the entry 
c140: 69 6e 74 6f 20 74 68 65 20 61 75 78 69 6c 69 61  into the auxilia
c150: 72 79 0a 20 20 2a 2a 20 66 69 6c 65 20 69 6e 73  ry.  ** file ins
c160: 74 65 61 64 20 6f 66 20 69 6e 74 6f 20 74 68 65  tead of into the
c170: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
c180: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
c190: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
c1a0: 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
c1b0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
c1c0: 61 72 20 2a 7a 54 79 70 65 3b 20 20 20 20 2f 2a  ar *zType;    /*
c1d0: 20 22 76 69 65 77 22 20 6f 72 20 22 74 61 62 6c   "view" or "tabl
c1e0: 65 22 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  e" */.    char *
c1f0: 7a 54 79 70 65 32 3b 20 20 20 2f 2a 20 22 56 49  zType2;   /* "VI
c200: 45 57 22 20 6f 72 20 22 54 41 42 4c 45 22 20 2a  EW" or "TABLE" *
c210: 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d  /.    char *zStm
c220: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
c230: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
c240: 45 20 6f 72 20 43 52 45 41 54 45 20 56 49 45 57  E or CREATE VIEW
c250: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20   statement */.. 
c260: 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65     v = sqlite3Ge
c270: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
c280: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
c290: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74  turn;..    sqlit
c2a0: 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
c2b0: 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20  OP_Close, 0);.. 
c2c0: 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e     /* .    ** In
c2d0: 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66  itialize zType f
c2e0: 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77 20  or the new view 
c2f0: 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f  or table..    */
c300: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c  .    if( p->pSel
c310: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect==0 ){.      
c320: 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61 62  /* A regular tab
c330: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  le */.      zTyp
c340: 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20  e = "table";.   
c350: 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42     zType2 = "TAB
c360: 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  LE";.#ifndef SQL
c370: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
c380: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
c390: 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20  * A view */.    
c3a0: 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22    zType = "view"
c3b0: 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d  ;.      zType2 =
c3c0: 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a   "VIEW";.#endif.
c3d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
c3e0: 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41 54   this is a CREAT
c3f0: 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53 45  E TABLE xx AS SE
c400: 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74  LECT ..., execut
c410: 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20  e the SELECT.   
c420: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f   ** statement to
c430: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65   populate the ne
c440: 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f  w table. The roo
c450: 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  t-page number fo
c460: 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77  r the.    ** new
c470: 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67   table is in reg
c480: 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65  ister pParse->re
c490: 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  gRoot..    **.  
c4a0: 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45    ** Once the SE
c4b0: 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f  LECT has been co
c4c0: 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65  ded by sqlite3Se
c4d0: 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e  lect(), it is in
c4e0: 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62   a.    ** suitab
c4f0: 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72  le state to quer
c500: 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e  y for the column
c510: 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73   names and types
c520: 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20   to be used.    
c530: 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61  ** by the new ta
c540: 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ble..    **.    
c550: 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68  ** A shared-cach
c560: 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20  e write-lock is 
c570: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
c580: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77  write to the new
c590: 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61   table,.    ** a
c5a0: 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20  s a schema-lock 
c5b0: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
c5c0: 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20  y been obtained 
c5d0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69  to create it. Si
c5e0: 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68  nce.    ** a sch
c5f0: 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65  ema-lock exclude
c600: 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61  s all other data
c610: 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20  base users, the 
c620: 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64  write-lock would
c630: 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e  .    ** be redun
c640: 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dant..    */.   
c650: 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a   if( pSelect ){.
c660: 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74        SelectDest
c670: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61 62   dest;.      Tab
c680: 6c 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20  le *pSelTab;..  
c690: 20 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73      assert(pPars
c6a0: 65 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20  e->nTab==1);.   
c6b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c6c0: 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp3(v, OP_OpenW
c6d0: 72 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d  rite, 1, pParse-
c6e0: 3e 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a  >regRoot, iDb);.
c6f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c700: 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b  eChangeP5(v, 1);
c710: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
c720: 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73  Tab = 2;.      s
c730: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74  qlite3SelectDest
c740: 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f  Init(&dest, SRT_
c750: 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20  Table, 1);.     
c760: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
c770: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
c780: 26 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71  &dest);.      sq
c790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
c7a0: 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b  v, OP_Close, 1);
c7b0: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
c7c0: 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20  e->nErr==0 ){.  
c7d0: 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20        pSelTab = 
c7e0: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
c7f0: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
c800: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20   pSelect);.     
c810: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d     if( pSelTab==
c820: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
c830: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
c840: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
c850: 20 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c    p->nCol = pSel
c860: 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20  Tab->nCol;.     
c870: 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65     p->aCol = pSe
c880: 6c 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20  lTab->aCol;.    
c890: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f      pSelTab->nCo
c8a0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  l = 0;.        p
c8b0: 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30  SelTab->aCol = 0
c8c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
c8d0: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65  3DeleteTable(pSe
c8e0: 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lTab);.      }. 
c8f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
c900: 70 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  pute the complet
c910: 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52  e text of the CR
c920: 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a  EATE statement *
c930: 2f 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63  /.    if( pSelec
c940: 74 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74  t ){.      zStmt
c950: 20 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74   = createTableSt
c960: 6d 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d  mt(db, p);.    }
c970: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20  else{.      n = 
c980: 28 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20  (int)(pEnd->z - 
c990: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
c9a0: 65 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20  en.z) + 1;.     
c9b0: 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
c9c0: 4d 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20  MPrintf(db, .   
c9d0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25         "CREATE %
c9e0: 73 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c  s %.*s", zType2,
c9f0: 20 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d   n, pParse->sNam
ca00: 65 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29  eToken.z.      )
ca10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ca20: 41 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72  A slot for the r
ca30: 65 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64  ecord has alread
ca40: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
ca50: 20 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   in the .    ** 
ca60: 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
ca70: 62 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65  ble.  We just ne
ca80: 65 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61  ed to update tha
ca90: 74 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a  t slot with all.
caa0: 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72      ** the infor
cab0: 6d 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c  mation we've col
cac0: 6c 65 63 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  lected..    */. 
cad0: 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
cae0: 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
caf0: 20 20 20 20 22 55 50 44 41 54 45 20 25 51 2e 25      "UPDATE %Q.%
cb00: 73 20 22 0a 20 20 20 20 20 20 20 20 20 22 53 45  s ".         "SE
cb10: 54 20 74 79 70 65 3d 27 25 73 27 2c 20 6e 61 6d  T type='%s', nam
cb20: 65 3d 25 51 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25  e=%Q, tbl_name=%
cb30: 51 2c 20 72 6f 6f 74 70 61 67 65 3d 23 25 64 2c  Q, rootpage=#%d,
cb40: 20 73 71 6c 3d 25 51 20 22 0a 20 20 20 20 20 20   sql=%Q ".      
cb50: 20 22 57 48 45 52 45 20 72 6f 77 69 64 3d 23 25   "WHERE rowid=#%
cb60: 64 22 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44  d",.      db->aD
cb70: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
cb80: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
cb90: 0a 20 20 20 20 20 20 7a 54 79 70 65 2c 0a 20 20  .      zType,.  
cba0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
cbb0: 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20      p->zName,.  
cbc0: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
cbd0: 6f 6f 74 2c 0a 20 20 20 20 20 20 7a 53 74 6d 74  oot,.      zStmt
cbe0: 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ,.      pParse->
cbf0: 72 65 67 52 6f 77 69 64 0a 20 20 20 20 29 3b 0a  regRowid.    );.
cc00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
cc10: 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a 20 20  e(db, zStmt);.  
cc20: 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43    sqlite3ChangeC
cc30: 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44  ookie(pParse, iD
cc40: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
cc50: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
cc60: 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a 20 43 68  REMENT.    /* Ch
cc70: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65  eck to see if we
cc80: 20 6e 65 65 64 20 74 6f 20 63 72 65 61 74 65 20   need to create 
cc90: 61 6e 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  an sqlite_sequen
cca0: 63 65 20 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  ce table for.   
ccb0: 20 2a 2a 20 6b 65 65 70 69 6e 67 20 74 72 61 63   ** keeping trac
ccc0: 6b 20 6f 66 20 61 75 74 6f 69 6e 63 72 65 6d 65  k of autoincreme
ccd0: 6e 74 20 6b 65 79 73 2e 0a 20 20 20 20 2a 2f 0a  nt keys..    */.
cce0: 20 20 20 20 69 66 28 20 70 2d 3e 74 61 62 46 6c      if( p->tabFl
ccf0: 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
cd00: 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  rement ){.      
cd10: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
cd20: 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 20 20 69  Db[iDb];.      i
cd30: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
cd40: 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
cd50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
cd60: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
cd70: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
cd80: 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
cd90: 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d  ite_sequence(nam
cda0: 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
cdb0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
cdc0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
cdd0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
cde0: 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76     /* Reparse ev
cdf0: 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61  erything to upda
ce00: 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
ce10: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
ce20: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
ce30: 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50  beAddOp4(v, OP_P
ce40: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
ce50: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 73   0, 0,.        s
ce60: 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
ce70: 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d 27 25 71 27  , "tbl_name='%q'
ce80: 22 2c 70 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f  ",p->zName), P4_
ce90: 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 0a 0a  DYNAMIC);.  }...
cea0: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
ceb0: 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
cec0: 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
ced0: 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
cee0: 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
cef0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
cf00: 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20  pParse->nErr==0 
cf10: 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 4f  ){.    Table *pO
cf20: 6c 64 3b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a  ld;.    Schema *
cf30: 70 53 63 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63  pSchema = p->pSc
cf40: 68 65 6d 61 3b 0a 20 20 20 20 70 4f 6c 64 20 3d  hema;.    pOld =
cf50: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
cf60: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c  rt(&pSchema->tbl
cf70: 48 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a  Hash, p->zName,.
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
cfa0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e  ite3Strlen30(p->
cfb0: 7a 4e 61 6d 65 29 2c 70 29 3b 0a 20 20 20 20 69  zName),p);.    i
cfc0: 66 28 20 70 4f 6c 64 20 29 7b 0a 20 20 20 20 20  f( pOld ){.     
cfd0: 20 61 73 73 65 72 74 28 20 70 3d 3d 70 4f 6c 64   assert( p==pOld
cfe0: 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d   );  /* Malloc m
cff0: 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64 20  ust have failed 
d000: 69 6e 73 69 64 65 20 48 61 73 68 49 6e 73 65 72  inside HashInser
d010: 74 28 29 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  t() */.      db-
d020: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
d030: 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  1;.      return;
d040: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
d050: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 3d 20 30  e->pNewTable = 0
d060: 3b 0a 20 20 20 20 64 62 2d 3e 6e 54 61 62 6c 65  ;.    db->nTable
d070: 2b 2b 3b 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67  ++;.    db->flag
d080: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
d090: 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23 69 66 6e  rnChanges;..#ifn
d0a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d0b0: 41 4c 54 45 52 54 41 42 4c 45 0a 20 20 20 20 69  ALTERTABLE.    i
d0c0: 66 28 20 21 70 2d 3e 70 53 65 6c 65 63 74 20 29  f( !p->pSelect )
d0d0: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
d0e0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e  ar *zName = (con
d0f0: 73 74 20 63 68 61 72 20 2a 29 70 50 61 72 73 65  st char *)pParse
d100: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a  ->sNameToken.z;.
d110: 20 20 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 3b        int nName;
d120: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
d130: 70 53 65 6c 65 63 74 20 26 26 20 70 43 6f 6e 73  pSelect && pCons
d140: 20 26 26 20 70 45 6e 64 20 29 3b 0a 20 20 20 20   && pEnd );.    
d150: 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e 7a 3d 3d    if( pCons->z==
d160: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  0 ){.        pCo
d170: 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20 20  ns = pEnd;.     
d180: 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 3d   }.      nName =
d190: 20 28 69 6e 74 29 28 28 63 6f 6e 73 74 20 63 68   (int)((const ch
d1a0: 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a 20 2d 20  ar *)pCons->z - 
d1b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d  zName);.      p-
d1c0: 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74 20 3d 20  >addColOffset = 
d1d0: 31 33 20 2b 20 73 71 6c 69 74 65 33 55 74 66 38  13 + sqlite3Utf8
d1e0: 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65 2c 20 6e  CharLen(zName, n
d1f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Name);.    }.#en
d200: 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  dif.  }.}..#ifnd
d210: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d220: 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  IEW./*.** The pa
d230: 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  rser calls this 
d240: 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72 64 65 72  routine in order
d250: 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77   to create a new
d260: 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64 20 73 71   VIEW.*/.void sq
d270: 6c 69 74 65 33 43 72 65 61 74 65 56 69 65 77 28  lite3CreateView(
d280: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
d290: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72  ,     /* The par
d2a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d2b0: 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67 69 6e 2c    Token *pBegin,
d2c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52 45 41       /* The CREA
d2d0: 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20 62 65  TE token that be
d2e0: 67 69 6e 73 20 74 68 65 20 73 74 61 74 65 6d 65  gins the stateme
d2f0: 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  nt */.  Token *p
d300: 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 54 68  Name1,     /* Th
d310: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
d320: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
d330: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 54 6f 6b  he view */.  Tok
d340: 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20  en *pName2,     
d350: 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61  /* The token tha
d360: 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  t holds the name
d370: 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a   of the view */.
d380: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
d390: 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43 54  t,   /* A SELECT
d3a0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
d3b0: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
d3c0: 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  new view */.  in
d3d0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 20  t isTemp,       
d3e0: 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20 54   /* TRUE for a T
d3f0: 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a 2f  EMPORARY view */
d400: 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20 20  .  int noErr    
d410: 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65 73        /* Suppres
d420: 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  s error messages
d430: 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64 79   if VIEW already
d440: 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
d450: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
d460: 6e 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  n;.  const unsig
d470: 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a 20 20 54  ned char *z;.  T
d480: 6f 6b 65 6e 20 73 45 6e 64 3b 0a 20 20 44 62 46  oken sEnd;.  DbF
d490: 69 78 65 72 20 73 46 69 78 3b 0a 20 20 54 6f 6b  ixer sFix;.  Tok
d4a0: 65 6e 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 6e 74  en *pName;.  int
d4b0: 20 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20   iDb;.  sqlite3 
d4c0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
d4d0: 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
d4e0: 3e 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73  >nVar>0 ){.    s
d4f0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
d500: 50 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65  Parse, "paramete
d510: 72 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77  rs are not allow
d520: 65 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20  ed in views");. 
d530: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
d540: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65  Delete(db, pSele
d550: 63 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ct);.    return;
d560: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74  .  }.  sqlite3St
d570: 61 72 74 54 61 62 6c 65 28 70 50 61 72 73 65 2c  artTable(pParse,
d580: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
d590: 20 69 73 54 65 6d 70 2c 20 31 2c 20 30 2c 20 6e   isTemp, 1, 0, n
d5a0: 6f 45 72 72 29 3b 0a 20 20 70 20 3d 20 70 50 61  oErr);.  p = pPa
d5b0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
d5c0: 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50    if( p==0 || pP
d5d0: 61 72 73 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20  arse->nErr ){.  
d5e0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
d5f0: 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63  elete(db, pSelec
d600: 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  t);.    return;.
d610: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 54 77 6f    }.  sqlite3Two
d620: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
d630: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
d640: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 44 62 20   &pName);.  iDb 
d650: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
d660: 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53  oIndex(db, p->pS
d670: 63 68 65 6d 61 29 3b 0a 20 20 69 66 28 20 73 71  chema);.  if( sq
d680: 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46  lite3FixInit(&sF
d690: 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c  ix, pParse, iDb,
d6a0: 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29 0a   "view", pName).
d6b0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 46 69      && sqlite3Fi
d6c0: 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20 70  xSelect(&sFix, p
d6d0: 53 65 6c 65 63 74 29 0a 20 20 29 7b 0a 20 20 20  Select).  ){.   
d6e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d6f0: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
d700: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
d710: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20   }..  /* Make a 
d720: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69  copy of the enti
d730: 72 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  re SELECT statem
d740: 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73  ent that defines
d750: 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20   the view..  ** 
d760: 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20  This will force 
d770: 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b  all the Expr.tok
d780: 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62  en.z values to b
d790: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
d7a0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74  ** allocated rat
d7b0: 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74  her than point t
d7c0: 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69  o the input stri
d7d0: 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73  ng - which means
d7e0: 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20   that.  ** they 
d7f0: 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74  will persist aft
d800: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  er the current s
d810: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61  qlite3_exec() ca
d820: 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f  ll returns..  */
d830: 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20  .  p->pSelect = 
d840: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
d850: 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58  (db, pSelect, EX
d860: 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20  PRDUP_REDUCE);. 
d870: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
d880: 6c 65 74 65 28 64 62 2c 20 70 53 65 6c 65 63 74  lete(db, pSelect
d890: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
d8a0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
d8b0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
d8c0: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  f( !db->init.bus
d8d0: 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  y ){.    sqlite3
d8e0: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
d8f0: 65 73 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20  es(pParse, p);. 
d900: 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
d910: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43  the end of the C
d920: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
d930: 6d 65 6e 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64  ment.  Make sEnd
d940: 20 70 6f 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74   point to.  ** t
d950: 68 65 20 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73  he end..  */.  s
d960: 45 6e 64 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c  End = pParse->sL
d970: 61 73 74 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20  astToken;.  if( 
d980: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 26 26 20  sEnd.z[0]!=0 && 
d990: 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27 3b 27 20 29  sEnd.z[0]!=';' )
d9a0: 7b 0a 20 20 20 20 73 45 6e 64 2e 7a 20 2b 3d 20  {.    sEnd.z += 
d9b0: 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a 20 20 73 45  sEnd.n;.  }.  sE
d9c0: 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20 6e 20 3d 20  nd.n = 0;.  n = 
d9d0: 28 69 6e 74 29 28 73 45 6e 64 2e 7a 20 2d 20 70  (int)(sEnd.z - p
d9e0: 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20 20 7a 20 3d  Begin->z);.  z =
d9f0: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
da00: 20 63 68 61 72 2a 29 70 42 65 67 69 6e 2d 3e 7a   char*)pBegin->z
da10: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26  ;.  while( n>0 &
da20: 26 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 7c  & (z[n-1]==';' |
da30: 7c 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  | sqlite3Isspace
da40: 28 7a 5b 6e 2d 31 5d 29 29 20 29 7b 20 6e 2d 2d  (z[n-1])) ){ n--
da50: 3b 20 7d 0a 20 20 73 45 6e 64 2e 7a 20 3d 20 26  ; }.  sEnd.z = &
da60: 7a 5b 6e 2d 31 5d 3b 0a 20 20 73 45 6e 64 2e 6e  z[n-1];.  sEnd.n
da70: 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 55 73 65 20   = 1;..  /* Use 
da80: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
da90: 29 20 74 6f 20 61 64 64 20 74 68 65 20 76 69 65  ) to add the vie
daa0: 77 20 74 6f 20 74 68 65 20 53 51 4c 49 54 45 5f  w to the SQLITE_
dab0: 4d 41 53 54 45 52 20 74 61 62 6c 65 20 2a 2f 0a  MASTER table */.
dac0: 20 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c    sqlite3EndTabl
dad0: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 26 73 45  e(pParse, 0, &sE
dae0: 6e 64 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  nd, 0);.  return
daf0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
db00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
db10: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
db20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
db30: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
db40: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
db50: 4c 54 41 42 4c 45 29 0a 2f 2a 0a 2a 2a 20 54 68  LTABLE)./*.** Th
db60: 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72  e Table structur
db70: 65 20 70 54 61 62 6c 65 20 69 73 20 72 65 61 6c  e pTable is real
db80: 6c 79 20 61 20 56 49 45 57 2e 20 20 46 69 6c 6c  ly a VIEW.  Fill
db90: 20 69 6e 20 74 68 65 20 6e 61 6d 65 73 20 6f 66   in the names of
dba0: 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  .** the columns 
dbb0: 6f 66 20 74 68 65 20 76 69 65 77 20 69 6e 20 74  of the view in t
dbc0: 68 65 20 70 54 61 62 6c 65 20 73 74 72 75 63 74  he pTable struct
dbd0: 75 72 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ure.  Return the
dbe0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 65 72   number.** of er
dbf0: 72 6f 72 73 2e 20 20 49 66 20 61 6e 20 65 72 72  rors.  If an err
dc00: 6f 72 20 69 73 20 73 65 65 6e 20 6c 65 61 76 65  or is seen leave
dc10: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
dc20: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
dc30: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
dc40: 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d  ite3ViewGetColum
dc50: 6e 4e 61 6d 65 73 28 50 61 72 73 65 20 2a 70 50  nNames(Parse *pP
dc60: 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
dc70: 62 6c 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ble){.  Table *p
dc80: 53 65 6c 54 61 62 3b 20 20 20 2f 2a 20 41 20 66  SelTab;   /* A f
dc90: 61 6b 65 20 74 61 62 6c 65 20 66 72 6f 6d 20 77  ake table from w
dca0: 68 69 63 68 20 77 65 20 67 65 74 20 74 68 65 20  hich we get the 
dcb0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
dcc0: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20 20 20  Select *pSel;   
dcd0: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 74 68 65    /* Copy of the
dce0: 20 53 45 4c 45 43 54 20 74 68 61 74 20 69 6d 70   SELECT that imp
dcf0: 6c 65 6d 65 6e 74 73 20 74 68 65 20 76 69 65 77  lements the view
dd00: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d   */.  int nErr =
dd10: 20 30 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   0;     /* Numbe
dd20: 72 20 6f 66 20 65 72 72 6f 72 73 20 65 6e 63 6f  r of errors enco
dd30: 75 6e 74 65 72 65 64 20 2a 2f 0a 20 20 69 6e 74  untered */.  int
dd40: 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   n;            /
dd50: 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 68 6f  * Temporarily ho
dd60: 6c 64 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lds the number o
dd70: 66 20 63 75 72 73 6f 72 73 20 61 73 73 69 67 6e  f cursors assign
dd80: 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
dd90: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
dda0: 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63  ;  /* Database c
ddb0: 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72 20 6d 61  onnection for ma
ddc0: 6c 6c 6f 63 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lloc errors */. 
ddd0: 20 69 6e 74 20 28 2a 78 41 75 74 68 29 28 76 6f   int (*xAuth)(vo
dde0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
ddf0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ar*,const char*,
de00: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
de10: 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 61 73 73  t char*);..  ass
de20: 65 72 74 28 20 70 54 61 62 6c 65 20 29 3b 0a 0a  ert( pTable );..
de30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
de40: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
de50: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 74  .  if( sqlite3Vt
de60: 61 62 43 61 6c 6c 43 6f 6e 6e 65 63 74 28 70 50  abCallConnect(pP
de70: 61 72 73 65 2c 20 70 54 61 62 6c 65 29 20 29 7b  arse, pTable) ){
de80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
de90: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
dea0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
deb0: 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 30  able) ) return 0
dec0: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
ded0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
dee0: 45 57 0a 20 20 2f 2a 20 41 20 70 6f 73 69 74 69  EW.  /* A positi
def0: 76 65 20 6e 43 6f 6c 20 6d 65 61 6e 73 20 74 68  ve nCol means th
df00: 65 20 63 6f 6c 75 6d 6e 73 20 6e 61 6d 65 73 20  e columns names 
df10: 66 6f 72 20 74 68 69 73 20 76 69 65 77 20 61 72  for this view ar
df20: 65 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 6b  e.  ** already k
df30: 6e 6f 77 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nown..  */.  if(
df40: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20   pTable->nCol>0 
df50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
df60: 2a 20 41 20 6e 65 67 61 74 69 76 65 20 6e 43 6f  * A negative nCo
df70: 6c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 6d  l is a special m
df80: 61 72 6b 65 72 20 6d 65 61 6e 69 6e 67 20 74 68  arker meaning th
df90: 61 74 20 77 65 20 61 72 65 20 63 75 72 72 65 6e  at we are curren
dfa0: 74 6c 79 0a 20 20 2a 2a 20 74 72 79 69 6e 67 20  tly.  ** trying 
dfb0: 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 63  to compute the c
dfc0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 66  olumn names.  If
dfd0: 20 77 65 20 65 6e 74 65 72 20 74 68 69 73 20 72   we enter this r
dfe0: 6f 75 74 69 6e 65 20 77 69 74 68 0a 20 20 2a 2a  outine with.  **
dff0: 20 61 20 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c   a negative nCol
e000: 2c 20 69 74 20 6d 65 61 6e 73 20 74 77 6f 20 6f  , it means two o
e010: 72 20 6d 6f 72 65 20 76 69 65 77 73 20 66 6f 72  r more views for
e020: 6d 20 61 20 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74  m a loop, like t
e030: 68 69 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  his:.  **.  **  
e040: 20 20 20 43 52 45 41 54 45 20 56 49 45 57 20 6f     CREATE VIEW o
e050: 6e 65 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46  ne AS SELECT * F
e060: 52 4f 4d 20 74 77 6f 3b 0a 20 20 2a 2a 20 20 20  ROM two;.  **   
e070: 20 20 43 52 45 41 54 45 20 56 49 45 57 20 74 77    CREATE VIEW tw
e080: 6f 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  o AS SELECT * FR
e090: 4f 4d 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a  OM one;.  **.  *
e0a0: 2a 20 41 63 74 75 61 6c 6c 79 2c 20 74 68 69 73  * Actually, this
e0b0: 20 65 72 72 6f 72 20 69 73 20 63 61 75 67 68 74   error is caught
e0c0: 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6e 64 20   previously and 
e0d0: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
e0e0: 20 74 65 73 74 0a 20 20 2a 2a 20 73 68 6f 75 6c   test.  ** shoul
e0f0: 64 20 61 6c 77 61 79 73 20 66 61 69 6c 2e 20 20  d always fail.  
e100: 42 75 74 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  But we will leav
e110: 65 20 69 74 20 69 6e 20 70 6c 61 63 65 20 6a 75  e it in place ju
e120: 73 74 20 74 6f 20 62 65 20 73 61 66 65 2e 0a 20  st to be safe.. 
e130: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
e140: 2d 3e 6e 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20  ->nCol<0 ){.    
e150: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
e160: 70 50 61 72 73 65 2c 20 22 76 69 65 77 20 25 73  pParse, "view %s
e170: 20 69 73 20 63 69 72 63 75 6c 61 72 6c 79 20 64   is circularly d
e180: 65 66 69 6e 65 64 22 2c 20 70 54 61 62 6c 65 2d  efined", pTable-
e190: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74  >zName);.    ret
e1a0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 1;.  }.  ass
e1b0: 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f  ert( pTable->nCo
e1c0: 6c 3e 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  l>=0 );..  /* If
e1d0: 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72   we get this far
e1e0: 2c 20 69 74 20 6d 65 61 6e 73 20 77 65 20 6e 65  , it means we ne
e1f0: 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68  ed to compute th
e200: 65 20 74 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 20  e table names.. 
e210: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
e220: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
e230: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
e240: 63 74 28 29 20 77 69 6c 6c 20 65 78 70 61 6e 64  ct() will expand
e250: 20 61 6e 79 0a 20 20 2a 2a 20 22 2a 22 20 65 6c   any.  ** "*" el
e260: 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 72 65  ements in the re
e270: 73 75 6c 74 73 20 73 65 74 20 6f 66 20 74 68 65  sults set of the
e280: 20 76 69 65 77 20 61 6e 64 20 77 69 6c 6c 20 61   view and will a
e290: 73 73 69 67 6e 20 63 75 72 73 6f 72 73 0a 20 20  ssign cursors.  
e2a0: 2a 2a 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e  ** to the elemen
e2b0: 74 73 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  ts of the FROM c
e2c0: 6c 61 75 73 65 2e 20 20 42 75 74 20 77 65 20 64  lause.  But we d
e2d0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 68 65 73 65  o not want these
e2e0: 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74 6f   changes.  ** to
e2f0: 20 62 65 20 70 65 72 6d 61 6e 65 6e 74 2e 20 20   be permanent.  
e300: 53 6f 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  So the computati
e310: 6f 6e 20 69 73 20 64 6f 6e 65 20 6f 6e 20 61 20  on is done on a 
e320: 63 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  copy of the SELE
e330: 43 54 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  CT.  ** statemen
e340: 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  t that defines t
e350: 68 65 20 76 69 65 77 2e 0a 20 20 2a 2f 0a 20 20  he view..  */.  
e360: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
e370: 70 53 65 6c 65 63 74 20 29 3b 0a 20 20 70 53 65  pSelect );.  pSe
e380: 6c 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  l = sqlite3Selec
e390: 74 44 75 70 28 64 62 2c 20 70 54 61 62 6c 65 2d  tDup(db, pTable-
e3a0: 3e 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20  >pSelect, 0);.  
e3b0: 69 66 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20  if( pSel ){.    
e3c0: 75 38 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69  u8 enableLookasi
e3d0: 64 65 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  de = db->lookasi
e3e0: 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 20  de.bEnabled;.   
e3f0: 20 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61   n = pParse->nTa
e400: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  b;.    sqlite3Sr
e410: 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
e420: 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  rs(pParse, pSel-
e430: 3e 70 53 72 63 29 3b 0a 20 20 20 20 70 54 61 62  >pSrc);.    pTab
e440: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
e450: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
e460: 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 23  .bEnabled = 0;.#
e470: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e480: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
e490: 0a 20 20 20 20 78 41 75 74 68 20 3d 20 64 62 2d  .    xAuth = db-
e4a0: 3e 78 41 75 74 68 3b 0a 20 20 20 20 64 62 2d 3e  >xAuth;.    db->
e4b0: 78 41 75 74 68 20 3d 20 30 3b 0a 20 20 20 20 70  xAuth = 0;.    p
e4c0: 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33  SelTab = sqlite3
e4d0: 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63  ResultSetOfSelec
e4e0: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b  t(pParse, pSel);
e4f0: 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d  .    db->xAuth =
e500: 20 78 41 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20   xAuth;.#else.  
e510: 20 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69    pSelTab = sqli
e520: 74 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65  te3ResultSetOfSe
e530: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
e540: 6c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  l);.#endif.    d
e550: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e560: 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 4c 6f  abled = enableLo
e570: 6f 6b 61 73 69 64 65 3b 0a 20 20 20 20 70 50 61  okaside;.    pPa
e580: 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
e590: 20 20 20 69 66 28 20 70 53 65 6c 54 61 62 20 29     if( pSelTab )
e5a0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
e5b0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 3d 3d 30 20  pTable->aCol==0 
e5c0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d  );.      pTable-
e5d0: 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d  >nCol = pSelTab-
e5e0: 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 54 61  >nCol;.      pTa
e5f0: 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c  ble->aCol = pSel
e600: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
e610: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d   pSelTab->nCol =
e620: 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
e630: 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->aCol = 0;.   
e640: 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
e650: 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a  Table(pSelTab);.
e660: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 70 53        pTable->pS
e670: 63 68 65 6d 61 2d 3e 66 6c 61 67 73 20 7c 3d 20  chema->flags |= 
e680: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 3b  DB_UnresetViews;
e690: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
e6a0: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
e6b0: 20 30 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b 2b   0;.      nErr++
e6c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
e6d0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
e6e0: 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 7d 20 65  db, pSel);.  } e
e6f0: 6c 73 65 20 7b 0a 20 20 20 20 6e 45 72 72 2b 2b  lse {.    nErr++
e700: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
e710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
e720: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45 72   */.  return nEr
e730: 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  r;  .}.#endif /*
e740: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
e750: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
e760: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
e770: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
e780: 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  ) */..#ifndef SQ
e790: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
e7a0: 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63  *.** Clear the c
e7b0: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d  olumn names from
e7c0: 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20 64   every VIEW in d
e7d0: 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f 0a  atabase idx..*/.
e7e0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69  static void sqli
e7f0: 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 73  teViewResetAll(s
e800: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
e810: 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  idx){.  HashElem
e820: 20 2a 69 3b 0a 20 20 69 66 28 20 21 44 62 48 61   *i;.  if( !DbHa
e830: 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69 64  sProperty(db, id
e840: 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69 65  x, DB_UnresetVie
e850: 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ws) ) return;.  
e860: 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73 68  for(i=sqliteHash
e870: 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b 69  First(&db->aDb[i
e880: 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  dx].pSchema->tbl
e890: 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69 74  Hash); i;i=sqlit
e8a0: 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a 20  eHashNext(i)){. 
e8b0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
e8c0: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
e8d0: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  i);.    if( pTab
e8e0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
e8f0: 20 20 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f     sqliteResetCo
e900: 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 29 3b  lumnNames(pTab);
e910: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 44 62 43  .    }.  }.  DbC
e920: 6c 65 61 72 50 72 6f 70 65 72 74 79 28 64 62 2c  learProperty(db,
e930: 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74   idx, DB_Unreset
e940: 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c 73 65 0a  Views);.}.#else.
e950: 23 20 64 65 66 69 6e 65 20 73 71 6c 69 74 65 56  # define sqliteV
e960: 69 65 77 52 65 73 65 74 41 6c 6c 28 41 2c 42 29  iewResetAll(A,B)
e970: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
e980: 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a  E_OMIT_VIEW */..
e990: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e9a0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
e9b0: 20 74 68 65 20 56 44 42 45 20 74 6f 20 61 64 6a   the VDBE to adj
e9c0: 75 73 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ust the internal
e9d0: 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73 65 64 20   schema.** used 
e9e0: 62 79 20 53 51 4c 69 74 65 20 77 68 65 6e 20 74  by SQLite when t
e9f0: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
ea00: 6f 76 65 73 20 61 20 74 61 62 6c 65 20 72 6f 6f  oves a table roo
ea10: 74 20 70 61 67 65 2e 20 54 68 65 0a 2a 2a 20 72  t page. The.** r
ea20: 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 20 74 61  oot-page of a ta
ea30: 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 6e 20  ble or index in 
ea40: 64 61 74 61 62 61 73 65 20 69 44 62 20 68 61 73  database iDb has
ea50: 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20 69 46   changed from iF
ea60: 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f 2e 0a 2a  rom.** to iTo..*
ea70: 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 31 37 32  *.** Ticket #172
ea80: 38 3a 20 20 54 68 65 20 73 79 6d 62 6f 6c 20 74  8:  The symbol t
ea90: 61 62 6c 65 20 6d 69 67 68 74 20 73 74 69 6c 6c  able might still
eaa0: 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f 72 6d 61   contain informa
eab0: 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61 62 6c 65  tion.** on table
eac0: 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69 63 65 73  s and/or indices
ead0: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 70 72   that are the pr
eae0: 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20 64  ocess of being d
eaf0: 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66 20 79 6f  eleted..** If yo
eb00: 75 20 61 72 65 20 75 6e 6c 75 63 6b 79 2c 20 6f  u are unlucky, o
eb10: 6e 65 20 6f 66 20 74 68 6f 73 65 20 64 65 6c 65  ne of those dele
eb20: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 72 20 74  ted indices or t
eb30: 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a 2a 20 68  ables might.** h
eb40: 61 76 65 20 74 68 65 20 73 61 6d 65 20 72 6f 6f  ave the same roo
eb50: 74 70 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20  tpage number as 
eb60: 74 68 65 20 72 65 61 6c 20 74 61 62 6c 65 20 6f  the real table o
eb70: 72 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 0a  r index that is.
eb80: 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 20  ** being moved. 
eb90: 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 73 74   So we cannot st
eba0: 6f 70 20 73 65 61 72 63 68 69 6e 67 20 61 66 74  op searching aft
ebb0: 65 72 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  er the first mat
ebc0: 63 68 20 0a 2a 2a 20 62 65 63 61 75 73 65 20 74  ch .** because t
ebd0: 68 65 20 66 69 72 73 74 20 6d 61 74 63 68 20 6d  he first match m
ebe0: 69 67 68 74 20 62 65 20 66 6f 72 20 6f 6e 65 20  ight be for one 
ebf0: 6f 66 20 74 68 65 20 64 65 6c 65 74 65 64 20 69  of the deleted i
ec00: 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20 74 61 62  ndices.** or tab
ec10: 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  les and not the 
ec20: 74 61 62 6c 65 2f 69 6e 64 65 78 20 74 68 61 74  table/index that
ec30: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 62 65 69   is actually bei
ec40: 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20 57 65 20  ng moved..** We 
ec50: 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65 20 6c 6f  must continue lo
ec60: 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 6c 6c 20  oping until all 
ec70: 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 64 69 63  tables and indic
ec80: 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f 6f 74 70  es with.** rootp
ec90: 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61 76 65 20  age==iFrom have 
eca0: 62 65 65 6e 20 63 6f 6e 76 65 72 74 65 64 20 74  been converted t
ecb0: 6f 20 68 61 76 65 20 61 20 72 6f 6f 74 70 61 67  o have a rootpag
ecc0: 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69 6e 20 6f  e of iTo.** in o
ecd0: 72 64 65 72 20 74 6f 20 62 65 20 63 65 72 74 61  rder to be certa
ece0: 69 6e 20 74 68 61 74 20 77 65 20 67 6f 74 20 74  in that we got t
ecf0: 68 65 20 72 69 67 68 74 20 6f 6e 65 2e 0a 2a 2f  he right one..*/
ed00: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ed10: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
ed20: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6f 74  void sqlite3Root
ed30: 50 61 67 65 4d 6f 76 65 64 28 44 62 20 2a 70 44  PageMoved(Db *pD
ed40: 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
ed50: 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
ed60: 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
ed70: 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 70 48 61  h *pHash;..  pHa
ed80: 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63 68 65  sh = &pDb->pSche
ed90: 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20 20 66  ma->tblHash;.  f
eda0: 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  or(pElem=sqliteH
edb0: 61 73 68 46 69 72 73 74 28 70 48 61 73 68 29 3b  ashFirst(pHash);
edc0: 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71   pElem; pElem=sq
edd0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 45 6c  liteHashNext(pEl
ede0: 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  em)){.    Table 
edf0: 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48 61  *pTab = sqliteHa
ee00: 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20  shData(pElem);. 
ee10: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 6e 75     if( pTab->tnu
ee20: 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  m==iFrom ){.    
ee30: 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d 20 69    pTab->tnum = i
ee40: 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  To;.    }.  }.  
ee50: 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53  pHash = &pDb->pS
ee60: 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 3b 0a  chema->idxHash;.
ee70: 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69    for(pElem=sqli
ee80: 74 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73  teHashFirst(pHas
ee90: 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d  h); pElem; pElem
eea0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
eeb0: 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49 6e 64  pElem)){.    Ind
eec0: 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c 69 74  ex *pIdx = sqlit
eed0: 65 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29  eHashData(pElem)
eee0: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  ;.    if( pIdx->
eef0: 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20  tnum==iFrom ){. 
ef00: 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75 6d 20       pIdx->tnum 
ef10: 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  = iTo;.    }.  }
ef20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
ef30: 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f 20 65   Write code to e
ef40: 72 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 77  rase the table w
ef50: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54  ith root-page iT
ef60: 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61 62 61  able from databa
ef70: 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73 6f 20  se iDb..** Also 
ef80: 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20 6d 6f  write code to mo
ef90: 64 69 66 79 20 74 68 65 20 73 71 6c 69 74 65 5f  dify the sqlite_
efa0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64  master table and
efb0: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
efc0: 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d 70 61  .** if a root-pa
efd0: 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 74 61  ge of another ta
efe0: 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20  ble is moved by 
eff0: 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65 72 20  the btree-layer 
f000: 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73 69 6e  whilst.** erasin
f010: 67 20 69 54 61 62 6c 65 20 28 74 68 69 73 20 63  g iTable (this c
f020: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
f030: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
f040: 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73 74 61  tabase)..*/ .sta
f050: 74 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79  tic void destroy
f060: 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65 20 2a  RootPage(Parse *
f070: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54 61 62  pParse, int iTab
f080: 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  le, int iDb){.  
f090: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
f0a0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
f0b0: 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  ;.  int r1 = sql
f0c0: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
f0d0: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
f0e0: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
f0f0: 50 5f 44 65 73 74 72 6f 79 2c 20 69 54 61 62 6c  P_Destroy, iTabl
f100: 65 2c 20 72 31 2c 20 69 44 62 29 3b 0a 23 69 66  e, r1, iDb);.#if
f110: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f120: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a  _AUTOVACUUM.  /*
f130: 20 4f 50 5f 44 65 73 74 72 6f 79 20 73 74 6f 72   OP_Destroy stor
f140: 65 73 20 61 6e 20 69 6e 20 69 6e 74 65 67 65 72  es an in integer
f150: 20 72 31 2e 20 49 66 20 74 68 69 73 20 69 6e 74   r1. If this int
f160: 65 67 65 72 0a 20 20 2a 2a 20 69 73 20 6e 6f 6e  eger.  ** is non
f170: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20 69  -zero, then it i
f180: 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
f190: 6e 75 6d 62 65 72 20 6f 66 20 61 20 74 61 62 6c  number of a tabl
f1a0: 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20 2a 2a 20  e moved to.  ** 
f1b0: 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62 6c 65 2e  location iTable.
f1c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
f1d0: 6f 64 65 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ode modifies the
f1e0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
f1f0: 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20 72 65 66  able to.  ** ref
f200: 6c 65 63 74 20 74 68 69 73 2e 0a 20 20 2a 2a 0a  lect this..  **.
f210: 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e 4e 22 20    ** The "#NNN" 
f220: 69 6e 20 74 68 65 20 53 51 4c 20 69 73 20 61 20  in the SQL is a 
f230: 73 70 65 63 69 61 6c 20 63 6f 6e 73 74 61 6e 74  special constant
f240: 20 74 68 61 74 20 6d 65 61 6e 73 20 77 68 61 74   that means what
f250: 65 76 65 72 20 76 61 6c 75 65 0a 20 20 2a 2a 20  ever value.  ** 
f260: 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 4e  is in register N
f270: 4e 4e 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  NN.  See sqlite3
f280: 52 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a  RegisterExpr()..
f290: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
f2a0: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
f2b0: 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
f2c0: 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
f2d0: 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
f2e0: 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
f2f0: 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
f300: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
f310: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
f320: 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72  (iDb), iTable, r
f330: 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20  1, r1);.#endif. 
f340: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
f350: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
f360: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
f370: 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
f380: 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
f390: 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
f3a0: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
f3b0: 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
f3c0: 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
f3d0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
f3e0: 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
f3f0: 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
f400: 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
f410: 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
f420: 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
f430: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
f440: 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
f450: 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
f460: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
f470: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
f480: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
f490: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
f4a0: 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
f4b0: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
f4c0: 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
f4d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f4e0: 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
f4f0: 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  Idx;.  int iDb =
f500: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f510: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f520: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
f530: 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
f540: 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
f550: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
f560: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
f570: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f580: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
f590: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
f5a0: 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
f5b0: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
f5c0: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
f5d0: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
f5e0: 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
f5f0: 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
f600: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f610: 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
f620: 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
f630: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
f640: 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
f650: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
f660: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
f670: 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
f680: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
f690: 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
f6a0: 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
f6b0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
f6c0: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
f6d0: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
f6e0: 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
f6f0: 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
f700: 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
f710: 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
f720: 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
f730: 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
f740: 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
f750: 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
f760: 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
f770: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
f780: 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
f790: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
f7a0: 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
f7b0: 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
f7c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
f7d0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
f7e0: 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
f7f0: 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
f800: 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
f810: 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
f820: 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
f830: 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
f840: 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
f850: 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
f860: 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
f870: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
f880: 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
f890: 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
f8a0: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
f8b0: 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
f8c0: 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
f8d0: 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
f8e0: 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
f8f0: 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
f900: 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
f910: 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
f920: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
f930: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f940: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f950: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
f960: 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
f970: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
f980: 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
f990: 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
f9a0: 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  a );.      if( (
f9b0: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
f9c0: 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
f9d0: 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
f9e0: 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
f9f0: 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
fa00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fa10: 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
fa20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
fa30: 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
fa40: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
fa50: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
fa60: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
fa70: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
fa80: 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f        destroyRoo
fa90: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
faa0: 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20  argest, iDb);.  
fab0: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
fac0: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d   iLargest;.    }
fad0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
fae0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
faf0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
fb00: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
fb10: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
fb20: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
fb30: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
fb40: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
fb50: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
fb60: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
fb70: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
fb80: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
fb90: 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e  nt isView, int n
fba0: 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oErr){.  Table *
fbb0: 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  pTab;.  Vdbe *v;
fbc0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
fbd0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
fbe0: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
fbf0: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
fc00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
fc10: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
fc20: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
fc30: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
fc40: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
fc50: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
fc60: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
fc70: 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20 20 20   isView, .      
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc90: 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b 30        pName->a[0
fca0: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
fcb0: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
fcc0: 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
fcd0: 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72  ){.    if( noErr
fce0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
fcf0: 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72  3ErrorClear(pPar
fd00: 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  se);.    }.    g
fd10: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fd20: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ble;.  }.  iDb =
fd30: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
fd40: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
fd50: 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
fd60: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
fd70: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
fd80: 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
fd90: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
fda0: 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
fdb0: 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
fdc0: 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
fdd0: 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
fde0: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
fdf0: 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
fe00: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
fe10: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
fe20: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
fe30: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
fe40: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
fe50: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
fe60: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
fe70: 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
fe80: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
fe90: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
fea0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
feb0: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
fec0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
fed0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
fee0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
fef0: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
ff00: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
ff10: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
ff20: 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
ff30: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ff40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
ff50: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
ff60: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
ff70: 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
ff80: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
ff90: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
ffa0: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
ffb0: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
ffc0: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
ffd0: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
ffe0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
fff0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
10000 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
10010 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
10020 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
10030 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
10040 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62 2d 3e    zArg2 = pTab->
10050 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
10060 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
10070 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
10080 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
10090 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
100a0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
100b0 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
100c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
100d0 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
100e0 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
100f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
10100 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
10110 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
10120 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
10130 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
10140 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
10150 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
10160 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
10170 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
10180 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
10190 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
101a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
101b0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
101c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
101d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
101e0 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
101f0 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
10200 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
10210 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
10220 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
10230 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
10240 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
10250 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
10260 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
10270 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10280 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
10290 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
102a0 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
102b0 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
102c0 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
102d0 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
102e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
102f0 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
10300 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
10310 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
10320 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
10330 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
10340 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
10350 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
10360 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
10370 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
10380 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
10390 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
103a0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
103b0 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
103c0 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
103d0 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
103e0 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
103f0 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
10400 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
10410 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
10420 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
10430 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
10440 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
10450 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
10460 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
10470 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
10480 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65   v ){.    Trigge
10490 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
104a0 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
104b0 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71  aDb[iDb];.    sq
104c0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
104d0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
104e0 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
104f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10500 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
10510 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
10520 61 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ab) ){.      if(
10530 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71   v ){.        sq
10540 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
10550 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
10560 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
10570 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  dif..    /* Drop
10580 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
10590 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
105a0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
105b0 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20  opped. Code.    
105c0 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ** is generated 
105d0 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65  to remove entrie
105e0 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  s from sqlite_ma
105f0 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20  ster and/or.    
10600 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
10610 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
10620 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  d..    */.    pT
10630 72 69 67 67 65 72 20 3d 20 73 71 6c 69 74 65 33  rigger = sqlite3
10640 54 72 69 67 67 65 72 4c 69 73 74 28 70 50 61 72  TriggerList(pPar
10650 73 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 77  se, pTab);.    w
10660 68 69 6c 65 28 20 70 54 72 69 67 67 65 72 20 29  hile( pTrigger )
10670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
10680 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d  pTrigger->pSchem
10690 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
106a0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
106b0 54 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61  Trigger->pSchema
106c0 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  ==db->aDb[1].pSc
106d0 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71  hema );.      sq
106e0 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65 72  lite3DropTrigger
106f0 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72 69  Ptr(pParse, pTri
10700 67 67 65 72 29 3b 0a 20 20 20 20 20 20 70 54 72  gger);.      pTr
10710 69 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72  igger = pTrigger
10720 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a  ->pNext;.    }..
10730 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10740 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
10750 54 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  T.    /* Remove 
10760 61 6e 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74  any entries of t
10770 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
10780 63 65 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61  ce table associa
10790 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ted with.    ** 
107a0 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  the table being 
107b0 64 72 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73  dropped. This is
107c0 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65   done before the
107d0 20 74 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65   table is droppe
107e0 64 0a 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20  d.    ** at the 
107f0 62 74 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20  btree level, in 
10800 63 61 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  case the sqlite_
10810 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e  sequence table n
10820 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  eeds to.    ** m
10830 6f 76 65 20 61 73 20 61 20 72 65 73 75 6c 74 20  ove as a result 
10840 6f 66 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e  of the drop (can
10850 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
10860 76 61 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20  vacuum mode)..  
10870 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61    */.    if( pTa
10880 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
10890 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
108a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
108b0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
108c0 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
108d0 54 45 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74  TE FROM %s.sqlit
108e0 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
108f0 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
10900 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70     pDb->zName, p
10910 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  Tab->zName.     
10920 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
10930 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c  ..    /* Drop al
10940 6c 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20  l SQLITE_MASTER 
10950 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
10960 65 6e 74 72 69 65 73 20 74 68 61 74 20 72 65 66  entries that ref
10970 65 72 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  er to the.    **
10980 20 74 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67   table. The prog
10990 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74  ram name loops t
109a0 68 72 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65  hrough the maste
109b0 72 20 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65  r table and dele
109c0 74 65 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79  tes.    ** every
109d0 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72 73   row that refers
109e0 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74   to a table of t
109f0 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20  he same name as 
10a00 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20  the one being.  
10a10 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72    ** dropped. Tr
10a20 69 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c  iggers are handl
10a30 65 64 20 73 65 70 65 72 61 74 65 6c 79 20 62 65  ed seperately be
10a40 63 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20  cause a trigger 
10a50 63 61 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72  can be.    ** cr
10a60 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
10a70 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
10a80 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
10a90 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20  e in another.   
10aa0 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20   ** database..  
10ab0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
10ac0 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72  NestedParse(pPar
10ad0 73 65 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45  se, .        "DE
10ae0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
10af0 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25  WHERE tbl_name=%
10b00 51 20 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69  Q and type!='tri
10b10 67 67 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20  gger'",.        
10b20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45  pDb->zName, SCHE
10b30 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70  MA_TABLE(iDb), p
10b40 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20  Tab->zName);..  
10b50 20 20 2f 2a 20 44 72 6f 70 20 61 6e 79 20 73 74    /* Drop any st
10b60 61 74 69 73 74 69 63 73 20 66 72 6f 6d 20 74 68  atistics from th
10b70 65 20 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74  e sqlite_stat1 t
10b80 61 62 6c 65 2c 20 69 66 20 69 74 20 65 78 69 73  able, if it exis
10b90 74 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  ts */.    if( sq
10ba0 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
10bb0 62 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31  b, "sqlite_stat1
10bc0 22 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e  ", db->aDb[iDb].
10bd0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
10be0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
10bf0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
10c00 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
10c10 25 51 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20  %Q.sqlite_stat1 
10c20 57 48 45 52 45 20 74 62 6c 3d 25 51 22 2c 20 70  WHERE tbl=%Q", p
10c30 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d  Db->zName, pTab-
10c40 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
10c50 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
10c60 69 73 56 69 65 77 20 26 26 20 21 49 73 56 69 72  isView && !IsVir
10c70 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20  tual(pTab) ){.  
10c80 20 20 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65      destroyTable
10c90 28 70 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a  (pParse, pTab);.
10ca0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
10cb0 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 65  move the table e
10cc0 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65  ntry from SQLite
10cd0 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  's internal sche
10ce0 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20  ma and modify.  
10cf0 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20    ** the schema 
10d00 63 6f 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20  cookie..    */. 
10d10 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
10d20 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  (pTab) ){.      
10d30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10d40 34 28 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79  4(v, OP_VDestroy
10d50 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61  , iDb, 0, 0, pTa
10d60 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  b->zName, 0);.  
10d70 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
10d80 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10d90 44 72 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20  DropTable, iDb, 
10da0 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
10db0 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  e, 0);.    sqlit
10dc0 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10dd0 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d  Parse, iDb);.  }
10de0 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  .  sqliteViewRes
10df0 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a  etAll(db, iDb);.
10e00 0a 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65  .exit_drop_table
10e10 3a 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69  :.  sqlite3SrcLi
10e20 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61  stDelete(db, pNa
10e30 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  me);.}../*.** Th
10e40 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10e50 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  lled to create a
10e60 20 6e 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79   new foreign key
10e70 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   on the table.**
10e80 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
10e90 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
10ea0 70 46 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69  pFromCol determi
10eb0 6e 65 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e  nes which column
10ec0 73 0a 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72  s.** in the curr
10ed0 65 6e 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20  ent table point 
10ee0 74 6f 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  to the foreign k
10ef0 65 79 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c  ey.  If pFromCol
10f00 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e  ==0 then.** conn
10f10 65 63 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74  ect the key to t
10f20 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69  he last column i
10f30 6e 73 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73  nserted.  pTo is
10f40 20 74 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20   the name of.** 
10f50 74 68 65 20 74 61 62 6c 65 20 72 65 66 65 72 72  the table referr
10f60 65 64 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69  ed to.  pToCol i
10f70 73 20 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c  s a list of tabl
10f80 65 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a  es in the other.
10f90 2a 2a 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61  ** pTo table tha
10fa0 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  t the foreign ke
10fb0 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c  y points to.  fl
10fc0 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ags contains all
10fd0 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  .** information 
10fe0 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69  about the confli
10ff0 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
11000 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66 69  gorithms specifi
11010 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20  ed.** in the ON 
11020 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54  DELETE, ON UPDAT
11030 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20  E and ON INSERT 
11040 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  clauses..**.** A
11050 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72 65  n FKey structure
11060 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
11070 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61 62  added to the tab
11080 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  le currently.** 
11090 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
110a0 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73 65  on in the pParse
110b0 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c  ->pNewTable fiel
110c0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72  d..**.** The for
110d0 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74 20  eign key is set 
110e0 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70 72  for IMMEDIATE pr
110f0 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75 62  ocessing.  A sub
11100 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20  sequent call.** 
11110 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72 46  to sqlite3DeferF
11120 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67 68  oreignKey() migh
11130 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74 6f  t change this to
11140 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f   DEFERRED..*/.vo
11150 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74 65  id sqlite3Create
11160 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50 61  ForeignKey(.  Pa
11170 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
11180 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
11190 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c  ntext */.  ExprL
111a0 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20  ist *pFromCol,  
111b0 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  /* Columns in th
111c0 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70 6f  is table that po
111d0 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61 62  int to other tab
111e0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
111f0 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  To,          /* 
11200 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68 65  Name of the othe
11210 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  r table */.  Exp
11220 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20  rList *pToCol,  
11230 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20    /* Columns in 
11240 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
11250 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
11260 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
11270 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e  flict resolution
11280 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a   algorithms. */.
11290 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
112a0 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
112b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
112c0 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
112d0 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20 30   FKey *pFKey = 0
112e0 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d 20 70  ;.  Table *p = p
112f0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
11300 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
11310 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43   int i;.  int nC
11320 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ol;.  char *z;..
11330 20 20 61 73 73 65 72 74 28 20 70 54 6f 21 3d 30    assert( pTo!=0
11340 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c   );.  if( p==0 |
11350 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
11360 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
11370 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b  B ) goto fk_end;
11380 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d  .  if( pFromCol=
11390 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 43  =0 ){.    int iC
113a0 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a  ol = p->nCol-1;.
113b0 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 30 20 29      if( iCol<0 )
113c0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
113d0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20    if( pToCol && 
113e0 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31  pToCol->nExpr!=1
113f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11400 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
11410 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  , "foreign key o
11420 6e 20 25 73 22 0a 20 20 20 20 20 20 20 20 20 22  n %s".         "
11430 20 73 68 6f 75 6c 64 20 72 65 66 65 72 65 6e 63   should referenc
11440 65 20 6f 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d  e only one colum
11450 6e 20 6f 66 20 74 61 62 6c 65 20 25 54 22 2c 0a  n of table %T",.
11460 20 20 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c           p->aCol
11470 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54  [iCol].zName, pT
11480 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66  o);.      goto f
11490 6b 5f 65 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  k_end;.    }.   
114a0 20 6e 43 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c   nCol = 1;.  }el
114b0 73 65 20 69 66 28 20 70 54 6f 43 6f 6c 20 26 26  se if( pToCol &&
114c0 20 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d   pToCol->nExpr!=
114d0 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20  pFromCol->nExpr 
114e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
114f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20  rorMsg(pParse,. 
11500 20 20 20 20 20 20 20 22 6e 75 6d 62 65 72 20 6f         "number o
11510 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72  f columns in for
11520 65 69 67 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f  eign key does no
11530 74 20 6d 61 74 63 68 20 74 68 65 20 6e 75 6d 62  t match the numb
11540 65 72 20 6f 66 20 22 0a 20 20 20 20 20 20 20 20  er of ".        
11550 22 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20  "columns in the 
11560 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
11570 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f  ");.    goto fk_
11580 65 6e 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  end;.  }else{.  
11590 20 20 6e 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f    nCol = pFromCo
115a0 6c 2d 3e 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20  l->nExpr;.  }.  
115b0 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
115c0 70 46 4b 65 79 29 20 2b 20 28 6e 43 6f 6c 2d 31  pFKey) + (nCol-1
115d0 29 2a 73 69 7a 65 6f 66 28 70 46 4b 65 79 2d 3e  )*sizeof(pFKey->
115e0 61 43 6f 6c 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e  aCol[0]) + pTo->
115f0 6e 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 54 6f  n + 1;.  if( pTo
11600 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Col ){.    for(i
11610 3d 30 3b 20 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45  =0; i<pToCol->nE
11620 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
11630 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
11640 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f 6c  3Strlen30(pToCol
11650 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20  ->a[i].zName) + 
11660 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
11670 46 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 44 62  FKey = sqlite3Db
11680 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
11690 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 46  Byte );.  if( pF
116a0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  Key==0 ){.    go
116b0 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20  to fk_end;.  }. 
116c0 20 70 46 4b 65 79 2d 3e 70 46 72 6f 6d 20 3d 20   pFKey->pFrom = 
116d0 70 3b 0a 20 20 70 46 4b 65 79 2d 3e 70 4e 65 78  p;.  pFKey->pNex
116e0 74 46 72 6f 6d 20 3d 20 70 2d 3e 70 46 4b 65 79  tFrom = p->pFKey
116f0 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 26  ;.  z = (char*)&
11700 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c  pFKey->aCol[nCol
11710 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 20  ];.  pFKey->zTo 
11720 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 2c  = z;.  memcpy(z,
11730 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29   pTo->z, pTo->n)
11740 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20  ;.  z[pTo->n] = 
11750 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 75  0;.  sqlite3Dequ
11760 6f 74 65 28 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70  ote(z);.  z += p
11770 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46 4b 65 79  To->n+1;.  pFKey
11780 2d 3e 6e 43 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20  ->nCol = nCol;. 
11790 20 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30   if( pFromCol==0
117a0 20 29 7b 0a 20 20 20 20 70 46 4b 65 79 2d 3e 61   ){.    pFKey->a
117b0 43 6f 6c 5b 30 5d 2e 69 46 72 6f 6d 20 3d 20 70  Col[0].iFrom = p
117c0 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73  ->nCol-1;.  }els
117d0 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  e{.    for(i=0; 
117e0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
117f0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
11800 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
11810 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
11820 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
11830 72 49 43 6d 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d  rICmp(p->aCol[j]
11840 2e 7a 4e 61 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c  .zName, pFromCol
11850 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  ->a[i].zName)==0
11860 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
11870 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72  Key->aCol[i].iFr
11880 6f 6d 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  om = j;.        
11890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
118a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
118b0 20 69 66 28 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20   if( j>=p->nCol 
118c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
118d0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
118e0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 75  e, .          "u
118f0 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22  nknown column \"
11900 25 73 5c 22 20 69 6e 20 66 6f 72 65 69 67 6e 20  %s\" in foreign 
11910 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e 22 2c  key definition",
11920 20 0a 20 20 20 20 20 20 20 20 20 20 70 46 72 6f   .          pFro
11930 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  mCol->a[i].zName
11940 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
11950 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 20 20 7d 0a  fk_end;.      }.
11960 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
11970 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20 66 6f  pToCol ){.    fo
11980 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
11990 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
119a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
119b0 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
119c0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 46  zName);.      pF
119d0 4b 65 79 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f  Key->aCol[i].zCo
119e0 6c 20 3d 20 7a 3b 0a 20 20 20 20 20 20 6d 65 6d  l = z;.      mem
119f0 63 70 79 28 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61  cpy(z, pToCol->a
11a00 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  [i].zName, n);. 
11a10 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20       z[n] = 0;. 
11a20 20 20 20 20 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20       z += n+1;. 
11a30 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
11a40 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20 30  ->isDeferred = 0
11a50 3b 0a 20 20 70 46 4b 65 79 2d 3e 64 65 6c 65 74  ;.  pFKey->delet
11a60 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 66 6c 61  eConf = (u8)(fla
11a70 67 73 20 26 20 30 78 66 66 29 3b 0a 20 20 70 46  gs & 0xff);.  pF
11a80 4b 65 79 2d 3e 75 70 64 61 74 65 43 6f 6e 66 20  Key->updateConf 
11a90 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e  = (u8)((flags >>
11aa0 20 38 20 29 20 26 20 30 78 66 66 29 3b 0a 20 20   8 ) & 0xff);.  
11ab0 70 46 4b 65 79 2d 3e 69 6e 73 65 72 74 43 6f 6e  pFKey->insertCon
11ac0 66 20 3d 20 28 75 38 29 28 28 66 6c 61 67 73 20  f = (u8)((flags 
11ad0 3e 3e 20 31 36 20 29 20 26 20 30 78 66 66 29 3b  >> 16 ) & 0xff);
11ae0 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20  ..  /* Link the 
11af0 66 6f 72 65 69 67 6e 20 6b 65 79 20 74 6f 20 74  foreign key to t
11b00 68 65 20 74 61 62 6c 65 20 61 73 20 74 68 65 20  he table as the 
11b10 6c 61 73 74 20 73 74 65 70 2e 0a 20 20 2a 2f 0a  last step..  */.
11b20 20 20 70 2d 3e 70 46 4b 65 79 20 3d 20 70 46 4b    p->pFKey = pFK
11b30 65 79 3b 0a 20 20 70 46 4b 65 79 20 3d 20 30 3b  ey;.  pFKey = 0;
11b40 0a 0a 66 6b 5f 65 6e 64 3a 0a 20 20 73 71 6c 69  ..fk_end:.  sqli
11b50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 46  te3DbFree(db, pF
11b60 4b 65 79 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  Key);.#endif /* 
11b70 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
11b80 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
11b90 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  ) */.  sqlite3Ex
11ba0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
11bb0 20 70 46 72 6f 6d 43 6f 6c 29 3b 0a 20 20 73 71   pFromCol);.  sq
11bc0 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
11bd0 65 74 65 28 64 62 2c 20 70 54 6f 43 6f 6c 29 3b  ete(db, pToCol);
11be0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
11bf0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
11c00 20 77 68 65 6e 20 61 6e 20 49 4e 49 54 49 41 4c   when an INITIAL
11c10 4c 59 20 49 4d 4d 45 44 49 41 54 45 20 6f 72 20  LY IMMEDIATE or 
11c20 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
11c30 45 44 0a 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  ED.** clause is 
11c40 73 65 65 6e 20 61 73 20 70 61 72 74 20 6f 66 20  seen as part of 
11c50 61 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  a foreign key de
11c60 66 69 6e 69 74 69 6f 6e 2e 20 20 54 68 65 20 69  finition.  The i
11c70 73 44 65 66 65 72 72 65 64 0a 2a 2a 20 70 61 72  sDeferred.** par
11c80 61 6d 65 74 65 72 20 69 73 20 31 20 66 6f 72 20  ameter is 1 for 
11c90 49 4e 49 54 49 41 4c 4c 59 20 44 45 46 45 52 52  INITIALLY DEFERR
11ca0 45 44 20 61 6e 64 20 30 20 66 6f 72 20 49 4e 49  ED and 0 for INI
11cb0 54 49 41 4c 4c 59 20 49 4d 4d 45 44 49 41 54 45  TIALLY IMMEDIATE
11cc0 2e 0a 2a 2a 20 54 68 65 20 62 65 68 61 76 69 6f  ..** The behavio
11cd0 72 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  r of the most re
11ce0 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64 20 66  cently created f
11cf0 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20 61 64  oreign key is ad
11d00 6a 75 73 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64  justed.** accord
11d10 69 6e 67 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ingly..*/.void s
11d20 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65 69  qlite3DeferForei
11d30 67 6e 4b 65 79 28 50 61 72 73 65 20 2a 70 50 61  gnKey(Parse *pPa
11d40 72 73 65 2c 20 69 6e 74 20 69 73 44 65 66 65 72  rse, int isDefer
11d50 72 65 64 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  red){.#ifndef SQ
11d60 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
11d70 4e 5f 4b 45 59 0a 20 20 54 61 62 6c 65 20 2a 70  N_KEY.  Table *p
11d80 54 61 62 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  Tab;.  FKey *pFK
11d90 65 79 3b 0a 20 20 69 66 28 20 28 70 54 61 62 20  ey;.  if( (pTab 
11da0 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
11db0 62 6c 65 29 3d 3d 30 20 7c 7c 20 28 70 46 4b 65  ble)==0 || (pFKe
11dc0 79 20 3d 20 70 54 61 62 2d 3e 70 46 4b 65 79 29  y = pTab->pFKey)
11dd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
11de0 61 73 73 65 72 74 28 20 69 73 44 65 66 65 72 72  assert( isDeferr
11df0 65 64 3d 3d 30 20 7c 7c 20 69 73 44 65 66 65 72  ed==0 || isDefer
11e00 72 65 64 3d 3d 31 20 29 3b 0a 20 20 70 46 4b 65  red==1 );.  pFKe
11e10 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
11e20 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
11e30 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
11e40 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
11e50 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
11e60 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
11e70 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
11e80 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
11e90 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
11ea0 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
11eb0 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
11ec0 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
11ed0 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
11ee0 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
11ef0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
11f00 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
11f10 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
11f20 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
11f30 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
11f40 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
11f50 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
11f60 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
11f70 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
11f80 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
11f90 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
11fa0 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
11fb0 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
11fc0 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
11fd0 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
11fe0 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
11ff0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
12000 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
12010 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
12020 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
12030 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
12040 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
12050 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12060 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
12070 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
12080 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
12090 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
120a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
120b0 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
120c0 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
120d0 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
120e0 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
120f0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
12100 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
12110 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
12120 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
12130 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
12140 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
12150 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
12160 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  dex */.  int add
12170 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r1;             
12180 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
12190 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f  ss of top of loo
121a0 70 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b  p */.  int tnum;
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
121c0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
121d0 67 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  ge of index */. 
121e0 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20   Vdbe *v;       
121f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12200 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
12210 20 69 6e 74 6f 20 74 68 69 73 20 76 69 72 74 75   into this virtu
12220 61 6c 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  al machine */.  
12230 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 20 20  KeyInfo *pKey;  
12240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12250 2a 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 69 6e  * KeyInfo for in
12260 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  dex */.  int reg
12270 49 64 78 4b 65 79 3b 20 20 20 20 20 20 20 20 20  IdxKey;         
12280 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
12290 74 65 72 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ters containing 
122a0 74 68 65 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  the index key */
122b0 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f 72 64  .  int regRecord
122c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
122d0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f    /* Register ho
122e0 6c 64 69 6e 67 20 61 73 73 65 6d 62 6c 69 65 64  lding assemblied
122f0 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f   index record */
12300 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
12310 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20   pParse->db;    
12320 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
12330 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
12340 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69    int iDb = sqli
12350 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
12360 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63  (db, pIndex->pSc
12370 68 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20  hema);..#ifndef 
12380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
12390 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
123a0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
123b0 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
123c0 52 45 49 4e 44 45 58 2c 20 70 49 6e 64 65 78 2d  REINDEX, pIndex-
123d0 3e 7a 4e 61 6d 65 2c 20 30 2c 0a 20 20 20 20 20  >zName, 0,.     
123e0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
123f0 61 6d 65 20 29 20 29 7b 0a 20 20 20 20 72 65 74  ame ) ){.    ret
12400 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
12410 0a 20 20 2f 2a 20 52 65 71 75 69 72 65 20 61 20  .  /* Require a 
12420 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
12430 65 20 74 61 62 6c 65 20 74 6f 20 70 65 72 66 6f  e table to perfo
12440 72 6d 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  rm this operatio
12450 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 54 61  n */.  sqlite3Ta
12460 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
12470 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
12480 20 31 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   1, pTab->zName)
12490 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
124a0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
124b0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
124c0 74 75 72 6e 3b 0a 20 20 69 66 28 20 6d 65 6d 52  turn;.  if( memR
124d0 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ootPage>=0 ){.  
124e0 20 20 74 6e 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74    tnum = memRoot
124f0 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Page;.  }else{. 
12500 20 20 20 74 6e 75 6d 20 3d 20 70 49 6e 64 65 78     tnum = pIndex
12510 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 73 71 6c 69  ->tnum;.    sqli
12520 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12530 20 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c   OP_Clear, tnum,
12540 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 70 4b 65   iDb);.  }.  pKe
12550 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65 78  y = sqlite3Index
12560 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c 20  Keyinfo(pParse, 
12570 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
12580 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12590 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 69 49  OP_OpenWrite, iI
125a0 64 78 2c 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a  dx, tnum, iDb, .
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 20 20 28 63 68 61 72 20 2a 29 70 4b 65 79      (char *)pKey
125d0 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e  , P4_KEYINFO_HAN
125e0 44 4f 46 46 29 3b 0a 20 20 69 66 28 20 6d 65 6d  DOFF);.  if( mem
125f0 52 6f 6f 74 50 61 67 65 3e 3d 30 20 29 7b 0a 20  RootPage>=0 ){. 
12600 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
12610 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a 20 20  angeP5(v, 1);.  
12620 7d 0a 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54  }.  sqlite3OpenT
12630 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69 54 61  able(pParse, iTa
12640 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f 50  b, iDb, pTab, OP
12650 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 61 64  _OpenRead);.  ad
12660 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
12670 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
12680 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
12690 20 20 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71    regRecord = sq
126a0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
126b0 70 50 61 72 73 65 29 3b 0a 20 20 72 65 67 49 64  pParse);.  regId
126c0 78 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 47 65  xKey = sqlite3Ge
126d0 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70  nerateIndexKey(p
126e0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 69  Parse, pIndex, i
126f0 54 61 62 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  Tab, regRecord, 
12700 31 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  1);.  if( pIndex
12710 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
12720 6e 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31  ne ){.    int j1
12730 2c 20 6a 32 3b 0a 20 20 20 20 69 6e 74 20 72 65  , j2;.    int re
12740 67 52 6f 77 69 64 3b 0a 0a 20 20 20 20 72 65 67  gRowid;..    reg
12750 52 6f 77 69 64 20 3d 20 72 65 67 49 64 78 4b 65  Rowid = regIdxKe
12760 79 20 2b 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  y + pIndex->nCol
12770 75 6d 6e 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  umn;.    j1 = sq
12780 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12790 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65  v, OP_IsNull, re
127a0 67 49 64 78 4b 65 79 2c 20 30 2c 20 70 49 6e 64  gIdxKey, 0, pInd
127b0 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  ex->nColumn);.  
127c0 20 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64    j2 = sqlite3Vd
127d0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 49  beAddOp4(v, OP_I
127e0 73 55 6e 69 71 75 65 2c 20 69 49 64 78 2c 0a 20  sUnique, iIdx,. 
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 20 20 20 20 20 20 20 20 20 20 30 2c 20 72 65 67            0, reg
12810 52 6f 77 69 64 2c 20 53 51 4c 49 54 45 5f 49 4e  Rowid, SQLITE_IN
12820 54 5f 54 4f 5f 50 54 52 28 72 65 67 52 65 63 6f  T_TO_PTR(regReco
12830 72 64 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  rd), P4_INT32);.
12840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12850 64 64 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74  ddOp4(v, OP_Halt
12860 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
12870 49 4e 54 2c 20 4f 45 5f 41 62 6f 72 74 2c 20 30  INT, OE_Abort, 0
12880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12890 20 20 20 20 20 20 22 69 6e 64 65 78 65 64 20 63        "indexed c
128a0 6f 6c 75 6d 6e 73 20 61 72 65 20 6e 6f 74 20 75  olumns are not u
128b0 6e 69 71 75 65 22 2c 20 50 34 5f 53 54 41 54 49  nique", P4_STATI
128c0 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  C);.    sqlite3V
128d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
128e0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  1);.    sqlite3V
128f0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
12900 32 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  2);.  }.  sqlite
12910 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
12920 50 5f 49 64 78 49 6e 73 65 72 74 2c 20 69 49 64  P_IdxInsert, iId
12930 78 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20  x, regRecord);. 
12940 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
12950 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
12960 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
12970 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
12980 2c 20 4f 50 5f 4e 65 78 74 2c 20 69 54 61 62 2c  , OP_Next, iTab,
12990 20 61 64 64 72 31 2b 31 29 3b 0a 20 20 73 71 6c   addr1+1);.  sql
129a0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
129b0 28 76 2c 20 61 64 64 72 31 29 3b 0a 20 20 73 71  (v, addr1);.  sq
129c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
129d0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 54 61  v, OP_Close, iTa
129e0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  b);.  sqlite3Vdb
129f0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
12a00 6f 73 65 2c 20 69 49 64 78 29 3b 0a 7d 0a 0a 2f  ose, iIdx);.}../
12a10 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
12a20 77 20 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53  w index for an S
12a30 51 4c 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65  QL table.  pName
12a40 31 2e 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20  1.pName2 is the 
12a50 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
12a60 78 20 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69  x .** and pTblLi
12a70 73 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  st is the name o
12a80 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
12a90 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
12aa0 64 2e 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a  d.  Both will .*
12ab0 2a 20 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20  * be NULL for a 
12ac0 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61  primary key or a
12ad0 6e 20 69 6e 64 65 78 20 74 68 61 74 20 69 73 20  n index that is 
12ae0 63 72 65 61 74 65 64 20 74 6f 20 73 61 74 69 73  created to satis
12af0 66 79 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63  fy a.** UNIQUE c
12b00 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70  onstraint.  If p
12b10 54 61 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78  Table and pIndex
12b20 20 61 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70   are NULL, use p
12b30 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
12b40 0a 2a 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65  .** as the table
12b50 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
12b60 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
12b70 6c 65 20 69 73 20 61 20 74 61 62 6c 65 20 74 68  le is a table th
12b80 61 74 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74  at is.** current
12b90 6c 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  ly being constru
12ba0 63 74 65 64 20 62 79 20 61 20 43 52 45 41 54 45  cted by a CREATE
12bb0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
12bc0 2e 0a 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73  ..**.** pList is
12bd0 20 61 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d   a list of colum
12be0 6e 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64  ns to be indexed
12bf0 2e 20 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65  .  pList will be
12c00 20 4e 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a   NULL if this.**
12c10 20 69 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65   is a primary ke
12c20 79 20 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73  y or unique-cons
12c30 74 72 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f  traint on the mo
12c40 73 74 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e  st recent column
12c50 20 61 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65   added.** to the
12c60 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
12c70 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
12c80 69 6f 6e 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ion.  .*/.void s
12c90 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
12ca0 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
12cb0 73 65 2c 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69  se,     /* All i
12cc0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
12cd0 20 74 68 69 73 20 70 61 72 73 65 20 2a 2f 0a 20   this parse */. 
12ce0 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20   Token *pName1, 
12cf0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72      /* First par
12d00 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e  t of index name.
12d10 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a   May be NULL */.
12d20 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c    Token *pName2,
12d30 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70       /* Second p
12d40 61 72 74 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d  art of index nam
12d50 65 2e 20 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a  e. May be NULL *
12d60 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 62  /.  SrcList *pTb
12d70 6c 4e 61 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20  lName, /* Table 
12d80 74 6f 20 69 6e 64 65 78 2e 20 55 73 65 20 70 50  to index. Use pP
12d90 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
12da0 69 66 20 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69  if 0 */.  ExprLi
12db0 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20  st *pList,   /* 
12dc0 41 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e  A list of column
12dd0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  s to be indexed 
12de0 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72  */.  int onError
12df0 2c 20 20 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62  ,       /* OE_Ab
12e00 6f 72 74 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20  ort, OE_Ignore, 
12e10 4f 45 5f 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f  OE_Replace, or O
12e20 45 5f 4e 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65  E_None */.  Toke
12e30 6e 20 2a 70 53 74 61 72 74 2c 20 20 20 20 20 2f  n *pStart,     /
12e40 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
12e50 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
12e60 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
12e70 0a 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20  .  Token *pEnd, 
12e80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 29 22        /* The ")"
12e90 20 74 68 61 74 20 63 6c 6f 73 65 73 20 74 68 65   that closes the
12ea0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
12eb0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  atement */.  int
12ec0 20 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20   sortOrder,     
12ed0 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66  /* Sort order of
12ee0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65   primary key whe
12ef0 6e 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f  n pList==NULL */
12f00 0a 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73  .  int ifNotExis
12f10 74 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72  t     /* Omit er
12f20 72 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72  ror if index alr
12f30 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
12f40 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
12f50 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c  = 0;     /* Tabl
12f60 65 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20  e to be indexed 
12f70 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64  */.  Index *pInd
12f80 65 78 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65  ex = 0;   /* The
12f90 20 69 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65   index to be cre
12fa0 61 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ated */.  char *
12fb0 7a 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f  zName = 0;     /
12fc0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
12fd0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  dex */.  int nNa
12fe0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  me;           /*
12ff0 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
13000 63 74 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a  cters in zName *
13010 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  /.  int i, j;.  
13020 54 6f 6b 65 6e 20 6e 75 6c 6c 49 64 3b 20 20 20  Token nullId;   
13030 20 20 20 20 20 2f 2a 20 46 61 6b 65 20 74 6f 6b       /* Fake tok
13040 65 6e 20 66 6f 72 20 61 6e 20 65 6d 70 74 79 20  en for an empty 
13050 49 44 20 6c 69 73 74 20 2a 2f 0a 20 20 44 62 46  ID list */.  DbF
13060 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20 20  ixer sFix;      
13070 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69    /* For assigni
13080 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ng database name
13090 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20  s to pTable */. 
130a0 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61   int sortOrderMa
130b0 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f  sk;   /* 1 to ho
130c0 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65  nor DESC in inde
130d0 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e  x.  0 to ignore.
130e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
130f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13100 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
13110 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70         /* The sp
13120 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e  ecific table con
13130 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
13140 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  xed database */.
13150 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
13160 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
13170 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13180 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77 72  that is being wr
13190 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  itten */.  Token
131a0 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20   *pName = 0;    
131b0 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e  /* Unqualified n
131c0 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
131d0 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20   to create */.  
131e0 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
131f0 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b  item *pListItem;
13200 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
13210 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20  over pList */.  
13220 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 69 6e 74 20  int nCol;.  int 
13230 6e 45 78 74 72 61 20 3d 20 30 3b 0a 20 20 63 68  nExtra = 0;.  ch
13240 61 72 20 2a 7a 45 78 74 72 61 3b 0a 0a 20 20 69  ar *zExtra;..  i
13250 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
13260 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
13270 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  led || IN_DECLAR
13280 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 67 6f  E_VTAB ){.    go
13290 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
132a0 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ndex;.  }..  /*.
132b0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 74 61    ** Find the ta
132c0 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
132d0 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65 74 75  e indexed.  Retu
132e0 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f 74 20  rn early if not 
132f0 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  found..  */.  if
13300 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b  ( pTblName!=0 ){
13310 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74 68 65  ..    /* Use the
13320 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65 78 20   two-part index 
13330 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
13340 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  e the database .
13350 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72 63 68      ** to search
13360 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20   for the table. 
13370 27 46 69 78 27 20 74 68 65 20 74 61 62 6c 65 20  'Fix' the table 
13380 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64 62 0a  name to this db.
13390 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 6c 6f      ** before lo
133a0 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74 61 62  oking up the tab
133b0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  le..    */.    a
133c0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20 26 26  ssert( pName1 &&
133d0 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20 20 69   pName2 );.    i
133e0 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50  Db = sqlite3TwoP
133f0 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  artName(pParse, 
13400 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20  pName1, pName2, 
13410 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  &pName);.    if(
13420 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20 65 78   iDb<0 ) goto ex
13430 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13440 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13450 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20 20  _OMIT_TEMPDB.   
13460 20 2f 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78   /* If the index
13470 20 6e 61 6d 65 20 77 61 73 20 75 6e 71 75 61 6c   name was unqual
13480 69 66 69 65 64 2c 20 63 68 65 63 6b 20 69 66 20  ified, check if 
13490 74 68 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  the the table.  
134a0 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74    ** is a temp t
134b0 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74  able. If so, set
134c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
134d0 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68   1. Do not do th
134e0 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69  is.    ** if ini
134f0 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61  tialising a data
13500 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20  base schema..   
13510 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d   */.    if( !db-
13520 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
13530 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74      pTab = sqlit
13540 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28  e3SrcListLookup(
13550 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65  pParse, pTblName
13560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61  );.      if( pNa
13570 6d 65 32 20 26 26 20 70 4e 61 6d 65 32 2d 3e 6e  me2 && pName2->n
13580 3d 3d 30 20 26 26 20 70 54 61 62 20 26 26 20 70  ==0 && pTab && p
13590 54 61 62 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62  Tab->pSchema==db
135a0 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
135b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 44 62 20   ){.        iDb 
135c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
135d0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
135e0 66 28 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69  f( sqlite3FixIni
135f0 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c  t(&sFix, pParse,
13600 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20 70   iDb, "index", p
13610 4e 61 6d 65 29 20 26 26 0a 20 20 20 20 20 20 20  Name) &&.       
13620 20 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69   sqlite3FixSrcLi
13630 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61  st(&sFix, pTblNa
13640 6d 65 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  me).    ){.     
13650 20 2f 2a 20 42 65 63 61 75 73 65 20 74 68 65 20   /* Because the 
13660 70 61 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74  parser construct
13670 73 20 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20  s pTblName from 
13680 61 20 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66  a single identif
13690 69 65 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71  ier,.      ** sq
136a0 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73 74 20  lite3FixSrcList 
136b0 63 61 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20  can never fail. 
136c0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
136d0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  0);.    }.    pT
136e0 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61  ab = sqlite3Loca
136f0 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  teTable(pParse, 
13700 30 2c 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  0, pTblName->a[0
13710 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20  ].zName, .      
13720 20 20 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30 5d    pTblName->a[0]
13730 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20  .zDatabase);.   
13740 20 69 66 28 20 21 70 54 61 62 20 7c 7c 20 64 62   if( !pTab || db
13750 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13760 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13770 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73  e_index;.    ass
13780 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
13790 5d 2e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ].pSchema==pTab-
137a0 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 7d 65  >pSchema );.  }e
137b0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
137c0 20 70 4e 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 20   pName==0 );.   
137d0 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   pTab = pParse->
137e0 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69  pNewTable;.    i
137f0 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20  f( !pTab ) goto 
13800 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13810 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  x;.    iDb = sql
13820 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
13830 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  x(db, pTab->pSch
13840 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20  ema);.  }.  pDb 
13850 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
13860 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
13870 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
13880 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
13890 74 65 5f 69 6e 64 65 78 3b 0a 20 20 69 66 28 20  te_index;.  if( 
138a0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
138b0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
138c0 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 0a 20  lite_", 7)==0 . 
138d0 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28        && memcmp(
138e0 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d 2c  &pTab->zName[7],
138f0 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21 3d  "altertab_",9)!=
13900 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
13910 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13920 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e   "table %s may n
13930 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c 20  ot be indexed", 
13940 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
13950 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13960 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 69  te_index;.  }.#i
13970 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13980 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54 61  T_VIEW.  if( pTa
13990 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
139a0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
139b0 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77 73  g(pParse, "views
139c0 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65   may not be inde
139d0 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  xed");.    goto 
139e0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
139f0 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  x;.  }.#endif.#i
13a00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13a10 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
13a20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
13a30 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
13a40 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13a50 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61 62  se, "virtual tab
13a60 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  les may not be i
13a70 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f  ndexed");.    go
13a80 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
13a90 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ndex;.  }.#endif
13aa0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
13ab0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
13ac0 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73 75   index.  Make su
13ad0 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20  re there is not 
13ae0 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 0a  already another.
13af0 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61    ** index or ta
13b00 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ble with the sam
13b10 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a 20  e name.  .  **. 
13b20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20 20   ** Exception:  
13b30 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69 6e  If we are readin
13b40 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 70  g the names of p
13b50 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65 73  ermanent indices
13b60 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 73   from the.  ** s
13b70 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
13b80 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d 65  le (because some
13b90 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 63   other process c
13ba0 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65 6d  hanged the schem
13bb0 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65 20  a) and.  ** one 
13bc0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d  of the index nam
13bd0 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74 68  es collides with
13be0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74   the name of a t
13bf0 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f  emporary table o
13c00 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74 68  r.  ** index, th
13c10 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69  en we will conti
13c20 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20 74  nue to process t
13c30 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  his index..  **.
13c40 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d 30    ** If pName==0
13c50 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
13c60 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c 69  e are.  ** deali
13c70 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61 72  ng with a primar
13c80 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45 20  y key or UNIQUE 
13c90 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65 20  constraint.  We 
13ca0 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20 6f  have to invent o
13cb0 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d 65  ur.  ** own name
13cc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e 61  ..  */.  if( pNa
13cd0 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  me ){.    zName 
13ce0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
13cf0 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65  mToken(db, pName
13d00 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  );.    if( SQLIT
13d10 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61  E_OK!=sqlite3Rea
13d20 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
13d30 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
13d40 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69 66  te_index;.    if
13d50 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74  ( zName==0 ) got
13d60 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
13d70 64 65 78 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  dex;.    if( SQL
13d80 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43  ITE_OK!=sqlite3C
13d90 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70  heckObjectName(p
13da0 50 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b  Parse, zName) ){
13db0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
13dc0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13dd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
13de0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
13df0 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
13e00 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
13e10 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20  chema(pParse) ) 
13e20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
13e30 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 69 66  _index;.      if
13e40 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
13e50 6c 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29  le(db, zName, 0)
13e60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=0 ){.        s
13e70 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
13e80 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
13e90 20 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65   already a table
13ea0 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d   named %s", zNam
13eb0 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
13ec0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13ed0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
13ee0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
13ef0 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a  3FindIndex(db, z
13f00 4e 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  Name, pDb->zName
13f10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
13f20 28 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b  ( !ifNotExist ){
13f30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13f40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
13f50 20 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61   "index %s alrea
13f60 64 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d  dy exists", zNam
13f70 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
13f80 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
13f90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
13fa0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
13fb0 20 6e 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   n;.    Index *p
13fc0 4c 6f 6f 70 3b 0a 20 20 20 20 66 6f 72 28 70 4c  Loop;.    for(pL
13fd0 6f 6f 70 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  oop=pTab->pIndex
13fe0 2c 20 6e 3d 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c  , n=1; pLoop; pL
13ff0 6f 6f 70 3d 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74  oop=pLoop->pNext
14000 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61  , n++){}.    zNa
14010 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  me = sqlite3MPri
14020 6e 74 66 28 64 62 2c 20 22 73 71 6c 69 74 65 5f  ntf(db, "sqlite_
14030 61 75 74 6f 69 6e 64 65 78 5f 25 73 5f 25 64 22  autoindex_%s_%d"
14040 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e  , pTab->zName, n
14050 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  );.    if( zName
14060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ==0 ){.      got
14070 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14080 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dex;.    }.  }..
14090 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
140a0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 74 6f 20  uthorization to 
140b0 63 72 65 61 74 65 20 61 6e 20 69 6e 64 65 78 2e  create an index.
140c0 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
140d0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
140e0 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20  IZATION.  {.    
140f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
14100 3d 20 70 44 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  = pDb->zName;.  
14110 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
14120 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
14130 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 53 43  QLITE_INSERT, SC
14140 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
14150 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
14160 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14170 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14180 20 20 20 20 69 20 3d 20 53 51 4c 49 54 45 5f 43      i = SQLITE_C
14190 52 45 41 54 45 5f 49 4e 44 45 58 3b 0a 20 20 20  REATE_INDEX;.   
141a0 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44   if( !OMIT_TEMPD
141b0 42 20 26 26 20 69 44 62 3d 3d 31 20 29 20 69 20  B && iDb==1 ) i 
141c0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
141d0 54 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20  TEMP_INDEX;.    
141e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
141f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 69 2c 20  heck(pParse, i, 
14200 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
14210 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
14220 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14230 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14240 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14250 20 49 66 20 70 4c 69 73 74 3d 3d 30 2c 20 69 74   If pList==0, it
14260 20 6d 65 61 6e 73 20 74 68 69 73 20 72 6f 75 74   means this rout
14270 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 20 74  ine was called t
14280 6f 20 6d 61 6b 65 20 61 20 70 72 69 6d 61 72 79  o make a primary
14290 0a 20 20 2a 2a 20 6b 65 79 20 6f 75 74 20 6f 66  .  ** key out of
142a0 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e   the last column
142b0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
142c0 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
142d0 75 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20  uction..  ** So 
142e0 63 72 65 61 74 65 20 61 20 66 61 6b 65 20 6c 69  create a fake li
142f0 73 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 74  st to simulate t
14300 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  his..  */.  if( 
14310 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
14320 6e 75 6c 6c 49 64 2e 7a 20 3d 20 28 75 38 2a 29  nullId.z = (u8*)
14330 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
14340 3e 6e 43 6f 6c 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a  >nCol-1].zName;.
14350 20 20 20 20 6e 75 6c 6c 49 64 2e 6e 20 3d 20 73      nullId.n = s
14360 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 28  qlite3Strlen30((
14370 63 68 61 72 2a 29 6e 75 6c 6c 49 64 2e 7a 29 3b  char*)nullId.z);
14380 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
14390 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
143a0 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  nd(pParse, 0, 0,
143b0 20 26 6e 75 6c 6c 49 64 29 3b 0a 20 20 20 20 69   &nullId);.    i
143c0 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f  f( pList==0 ) go
143d0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
143e0 6e 64 65 78 3b 0a 20 20 20 20 70 4c 69 73 74 2d  ndex;.    pList-
143f0 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 20  >a[0].sortOrder 
14400 3d 20 28 75 38 29 73 6f 72 74 4f 72 64 65 72 3b  = (u8)sortOrder;
14410 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
14420 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 62  e out how many b
14430 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 72  ytes of space ar
14440 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 73 74  e required to st
14450 6f 72 65 20 65 78 70 6c 69 63 69 74 6c 79 0a 20  ore explicitly. 
14460 20 2a 2a 20 73 70 65 63 69 66 69 65 64 20 63 6f   ** specified co
14470 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14480 20 6e 61 6d 65 73 2e 0a 20 20 2a 2f 0a 20 20 66   names..  */.  f
14490 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
144a0 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
144b0 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 0a 20    Expr *pExpr;. 
144c0 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
144d0 6c 3b 0a 20 20 20 20 69 66 28 20 28 70 45 78 70  l;.    if( (pExp
144e0 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  r = pList->a[i].
144f0 70 45 78 70 72 29 21 3d 30 20 26 26 20 28 70 43  pExpr)!=0 && (pC
14500 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
14510 6c 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ll)!=0 ){.      
14520 6e 45 78 74 72 61 20 2b 3d 20 28 31 20 2b 20 73  nExtra += (1 + s
14530 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
14540 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20  Coll->zName));. 
14550 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a     }.  }..  /* .
14560 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    ** Allocate th
14570 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
14580 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65  e. .  */.  nName
14590 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
145a0 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 43 6f  30(zName);.  nCo
145b0 6c 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  l = pList->nExpr
145c0 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  ;.  pIndex = sql
145d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
145e0 28 64 62 2c 20 0a 20 20 20 20 20 20 73 69 7a 65  (db, .      size
145f0 6f 66 28 49 6e 64 65 78 29 20 2b 20 20 20 20 20  of(Index) +     
14600 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14610 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
14620 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69 6e 74        sizeof(int
14630 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
14640 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f     /* Index.aiCo
14650 6c 75 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20  lumn   */.      
14660 73 69 7a 65 6f 66 28 69 6e 74 29 2a 28 6e 43 6f  sizeof(int)*(nCo
14670 6c 2b 31 29 20 2b 20 20 20 20 20 20 20 2f 2a 20  l+1) +       /* 
14680 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 20 20  Index.aiRowEst  
14690 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
146a0 28 63 68 61 72 20 2a 29 2a 6e 43 6f 6c 20 2b 20  (char *)*nCol + 
146b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
146c0 61 7a 43 6f 6c 6c 20 20 20 20 20 2a 2f 0a 20 20  azColl     */.  
146d0 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29 2a 6e      sizeof(u8)*n
146e0 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
146f0 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74 4f   /* Index.aSortO
14700 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 6e 4e  rder */.      nN
14710 61 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20  ame + 1 +       
14720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14730 64 65 78 2e 7a 4e 61 6d 65 20 20 20 20 20 20 2a  dex.zName      *
14740 2f 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 20  /.      nExtra  
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f       /* Collatio
14770 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
14780 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 64   */.  );.  if( d
14790 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
147a0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
147b0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
147c0 20 7d 0a 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43   }.  pIndex->azC
147d0 6f 6c 6c 20 3d 20 28 63 68 61 72 2a 2a 29 28 26  oll = (char**)(&
147e0 70 49 6e 64 65 78 5b 31 5d 29 3b 0a 20 20 70 49  pIndex[1]);.  pI
147f0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d  ndex->aiColumn =
14800 20 28 69 6e 74 20 2a 29 28 26 70 49 6e 64 65 78   (int *)(&pIndex
14810 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b  ->azColl[nCol]);
14820 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77  .  pIndex->aiRow
14830 45 73 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Est = (unsigned 
14840 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 43 6f  *)(&pIndex->aiCo
14850 6c 75 6d 6e 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70  lumn[nCol]);.  p
14860 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65  Index->aSortOrde
14870 72 20 3d 20 28 75 38 20 2a 29 28 26 70 49 6e 64  r = (u8 *)(&pInd
14880 65 78 2d 3e 61 69 52 6f 77 45 73 74 5b 6e 43 6f  ex->aiRowEst[nCo
14890 6c 2b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  l+1]);.  pIndex-
148a0 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 20 2a  >zName = (char *
148b0 29 28 26 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74  )(&pIndex->aSort
148c0 4f 72 64 65 72 5b 6e 43 6f 6c 5d 29 3b 0a 20 20  Order[nCol]);.  
148d0 7a 45 78 74 72 61 20 3d 20 28 63 68 61 72 20 2a  zExtra = (char *
148e0 29 28 26 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  )(&pIndex->zName
148f0 5b 6e 4e 61 6d 65 2b 31 5d 29 3b 0a 20 20 6d 65  [nName+1]);.  me
14900 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
14910 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
14920 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
14930 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
14940 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  pIndex->nColumn 
14950 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
14960 20 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f    pIndex->onErro
14970 72 20 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b  r = (u8)onError;
14980 0a 20 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49  .  pIndex->autoI
14990 6e 64 65 78 20 3d 20 28 75 38 29 28 70 4e 61 6d  ndex = (u8)(pNam
149a0 65 3d 3d 30 29 3b 0a 20 20 70 49 6e 64 65 78 2d  e==0);.  pIndex-
149b0 3e 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  >pSchema = db->a
149c0 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b  Db[iDb].pSchema;
149d0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
149e0 73 65 65 20 69 66 20 77 65 20 73 68 6f 75 6c 64  see if we should
149f0 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65 71 75   honor DESC requ
14a00 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20 63 6f  ests on index co
14a10 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69 66 28  lumns.  */.  if(
14a20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 66   pDb->pSchema->f
14a30 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b  ile_format>=4 ){
14a40 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61  .    sortOrderMa
14a50 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20 48 6f  sk = -1;   /* Ho
14a60 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20 7d 65  nor DESC */.  }e
14a70 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64  lse{.    sortOrd
14a80 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20 2f  erMask = 0;    /
14a90 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20 2a 2f  * Ignore DESC */
14aa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61 6e 20  .  }..  /* Scan 
14ab0 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
14ac0 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20   columns of the 
14ad0 74 61 62 6c 65 20 74 6f 20 62 65 20 69 6e 64 65  table to be inde
14ae0 78 65 64 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 61  xed and.  ** loa
14af0 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64  d the column ind
14b00 69 63 65 73 20 69 6e 74 6f 20 74 68 65 20 49 6e  ices into the In
14b10 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 20  dex structure.  
14b20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 0a  Report an error.
14b30 20 20 2a 2a 20 69 66 20 61 6e 79 20 63 6f 6c 75    ** if any colu
14b40 6d 6e 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2e  mn is not found.
14b50 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
14b60 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
14b70 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
14b80 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
14b90 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  tem++){.    cons
14ba0 74 20 63 68 61 72 20 2a 7a 43 6f 6c 4e 61 6d 65  t char *zColName
14bb0 20 3d 20 70 4c 69 73 74 49 74 65 6d 2d 3e 7a 4e   = pListItem->zN
14bc0 61 6d 65 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  ame;.    Column 
14bd0 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 20 20 69 6e  *pTabCol;.    in
14be0 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f  t requestedSortO
14bf0 72 64 65 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  rder;.    char *
14c00 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  zColl;          
14c10 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c           /* Coll
14c20 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
14c30 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 66 6f 72 28  ame */..    for(
14c40 6a 3d 30 2c 20 70 54 61 62 43 6f 6c 3d 70 54 61  j=0, pTabCol=pTa
14c50 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
14c60 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 54 61 62  >nCol; j++, pTab
14c70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
14c80 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
14c90 28 7a 43 6f 6c 4e 61 6d 65 2c 20 70 54 61 62 43  (zColName, pTabC
14ca0 6f 6c 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  ol->zName)==0 ) 
14cb0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
14cc0 20 69 66 28 20 6a 3e 3d 70 54 61 62 2d 3e 6e 43   if( j>=pTab->nC
14cd0 6f 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ol ){.      sqli
14ce0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14cf0 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 68 61  se, "table %s ha
14d00 73 20 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  s no column name
14d10 64 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70  d %s",.        p
14d20 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Tab->zName, zCol
14d30 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
14d40 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
14d50 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  dex;.    }.    /
14d60 2a 20 54 4f 44 4f 3a 20 20 41 64 64 20 61 20 74  * TODO:  Add a t
14d70 65 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  est to make sure
14d80 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63   that the same c
14d90 6f 6c 75 6d 6e 20 69 73 20 6e 6f 74 20 6e 61 6d  olumn is not nam
14da0 65 64 0a 20 20 20 20 2a 2a 20 6d 6f 72 65 20 74  ed.    ** more t
14db0 68 61 6e 20 6f 6e 63 65 20 77 69 74 68 69 6e 20  han once within 
14dc0 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 2e 20  the same index. 
14dd0 20 4f 6e 6c 79 20 74 68 65 20 66 69 72 73 74 20   Only the first 
14de0 69 6e 73 74 61 6e 63 65 20 6f 66 0a 20 20 20 20  instance of.    
14df0 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 20 77 69  ** the column wi
14e00 6c 6c 20 65 76 65 72 20 62 65 20 75 73 65 64 20  ll ever be used 
14e10 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72  by the optimizer
14e20 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 75 73 69  .  Note that usi
14e30 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 61  ng the.    ** sa
14e40 6d 65 20 63 6f 6c 75 6d 6e 20 6d 6f 72 65 20 74  me column more t
14e50 68 61 6e 20 6f 6e 63 65 20 63 61 6e 6e 6f 74 20  han once cannot 
14e60 62 65 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61  be an error beca
14e70 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 0a  use that would .
14e80 20 20 20 20 2a 2a 20 62 72 65 61 6b 20 62 61 63      ** break bac
14e90 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
14ea0 6c 69 74 79 20 2d 20 69 74 20 6e 65 65 64 73 20  lity - it needs 
14eb0 74 6f 20 62 65 20 61 20 77 61 72 6e 69 6e 67 2e  to be a warning.
14ec0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 64  .    */.    pInd
14ed0 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20  ex->aiColumn[i] 
14ee0 3d 20 6a 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  = j;.    if( pLi
14ef0 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 20 26 26  stItem->pExpr &&
14f00 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
14f10 72 2d 3e 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  r->pColl ){.    
14f20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 49    assert( pListI
14f30 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
14f40 6c 20 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  l );.      zColl
14f50 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
14f60 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
14f70 66 28 6e 45 78 74 72 61 2c 20 7a 45 78 74 72 61  f(nExtra, zExtra
14f80 2c 20 22 25 73 22 2c 20 70 4c 69 73 74 49 74 65  , "%s", pListIte
14f90 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 2d  m->pExpr->pColl-
14fa0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a  >zName);.      z
14fb0 45 78 74 72 61 20 2b 3d 20 28 73 71 6c 69 74 65  Extra += (sqlite
14fc0 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
14fd0 20 2b 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65   + 1);.    }else
14fe0 7b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  {.      zColl = 
14ff0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43  pTab->aCol[j].zC
15000 6f 6c 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 21  oll;.      if( !
15010 7a 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  zColl ){.       
15020 20 7a 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   zColl = db->pDf
15030 6c 74 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20  ltColl->zName;. 
15040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15050 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
15060 75 73 79 20 26 26 20 21 73 71 6c 69 74 65 33 4c  usy && !sqlite3L
15070 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61  ocateCollSeq(pPa
15080 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29 20  rse, zColl, -1) 
15090 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
150a0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
150b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65  .    }.    pInde
150c0 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a  x->azColl[i] = z
150d0 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73  Coll;.    reques
150e0 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70  tedSortOrder = p
150f0 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  ListItem->sortOr
15100 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d  der & sortOrderM
15110 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d  ask;.    pIndex-
15120 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d  >aSortOrder[i] =
15130 20 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f   (u8)requestedSo
15140 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 73  rtOrder;.  }.  s
15150 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77  qlite3DefaultRow
15160 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 0a 20 20  Est(pIndex);..  
15170 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65  if( pTab==pParse
15180 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20  ->pNewTable ){. 
15190 20 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69     /* This routi
151a0 6e 65 20 68 61 73 20 62 65 65 6e 20 63 61 6c 6c  ne has been call
151b0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20  ed to create an 
151c0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
151d0 61 73 20 61 0a 20 20 20 20 2a 2a 20 72 65 73 75  as a.    ** resu
151e0 6c 74 20 6f 66 20 61 20 50 52 49 4d 41 52 59 20  lt of a PRIMARY 
151f0 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63 6c  KEY or UNIQUE cl
15200 61 75 73 65 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  ause on a column
15210 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 6f 72 0a   definition, or.
15220 20 20 20 20 2a 2a 20 61 20 50 52 49 4d 41 52 59      ** a PRIMARY
15230 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 63   KEY or UNIQUE c
15240 6c 61 75 73 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  lause following 
15250 74 68 65 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  the column defin
15260 69 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 69  itions..    ** i
15270 2e 65 2e 20 6f 6e 65 20 6f 66 3a 0a 20 20 20 20  .e. one of:.    
15280 2a 2a 0a 20 20 20 20 2a 2a 20 43 52 45 41 54 45  **.    ** CREATE
15290 20 54 41 42 4c 45 20 74 28 78 20 50 52 49 4d 41   TABLE t(x PRIMA
152a0 52 59 20 4b 45 59 2c 20 79 29 3b 0a 20 20 20 20  RY KEY, y);.    
152b0 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
152c0 74 28 78 2c 20 79 2c 20 55 4e 49 51 55 45 28 78  t(x, y, UNIQUE(x
152d0 2c 20 79 29 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  , y));.    **.  
152e0 20 20 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c    ** Either way,
152f0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
15300 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61   the table alrea
15310 64 79 20 68 61 73 20 73 75 63 68 20 61 6e 20 69  dy has such an i
15320 6e 64 65 78 2e 20 49 66 0a 20 20 20 20 2a 2a 20  ndex. If.    ** 
15330 73 6f 2c 20 64 6f 6e 27 74 20 62 6f 74 68 65 72  so, don't bother
15340 20 63 72 65 61 74 69 6e 67 20 74 68 69 73 20 6f   creating this o
15350 6e 65 2e 20 54 68 69 73 20 6f 6e 6c 79 20 61 70  ne. This only ap
15360 70 6c 69 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20  plies to.    ** 
15370 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 72  automatically cr
15380 65 61 74 65 64 20 69 6e 64 69 63 65 73 2e 20 55  eated indices. U
15390 73 65 72 73 20 63 61 6e 20 64 6f 20 61 73 20 74  sers can do as t
153a0 68 65 79 20 77 69 73 68 20 77 69 74 68 0a 20 20  hey wish with.  
153b0 20 20 2a 2a 20 65 78 70 6c 69 63 69 74 20 69 6e    ** explicit in
153c0 64 69 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  dices..    */.  
153d0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
153e0 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62     for(pIdx=pTab
153f0 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20  ->pIndex; pIdx; 
15400 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74  pIdx=pIdx->pNext
15410 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a  ){.      int k;.
15420 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
15430 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
15440 4e 6f 6e 65 20 29 3b 0a 20 20 20 20 20 20 61 73  None );.      as
15450 73 65 72 74 28 20 70 49 64 78 2d 3e 61 75 74 6f  sert( pIdx->auto
15460 49 6e 64 65 78 20 29 3b 0a 20 20 20 20 20 20 61  Index );.      a
15470 73 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 6f  ssert( pIndex->o
15480 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
15490 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49  );..      if( pI
154a0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 21 3d 70 49 6e  dx->nColumn!=pIn
154b0 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 20 63  dex->nColumn ) c
154c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
154d0 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
154e0 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20  nColumn; k++){. 
154f0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
15500 72 20 2a 7a 31 20 3d 20 70 49 64 78 2d 3e 61 7a  r *z1 = pIdx->az
15510 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  Coll[k];.       
15520 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 32 20   const char *z2 
15530 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
15540 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [k];.        if(
15550 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
15560 6b 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f  k]!=pIndex->aiCo
15570 6c 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  lumn[k] ) break;
15580 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
15590 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  x->aSortOrder[k]
155a0 21 3d 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f  !=pIndex->aSortO
155b0 72 64 65 72 5b 6b 5d 20 29 20 62 72 65 61 6b 3b  rder[k] ) break;
155c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 31 21  .        if( z1!
155d0 3d 7a 32 20 26 26 20 73 71 6c 69 74 65 33 53 74  =z2 && sqlite3St
155e0 72 49 43 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20  rICmp(z1, z2) ) 
155f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
15600 20 20 20 20 20 69 66 28 20 6b 3d 3d 70 49 64 78       if( k==pIdx
15610 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->nColumn ){.   
15620 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6f       if( pIdx->o
15630 6e 45 72 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e  nError!=pIndex->
15640 6f 6e 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20  onError ){.     
15650 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e       /* This con
15660 73 74 72 61 69 6e 74 20 63 72 65 61 74 65 73 20  straint creates 
15670 74 68 65 20 73 61 6d 65 20 69 6e 64 65 78 20 61  the same index a
15680 73 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20 20  s a previous.   
15690 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72         ** constr
156a0 61 69 6e 74 20 73 70 65 63 69 66 69 65 64 20 73  aint specified s
156b0 6f 6d 65 77 68 65 72 65 20 69 6e 20 74 68 65 20  omewhere in the 
156c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
156d0 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20 20 20  tement..        
156e0 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 74 68 65    ** However the
156f0 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61   ON CONFLICT cla
15700 75 73 65 73 20 61 72 65 20 64 69 66 66 65 72 65  uses are differe
15710 6e 74 2e 20 49 66 20 62 6f 74 68 20 74 68 69 73  nt. If both this
15720 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63   .          ** c
15730 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68  onstraint and th
15740 65 20 70 72 65 76 69 6f 75 73 20 65 71 75 69 76  e previous equiv
15750 61 6c 65 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74  alent constraint
15760 20 68 61 76 65 20 65 78 70 6c 69 63 69 74 0a 20   have explicit. 
15770 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43           ** ON C
15780 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
15790 74 68 69 73 20 69 73 20 61 6e 20 65 72 72 6f 72  this is an error
157a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65  . Otherwise, use
157b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
157c0 2a 20 65 78 70 6c 69 63 69 74 6c 79 20 73 70 65  * explicitly spe
157d0 63 69 66 69 65 64 20 62 65 68 61 76 69 6f 75 72  cified behaviour
157e0 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 2e 0a   for the index..
157f0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
15800 20 20 20 20 20 20 20 69 66 28 20 21 28 70 49 64         if( !(pId
15810 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44  x->onError==OE_D
15820 65 66 61 75 6c 74 20 7c 7c 20 70 49 6e 64 65 78  efault || pIndex
15830 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65  ->onError==OE_De
15840 66 61 75 6c 74 29 20 29 7b 0a 20 20 20 20 20 20  fault) ){.      
15850 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15860 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
15870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15880 63 6f 6e 66 6c 69 63 74 69 6e 67 20 4f 4e 20 43  conflicting ON C
15890 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20  ONFLICT clauses 
158a0 73 70 65 63 69 66 69 65 64 22 2c 20 30 29 3b 0a  specified", 0);.
158b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
158c0 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
158d0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61  onError==OE_Defa
158e0 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ult ){.         
158f0 20 20 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72     pIdx->onError
15900 20 3d 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72   = pIndex->onErr
15910 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  or;.          }.
15920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15930 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
15940 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20  te_index;.      
15950 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
15960 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49  * Link the new I
15970 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74  ndex structure t
15980 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20  o its table and 
15990 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a  to the other.  *
159a0 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
159b0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73 2e  base structures.
159c0 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d   .  */.  if( db-
159d0 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20  >init.busy ){.  
159e0 20 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20    Index *p;.    
159f0 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49  p = sqlite3HashI
15a00 6e 73 65 72 74 28 26 70 49 6e 64 65 78 2d 3e 70  nsert(&pIndex->p
15a10 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
15a20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
15a30 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e 64              pInd
15a40 65 78 2d 3e 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  ex->zName, sqlit
15a50 65 33 53 74 72 6c 65 6e 33 30 28 70 49 6e 64 65  e3Strlen30(pInde
15a60 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  x->zName),.     
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a80 20 20 20 20 20 70 49 6e 64 65 78 29 3b 0a 20 20       pIndex);.  
15a90 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20    if( p ){.     
15aa0 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64   assert( p==pInd
15ab0 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63  ex );  /* Malloc
15ac0 20 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65   must have faile
15ad0 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d  d */.      db->m
15ae0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
15af0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
15b00 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
15b10 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61     }.    db->fla
15b20 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74  gs |= SQLITE_Int
15b30 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20  ernChanges;.    
15b40 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
15b50 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
15b60 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74  >tnum = db->init
15b70 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a  .newTnum;.    }.
15b80 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
15b90 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
15ba0 73 20 30 20 74 68 65 6e 20 63 72 65 61 74 65 20  s 0 then create 
15bb0 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 64 69 73  the index on dis
15bc0 6b 2e 20 20 54 68 69 73 0a 20 20 2a 2a 20 69 6e  k.  This.  ** in
15bd0 76 6f 6c 76 65 73 20 77 72 69 74 69 6e 67 20 74  volves writing t
15be0 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20 74 68  he index into th
15bf0 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e master table a
15c00 6e 64 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68  nd filling in th
15c10 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 77 69 74  e.  ** index wit
15c20 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  h the current ta
15c30 62 6c 65 20 63 6f 6e 74 65 6e 74 73 2e 0a 20 20  ble contents..  
15c40 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 64 62 2d 3e  **.  ** The db->
15c50 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 77  init.busy is 0 w
15c60 68 65 6e 20 74 68 65 20 75 73 65 72 20 66 69 72  hen the user fir
15c70 73 74 20 65 6e 74 65 72 73 20 61 20 43 52 45 41  st enters a CREA
15c80 54 45 20 49 4e 44 45 58 20 0a 20 20 2a 2a 20 63  TE INDEX .  ** c
15c90 6f 6d 6d 61 6e 64 2e 20 20 64 62 2d 3e 69 6e 69  ommand.  db->ini
15ca0 74 2e 62 75 73 79 20 69 73 20 31 20 77 68 65 6e  t.busy is 1 when
15cb0 20 61 20 64 61 74 61 62 61 73 65 20 69 73 20 6f   a database is o
15cc0 70 65 6e 65 64 20 61 6e 64 20 0a 20 20 2a 2a 20  pened and .  ** 
15cd0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
15ce0 74 65 6d 65 6e 74 73 20 61 72 65 20 72 65 61 64  tements are read
15cf0 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 73 74   out of the mast
15d00 65 72 20 74 61 62 6c 65 2e 20 20 49 6e 0a 20 20  er table.  In.  
15d10 2a 2a 20 74 68 65 20 6c 61 74 74 65 72 20 63 61  ** the latter ca
15d20 73 65 20 74 68 65 20 69 6e 64 65 78 20 61 6c 72  se the index alr
15d30 65 61 64 79 20 65 78 69 73 74 73 20 6f 6e 20 64  eady exists on d
15d40 69 73 6b 2c 20 77 68 69 63 68 20 69 73 20 77 68  isk, which is wh
15d50 79 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  y.  ** we don't 
15d60 77 61 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65  want to recreate
15d70 20 69 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49   it..  **.  ** I
15d80 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74  f pTblName==0 it
15d90 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65   means this inde
15da0 78 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61  x is generated a
15db0 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 0a  s a primary key.
15dc0 20 20 2a 2a 20 6f 72 20 55 4e 49 51 55 45 20 63    ** or UNIQUE c
15dd0 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 61 20 43  onstraint of a C
15de0 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
15df0 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65 20 74 68  ement.  Since th
15e00 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 68 61 73  e table.  ** has
15e10 20 6a 75 73 74 20 62 65 65 6e 20 63 72 65 61 74   just been creat
15e20 65 64 2c 20 69 74 20 63 6f 6e 74 61 69 6e 73 20  ed, it contains 
15e30 6e 6f 20 64 61 74 61 20 61 6e 64 20 74 68 65 20  no data and the 
15e40 69 6e 64 65 78 20 69 6e 69 74 69 61 6c 69 7a 61  index initializa
15e50 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65 70 20 63  tion.  ** step c
15e60 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e 0a 20  an be skipped.. 
15e70 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 64   */.  else if( d
15e80 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
15e90 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
15ea0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
15eb0 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
15ec0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
15ed0 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
15ee0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
15ef0 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
15f00 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
15f10 5f 69 6e 64 65 78 3b 0a 0a 0a 20 20 20 20 2f 2a  _index;...    /*
15f20 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
15f30 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64  page for the ind
15f40 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  ex.    */.    sq
15f50 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
15f60 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
15f70 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71   1, iDb);.    sq
15f80 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15f90 76 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65  v, OP_CreateInde
15fa0 78 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a  x, iDb, iMem);..
15fb0 20 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68      /* Gather th
15fc0 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20  e complete text 
15fd0 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e  of the CREATE IN
15fe0 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  DEX statement in
15ff0 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53  to.    ** the zS
16000 74 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20  tmt variable.   
16010 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61   */.    if( pSta
16020 72 74 20 26 26 20 70 45 6e 64 20 29 7b 0a 20 20  rt && pEnd ){.  
16030 20 20 20 20 2f 2a 20 41 20 6e 61 6d 65 64 20 69      /* A named i
16040 6e 64 65 78 20 77 69 74 68 20 61 6e 20 65 78 70  ndex with an exp
16050 6c 69 63 69 74 20 43 52 45 41 54 45 20 49 4e 44  licit CREATE IND
16060 45 58 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  EX statement */.
16070 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 73 71        zStmt = sq
16080 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
16090 20 22 43 52 45 41 54 45 25 73 20 49 4e 44 45 58   "CREATE%s INDEX
160a0 20 25 2e 2a 73 22 2c 0a 20 20 20 20 20 20 20 20   %.*s",.        
160b0 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65  onError==OE_None
160c0 20 3f 20 22 22 20 3a 20 22 20 55 4e 49 51 55 45   ? "" : " UNIQUE
160d0 22 2c 0a 20 20 20 20 20 20 20 20 70 45 6e 64 2d  ",.        pEnd-
160e0 3e 7a 20 2d 20 70 4e 61 6d 65 2d 3e 7a 20 2b 20  >z - pName->z + 
160f0 31 2c 0a 20 20 20 20 20 20 20 20 70 4e 61 6d 65  1,.        pName
16100 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
16110 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
16120 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
16130 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
16140 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
16150 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
16160 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
16170 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
16180 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
16190 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
161a0 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
161b0 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
161c0 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
161d0 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
161e0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
161f0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
16200 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
16210 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
16220 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29  x',%Q,%Q,#%d,%Q)
16230 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
16240 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
16250 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
16260 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
16270 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
16280 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
16290 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
162a0 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
162b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
162c0 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
162d0 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
162e0 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
162f0 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
16300 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
16310 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
16320 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
16330 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
16340 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
16350 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
16360 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
16370 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
16380 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
16390 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
163a0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
163b0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
163c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
163d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 50 61  eAddOp4(v, OP_Pa
163e0 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
163f0 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 73  0, 0,.         s
16400 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
16410 2c 20 22 6e 61 6d 65 3d 27 25 71 27 22 2c 20 70  , "name='%q'", p
16420 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 29 2c 20 50  Index->zName), P
16430 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  4_DYNAMIC);.    
16440 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16450 4f 70 31 28 76 2c 20 4f 50 5f 45 78 70 69 72 65  Op1(v, OP_Expire
16460 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
16470 0a 20 20 2f 2a 20 57 68 65 6e 20 61 64 64 69 6e  .  /* When addin
16480 67 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 74 68  g an index to th
16490 65 20 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65  e list of indice
164a0 73 20 66 6f 72 20 61 20 74 61 62 6c 65 2c 20 6d  s for a table, m
164b0 61 6b 65 0a 20 20 2a 2a 20 73 75 72 65 20 61 6c  ake.  ** sure al
164c0 6c 20 69 6e 64 69 63 65 73 20 6c 61 62 65 6c 65  l indices labele
164d0 64 20 4f 45 5f 52 65 70 6c 61 63 65 20 63 6f 6d  d OE_Replace com
164e0 65 20 61 66 74 65 72 20 61 6c 6c 20 74 68 6f 73  e after all thos
164f0 65 20 6c 61 62 65 6c 65 64 0a 20 20 2a 2a 20 4f  e labeled.  ** O
16500 45 5f 49 67 6e 6f 72 65 2e 20 20 54 68 69 73 20  E_Ignore.  This 
16510 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
16520 20 74 68 65 20 63 6f 72 72 65 63 74 20 6f 70 65   the correct ope
16530 72 61 74 69 6f 6e 20 6f 66 20 55 50 44 41 54 45  ration of UPDATE
16540 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 53 45 52 54  .  ** and INSERT
16550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
16560 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20 70 54  >init.busy || pT
16570 62 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  blName==0 ){.   
16580 20 69 66 28 20 6f 6e 45 72 72 6f 72 21 3d 4f 45   if( onError!=OE
16590 5f 52 65 70 6c 61 63 65 20 7c 7c 20 70 54 61 62  _Replace || pTab
165a0 2d 3e 70 49 6e 64 65 78 3d 3d 30 0a 20 20 20 20  ->pIndex==0.    
165b0 20 20 20 20 20 7c 7c 20 70 54 61 62 2d 3e 70 49       || pTab->pI
165c0 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f  ndex->onError==O
165d0 45 5f 52 65 70 6c 61 63 65 29 7b 0a 20 20 20 20  E_Replace){.    
165e0 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 20    pIndex->pNext 
165f0 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a  = pTab->pIndex;.
16600 20 20 20 20 20 20 70 54 61 62 2d 3e 70 49 6e 64        pTab->pInd
16610 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20  ex = pIndex;.   
16620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e   }else{.      In
16630 64 65 78 20 2a 70 4f 74 68 65 72 20 3d 20 70 54  dex *pOther = pT
16640 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  ab->pIndex;.    
16650 20 20 77 68 69 6c 65 28 20 70 4f 74 68 65 72 2d    while( pOther-
16660 3e 70 4e 65 78 74 20 26 26 20 70 4f 74 68 65 72  >pNext && pOther
16670 2d 3e 70 4e 65 78 74 2d 3e 6f 6e 45 72 72 6f 72  ->pNext->onError
16680 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20 29 7b 0a  !=OE_Replace ){.
16690 20 20 20 20 20 20 20 20 70 4f 74 68 65 72 20 3d          pOther =
166a0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a   pOther->pNext;.
166b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
166c0 6e 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 4f  ndex->pNext = pO
166d0 74 68 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ther->pNext;.   
166e0 20 20 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74     pOther->pNext
166f0 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d   = pIndex;.    }
16700 0a 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b  .    pIndex = 0;
16710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e  .  }..  /* Clean
16720 20 75 70 20 62 65 66 6f 72 65 20 65 78 69 74 69   up before exiti
16730 6e 67 20 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74  ng */.exit_creat
16740 65 5f 69 6e 64 65 78 3a 0a 20 20 69 66 28 20 70  e_index:.  if( p
16750 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
16760 69 74 65 33 5f 66 72 65 65 28 70 49 6e 64 65 78  ite3_free(pIndex
16770 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20  ->zColAff);.    
16780 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16790 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  , pIndex);.  }. 
167a0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
167b0 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
167c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
167d0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
167e0 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
167f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
16800 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
16810 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
16820 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75   code to make su
16830 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  re the file form
16840 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20  at number is at 
16850 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e  least minFormat.
16860 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65  .** The generate
16870 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72  d code will incr
16880 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f  ease the file fo
16890 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e  rmat number if n
168a0 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69  ecessary..*/.voi
168b0 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d  d sqlite3Minimum
168c0 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65  FileFormat(Parse
168d0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
168e0 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74  b, int minFormat
168f0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
16900 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
16910 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
16920 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ( v ){.    int r
16930 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
16940 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16950 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
16960 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
16970 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 6a  arse);.    int j
16980 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
16990 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
169a0 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
169b0 72 31 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  r1, 1);.    sqli
169c0 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
169d0 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  (v, iDb);.    sq
169e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
169f0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
16a00 69 6e 46 6f 72 6d 61 74 2c 20 72 32 29 3b 0a 20  inFormat, r2);. 
16a10 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
16a20 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16a30 47 65 2c 20 72 32 2c 20 30 2c 20 72 31 29 3b 0a  Ge, r2, 0, r1);.
16a40 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16a50 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
16a60 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72  ookie, iDb, 1, r
16a70 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
16a80 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
16a90 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  1);.    sqlite3R
16aa0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16ab0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 73  arse, r1);.    s
16ac0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
16ad0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
16ae0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
16af0 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
16b00 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
16b10 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
16b20 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
16b30 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
16b40 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
16b50 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
16b60 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
16b70 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
16b80 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f  is suppose to co
16b90 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
16ba0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
16bb0 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69  the index..** Si
16bc0 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  nce we do not kn
16bd0 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c  ow, guess 1 mill
16be0 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31  ion.  aiRowEst[1
16bf0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
16c00 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
16c10 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
16c20 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
16c30 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
16c40 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
16c50 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
16c60 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52   the index.  aiR
16c70 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65  owEst[2] is an e
16c80 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
16c90 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
16ca0 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
16cb0 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
16cc0 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  niation of the f
16cd0 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
16ce0 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
16cf0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
16d00 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
16d10 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
16d20 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
16d30 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
16d40 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
16d50 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
16d60 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
16d70 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
16d80 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
16d90 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
16da0 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
16db0 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
16dc0 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
16dd0 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
16de0 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
16df0 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
16e00 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
16e10 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
16e20 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
16e30 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
16e40 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
16e50 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
16e60 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
16e70 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Est;.  int i;.  
16e80 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a  assert( a!=0 );.
16e90 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30    a[0] = 1000000
16ea0 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e  ;.  for(i=pIdx->
16eb0 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69  nColumn; i>=5; i
16ec0 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  --){.    a[i] = 
16ed0 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  5;.  }.  while( 
16ee0 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d  i>=1 ){.    a[i]
16ef0 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69   = 11 - i;.    i
16f00 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  --;.  }.  if( pI
16f10 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
16f20 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49  None ){.    a[pI
16f30 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31  dx->nColumn] = 1
16f40 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
16f50 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
16f60 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
16f70 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
16f80 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
16f90 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
16fa0 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
16fb0 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
16fc0 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
16fd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
16fe0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
16ff0 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
17000 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
17010 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
17020 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
17030 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
17040 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
17050 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
17060 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
17070 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
17080 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
17090 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
170a0 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
170b0 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
170c0 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
170d0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
170e0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
170f0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
17100 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
17110 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
17120 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
17130 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
17140 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
17150 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
17160 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17170 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17180 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
17190 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
171a0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
171b0 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
171c0 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
171d0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
171e0 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
171f0 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
17200 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17210 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
17220 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
17230 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
17240 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
17250 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
17260 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
17270 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
17280 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
17290 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
172a0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
172b0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
172c0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
172d0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
172e0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
172f0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
17300 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
17310 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
17320 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
17330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
17340 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
17350 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
17360 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
17370 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
17380 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17390 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
173a0 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
173b0 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
173c0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
173d0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
173e0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
173f0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
17400 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
17410 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
17420 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17430 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
17440 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
17450 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
17460 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
17470 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17480 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
17490 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
174a0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
174b0 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
174c0 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
174d0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
174e0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
174f0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
17500 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
17510 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
17520 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
17530 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
17540 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
17550 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
17560 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
17570 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
17580 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
17590 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
175a0 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
175b0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
175c0 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  me.    );.    if
175d0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
175e0 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
175f0 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69  tat1", db->aDb[i
17600 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  Db].zName) ){.  
17610 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
17620 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
17630 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
17640 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
17650 61 74 31 20 57 48 45 52 45 20 69 64 78 3d 25 51  at1 WHERE idx=%Q
17660 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
17670 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70  Db[iDb].zName, p
17680 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
17690 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
176a0 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
176b0 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
176c0 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
176d0 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
176e0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
176f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17700 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
17710 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
17720 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
17730 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
17740 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
17750 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
17760 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
17770 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
17780 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17790 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
177a0 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63  cts.  Each objec
177b0 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
177c0 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
177d0 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69  es in size.  Thi
177e0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
177f0 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a  tes a new.** obj
17800 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ect on the end o
17810 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a  f the array..**.
17820 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74  ** *pnEntry is t
17830 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
17840 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ries already in 
17850 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69  use.  *pnAlloc i
17860 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  s.** the previou
17870 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  sly allocated si
17880 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
17890 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
178a0 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69  e.** suggested i
178b0 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a  nitial array siz
178c0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  e allocation..**
178d0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
178e0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
178f0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70  s returned in *p
17900 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Idx..**.** This 
17910 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
17920 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
17930 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
17940 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68  s.  This.** migh
17950 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
17960 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61   the pArray para
17970 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68  meter or it migh
17980 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74  t be a different
17990 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74  .** pointer if t
179a0 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73  he array was res
179b0 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
179c0 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
179d0 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
179e0 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
179f0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
17a00 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
17a10 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
17a20 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
17a30 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
17a40 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
17a50 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
17a60 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
17a70 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
17a80 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
17a90 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69   */.  int initSi
17aa0 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65  ze,     /* Sugge
17ab0 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c  sted initial all
17ac0 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
17ad0 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
17ae0 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
17af0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
17b00 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
17b10 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c  e */.  int *pnAl
17b20 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72  loc,     /* Curr
17b30 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
17b40 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
17b50 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
17b60 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
17b70 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
17b80 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
17b90 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
17ba0 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45  r *z;.  if( *pnE
17bb0 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63  ntry >= *pnAlloc
17bc0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
17bd0 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53  ew;.    int newS
17be0 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ize;.    newSize
17bf0 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20   = (*pnAlloc)*2 
17c00 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
17c10 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
17c20 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
17c30 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
17c40 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
17c50 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
17c60 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
17c70 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
17c80 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c      }.    *pnAll
17c90 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
17ca0 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65  llocSize(db, pNe
17cb0 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20  w)/szEntry;.    
17cc0 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
17cd0 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
17ce0 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
17cf0 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73  (&z[*pnEntry * s
17d00 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
17d10 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
17d20 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70  *pnEntry;.  ++*p
17d30 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
17d40 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
17d50 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
17d60 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
17d70 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
17d80 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
17d90 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
17da0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
17db0 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
17dc0 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
17dd0 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
17de0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
17df0 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
17e00 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
17e10 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
17e20 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
17e30 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
17e40 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
17e50 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
17e60 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
17e70 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
17e80 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
17e90 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
17ea0 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
17eb0 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
17ec0 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
17ed0 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
17ee0 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
17ef0 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
17f00 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a  a[0]),.      5,.
17f10 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
17f20 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  d,.      &pList-
17f30 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26  >nAlloc,.      &
17f40 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
17f50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
17f60 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
17f70 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
17f80 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
17f90 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
17fa0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17fb0 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
17fc0 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
17fd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
17fe0 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
17ff0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
18000 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
18010 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
18020 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
18030 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
18040 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
18050 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
18060 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
18070 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
18080 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
18090 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
180a0 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
180b0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
180c0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
180d0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
180e0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
180f0 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
18100 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
18110 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
18120 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
18130 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
18140 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
18150 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
18160 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
18170 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
18180 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
18190 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
181a0 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
181b0 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
181c0 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
181d0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
181e0 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
181f0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
18200 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68  ./*.** Expand th
18210 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
18220 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
18230 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62  SrcList object b
18240 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45  y.** creating nE
18250 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62  xtra new slots b
18260 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61  eginning at iSta
18270 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a  rt.  iStart is z
18280 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65  ero based..** Ne
18290 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f  w slots are zero
182a0 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
182b0 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61  ample, suppose a
182c0 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c   SrcList initial
182d0 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  ly contains two 
182e0 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a  entries: A,B..**
182f0 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77   To append 3 new
18300 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68   entries onto th
18310 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a  e end, do this:.
18320 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
18330 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
18340 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20  b, pSrclist, 3, 
18350 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  2);.**.** After 
18360 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69  the call above i
18370 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a  t would contain:
18380 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c    A, B, nil, nil
18390 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  , nil..** If the
183a0 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74   iStart argument
183b0 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74   had been 1 inst
183c0 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74  ead of 2, then t
183d0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75  he result.** wou
183e0 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41  ld have been:  A
183f0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  , nil, nil, nil,
18400 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20   B.  To prepend 
18410 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a  the new slots,.*
18420 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c  * the iStart val
18430 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20  ue would be 0.  
18440 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20  The result then 
18450 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c  would.** be: nil
18460 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42  , nil, nil, A, B
18470 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
18480 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
18490 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74  ails the SrcList
184a0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20   is unchanged.  
184b0 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f  The.** db->mallo
184c0 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c  cFailed flag wil
184d0 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65  l be set to true
184e0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
184f0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
18500 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  rge(.  sqlite3 *
18510 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db,       /* Dat
18520 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18530 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f   to notify of OO
18540 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72  M errors */.  Sr
18550 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
18560 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
18570 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
18580 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
18590 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
185a0 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
185b0 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
185c0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
185d0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
185e0 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
185f0 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
18600 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
18610 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
18620 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
18630 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
18640 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
18650 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
18660 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
18670 69 66 28 20 70 53 72 63 3d 3d 30 20 7c 7c 20 69  if( pSrc==0 || i
18680 53 74 61 72 74 3e 70 53 72 63 2d 3e 6e 53 72 63  Start>pSrc->nSrc
18690 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
186a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
186b0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   );.    return p
186c0 53 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  Src;.  }..  /* A
186d0 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e  llocate addition
186e0 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64  al space if need
186f0 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  ed */.  if( pSrc
18700 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53  ->nSrc+nExtra>pS
18710 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  rc->nAlloc ){.  
18720 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
18730 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
18740 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  = pSrc->nSrc+nEx
18750 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
18760 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
18770 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
18780 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
18790 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
187a0 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
187b0 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
187c0 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
187d0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
187e0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
187f0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18800 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
18810 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
18820 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
18830 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
18840 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
18850 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
18860 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
18870 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
18880 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36  c->nAlloc = (u16
18890 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  )nGot;.  }..  /*
188a0 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73   Move existing s
188b0 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61  lots that come a
188c0 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69  fter the newly i
188d0 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20  nserted slots.  
188e0 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ** out of the wa
188f0 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72  y */.  for(i=pSr
18900 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53  c->nSrc-1; i>=iS
18910 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  tart; i--){.    
18920 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61  pSrc->a[i+nExtra
18930 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  ] = pSrc->a[i];.
18940 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63    }.  pSrc->nSrc
18950 20 2b 3d 20 28 69 31 36 29 6e 45 78 74 72 61 3b   += (i16)nExtra;
18960 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
18970 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
18980 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
18990 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
189a0 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
189b0 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
189c0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
189d0 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
189e0 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
189f0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
18a00 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
18a10 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
18a20 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
18a30 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
18a40 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
18a50 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
18a60 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
18a70 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
18a80 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
18a90 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
18aa0 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
18ab0 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
18ac0 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
18ad0 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
18ae0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
18af0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
18b00 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
18b10 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
18b20 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
18b30 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
18b40 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
18b50 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
18b60 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
18b70 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
18b80 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
18b90 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
18ba0 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
18bb0 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
18bc0 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
18bd0 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
18be0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
18bf0 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
18c00 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
18c10 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
18c20 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
18c30 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
18c40 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
18c50 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
18c60 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
18c70 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
18c80 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
18c90 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
18ca0 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
18cb0 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
18cc0 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
18cd0 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
18ce0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
18cf0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
18d00 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
18d10 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
18d20 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
18d30 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
18d40 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
18d50 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
18d60 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
18d70 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
18d80 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
18d90 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
18da0 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
18db0 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
18dc0 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
18dd0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
18de0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
18df0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
18e00 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
18e10 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
18e20 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
18e30 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
18e40 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
18e50 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
18e60 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
18e70 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
18e80 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
18e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
18ea0 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
18eb0 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
18ec0 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
18ed0 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
18ee0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
18ef0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
18f00 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
18f10 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
18f20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
18f30 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
18f40 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
18f50 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
18f60 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
18f70 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
18f80 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
18f90 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
18fa0 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
18fb0 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
18fc0 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
18fd0 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
18fe0 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
18ff0 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
19000 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
19010 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
19020 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
19030 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
19040 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
19050 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
19060 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
19070 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
19080 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
19090 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
190a0 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73  .  }.  pList = s
190b0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
190c0 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
190d0 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
190e0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
190f0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
19100 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
19110 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
19120 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19130 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
19140 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
19150 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
19160 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
19170 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
19180 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
19190 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
191a0 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
191b0 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
191c0 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
191d0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
191e0 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
191f0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
19200 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
19210 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
19220 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
19230 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
19240 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
19250 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
19260 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74  Database);.  ret
19270 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
19280 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43  .** Assign VdbeC
19290 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62  ursor index numb
192a0 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ers to all table
192b0 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a  s in a SrcList.*
192c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
192d0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
192e0 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
192f0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
19300 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
19310 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
19320 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
19330 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72  rt(pList || pPar
19340 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
19350 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c  iled );.  if( pL
19360 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
19370 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
19380 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  >a; i<pList->nSr
19390 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
193a0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
193b0 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20  m->iCursor>=0 ) 
193c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74  break;.      pIt
193d0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50  em->iCursor = pP
193e0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
193f0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
19400 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
19410 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
19420 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
19430 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
19440 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20  lect->pSrc);.   
19450 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
19460 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
19470 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
19480 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
19490 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
194a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
194b0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71  SrcListDelete(sq
194c0 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
194d0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
194e0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
194f0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
19500 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
19510 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
19520 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
19530 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
19540 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
19550 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
19560 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
19570 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
19580 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19590 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
195a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
195b0 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
195c0 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c  zAlias);.    sql
195d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
195e0 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20  Item->zIndex);. 
195f0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
19600 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61  Table(pItem->pTa
19610 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
19620 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
19630 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
19640 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19650 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
19660 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
19670 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
19680 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
19690 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
196a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
196b0 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
196c0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
196d0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
196e0 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
196f0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
19700 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
19710 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
19720 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
19730 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
19740 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19750 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
19760 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
19770 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
19780 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
19790 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
197a0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
197b0 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
197c0 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
197d0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
197e0 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
197f0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
19800 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
19810 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
19820 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
19830 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
19840 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
19850 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
19860 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
19870 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
19880 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
19890 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
198a0 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
198b0 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
198c0 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
198d0 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
198e0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
198f0 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
19900 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
19910 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
19920 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
19930 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
19940 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
19950 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
19960 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
19970 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
19980 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
19990 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
199a0 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
199b0 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
199c0 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
199d0 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
199e0 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
199f0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
19a00 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
19a10 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
19a20 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
19a30 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
19a40 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
19a50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
19a60 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
19a70 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
19a80 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
19a90 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
19aa0 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
19ab0 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
19ac0 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
19ad0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
19ae0 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
19af0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
19b00 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19b10 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
19b20 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
19b30 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
19b40 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
19b50 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
19b60 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
19b70 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
19b80 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
19b90 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
19ba0 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
19bb0 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
19bc0 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
19bd0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
19be0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
19bf0 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
19c00 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
19c10 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
19c20 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
19c30 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19c40 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19c50 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
19c60 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
19c70 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
19c80 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
19c90 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
19ca0 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
19cb0 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ->nSrc==0 ){.   
19cc0 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
19cd0 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 20  te(db, pOn);.   
19ce0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
19cf0 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
19d00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
19d10 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
19d20 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 72 65  ubquery);.    re
19d30 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49  turn p;.  }.  pI
19d40 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
19d50 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41  Src-1];.  if( pA
19d60 6c 69 61 73 20 26 26 20 70 41 6c 69 61 73 2d 3e  lias && pAlias->
19d70 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
19d80 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
19d90 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
19da0 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
19db0 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
19dc0 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
19dd0 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
19de0 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
19df0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
19e00 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
19e10 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
19e20 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
19e30 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
19e40 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
19e50 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
19e60 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
19e70 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
19e80 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
19e90 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19ea0 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
19eb0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19ec0 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
19ed0 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
19ee0 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
19ef0 20 26 26 20 70 20 26 26 20 70 2d 3e 6e 53 72 63   && p && p->nSrc
19f00 3e 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  >0 ){.    struct
19f10 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19f20 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
19f30 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
19f40 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49  ert( pItem->notI
19f50 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74  ndexed==0 && pIt
19f60 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b  em->zIndex==0 );
19f70 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
19f80 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
19f90 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
19fa0 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
19fb0 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
19fc0 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
19fd0 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
19fe0 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
19ff0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
1a000 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1a010 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
1a020 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
1a030 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
1a040 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
1a050 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1a060 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
1a070 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  edBy);.    }.  }
1a080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
1a090 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
1a0a0 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
1a0b0 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
1a0c0 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
1a0d0 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
1a0e0 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
1a0f0 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
1a100 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
1a110 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
1a120 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
1a130 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
1a140 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
1a150 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
1a160 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
1a170 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
1a180 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
1a190 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
1a1a0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
1a1b0 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
1a1c0 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
1a1d0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1a1e0 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
1a1f0 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
1a200 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
1a210 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
1a220 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
1a230 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
1a240 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
1a250 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
1a260 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1a270 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
1a280 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
1a290 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
1a2a0 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
1a2b0 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
1a2c0 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
1a2d0 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
1a2e0 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
1a2f0 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
1a300 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
1a310 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ->a ){.    int i
1a320 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
1a330 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
1a340 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
1a350 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
1a360 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  i-1].jointype;. 
1a370 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d     }.    p->a[0]
1a380 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20  .jointype = 0;. 
1a390 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69   }.}../*.** Begi
1a3a0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1a3b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1a3c0 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
1a3d0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
1a3e0 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69  nt type){.  sqli
1a3f0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
1a400 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *v;.  int i;..  
1a410 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
1a420 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
1a430 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
1a440 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1a450 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1a460 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1a470 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1a480 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
1a490 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1a4a0 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1a4b0 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
1a4c0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
1a4d0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1a4e0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1a4f0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
1a500 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
1a510 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
1a520 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1a530 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
1a540 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a550 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
1a560 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
1a570 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
1a580 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a590 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
1a5a0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
1a5b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a5c0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1a5d0 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
1a5e0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
1a5f0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1a600 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
1a610 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1a620 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
1a630 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
1a640 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
1a650 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
1a660 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
1a670 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
1a680 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1a690 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1a6a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a6b0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1a6c0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1a6d0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1a6e0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
1a6f0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20  OMMIT", 0, 0) ) 
1a700 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
1a710 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a720 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1a730 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a740 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1a750 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1a760 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1a770 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1a780 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1a790 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1a7a0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1a7b0 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1a7c0 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1a7d0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
1a7e0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
1a7f0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
1a800 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1a810 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
1a820 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1a830 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a840 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
1a850 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1a860 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
1a870 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
1a880 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
1a890 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
1a8a0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a8b0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1a8c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a8d0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1a8e0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
1a8f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1a900 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1a910 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
1a920 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73  ser when it pars
1a930 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  es a command to 
1a940 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61  create,.** relea
1a950 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1a960 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e  n SQL savepoint.
1a970 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
1a980 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65  3Savepoint(Parse
1a990 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70   *pParse, int op
1a9a0 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
1a9b0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
1a9c0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1a9d0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
1a9e0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
1a9f0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  zName ){.    Vdb
1aa00 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
1aa10 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23  tVdbe(pParse);.#
1aa20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aa30 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1aa40 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1aa50 74 20 63 68 61 72 20 2a 61 7a 5b 5d 20 3d 20 7b  t char *az[] = {
1aa60 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41   "BEGIN", "RELEA
1aa70 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20  SE", "ROLLBACK" 
1aa80 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  };.    assert( !
1aa90 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20  SAVEPOINT_BEGIN 
1aaa0 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  && SAVEPOINT_REL
1aab0 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50  EASE==1 && SAVEP
1aac0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32  OINT_ROLLBACK==2
1aad0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
1aae0 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33  f( !v || sqlite3
1aaf0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1ab00 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  , SQLITE_SAVEPOI
1ab10 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d  NT, az[op], zNam
1ab20 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
1ab30 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1ab40 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
1ab50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1ab60 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1ab70 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1ab80 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20  _Savepoint, op, 
1ab90 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  0, 0, zName, P4_
1aba0 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1abb0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1abc0 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1abd0 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
1abe0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
1abf0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
1ac00 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1ac10 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
1ac20 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
1ac30 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1ac40 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1ac50 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1ac60 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
1ac70 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
1ac80 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1ac90 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
1aca0 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
1acb0 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1acc0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1acd0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
1ace0 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20   flags = .      
1acf0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1ad00 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
1ad10 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1ad20 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1ad30 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1ad40 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1ad50 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1ad60 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1ad70 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1ad80 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1ad90 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
1ada0 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28  te3BtreeFactory(
1adb0 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  db, 0, 0, SQLITE
1adc0 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
1add0 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20  IZE, flags,.    
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 62               &db
1ae00 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
1ae10 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ae20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1ae30 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1ae40 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
1ae50 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
1ae60 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
1ae70 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
1ae80 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
1ae90 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
1aea0 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
1aeb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1aec0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1aed0 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  rt( (db->flags &
1aee0 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
1aef0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43  ==0 || db->autoC
1af00 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 61 73 73  ommit );.    ass
1af10 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
1af20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
1af30 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
1af40 61 6c 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74  alMode(sqlite3Bt
1af50 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
1af60 5b 31 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20  [1].pBt),.      
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af80 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4a 6f        db->dfltJo
1af90 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a 20 20 7d 0a  urnalMode);.  }.
1afa0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1afb0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
1afc0 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  BE code that wil
1afd0 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  l verify the sch
1afe0 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73  ema cookie and s
1aff0 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74  tart.** a read-t
1b000 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61  ransaction for a
1b010 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ll named databas
1b020 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  e files..**.** I
1b030 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
1b040 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63  hat all schema c
1b050 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69  ookies be verifi
1b060 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65  ed and all.** re
1b070 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ad transactions 
1b080 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
1b090 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  e anything else 
1b0a0 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68  happens in.** th
1b0b0 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
1b0c0 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
1b0d0 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
1b0e0 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72  after much other
1b0f0 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65  .** code has bee
1b100 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f  n generated.  So
1b110 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65   here is what we
1b120 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66   do:.**.** The f
1b130 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1b140 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1b150 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f  , we code an OP_
1b160 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c  Goto that.** wil
1b170 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72  l jump to a subr
1b180 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e  outine at the en
1b190 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d of the program
1b1a0 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65  .  Then we.** re
1b1b0 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62  cord every datab
1b1c0 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69  ase that needs i
1b1d0 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69  ts schema verifi
1b1e0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61  ed in the.** pPa
1b1f0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1b200 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61  field.  Later, a
1b210 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63  fter all other c
1b220 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ode has been.** 
1b230 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73  generated, the s
1b240 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64  ubroutine that d
1b250 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  oes the cookie v
1b260 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64  erifications and
1b270 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74  .** starts the t
1b280 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c  ransactions will
1b290 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68   be coded and th
1b2a0 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c  e OP_Goto P2 val
1b2b0 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61  ue.** will be ma
1b2c0 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
1b2d0 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  hat subroutine. 
1b2e0 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   The generation 
1b2f0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  of the.** cookie
1b300 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   verification su
1b310 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61  broutine code ha
1b320 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33  ppens in sqlite3
1b330 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
1b340 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74  **.** If iDb<0 t
1b350 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f  hen code the OP_
1b360 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27  Goto only - don'
1b370 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65  t set flag to ve
1b380 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65  rify the.** sche
1b390 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61  ma on any databa
1b3a0 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62  ses.  This can b
1b3b0 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
1b3c0 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a  on the OP_Goto.*
1b3d0 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63  * early in the c
1b3e0 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b  ode, before we k
1b3f0 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62  now if any datab
1b400 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20  ase tables will 
1b410 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  be used..*/.void
1b420 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1b430 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
1b440 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
1b450 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1b460 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
1b470 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73  t mask;..  v = s
1b480 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1b490 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
1b4a0 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
1b4b0 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1b4c0 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
1b4d0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
1b4e0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1b4f0 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
1b500 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
1b510 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  {.    pParse->co
1b520 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
1b530 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b540 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
1b550 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
1b560 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1b570 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
1b580 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1b590 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
1b5a0 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
1b5b0 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
1b5c0 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
1b5d0 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20  D+2 );.    mask 
1b5e0 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66  = 1<<iDb;.    if
1b5f0 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ( (pParse->cooki
1b600 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
1b610 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
1b620 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20  ->cookieMask |= 
1b630 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72  mask;.      pPar
1b640 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
1b650 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  iDb] = db->aDb[i
1b660 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
1b670 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
1b680 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1b690 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
1b6a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
1b6b0 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
1b6c0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
1b6d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1b6e0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1b6f0 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
1b700 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
1b710 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
1b720 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1b730 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1b740 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b750 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
1b760 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
1b770 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
1b780 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
1b790 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
1b7a0 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
1b7b0 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
1b7c0 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
1b7d0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
1b7e0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
1b7f0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
1b800 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
1b810 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
1b820 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
1b830 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
1b840 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
1b850 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
1b860 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
1b870 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
1b880 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
1b890 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
1b8a0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
1b8b0 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
1b8c0 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
1b8d0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
1b8e0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
1b8f0 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
1b900 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
1b910 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
1b920 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1b930 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
1b940 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
1b950 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
1b960 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
1b970 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
1b980 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
1b990 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1b9a0 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
1b9b0 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
1b9c0 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
1b9d0 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
1b9e0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1b9f0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
1ba00 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1ba10 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1ba20 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1ba30 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77  Db);.  pParse->w
1ba40 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  riteMask |= 1<<i
1ba50 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61  Db;.  if( setSta
1ba60 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65  tement && pParse
1ba70 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
1ba80 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1ba90 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74 61 74 65  dOp1(v, OP_State
1baa0 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  ment, iDb);.  }.
1bab0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
1bac0 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
1bad0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
1bae0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1baf0 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
1bb00 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
1bb10 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
1bb20 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
1bb30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1bb40 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
1bb50 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
1bb60 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
1bb70 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
1bb80 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  x){.  int i;.  f
1bb90 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
1bba0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
1bbb0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1bbc0 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
1bbd0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  oll[i];.    if( 
1bbe0 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26  z==zColl || (z &
1bbf0 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71  & zColl && 0==sq
1bc00 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
1bc10 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20  zColl)) ){.     
1bc20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1bc30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1bc40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1bc50 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1bc60 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
1bc70 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
1bc80 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1bc90 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
1bca0 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
1bcb0 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1bcc0 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
1bcd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bce0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1bcf0 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
1bd00 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1bd10 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
1bd20 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1bd30 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1bd40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1bd50 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
1bd60 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
1bd70 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
1bd80 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1bd90 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
1bda0 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
1bdb0 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
1bdc0 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
1bdd0 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
1bde0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
1bdf0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1be00 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1be10 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1be20 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
1be30 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1be40 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1be50 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
1be60 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1be70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1be80 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
1be90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1bea0 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1beb0 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
1bec0 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
1bed0 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
1bee0 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
1bef0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1bf00 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
1bf10 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
1bf20 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
1bf30 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
1bf40 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1bf50 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1bf60 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1bf70 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
1bf80 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
1bf90 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
1bfa0 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bfc0 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
1bfd0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bff0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1c000 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1c010 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1c020 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1c030 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1c040 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1c050 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
1c060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c070 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1c080 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
1c090 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1c0a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c0b0 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
1c0c0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
1c0d0 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1c0e0 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1c0f0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1c100 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1c110 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1c120 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1c130 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1c140 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1c150 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1c160 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1c170 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1c180 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1c190 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1c1a0 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1c1b0 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1c1c0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1c1d0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1c1e0 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1c1f0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1c200 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1c230 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1c240 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1c250 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1c260 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1c270 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1c280 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1c290 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1c2a0 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1c2b0 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1c2c0 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1c2d0 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1c2e0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1c2f0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1c300 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1c310 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1c320 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1c330 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1c340 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1c350 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1c360 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1c370 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1c380 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1c390 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1c3a0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1c3b0 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1c3c0 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1c3d0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1c3e0 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1c3f0 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1c400 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1c410 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1c420 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1c430 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1c440 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1c450 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1c460 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1c470 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1c4a0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1c4b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c4c0 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1c4d0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1c4e0 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1c4f0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1c500 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1c510 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1c520 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1c530 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1c540 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1c550 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1c560 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1c570 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1c580 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1c590 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1c5a0 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1c5b0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c5c0 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1c5d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1c5e0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1c5f0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1c600 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1c610 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1c620 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1c630 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1c640 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1c650 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c660 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1c670 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1c680 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1c690 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1c6a0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1c6b0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1c6c0 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1c6d0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1c6e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1c6f0 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31  me1==0 || pName1
1c700 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ->z==0 ){.    re
1c710 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1c720 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1c730 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1c740 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20  f( pName2==0 || 
1c750 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
1c760 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
1c770 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
1c780 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
1c790 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
1c7a0 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1c7b0 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
1c7c0 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
1c7d0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
1c7e0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1c7f0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
1c800 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20  db), zColl, -1, 
1c810 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
1c820 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  l ){.      if( z
1c830 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1c840 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1c850 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1c860 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c870 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
1c880 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c890 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1c8a0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1c8b0 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
1c8c0 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1c8d0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
1c8e0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
1c8f0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
1c900 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
1c910 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
1c920 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1c930 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
1c940 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
1c950 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
1c960 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
1c970 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1c980 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1c990 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
1c9a0 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
1c9b0 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
1c9c0 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
1c9d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1c9e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c9f0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1ca00 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1ca10 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
1ca20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ca30 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
1ca40 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1ca50 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1ca60 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
1ca70 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
1ca80 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1ca90 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
1caa0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1cab0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1cac0 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
1cad0 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
1cae0 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
1caf0 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
1cb00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1cb10 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61  rn a dynamicly a
1cb20 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f  llocated KeyInfo
1cb30 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1cb40 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77  can be used.** w
1cb50 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  ith OP_OpenRead 
1cb60 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  or OP_OpenWrite 
1cb70 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62 61  to access databa
1cb80 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  se index pIdx..*
1cb90 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1cba0 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ul, a pointer to
1cbb0 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74 75   the new structu
1cbc0 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  re is returned. 
1cbd0 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
1cbe0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
1cbf0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1cc00 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  lling sqlite3DbF
1cc10 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65  ree(db, ) on the
1cc20 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f   returned .** po
1cc30 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72  inter. If an err
1cc40 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f  or occurs (out o
1cc50 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73  f memory or miss
1cc60 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a  ing collation .*
1cc70 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c  * sequence), NUL
1cc80 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
1cc90 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 70  d the state of p
1cca0 50 61 72 73 65 20 75 70 64 61 74 65 64 20 74 6f  Parse updated to
1ccb0 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20   reflect.** the 
1ccc0 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  error..*/.KeyInf
1ccd0 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b  o *sqlite3IndexK
1cce0 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyinfo(Parse *pP
1ccf0 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
1cd00 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
1cd10 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
1cd20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
1cd30 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b  Bytes = sizeof(K
1cd40 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d  eyInfo) + (nCol-
1cd50 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  1)*sizeof(CollSe
1cd60 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71  q*) + nCol;.  sq
1cd70 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1cd80 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
1cd90 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e  o *pKey = (KeyIn
1cda0 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  fo *)sqlite3DbMa
1cdb0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
1cdc0 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65  tes);..  if( pKe
1cdd0 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64  y ){.    pKey->d
1cde0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1cdf0 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
1ce00 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70  rder = (u8 *)&(p
1ce10 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d  Key->aColl[nCol]
1ce20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  );.    assert( &
1ce30 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1ce40 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a  [nCol]==&(((u8 *
1ce50 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20  )pKey)[nBytes]) 
1ce60 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1ce70 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
1ce80 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20      char *zColl 
1ce90 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
1cea0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
1ceb0 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20   zColl );.      
1cec0 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
1ced0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
1cee0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
1cef0 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  oll, -1);.      
1cf00 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1cf10 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
1cf20 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
1cf30 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
1cf40 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20  d = (u16)nCol;. 
1cf50 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
1cf60 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
1cf70 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cf80 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1cf90 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1cfa0 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.