/ Hex Artifact Content
Login

Artifact a394b2511c5c768f14a9d7c1c31606b9fa569f1b:


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 31 38 20 32 30 30 39 2f 30 32 2f 31 33  1.518 2009/02/13
02f0: 20 30 33 3a 34 33 3a 33 32 20 64 72 68 20 45 78   03:43:32 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 73 71 6c 69 74 65  ;.        sqlite
12b0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50  3VdbeAddOp2(v,OP
12c0: 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c 20 69  _VerifyCookie, i
12d0: 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b  Db, pParse->cook
12e0: 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b 0a 20  ieValue[iDb]);. 
12f0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
1300: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1310: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 7b 0a  ALTABLE.      {.
1320: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
1330: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
1340: 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74 61 62 4c  i<pParse->nVtabL
1350: 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ock; i++){.     
1360: 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62 20       char *vtab 
1370: 3d 20 28 63 68 61 72 20 2a 29 70 50 61 72 73 65  = (char *)pParse
1380: 2d 3e 61 70 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d  ->apVtabLock[i]-
1390: 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 20 20  >pVtab;.        
13a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13b0: 4f 70 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e  Op4(v, OP_VBegin
13c0: 2c 20 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c  , 0, 0, 0, vtab,
13d0: 20 50 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20   P4_VTAB);.     
13e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
13f0: 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d  rse->nVtabLock =
1400: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   0;.      }.#end
1410: 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 63  if..      /* Onc
1420: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b 69 65  e all the cookie
1430: 73 20 68 61 76 65 20 62 65 65 6e 20 76 65 72 69  s have been veri
1440: 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73 61 63  fied and transac
1450: 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20 0a 20  tions opened, . 
1460: 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 74       ** obtain t
1470: 68 65 20 72 65 71 75 69 72 65 64 20 74 61 62 6c  he required tabl
1480: 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20 69 73  e-locks. This is
1490: 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20   a no-op unless 
14a0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 73 68  the .      ** sh
14b0: 61 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75  ared-cache featu
14c0: 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20  re is enabled.. 
14d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
14e0: 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 50 61  deTableLocks(pPa
14f0: 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
1500: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1510: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
1520: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29  rse->cookieGoto)
1530: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
1540: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
1550: 43 45 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  CE.    if( !db->
1560: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
1570: 20 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65     /* Change the
1580: 20 50 34 20 61 72 67 75 6d 65 6e 74 20 6f 66 20   P4 argument of 
1590: 74 68 65 20 66 69 72 73 74 20 6f 70 63 6f 64 65  the first opcode
15a0: 20 28 77 68 69 63 68 20 77 69 6c 6c 20 61 6c 77   (which will alw
15b0: 61 79 73 20 62 65 0a 20 20 20 20 20 20 2a 2a 20  ays be.      ** 
15c0: 61 6e 20 4f 50 5f 54 72 61 63 65 29 20 74 6f 20  an OP_Trace) to 
15d0: 62 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  be the complete 
15e0: 74 65 78 74 20 6f 66 20 74 68 65 20 63 75 72 72  text of the curr
15f0: 65 6e 74 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ent SQL statemen
1600: 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
1610: 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20    VdbeOp *pOp = 
1620: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
1630: 28 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  (v, 0);.      if
1640: 28 20 70 4f 70 20 26 26 20 70 4f 70 2d 3e 6f 70  ( pOp && pOp->op
1650: 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 63 65 20 29  code==OP_Trace )
1660: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1670: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
1680: 20 30 2c 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c   0, pParse->zSql
1690: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
16b0: 6e 74 29 28 70 50 61 72 73 65 2d 3e 7a 54 61 69  nt)(pParse->zTai
16c0: 6c 20 2d 20 70 50 61 72 73 65 2d 3e 7a 53 71 6c  l - pParse->zSql
16d0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
16e0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16f0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
1700: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47 65 74 20  .  }...  /* Get 
1710: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
1720: 20 72 65 61 64 79 20 66 6f 72 20 65 78 65 63 75   ready for execu
1730: 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tion.  */.  if( 
1740: 76 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  v && pParse->nEr
1750: 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e 6d 61 6c  r==0 && !db->mal
1760: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 23 69 66  locFailed ){.#if
1770: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1780: 0a 20 20 20 20 46 49 4c 45 20 2a 74 72 61 63 65  .    FILE *trace
1790: 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20   = (db->flags & 
17a0: 53 51 4c 49 54 45 5f 56 64 62 65 54 72 61 63 65  SQLITE_VdbeTrace
17b0: 29 21 3d 30 20 3f 20 73 74 64 6f 75 74 20 3a 20  )!=0 ? stdout : 
17c0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  0;.    sqlite3Vd
17d0: 62 65 54 72 61 63 65 28 76 2c 20 74 72 61 63 65  beTrace(v, trace
17e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
17f0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 64 69  sert( pParse->di
1800: 73 61 62 6c 65 43 6f 6c 43 61 63 68 65 3d 3d 30  sableColCache==0
1810: 20 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73   );  /* Disables
1820: 20 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20   and re-enables 
1830: 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71 6c  match */.    sql
1840: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
1850: 79 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61  y(v, pParse->nVa
1860: 72 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b  r, pParse->nMem+
1870: 33 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3,.             
1880: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
1890: 73 65 2d 3e 6e 54 61 62 2b 33 2c 20 70 50 61 72  se->nTab+3, pPar
18a0: 73 65 2d 3e 65 78 70 6c 61 69 6e 29 3b 0a 20 20  se->explain);.  
18b0: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
18c0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
18d0: 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61 6d 65 73  pParse->colNames
18e0: 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Set = 0;.  }else
18f0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 72 63 3d   if( pParse->rc=
1900: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1910: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
1920: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1930: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20  .  pParse->nTab 
1940: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
1950: 4d 65 6d 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  Mem = 0;.  pPars
1960: 65 2d 3e 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70  e->nSet = 0;.  p
1970: 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b  Parse->nVar = 0;
1980: 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  .  pParse->cooki
1990: 65 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  eMask = 0;.  pPa
19a0: 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f 20  rse->cookieGoto 
19b0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  = 0;.}../*.** Ru
19c0: 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 6e 64  n the parser and
19d0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20   code generator 
19e0: 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e 20 6f  recursively in o
19f0: 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61 74 65  rder to generate
1a00: 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74 68 65  .** code for the
1a10: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 67   SQL statement g
1a20: 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e  iven onto the en
1a30: 64 20 6f 66 20 74 68 65 20 70 50 61 72 73 65 20  d of the pParse 
1a40: 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72 72 65  context.** curre
1a50: 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
1a60: 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ruction.  When t
1a70: 68 65 20 70 61 72 73 65 72 20 69 73 20 72 75 6e  he parser is run
1a80: 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a 2a 20   recursively.** 
1a90: 74 68 69 73 20 77 61 79 2c 20 74 68 65 20 66 69  this way, the fi
1aa0: 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73 20 6e  nal OP_Halt is n
1ab0: 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e 64 20  ot appended and 
1ac0: 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69 7a 61  other initializa
1ad0: 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69 6e 61  tion.** and fina
1ae0: 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73 20 61  lization steps a
1af0: 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63 61 75  re omitted becau
1b00: 73 65 20 74 68 6f 73 65 20 61 72 65 20 68 61 6e  se those are han
1b10: 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a 2a 20  dling by the.** 
1b20: 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73 65 72  outermost parser
1b30: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72  ..**.** Not ever
1b40: 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74 61 62  ything is nestab
1b50: 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69 6c 69  le.  This facili
1b60: 74 79 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  ty is designed t
1b70: 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e 53 45  o permit.** INSE
1b80: 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e 64 20  RT, UPDATE, and 
1b90: 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e  DELETE operation
1ba0: 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49 54 45  s against SQLITE
1bb0: 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a 2a 2a  _MASTER.  Use.**
1bc0: 20 63 61 72 65 20 69 66 20 79 6f 75 20 64 65 63   care if you dec
1bd0: 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20 75 73  ide to try to us
1be0: 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  e this routine f
1bf0: 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1c00: 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  rposes..*/.void 
1c10: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1c20: 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  se(Parse *pParse
1c30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
1c40: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
1c50: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
1c60: 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20  r *zSql;.  char 
1c70: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
1c80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1c90: 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65 66 69  arse->db;.# defi
1ca0: 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73 69 7a  ne SAVE_SZ  (siz
1cb0: 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f 66 66  eof(Parse) - off
1cc0: 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56 61 72  setof(Parse,nVar
1cd0: 29 29 0a 20 20 63 68 61 72 20 73 61 76 65 42 75  )).  char saveBu
1ce0: 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20 20 69  f[SAVE_SZ];..  i
1cf0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1d00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
1d10: 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  rt( pParse->nest
1d20: 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e 65 73  ed<10 );  /* Nes
1d30: 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  ting should only
1d40: 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64 20 64   be of limited d
1d50: 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73 74 61  epth */.  va_sta
1d60: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
1d70: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
1d80: 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20 7a 46  3VMPrintf(db, zF
1d90: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
1da0: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
1db0: 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  zSql==0 ){.    r
1dc0: 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20 6d 61  eturn;   /* A ma
1dd0: 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66  lloc must have f
1de0: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 70  ailed */.  }.  p
1df0: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b 2b 3b  Parse->nested++;
1e00: 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65 42 75  .  memcpy(saveBu
1e10: 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56 61 72  f, &pParse->nVar
1e20: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 6d 65  , SAVE_SZ);.  me
1e30: 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e 6e 56  mset(&pParse->nV
1e40: 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a 29 3b  ar, 0, SAVE_SZ);
1e50: 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50 61 72  .  sqlite3RunPar
1e60: 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53 71 6c  ser(pParse, zSql
1e70: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  , &zErrMsg);.  s
1e80: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1e90: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c   zErrMsg);.  sql
1ea0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1eb0: 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  Sql);.  memcpy(&
1ec0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 73 61  pParse->nVar, sa
1ed0: 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a 29 3b  veBuf, SAVE_SZ);
1ee0: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  .  pParse->neste
1ef0: 64 2d 2d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  d--;.}../*.** Lo
1f00: 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  cate the in-memo
1f10: 72 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ry structure tha
1f20: 74 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61  t describes a pa
1f30: 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1f40: 65 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e  e.** table given
1f50: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61   the name of tha
1f60: 74 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74  t table and (opt
1f70: 69 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d  ionally) the nam
1f80: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
1f90: 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  base containing 
1fa0: 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1fb0: 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1fc0: 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ound..**.** If z
1fd0: 44 61 74 61 62 61 73 65 20 69 73 20 30 2c 20 61  Database is 0, a
1fe0: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ll databases are
1ff0: 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 74 68   searched for th
2000: 65 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a  e table and the.
2010: 2a 2a 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e  ** first matchin
2020: 67 20 74 61 62 6c 65 20 69 73 20 72 65 74 75 72  g table is retur
2030: 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69  ned.  (No checki
2040: 6e 67 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ng for duplicate
2050: 20 74 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20   table.** names 
2060: 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73  is done.)  The s
2070: 65 61 72 63 68 20 6f 72 64 65 72 20 69 73 20 54  earch order is T
2080: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2090: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a  MAIN, then any.*
20a0: 2a 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  * auxiliary data
20b0: 62 61 73 65 73 20 61 64 64 65 64 20 75 73 69 6e  bases added usin
20c0: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
20d0: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  mand..**.** See 
20e0: 61 6c 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61  also sqlite3Loca
20f0: 74 65 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61  teTable()..*/.Ta
2100: 62 6c 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  ble *sqlite3Find
2110: 54 61 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64  Table(sqlite3 *d
2120: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2130: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2140: 20 2a 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20   *zDatabase){.  
2150: 54 61 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20  Table *p = 0;.  
2160: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 4e 61  int i;.  int nNa
2170: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 4e  me;.  assert( zN
2180: 61 6d 65 21 3d 30 20 29 3b 0a 20 20 6e 4e 61 6d  ame!=0 );.  nNam
2190: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
21a0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 29 20 2b 20 31  n(db, zName) + 1
21b0: 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d 49 54 5f 54  ;.  for(i=OMIT_T
21c0: 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e 6e 44 62  EMPDB; i<db->nDb
21d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
21e0: 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69 5e 31 20  j = (i<2) ? i^1 
21f0: 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61 72 63 68  : i;   /* Search
2200: 20 54 45 4d 50 20 62 65 66 6f 72 65 20 4d 41 49   TEMP before MAI
2210: 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 61  N */.    if( zDa
2220: 74 61 62 61 73 65 21 3d 30 20 26 26 20 73 71 6c  tabase!=0 && sql
2230: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 61 74  ite3StrICmp(zDat
2240: 61 62 61 73 65 2c 20 64 62 2d 3e 61 44 62 5b 6a  abase, db->aDb[j
2250: 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69  ].zName) ) conti
2260: 6e 75 65 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  nue;.    p = sql
2270: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
2280: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2290: 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e 61 6d 65  ->tblHash, zName
22a0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  , nName);.    if
22b0: 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  ( p ) break;.  }
22c0: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
22d0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
22e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63   in-memory struc
22f0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
2300: 62 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  bes a particular
2310: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62   database.** tab
2320: 6c 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d  le given the nam
2330: 65 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20  e of that table 
2340: 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29  and (optionally)
2350: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
2360: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
2370: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c  taining the tabl
2380: 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  e.  Return NULL 
2390: 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41  if not found.  A
23a0: 6c 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20  lso leave an.** 
23b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
23c0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
23d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
23e0: 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
23f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
2400: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2410: 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
2420: 2a 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65  ** routine leave
2430: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2440: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2450: 72 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73  rrMsg where.** s
2460: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2470: 29 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54  ) does not..*/.T
2480: 61 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63  able *sqlite3Loc
2490: 61 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73  ateTable(.  Pars
24a0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
24b0: 20 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e     /* context in
24c0: 20 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74   which to report
24d0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
24e0: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 20 20   isView,        
24f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c      /* True if l
2500: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56 49 45  ooking for a VIE
2510: 57 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20  W rather than a 
2520: 54 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74  TABLE */.  const
2530: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
2540: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2550: 20 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c 6f   table we are lo
2560: 6f 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63  oking for */.  c
2570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73  onst char *zDbas
2580: 65 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  e     /* Name of
2590: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
25a0: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
25b0: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a  .){.  Table *p;.
25c0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64  .  /* Read the d
25d0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
25e0: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
25f0: 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  rs, leave an err
2600: 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20  or message.  ** 
2610: 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72  and code in pPar
2620: 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  se and return NU
2630: 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  LL. */.  if( SQL
2640: 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52  ITE_OK!=sqlite3R
2650: 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65  eadSchema(pParse
2660: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2670: 30 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71  0;.  }..  p = sq
2680: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70  lite3FindTable(p
2690: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65  Parse->db, zName
26a0: 2c 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28  , zDbase);.  if(
26b0: 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e   p==0 ){.    con
26c0: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20  st char *zMsg = 
26d0: 69 73 56 69 65 77 20 3f 20 22 6e 6f 20 73 75 63  isView ? "no suc
26e0: 68 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75  h view" : "no su
26f0: 63 68 20 74 61 62 6c 65 22 3b 0a 20 20 20 20 69  ch table";.    i
2700: 66 28 20 7a 44 62 61 73 65 20 29 7b 0a 20 20 20  f( zDbase ){.   
2710: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
2720: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20  sg(pParse, "%s: 
2730: 25 73 2e 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44  %s.%s", zMsg, zD
2740: 62 61 73 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  base, zName);.  
2750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2760: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2770: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c  Parse, "%s: %s",
2780: 20 7a 4d 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20   zMsg, zName);. 
2790: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
27a0: 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31  >checkSchema = 1
27b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
27c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
27d0: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
27e0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
27f0: 65 73 63 72 69 62 65 73 20 0a 2a 2a 20 61 20 70  escribes .** a p
2800: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
2810: 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f  given the name o
2820: 66 20 74 68 61 74 20 69 6e 64 65 78 0a 2a 2a 20  f that index.** 
2830: 61 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  and the name of 
2840: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68 61  the database tha
2850: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  t contains the i
2860: 6e 64 65 78 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  ndex..** Return 
2870: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
2880: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74  d..**.** If zDat
2890: 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20  abase is 0, all 
28a0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73 65  databases are se
28b0: 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 0a 2a  arched for the.*
28c0: 2a 20 74 61 62 6c 65 20 61 6e 64 20 74 68 65 20  * table and the 
28d0: 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20 69  first matching i
28e0: 6e 64 65 78 20 69 73 20 72 65 74 75 72 6e 65 64  ndex is returned
28f0: 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 0a  .  (No checking.
2900: 2a 2a 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65  ** for duplicate
2910: 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 69 73 20   index names is 
2920: 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72  done.)  The sear
2930: 63 68 20 6f 72 64 65 72 20 69 73 0a 2a 2a 20 54  ch order is.** T
2940: 45 4d 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20  EMP first, then 
2950: 4d 41 49 4e 2c 20 74 68 65 6e 20 61 6e 79 20 61  MAIN, then any a
2960: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
2970: 65 73 20 61 64 64 65 64 0a 2a 2a 20 75 73 69 6e  es added.** usin
2980: 67 20 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d  g the ATTACH com
2990: 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a  mand..*/.Index *
29a0: 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78  sqlite3FindIndex
29b0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
29c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
29d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
29e0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 20 3d 20  ){.  Index *p = 
29f0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
2a00: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
2a10: 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d  3Strlen(db, zNam
2a20: 65 29 2b 31 3b 0a 20 20 66 6f 72 28 69 3d 4f 4d  e)+1;.  for(i=OM
2a30: 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d  IT_TEMPDB; i<db-
2a40: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
2a50: 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20  int j = (i<2) ? 
2a60: 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65 61  i^1 : i;  /* Sea
2a70: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2a80: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68 65  MAIN */.    Sche
2a90: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64 62  ma *pSchema = db
2aa0: 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d 61  ->aDb[j].pSchema
2ab0: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26 26  ;.    if( zDb &&
2ac0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2ad0: 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e  zDb, db->aDb[j].
2ae0: 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75  zName) ) continu
2af0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
2b00: 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31 20  Schema || (j==1 
2b10: 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  && !db->aDb[1].p
2b20: 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  Bt) );.    if( p
2b30: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
2b40: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
2b50: 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69 64  ind(&pSchema->id
2b60: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  xHash, zName, nN
2b70: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
2b80: 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a 20  if( p ) break;. 
2b90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
2ba0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d 20  ../*.** Reclaim 
2bb0: 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  the memory used 
2bc0: 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a 73  by an index.*/.s
2bd0: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 49  tatic void freeI
2be0: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a  ndex(Index *p){.
2bf0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2c00: 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 3b 0a 20  p->pTable->db;. 
2c10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
2c20: 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a  b, p->zColAff);.
2c30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2c40: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
2c50: 20 52 65 6d 6f 76 65 20 74 68 65 20 67 69 76 65   Remove the give
2c60: 6e 20 69 6e 64 65 78 20 66 72 6f 6d 20 74 68 65  n index from the
2c70: 20 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c   index hash tabl
2c80: 65 2c 20 61 6e 64 20 66 72 65 65 0a 2a 2a 20 69  e, and free.** i
2c90: 74 73 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  ts memory struct
2ca0: 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ures..**.** The 
2cb0: 69 6e 64 65 78 20 69 73 20 72 65 6d 6f 76 65 64  index is removed
2cc0: 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2cd0: 73 65 20 68 61 73 68 20 74 61 62 6c 65 73 20 62  se hash tables b
2ce0: 75 74 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20  ut.** it is not 
2cf0: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
2d00: 65 20 54 61 62 6c 65 20 74 68 61 74 20 69 74 20  e Table that it 
2d10: 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 55 6e 6c 69  indexes..** Unli
2d20: 6e 6b 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 54  nking from the T
2d30: 61 62 6c 65 20 6d 75 73 74 20 62 65 20 64 6f 6e  able must be don
2d40: 65 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  e by the calling
2d50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2d60: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
2d70: 33 44 65 6c 65 74 65 49 6e 64 65 78 28 49 6e 64  3DeleteIndex(Ind
2d80: 65 78 20 2a 70 29 7b 0a 20 20 49 6e 64 65 78 20  ex *p){.  Index 
2d90: 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e 73 74 20 63  *pOld;.  const c
2da0: 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 2d 3e  har *zName = p->
2db0: 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f 6c 64 20 3d  zName;..  pOld =
2dc0: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
2dd0: 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e  rt(&p->pSchema->
2de0: 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 0a  idxHash, zName,.
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2e10: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
2e20: 29 2b 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  )+1, 0);.  asser
2e30: 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20 70 4f  t( pOld==0 || pO
2e40: 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65 65 49  ld==p );.  freeI
2e50: 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ndex(p);.}../*.*
2e60: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
2e70: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
2e80: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
2e90: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
2ea0: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
2eb0: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
2ec0: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
2ed0: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
2ee0: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
2ef0: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
2f00: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
2f10: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
2f20: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
2f30: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
2f40: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
2f50: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
2f60: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
2f70: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
2f80: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
2f90: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e 74 20   *pIndex;.  int 
2fa0: 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  len;.  Hash *pHa
2fb0: 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  sh = &db->aDb[iD
2fc0: 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b].pSchema->idxH
2fd0: 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71  ash;..  len = sq
2fe0: 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c 20  lite3Strlen(db, 
2ff0: 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  zIdxName);.  pIn
3000: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73  dex = sqlite3Has
3010: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
3020: 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2b 31 2c 20  IdxName, len+1, 
3030: 30 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  0);.  if( pIndex
3040: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64   ){.    if( pInd
3050: 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64  ex->pTable->pInd
3060: 65 78 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20  ex==pIndex ){.  
3070: 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62      pIndex->pTab
3080: 6c 65 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  le->pIndex = pIn
3090: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
30a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64  }else{.      Ind
30b0: 65 78 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72  ex *p;.      for
30c0: 28 70 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c  (p=pIndex->pTabl
30d0: 65 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  e->pIndex; p && 
30e0: 70 2d 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78  p->pNext!=pIndex
30f0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a  ; p=p->pNext){}.
3100: 20 20 20 20 20 20 69 66 28 20 70 20 26 26 20 70        if( p && p
3110: 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20  ->pNext==pIndex 
3120: 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  ){.        p->pN
3130: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
3140: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
3150: 20 7d 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78   }.    freeIndex
3160: 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20  (pIndex);.  }.  
3170: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
3180: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
3190: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73  s;.}../*.** Eras
31a0: 65 20 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66  e all schema inf
31b0: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
31c0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
31d0: 20 74 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20   tables of.** a 
31e0: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e  single database.
31f0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
3200: 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c  s called to recl
3210: 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65  aim memory.** be
3220: 66 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  fore the databas
3230: 65 20 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73  e closes.  It is
3240: 20 61 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72   also called dur
3250: 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ing a rollback.*
3260: 2a 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  * if there were 
3270: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64  schema changes d
3280: 75 72 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61  uring the transa
3290: 63 74 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a  ction or if a.**
32a0: 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d   schema-cookie m
32b0: 69 73 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a  ismatch occurs..
32c0: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 20  **.** If iDb==0 
32d0: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
32e0: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74  nternal schema t
32f0: 61 62 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61  ables for all da
3300: 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e  tabase.** files.
3310: 20 20 49 66 20 69 44 62 3e 3d 31 20 74 68 65 6e    If iDb>=1 then
3320: 20 72 65 73 65 74 20 74 68 65 20 69 6e 74 65 72   reset the inter
3330: 6e 61 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f  nal schema for o
3340: 6e 6c 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c  nly the.** singl
3350: 65 20 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64  e file indicated
3360: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3370: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
3380: 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62  hema(sqlite3 *db
3390: 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e  , int iDb){.  in
33a0: 74 20 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74  t i, j;.  assert
33b0: 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
33c0: 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66  db->nDb );..  if
33d0: 28 20 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20  ( iDb==0 ){.    
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
33f0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 20 20  rAll(db);.  }.  
3400: 66 6f 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d  for(i=iDb; i<db-
3410: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
3420: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
3430: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
3440: 44 62 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Db->pSchema ){. 
3450: 20 20 20 20 20 61 73 73 65 72 74 28 69 3d 3d 31       assert(i==1
3460: 20 7c 7c 20 28 70 44 62 2d 3e 70 42 74 20 26 26   || (pDb->pBt &&
3470: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
3480: 64 73 4d 75 74 65 78 28 70 44 62 2d 3e 70 42 74  dsMutex(pDb->pBt
3490: 29 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )));.      sqlit
34a0: 65 33 53 63 68 65 6d 61 46 72 65 65 28 70 44 62  e3SchemaFree(pDb
34b0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
34c0: 7d 0a 20 20 20 20 69 66 28 20 69 44 62 3e 30 20  }.    if( iDb>0 
34d0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20  ) return;.  }.  
34e0: 61 73 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29  assert( iDb==0 )
34f0: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d  ;.  db->flags &=
3500: 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43   ~SQLITE_InternC
3510: 68 61 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65  hanges;.  sqlite
3520: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
3530: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  b);..  /* If one
3540: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
3550: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
3560: 73 65 20 66 69 6c 65 73 20 68 61 73 20 62 65 65  se files has bee
3570: 6e 20 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74  n closed,.  ** t
3580: 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d 20  hen remove them 
3590: 66 72 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61  from the auxilia
35a0: 72 79 20 64 61 74 61 62 61 73 65 20 6c 69 73 74  ry database list
35b0: 2e 20 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20  .  We take the. 
35c0: 20 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   ** opportunity 
35d0: 74 6f 20 64 6f 20 74 68 69 73 20 68 65 72 65 20  to do this here 
35e0: 73 69 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75  since we have ju
35f0: 73 74 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f  st deleted all o
3600: 66 20 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d  f the.  ** schem
3610: 61 20 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e  a hash tables an
3620: 64 20 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e  d therefore do n
3630: 6f 74 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20  ot have to make 
3640: 61 6e 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a  any changes.  **
3650: 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65   to any of those
3660: 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
3670: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
3680: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Db; i++){.    st
3690: 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26  ruct Db *pDb = &
36a0: 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20  db->aDb[i];.    
36b0: 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20  if( pDb->pBt==0 
36c0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ){.      if( pDb
36d0: 2d 3e 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78  ->pAux && pDb->x
36e0: 46 72 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78  FreeAux ) pDb->x
36f0: 46 72 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75  FreeAux(pDb->pAu
3700: 78 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  x);.      pDb->p
3710: 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Aux = 0;.    }. 
3720: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20   }.  for(i=j=2; 
3730: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
3740: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
3750: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
3760: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
3770: 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  pBt==0 ){.      
3780: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3790: 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  , pDb->zName);. 
37a0: 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20       pDb->zName 
37b0: 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
37c0: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
37d0: 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20  f( j<i ){.      
37e0: 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d  db->aDb[j] = db-
37f0: 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aDb[i];.    }. 
3800: 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65     j++;.  }.  me
3810: 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d  mset(&db->aDb[j]
3820: 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29  , 0, (db->nDb-j)
3830: 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b  *sizeof(db->aDb[
3840: 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20  j]));.  db->nDb 
3850: 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e  = j;.  if( db->n
3860: 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62  Db<=2 && db->aDb
3870: 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20  !=db->aDbStatic 
3880: 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62  ){.    memcpy(db
3890: 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d  ->aDbStatic, db-
38a0: 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64  >aDb, 2*sizeof(d
38b0: 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20  b->aDb[0]));.   
38c0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
38d0: 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20  b, db->aDb);.   
38e0: 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61   db->aDb = db->a
38f0: 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a  DbStatic;.  }.}.
3900: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3910: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
3920: 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75  en a commit occu
3930: 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  rs..*/.void sqli
3940: 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
3950: 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33  lChanges(sqlite3
3960: 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61   *db){.  db->fla
3970: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e  gs &= ~SQLITE_In
3980: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
3990: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
39a0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
39b0: 6d 20 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65  m a table or vie
39c0: 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  w..*/.static voi
39d0: 64 20 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c  d sqliteResetCol
39e0: 75 6d 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a  umnNames(Table *
39f0: 70 54 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69  pTable){.  int i
3a00: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
3a10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
3a20: 3d 20 70 54 61 62 6c 65 2d 3e 64 62 3b 0a 20 20  = pTable->db;.  
3a30: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d  assert( pTable!=
3a40: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  0 );.  if( (pCol
3a50: 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29   = pTable->aCol)
3a60: 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  !=0 ){.    for(i
3a70: 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43  =0; i<pTable->nC
3a80: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
3a90: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
3aa0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
3ab0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  zName);.      sq
3ac0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
3ad0: 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29  db, pCol->pDflt)
3ae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
3af0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
3b00: 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73 71  zType);.      sq
3b10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3b20: 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20 20  pCol->zColl);.  
3b30: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
3b40: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
3b50: 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20 70  ->aCol);.  }.  p
3b60: 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30 3b  Table->aCol = 0;
3b70: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20  .  pTable->nCol 
3b80: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
3b90: 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  move the memory 
3ba0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
3bb0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3bc0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61 62  the given.** Tab
3bd0: 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73 20  le.  No changes 
3be0: 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73 6b  are made to disk
3bf0: 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
3c00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3c10: 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74 65  tine just delete
3c20: 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75 63  s the data struc
3c30: 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20 6e  ture.  It does n
3c40: 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65  ot unlink.** the
3c50: 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72 75   table data stru
3c60: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 68  cture from the h
3c70: 61 73 68 20 74 61 62 6c 65 2e 20 20 4e 6f 72 20  ash table.  Nor 
3c80: 64 6f 65 73 20 69 74 20 72 65 6d 6f 76 65 0a 2a  does it remove.*
3c90: 2a 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 66  * foreign keys f
3ca0: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 2e 61  rom the sqlite.a
3cb0: 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c 65 2e  FKey hash table.
3cc0: 20 20 42 75 74 20 69 74 20 64 6f 65 73 20 64 65    But it does de
3cd0: 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f 72 79 20  stroy.** memory 
3ce0: 73 74 72 75 63 74 75 72 65 73 20 6f 66 20 74 68  structures of th
3cf0: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 66 6f  e indices and fo
3d00: 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f 63  reign keys assoc
3d10: 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74  iated with .** t
3d20: 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69  he table..*/.voi
3d30: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54  d sqlite3DeleteT
3d40: 61 62 6c 65 28 54 61 62 6c 65 20 2a 70 54 61 62  able(Table *pTab
3d50: 6c 65 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  le){.  Index *pI
3d60: 6e 64 65 78 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  ndex, *pNext;.  
3d70: 46 4b 65 79 20 2a 70 46 4b 65 79 2c 20 2a 70 4e  FKey *pFKey, *pN
3d80: 65 78 74 46 4b 65 79 3b 0a 20 20 73 71 6c 69 74  extFKey;.  sqlit
3d90: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70  e3 *db;..  if( p
3da0: 54 61 62 6c 65 3d 3d 30 20 29 20 72 65 74 75 72  Table==0 ) retur
3db0: 6e 3b 0a 20 20 64 62 20 3d 20 70 54 61 62 6c 65  n;.  db = pTable
3dc0: 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e  ->db;..  /* Do n
3dd0: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 74 61  ot delete the ta
3de0: 62 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ble until the re
3df0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
3e00: 61 63 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  aches zero. */. 
3e10: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b   pTable->nRef--;
3e20: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e  .  if( pTable->n
3e30: 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  Ref>0 ){.    ret
3e40: 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
3e50: 74 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d  t( pTable->nRef=
3e60: 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65  =0 );..  /* Dele
3e70: 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61  te all indices a
3e80: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
3e90: 68 69 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  his table.  */. 
3ea0: 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54   for(pIndex = pT
3eb0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49  able->pIndex; pI
3ec0: 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65  ndex; pIndex=pNe
3ed0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
3ee0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
3ef0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 64      assert( pInd
3f00: 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  ex->pSchema==pTa
3f10: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a  ble->pSchema );.
3f20: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
3f30: 65 49 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a  eIndex(pIndex);.
3f40: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
3f50: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
3f60: 5f 4b 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65  _KEY.  /* Delete
3f70: 20 61 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79   all foreign key
3f80: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3f90: 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 54  h this table.  T
3fa0: 68 65 20 6b 65 79 73 0a 20 20 2a 2a 20 73 68 6f  he keys.  ** sho
3fb0: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
3fc0: 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 20 66   been unlinked f
3fd0: 72 6f 6d 20 74 68 65 20 70 53 63 68 65 6d 61 2d  rom the pSchema-
3fe0: 3e 61 46 4b 65 79 20 68 61 73 68 20 74 61 62 6c  >aFKey hash tabl
3ff0: 65 20 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 46  e .  */.  for(pF
4000: 4b 65 79 3d 70 54 61 62 6c 65 2d 3e 70 46 4b 65  Key=pTable->pFKe
4010: 79 3b 20 70 46 4b 65 79 3b 20 70 46 4b 65 79 3d  y; pFKey; pFKey=
4020: 70 4e 65 78 74 46 4b 65 79 29 7b 0a 20 20 20 20  pNextFKey){.    
4030: 70 4e 65 78 74 46 4b 65 79 20 3d 20 70 46 4b 65  pNextFKey = pFKe
4040: 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 3b 0a 20 20  y->pNextFrom;.  
4050: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
4060: 33 48 61 73 68 46 69 6e 64 28 26 70 54 61 62 6c  3HashFind(&pTabl
4070: 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  e->pSchema->aFKe
4080: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
40a0: 4b 65 79 2d 3e 7a 54 6f 2c 20 73 71 6c 69 74 65  Key->zTo, sqlite
40b0: 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d  3Strlen30(pFKey-
40c0: 3e 7a 54 6f 29 2b 31 29 21 3d 70 46 4b 65 79 20  >zTo)+1)!=pFKey 
40d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
40e0: 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
40f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
4100: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54 61 62  * Delete the Tab
4110: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 74 73  le structure its
4120: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  elf..  */.  sqli
4130: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
4140: 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71  es(pTable);.  sq
4150: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
4160: 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  pTable->zName);.
4170: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4180: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c  db, pTable->zCol
4190: 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  Aff);.  sqlite3S
41a0: 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
41b0: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29  pTable->pSelect)
41c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
41d0: 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20 73 71  _OMIT_CHECK.  sq
41e0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
41f0: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  db, pTable->pChe
4200: 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  ck);.#endif.  sq
4210: 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72 28 70  lite3VtabClear(p
4220: 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  Table);.  sqlite
4230: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
4240: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  le);.}../*.** Un
4250: 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74  link the given t
4260: 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61  able from the ha
4270: 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68  sh tables and th
4280: 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20  e delete the.** 
4290: 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20  table structure 
42a0: 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64  with all its ind
42b0: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
42c0: 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73   keys..*/.void s
42d0: 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44  qlite3UnlinkAndD
42e0: 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74  eleteTable(sqlit
42f0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
4300: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
4310: 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20  bName){.  Table 
4320: 2a 70 3b 0a 20 20 46 4b 65 79 20 2a 70 46 31 2c  *p;.  FKey *pF1,
4330: 20 2a 70 46 32 3b 0a 20 20 44 62 20 2a 70 44 62   *pF2;.  Db *pDb
4340: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  ;..  assert( db!
4350: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
4360: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
4370: 2d 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72  ->nDb );.  asser
4380: 74 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a  t( zTabName && z
4390: 54 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20  TabName[0] );.  
43a0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
43b0: 44 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  Db];.  p = sqlit
43c0: 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44  e3HashInsert(&pD
43d0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
43e0: 61 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20  ash, zTabName,. 
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74         sqlite3St
4410: 72 6c 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29  rlen30(zTabName)
4420: 2b 31 2c 30 29 3b 0a 20 20 69 66 28 20 70 20 29  +1,0);.  if( p )
4430: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
4440: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
4450: 59 0a 20 20 20 20 66 6f 72 28 70 46 31 3d 70 2d  Y.    for(pF1=p-
4460: 3e 70 46 4b 65 79 3b 20 70 46 31 3b 20 70 46 31  >pFKey; pF1; pF1
4470: 3d 70 46 31 2d 3e 70 4e 65 78 74 46 72 6f 6d 29  =pF1->pNextFrom)
4480: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 20  {.      int nTo 
4490: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
44a0: 30 28 70 46 31 2d 3e 7a 54 6f 29 20 2b 20 31 3b  0(pF1->zTo) + 1;
44b0: 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73 71 6c  .      pF2 = sql
44c0: 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 70 44  ite3HashFind(&pD
44d0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  b->pSchema->aFKe
44e0: 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e 54 6f  y, pF1->zTo, nTo
44f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 32  );.      if( pF2
4500: 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20 20 20  ==pF1 ){.       
4510: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
4520: 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61  rt(&pDb->pSchema
4530: 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e 7a 54  ->aFKey, pF1->zT
4540: 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70 4e 65  o, nTo, pF1->pNe
4550: 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtTo);.      }el
4560: 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
4570: 65 28 20 70 46 32 20 26 26 20 70 46 32 2d 3e 70  e( pF2 && pF2->p
4580: 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b 20 70  NextTo!=pF1 ){ p
4590: 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54 6f 3b  F2=pF2->pNextTo;
45a0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
45b0: 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  F2 ){.          
45c0: 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70  pF2->pNextTo = p
45d0: 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20 20 20  F1->pNextTo;.   
45e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
45f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4600: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
4610: 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d  le(p);.  }.  db-
4620: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
4630: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
4640: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
4650: 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61   token, return a
4660: 20 73 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   string that con
4670: 73 69 73 74 73 20 6f 66 20 74 68 65 20 74 65 78  sists of the tex
4680: 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b  t of that.** tok
4690: 65 6e 20 77 69 74 68 20 61 6e 79 20 71 75 6f 74  en with any quot
46a0: 61 74 69 6f 6e 73 20 72 65 6d 6f 76 65 64 2e 20  ations removed. 
46b0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
46c0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
46d0: 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65  ng.** is obtaine
46e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
46f0: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
4700: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
4710: 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69  alling.** functi
4720: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73  on..**.** Tokens
4730: 20 61 72 65 20 6f 66 74 65 6e 20 6a 75 73 74 20   are often just 
4740: 70 6f 69 6e 74 65 72 73 20 69 6e 74 6f 20 74 68  pointers into th
4750: 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 74  e original SQL t
4760: 65 78 74 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72  ext and so.** ar
4770: 65 20 6e 6f 74 20 5c 30 30 30 20 74 65 72 6d 69  e not \000 termi
4780: 6e 61 74 65 64 20 61 6e 64 20 61 72 65 20 6e 6f  nated and are no
4790: 74 20 70 65 72 73 69 73 74 65 6e 74 2e 20 20 54  t persistent.  T
47a0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
47b0: 6e 67 0a 2a 2a 20 69 73 20 5c 30 30 30 20 74 65  ng.** is \000 te
47c0: 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 69 73 20  rminated and is 
47d0: 70 65 72 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63  persistent..*/.c
47e0: 68 61 72 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65  har *sqlite3Name
47f0: 46 72 6f 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65  FromToken(sqlite
4800: 33 20 2a 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e  3 *db, Token *pN
4810: 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e  ame){.  char *zN
4820: 61 6d 65 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65  ame;.  if( pName
4830: 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20   ){.    zName = 
4840: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
4850: 28 64 62 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d  (db, (char*)pNam
4860: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b  e->z, pName->n);
4870: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75  .    sqlite3Dequ
4880: 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65  ote(zName);.  }e
4890: 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  lse{.    zName =
48a0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
48b0: 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zName;.}../*.**
48c0: 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74 65   Open the sqlite
48d0: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73 74  _master table st
48e0: 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73 65  ored in database
48f0: 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72 0a   number iDb for.
4900: 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65 20  ** writing. The 
4910: 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  table is opened 
4920: 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e 0a  using cursor 0..
4930: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4f  */.void sqlite3O
4940: 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28 50  penMasterTable(P
4950: 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  arse *p, int iDb
4960: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
4970: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 29  qlite3GetVdbe(p)
4980: 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65  ;.  sqlite3Table
4990: 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41 53  Lock(p, iDb, MAS
49a0: 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43 48  TER_ROOT, 1, SCH
49b0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
49c0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
49d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65 74 4e 75  dOp2(v, OP_SetNu
49e0: 6d 43 6f 6c 75 6d 6e 73 2c 20 30 2c 20 35 29 3b  mColumns, 0, 5);
49f0: 2f 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  /* sqlite_master
4a00: 20 68 61 73 20 35 20 63 6f 6c 75 6d 6e 73 20 2a   has 5 columns *
4a10: 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  /.  sqlite3VdbeA
4a20: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
4a30: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
4a40: 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 7d 0a 0a  _ROOT, iDb);.}..
4a50: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
4a60: 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74 6f 20  zName points to 
4a70: 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
4a80: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
4a90: 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  ng the name.** o
4aa0: 66 20 61 20 64 61 74 61 62 61 73 65 20 28 22 6d  f a database ("m
4ab0: 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f 72 20  ain", "temp" or 
4ac0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61  the name of an a
4ad0: 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69  ttached db). Thi
4ae0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
4af0: 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65 78 20  turns the index 
4b00: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
4b10: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
4b20: 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69 66 20  [], or.** -1 if 
4b30: 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63 61 6e  the named db can
4b40: 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
4b50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
4b60: 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a  DbName(sqlite3 *
4b70: 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
4b80: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
4b90: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
4ba0: 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72   Database number
4bb0: 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20   */.  if( zName 
4bc0: 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 3b 0a  ){.    Db *pDb;.
4bd0: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
4be0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
4bf0: 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 64  e);.    for(i=(d
4c00: 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62 3d 26  b->nDb-1), pDb=&
4c10: 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e 3d 30  db->aDb[i]; i>=0
4c20: 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b 0a 20  ; i--, pDb--){. 
4c30: 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49 54 5f       if( (!OMIT_
4c40: 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31 20 29  TEMPDB || i!=1 )
4c50: 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33 53 74   && n==sqlite3St
4c60: 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e 61 6d  rlen30(pDb->zNam
4c70: 65 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  e) && .         
4c80: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
4c90: 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  mp(pDb->zName, z
4ca0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
4cb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4cc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4cd0: 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn i;.}../*.** T
4ce0: 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  he token *pName 
4cf0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
4d00: 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  e of a database 
4d10: 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22 20 6f  (either "main" o
4d20: 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72 20 74  r.** "temp" or t
4d30: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 61 74  he name of an at
4d40: 74 61 63 68 65 64 20 64 62 29 2e 20 54 68 69 73  tached db). This
4d50: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
4d60: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 6f 66   the.** index of
4d70: 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74 61 62   the named datab
4d80: 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  ase in db->aDb[]
4d90: 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65 20 6e  , or -1 if the n
4da0: 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f 65 73  amed db .** does
4db0: 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a 69   not exist..*/.i
4dc0: 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  nt sqlite3FindDb
4dd0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f  (sqlite3 *db, To
4de0: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
4df0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e10: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
4e20: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
4e30: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
4e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e50: 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72 65 20   /* Name we are 
4e60: 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 2a 2f  searching for */
4e70: 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  zName = sqlit
4e80: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
4e90: 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 20  db, pName);.  i 
4ea0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
4eb0: 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ame(db, zName);.
4ec0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4ed0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65  db, zName);.  re
4ee0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn i;.}../* Th
4ef0: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
4f00: 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d 65 20  or trigger name 
4f10: 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  is passed to thi
4f20: 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20 74 6f  s routine via to
4f30: 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31 20 61  kens.** pName1 a
4f40: 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20 74 68  nd pName2. If th
4f50: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 61 73  e table name was
4f60: 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
4f70: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a  , for example:.*
4f80: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
4f90: 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b  E xxx.yyy (...);
4fa0: 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70 4e 61  .** .** Then pNa
4fb0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
4fc0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
4fd0: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
4fe0: 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20 74 68  er hand if.** th
4ff0: 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 73 20  e table name is 
5000: 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  not fully qualif
5010: 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a 2a 2a  ied, i.e.:.**.**
5020: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 79 79   CREATE TABLE yy
5030: 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20 54 68  y(...);.**.** Th
5040: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5050: 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20 70 4e   to "yyy" and pN
5060: 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a 0a 2a  ame2 is ""..**.*
5070: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
5080: 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71 75 61  ets the *ppUnqua
5090: 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69  l pointer to poi
50a0: 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20  nt at the token 
50b0: 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20 70 4e  (pName1 or.** pN
50c0: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
50d0: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
50e0: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 20 54  d table name.  T
50f0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
5100: 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78 78 78  ** database "xxx
5110: 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  " is returned..*
5120: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 77 6f  /.int sqlite3Two
5130: 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61 72 73  PartName(.  Pars
5140: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5150: 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20 63  /* Parsing and c
5160: 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ode generating c
5170: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5180: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 20  n *pName1,      
5190: 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69 6e 20  /* The "xxx" in 
51a0: 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e 79 79  the name "xxx.yy
51b0: 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f 0a 20  y" or "xxx" */. 
51c0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
51d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79 79 79       /* The "yyy
51e0: 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78  " in the name "x
51f0: 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54 6f 6b  xx.yyy" */.  Tok
5200: 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20 20 20  en **pUnqual    
5210: 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 75 6e   /* Write the un
5220: 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74  qualified object
5230: 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a 29 7b   name here */.){
5240: 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
5250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5260: 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
5270: 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f  ng the object */
5280: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5290: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
52a0: 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70 4e  if( pName2 && pN
52b0: 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  ame2->n>0 ){.   
52c0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
52d0: 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c  sy ) {.      sql
52e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
52f0: 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61  rse, "corrupt da
5300: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
5310: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
5320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
5330: 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71  .    }.    *pUnq
5340: 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20  ual = pName2;.  
5350: 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 46    iDb = sqlite3F
5360: 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d 65 31  indDb(db, pName1
5370: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
5380: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5390: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
53a0: 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62  , "unknown datab
53b0: 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65 31 29  ase %T", pName1)
53c0: 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ;.      pParse->
53d0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
53e0: 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20  turn -1;.    }. 
53f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
5400: 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  rt( db->init.iDb
5410: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69 74 2e  ==0 || db->init.
5420: 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44 62 20  busy );.    iDb 
5430: 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a  = db->init.iDb;.
5440: 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20 70      *pUnqual = p
5450: 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72 65 74  Name1;.  }.  ret
5460: 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn iDb;.}../*.*
5470: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
5480: 73 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20  s used to check 
5490: 69 66 20 74 68 65 20 55 54 46 2d 38 20 73 74 72  if the UTF-8 str
54a0: 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61 20 6c  ing zName is a l
54b0: 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c 69 66  egal.** unqualif
54c0: 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 6e  ied name for a n
54d0: 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74  ew schema object
54e0: 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78 2c 20   (table, index, 
54f0: 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69 67 67  view or.** trigg
5500: 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73 20 61  er). All names a
5510: 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70 74 20  re legal except 
5520: 74 68 6f 73 65 20 74 68 61 74 20 62 65 67 69 6e  those that begin
5530: 20 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67   with the string
5540: 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20 28 69  .** "sqlite_" (i
5550: 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72 20 6f  n upper, lower o
5560: 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e 20 54  r mixed case). T
5570: 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  his portion of t
5580: 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20  he namespace.** 
5590: 69 73 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  is reserved for 
55a0: 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a 2a 2f  internal use..*/
55b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
55c0: 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61 72 73  kObjectName(Pars
55d0: 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73 74  e *pParse, const
55e0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
55f0: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 64 62   if( !pParse->db
5600: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 70  ->init.busy && p
5610: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30  Parse->nested==0
5620: 20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28   .          && (
5630: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61 67  pParse->db->flag
5640: 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69 74 65  s & SQLITE_Write
5650: 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20 20 20  Schema)==0.     
5660: 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c 69 74       && 0==sqlit
5670: 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61 6d 65  e3StrNICmp(zName
5680: 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 20  , "sqlite_", 7) 
5690: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
56a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
56b0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65 73 65  object name rese
56c0: 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61  rved for interna
56d0: 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e 61 6d  l use: %s", zNam
56e0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
56f0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
5700: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5710: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  _OK;.}../*.** Be
5720: 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  gin constructing
5730: 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72 65 70   a new table rep
5740: 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e 20 6d  resentation in m
5750: 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69 73 0a  emory.  This is.
5760: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 66 20  ** the first of 
5770: 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e 20 72  several action r
5780: 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67 65 74  outines that get
5790: 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73 70 6f   called in respo
57a0: 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52 45 41  nse.** to a CREA
57b0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
57c0: 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63 75 6c  nt.  In particul
57d0: 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ar, this routine
57e0: 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 61 66   is called.** af
57f0: 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b 65 6e  ter seeing token
5800: 73 20 22 43 52 45 41 54 45 22 20 61 6e 64 20 22  s "CREATE" and "
5810: 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65 20 74  TABLE" and the t
5820: 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 69  able name. The i
5830: 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20 69 73  sTemp.** flag is
5840: 20 74 72 75 65 20 69 66 20 74 68 65 20 74 61 62   true if the tab
5850: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 74 6f  le should be sto
5860: 72 65 64 20 69 6e 20 74 68 65 20 61 75 78 69 6c  red in the auxil
5870: 69 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  iary database.**
5880: 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66   file instead of
5890: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
58a0: 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
58b0: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 74 68  s is normally th
58c0: 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e 20 74  e case.** when t
58d0: 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22 54 45  he "TEMP" or "TE
58e0: 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f 72 64  MPORARY" keyword
58f0: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
5900: 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61 6e 64  en.** CREATE and
5910: 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20 54 68   TABLE..**.** Th
5920: 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65 63 6f  e new table reco
5930: 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  rd is initialize
5940: 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70 50 61  d and put in pPa
5950: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 2e 0a  rse->pNewTable..
5960: 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20 74 68  ** As more of th
5970: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
5980: 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61 72 73  tatement is pars
5990: 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 61  ed, additional a
59a0: 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69 6e 65  ction.** routine
59b0: 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  s will be called
59c0: 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69 6e 66   to add more inf
59d0: 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68 69 73  ormation to this
59e0: 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74 20 74   record..** At t
59f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52  he end of the CR
5a00: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5a10: 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  ment, the sqlite
5a20: 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f 75 74  3EndTable() rout
5a30: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
5a40: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
5a50: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6f 66   construction of
5a60: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72   the new table r
5a70: 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ecord..*/.void s
5a80: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
5a90: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
5aa0: 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63  e,   /* Parser c
5ab0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5ac0: 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f 2a 20  n *pName1,   /* 
5ad0: 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 74 68  First part of th
5ae0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
5af0: 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20  ble or view */. 
5b00: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20   Token *pName2, 
5b10: 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
5b20: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   of the name of 
5b30: 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  the table or vie
5b40: 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d  w */.  int isTem
5b50: 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  p,      /* True 
5b60: 69 66 20 74 68 69 73 20 69 73 20 61 20 54 45 4d  if this is a TEM
5b70: 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  P table */.  int
5b80: 20 69 73 56 69 65 77 2c 20 20 20 20 20 20 2f 2a   isView,      /*
5b90: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5ba0: 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69 6e 74   a VIEW */.  int
5bb0: 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20 2f 2a   isVirtual,   /*
5bc0: 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
5bd0: 20 61 20 56 49 52 54 55 41 4c 20 74 61 62 6c 65   a VIRTUAL table
5be0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20   */.  int noErr 
5bf0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
5c00: 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20 61 6c  hing if table al
5c10: 72 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a  ready exists */.
5c20: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
5c30: 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  le;.  char *zNam
5c40: 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20 6e 61  e = 0; /* The na
5c50: 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  me of the new ta
5c60: 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
5c70: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5c80: 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
5c90: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
5ca0: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5cb0: 62 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68  ber to create th
5cc0: 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a 20 20  e table in */.  
5cd0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20 20 20  Token *pName;   
5ce0: 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
5cf0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
5d00: 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 0a  e to create */..
5d10: 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f    /* The table o
5d20: 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f 20 63  r view name to c
5d30: 72 65 61 74 65 20 69 73 20 70 61 73 73 65 64 20  reate is passed 
5d40: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5d50: 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a 2a 20  via tokens.  ** 
5d60: 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65  pName1 and pName
5d70: 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  2. If the table 
5d80: 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71  name was fully q
5d90: 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78  ualified, for ex
5da0: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
5db0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 78   CREATE TABLE xx
5dc0: 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20 20 2a  x.yyy (...);.  *
5dd0: 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  * .  ** Then pNa
5de0: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 78  me1 is set to "x
5df0: 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 22  xx" and pName2 "
5e00: 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f 74 68  yyy". On the oth
5e10: 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a 2a 20  er hand if.  ** 
5e20: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
5e30: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
5e40: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20 20 2a  ified, i.e.:.  *
5e50: 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41  *.  ** CREATE TA
5e60: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 20 20  BLE yyy(...);.  
5e70: 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70 4e 61  **.  ** Then pNa
5e80: 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20 22 79  me1 is set to "y
5e90: 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32 20 69  yy" and pName2 i
5ea0: 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  s ""..  **.  ** 
5eb0: 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77 20 73  The call below s
5ec0: 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20 70 6f  ets the pName po
5ed0: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  inter to point a
5ee0: 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70 4e 61  t the token (pNa
5ef0: 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e 61 6d  me1 or.  ** pNam
5f00: 65 32 29 20 74 68 61 74 20 73 74 6f 72 65 73 20  e2) that stores 
5f10: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5f20: 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20  table name. The 
5f30: 76 61 72 69 61 62 6c 65 20 69 44 62 20 69 73 0a  variable iDb is.
5f40: 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20    ** set to the 
5f50: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64 61 74  index of the dat
5f60: 61 62 61 73 65 20 74 68 61 74 20 74 68 65 20 74  abase that the t
5f70: 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69 73 20  able or view is 
5f80: 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  to be.  ** creat
5f90: 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 44  ed in..  */.  iD
5fa0: 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61  b = sqlite3TwoPa
5fb0: 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  rtName(pParse, p
5fc0: 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26  Name1, pName2, &
5fd0: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  pName);.  if( iD
5fe0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
5ff0: 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
6000: 20 26 26 20 69 73 54 65 6d 70 20 26 26 20 69 44   && isTemp && iD
6010: 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  b>1 ){.    /* If
6020: 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d 70   creating a temp
6030: 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d 65   table, the name
6040: 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61 6c   may not be qual
6050: 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c  ified */.    sql
6060: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6070: 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72 79 20  rse, "temporary 
6080: 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20  table name must 
6090: 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64 22 29  be unqualified")
60a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
60b0: 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45  }.  if( !OMIT_TE
60c0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
60d0: 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70 50 61   iDb = 1;..  pPa
60e0: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
60f0: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e 61 6d  = *pName;.  zNam
6100: 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
6110: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
6120: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
6130: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
6140: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
6150: 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63  qlite3CheckObjec
6160: 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e  tName(pParse, zN
6170: 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ame) ){.    goto
6180: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
6190: 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 62  or;.  }.  if( db
61a0: 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20 29 20  ->init.iDb==1 ) 
61b0: 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69 66 6e  isTemp = 1;.#ifn
61c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
61d0: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
61e0: 61 73 73 65 72 74 28 20 28 69 73 54 65 6d 70 20  assert( (isTemp 
61f0: 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29 3b 0a  & 1)==isTemp );.
6200: 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65    {.    int code
6210: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20  ;.    char *zDb 
6220: 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
6230: 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
6240: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
6250: 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
6260: 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
6270: 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a  LE(isTemp), 0, z
6280: 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
6290: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
62a0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ror;.    }.    i
62b0: 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20 20 20  f( isView ){.   
62c0: 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d     if( !OMIT_TEM
62d0: 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b  PDB && isTemp ){
62e0: 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
62f0: 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45  SQLITE_CREATE_TE
6300: 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  MP_VIEW;.      }
6310: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
6320: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
6330: 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  TE_VIEW;.      }
6340: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6350: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6360: 44 42 20 26 26 20 69 73 54 65 6d 70 20 29 7b 0a  DB && isTemp ){.
6370: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
6380: 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d  QLITE_CREATE_TEM
6390: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
63a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
63b0: 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41  de = SQLITE_CREA
63c0: 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  TE_TABLE;.      
63d0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
63e0: 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73 71  !isVirtual && sq
63f0: 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
6400: 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a 4e 61  Parse, code, zNa
6410: 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20  me, 0, zDb) ){. 
6420: 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f       goto begin_
6430: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20  table_error;.   
6440: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
6450: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
6460: 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65  e new table name
6470: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64   does not collid
6480: 65 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69  e with an existi
6490: 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72  ng.  ** index or
64a0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74   table name in t
64b0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
64c0: 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f  .  Issue an erro
64d0: 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a  r message if.  *
64e0: 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65  * it does. The e
64f0: 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74  xception is if t
6500: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  he statement bei
6510: 6e 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61  ng parsed was pa
6520: 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20  ssed.  ** to an 
6530: 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f  sqlite3_declare_
6540: 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20  vtab() call. In 
6550: 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74  that case only t
6560: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a  he column names.
6570: 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77    ** and types w
6580: 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20  ill be used, so 
6590: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
65a0: 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d   to test for nam
65b0: 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c  espace.  ** coll
65c0: 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  isions..  */.  i
65d0: 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56  f( !IN_DECLARE_V
65e0: 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28 20 53  TAB ){.    if( S
65f0: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
6600: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
6610: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
6620: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6630: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
6640: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
6650: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
6660: 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  me, db->aDb[iDb]
6670: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  .zName);.    if(
6680: 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20   pTable ){.     
6690: 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a 20   if( !noErr ){. 
66a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
66b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
66c0: 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64 79  table %T already
66d0: 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65 29   exists", pName)
66e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
66f0: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
6700: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
6710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
6720: 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
6730: 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44 62 3d  , 0)!=0 && (iDb=
6740: 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69 74 2e  =0 || !db->init.
6750: 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20 73  busy) ){.      s
6760: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6770: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
6780: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
6790: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
67a0: 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
67b0: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
67c0: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
67d0: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
67e0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
67f0: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
6800: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
6810: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
6820: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
6830: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
6840: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6850: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
6860: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
6870: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
6880: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
6890: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
68a0: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
68b0: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
68c0: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
68d0: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
68e0: 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  le->nRef = 1;.  
68f0: 70 54 61 62 6c 65 2d 3e 64 62 20 3d 20 64 62 3b  pTable->db = db;
6900: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70  .  if( pParse->p
6910: 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c 69 74  NewTable ) sqlit
6920: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 50  e3DeleteTable(pP
6930: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
6940: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  ;.  pParse->pNew
6950: 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b 0a  Table = pTable;.
6960: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
6970: 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69 74   the magic sqlit
6980: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
6990: 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e 63   used by autoinc
69a0: 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68 65  rement,.  ** the
69b0: 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  n record a point
69c0: 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  er to this table
69d0: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
69e0: 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 0a  abase structure.
69f0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e 53    ** so that INS
6a00: 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68 65  ERT can find the
6a10: 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a 20   table easily.. 
6a20: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
6a30: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
6a40: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 61  EMENT.  if( !pPa
6a50: 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20 73  rse->nested && s
6a60: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73 71  trcmp(zName, "sq
6a70: 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
6a80: 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62 6c 65  =0 ){.    pTable
6a90: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
6aa0: 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 7d  ab = pTable;.  }
6ab0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
6ac0: 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 74  gin generating t
6ad0: 68 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  he code that wil
6ae0: 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74 61 62  l insert the tab
6af0: 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 0a 20  le record into. 
6b00: 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   ** the SQLITE_M
6b10: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 4e 6f  ASTER table.  No
6b20: 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72  te in particular
6b30: 20 74 68 61 74 20 77 65 20 6d 75 73 74 20 67 6f   that we must go
6b40: 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e 64 20   ahead.  ** and 
6b50: 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72 65 63  allocate the rec
6b60: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6b70: 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 6e  he table entry n
6b80: 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e 79 0a  ow.  Before any.
6b90: 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59    ** PRIMARY KEY
6ba0: 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79 77 6f   or UNIQUE keywo
6bb0: 72 64 73 20 61 72 65 20 70 61 72 73 65 64 2e 20  rds are parsed. 
6bc0: 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64 73 20   Those keywords 
6bd0: 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a 2a 20  will cause.  ** 
6be0: 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20 63 72  indices to be cr
6bf0: 65 61 74 65 64 20 61 6e 64 20 74 68 65 20 74 61  eated and the ta
6c00: 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73 74 20  ble record must 
6c10: 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68 65 20  come before the 
6c20: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e 20 20  .  ** indices.  
6c30: 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63 6f 72  Hence, the recor
6c40: 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  d number for the
6c50: 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65 20 61   table must be a
6c60: 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20 6e 6f  llocated.  ** no
6c70: 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 64  w..  */.  if( !d
6c80: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
6c90: 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  (v = sqlite3GetV
6ca0: 64 62 65 28 70 50 61 72 73 65 29 29 21 3d 30 20  dbe(pParse))!=0 
6cb0: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20  ){.    int j1;. 
6cc0: 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72 6d 61     int fileForma
6cd0: 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67 31 2c  t;.    int reg1,
6ce0: 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20 20 20   reg2, reg3;.   
6cf0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
6d00: 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
6d10: 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a 23 69  se, 0, iDb);..#i
6d20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6d30: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
6d40: 20 20 20 69 66 28 20 69 73 56 69 72 74 75 61 6c     if( isVirtual
6d50: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6d60: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
6d70: 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 7d  P_VBegin);.    }
6d80: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
6d90: 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  If the file form
6da0: 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 20  at and encoding 
6db0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
6dc0: 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20 73 65  have not been se
6dd0: 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20 74  t, .    ** set t
6de0: 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a  hem now..    */.
6df0: 20 20 20 20 72 65 67 31 20 3d 20 70 50 61 72 73      reg1 = pPars
6e00: 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b  e->regRowid = ++
6e10: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
6e20: 20 20 72 65 67 32 20 3d 20 70 50 61 72 73 65 2d    reg2 = pParse-
6e30: 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70 50 61  >regRoot = ++pPa
6e40: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72  rse->nMem;.    r
6e50: 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  eg3 = ++pParse->
6e60: 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
6e70: 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
6e80: 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44  P_ReadCookie, iD
6e90: 62 2c 20 72 65 67 33 2c 20 31 29 3b 20 20 20 2f  b, reg3, 1);   /
6ea0: 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20 2a 2f  * file_format */
6eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ec0: 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62  UsesBtree(v, iDb
6ed0: 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71 6c 69  );.    j1 = sqli
6ee0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
6ef0: 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b 0a 20   OP_If, reg3);. 
6f00: 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20 3d 20     fileFormat = 
6f10: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  (db->flags & SQL
6f20: 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d  ITE_LegacyFileFm
6f30: 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20 20 20  t)!=0 ?.        
6f40: 20 20 20 20 20 20 20 20 20 20 31 20 3a 20 53 51            1 : SQ
6f50: 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f 46 4f  LITE_MAX_FILE_FO
6f60: 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69 74 65  RMAT;.    sqlite
6f70: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6f80: 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c 65 46  P_Integer, fileF
6f90: 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a 20 20  ormat, reg3);.  
6fa0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
6fb0: 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f  Op3(v, OP_SetCoo
6fc0: 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72 65 67  kie, iDb, 1, reg
6fd0: 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  3);.    sqlite3V
6fe0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
6ff0: 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64 62 29  Integer, ENC(db)
7000: 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c  , reg3);.    sql
7010: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
7020: 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20  , OP_SetCookie, 
7030: 69 44 62 2c 20 34 2c 20 72 65 67 33 29 3b 0a 20  iDb, 4, reg3);. 
7040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
7050: 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 0a  mpHere(v, j1);..
7060: 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74      /* This just
7070: 20 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65   creates a place
7080: 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69  -holder record i
7090: 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  n the sqlite_mas
70a0: 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  ter table..    *
70b0: 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65  * The record cre
70c0: 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f  ated does not co
70d0: 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79  ntain anything y
70e0: 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  et.  It will be 
70f0: 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20  replaced.    ** 
7100: 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72  by the real entr
7110: 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61  y in code genera
7120: 74 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e  ted at sqlite3En
7130: 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a  dTable()..    **
7140: 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69  .    ** The rowi
7150: 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e  d for the new en
7160: 74 72 79 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  try is left on t
7170: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74  he top of the st
7180: 61 63 6b 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  ack..    ** The 
7190: 72 6f 77 69 64 20 76 61 6c 75 65 20 69 73 20 6e  rowid value is n
71a0: 65 65 64 65 64 20 62 79 20 74 68 65 20 63 6f 64  eeded by the cod
71b0: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 45 6e  e that sqlite3En
71c0: 64 54 61 62 6c 65 20 77 69 6c 6c 0a 20 20 20 20  dTable will.    
71d0: 2a 2a 20 67 65 6e 65 72 61 74 65 2e 0a 20 20 20  ** generate..   
71e0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
71f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45  (SQLITE_OMIT_VIE
7200: 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  W) || !defined(S
7210: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7220: 41 4c 54 41 42 4c 45 29 0a 20 20 20 20 69 66 28  ALTABLE).    if(
7230: 20 69 73 56 69 65 77 20 7c 7c 20 69 73 56 69 72   isView || isVir
7240: 74 75 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71  tual ){.      sq
7250: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
7260: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
7270: 2c 20 72 65 67 32 29 3b 0a 20 20 20 20 7d 65 6c  , reg2);.    }el
7280: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
7290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
72a0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
72b0: 65 61 74 65 54 61 62 6c 65 2c 20 69 44 62 2c 20  eateTable, iDb, 
72c0: 72 65 67 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  reg2);.    }.   
72d0: 20 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74   sqlite3OpenMast
72e0: 65 72 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  erTable(pParse, 
72f0: 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  iDb);.    sqlite
7300: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7310: 50 5f 4e 65 77 52 6f 77 69 64 2c 20 30 2c 20 72  P_NewRowid, 0, r
7320: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
7330: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
7340: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 33 29  P_Null, 0, reg3)
7350: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
7360: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
7370: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
7380: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
7390: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
73a0: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
73b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
73c0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
73d0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
73e0: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
73f0: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
7400: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
7410: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
7420: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
7430: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
7440: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
7450: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
7460: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
7470: 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  ** This macro is
7480: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65   used to compare
7490: 20 74 77 6f 20 73 74 72 69 6e 67 73 20 69 6e 20   two strings in 
74a0: 61 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69  a case-insensiti
74b0: 76 65 20 6d 61 6e 6e 65 72 2e 0a 2a 2a 20 49 74  ve manner..** It
74c0: 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73   is slightly fas
74d0: 74 65 72 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67  ter than calling
74e0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
74f0: 29 20 64 69 72 65 63 74 6c 79 2c 20 62 75 74 0a  ) directly, but.
7500: 2a 2a 20 70 72 6f 64 75 63 65 73 20 6c 61 72 67  ** produces larg
7510: 65 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 57  er code..**.** W
7520: 41 52 4e 49 4e 47 3a 20 54 68 69 73 20 6d 61 63  ARNING: This mac
7530: 72 6f 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  ro is not compat
7540: 69 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 74  ible with the st
7550: 72 63 6d 70 28 29 20 66 61 6d 69 6c 79 2e 20 49  rcmp() family. I
7560: 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 74 72 75  t.** returns tru
7570: 65 20 69 66 20 74 68 65 20 74 77 6f 20 73 74 72  e if the two str
7580: 69 6e 67 73 20 61 72 65 20 65 71 75 61 6c 2c 20  ings are equal, 
7590: 6f 74 68 65 72 77 69 73 65 20 66 61 6c 73 65 2e  otherwise false.
75a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 54 52 49  .*/.#define STRI
75b0: 43 4d 50 28 78 2c 20 79 29 20 28 5c 0a 73 71 6c  CMP(x, y) (\.sql
75c0: 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65 72  ite3UpperToLower
75d0: 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [*(unsigned char
75e0: 20 2a 29 28 78 29 5d 3d 3d 20 20 20 5c 0a 73 71   *)(x)]==   \.sq
75f0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
7600: 72 5b 2a 28 75 6e 73 69 67 6e 65 64 20 63 68 61  r[*(unsigned cha
7610: 72 20 2a 29 28 79 29 5d 20 20 20 20 20 5c 0a 26  r *)(y)]     \.&
7620: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
7630: 28 28 78 29 2b 31 2c 28 79 29 2b 31 29 3d 3d 30  ((x)+1,(y)+1)==0
7640: 20 29 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20   )../*.** Add a 
7650: 6e 65 77 20 63 6f 6c 75 6d 6e 20 74 6f 20 74 68  new column to th
7660: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
7670: 79 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63  y being construc
7680: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
7690: 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68 69 73  arser calls this
76a0: 20 72 6f 75 74 69 6e 65 20 6f 6e 63 65 20 66 6f   routine once fo
76b0: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 64 65  r each column de
76c0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  claration.** in 
76d0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
76e0: 74 61 74 65 6d 65 6e 74 2e 20 20 73 71 6c 69 74  tatement.  sqlit
76f0: 65 33 53 74 61 72 74 54 61 62 6c 65 28 29 20 67  e3StartTable() g
7700: 65 74 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 66 69  ets called.** fi
7710: 72 73 74 20 74 6f 20 67 65 74 20 74 68 69 6e 67  rst to get thing
7720: 73 20 67 6f 69 6e 67 2e 20 20 54 68 65 6e 20 74  s going.  Then t
7730: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7740: 61 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 0a 2a  alled for each.*
7750: 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69  * column..*/.voi
7760: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75  d sqlite3AddColu
7770: 6d 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  mn(Parse *pParse
7780: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
7790: 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69  .  Table *p;.  i
77a0: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
77b0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
77c0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
77d0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
77e0: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
77f0: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
7800: 72 65 74 75 72 6e 3b 0a 23 69 66 20 53 51 4c 49  return;.#if SQLI
7810: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 0a 20 20  TE_MAX_COLUMN.  
7820: 69 66 28 20 70 2d 3e 6e 43 6f 6c 2b 31 3e 64 62  if( p->nCol+1>db
7830: 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ->aLimit[SQLITE_
7840: 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b  LIMIT_COLUMN] ){
7850: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
7860: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f  rMsg(pParse, "to
7870: 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20 6f  o many columns o
7880: 6e 20 25 73 22 2c 20 70 2d 3e 7a 4e 61 6d 65 29  n %s", p->zName)
7890: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
78a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7a 20 3d 20 73  }.#endif.  z = s
78b0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
78c0: 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ken(db, pName);.
78d0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
78e0: 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  urn;.  for(i=0; 
78f0: 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  i<p->nCol; i++){
7900: 0a 20 20 20 20 69 66 28 20 53 54 52 49 43 4d 50  .    if( STRICMP
7910: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
7920: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73  Name) ){.      s
7930: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7940: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
7950: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
7960: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
7970: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7980: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
7990: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
79a0: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
79b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
79c0: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
79d0: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
79e0: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
79f0: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
7a00: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
7a10: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
7a20: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
7a30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
7a40: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
7a50: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
7a60: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
7a70: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
7a80: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
7a90: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
7aa0: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
7ab0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
7ac0: 7a 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65  z;. .  /* If the
7ad0: 72 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70  re is no type sp
7ae0: 65 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73  ecified, columns
7af0: 20 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c   have the defaul
7b00: 74 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20  t affinity.  ** 
7b10: 27 4e 4f 4e 45 27 2e 20 49 66 20 74 68 65 72 65  'NONE'. If there
7b20: 20 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69   is a type speci
7b30: 66 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74  fied, then sqlit
7b40: 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28  e3AddColumnType(
7b50: 29 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63  ) will.  ** be c
7b60: 61 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65  alled next to se
7b70: 74 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  t pCol->affinity
7b80: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f   correctly..  */
7b90: 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74  .  pCol->affinit
7ba0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
7bb0: 4f 4e 45 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b  ONE;.  p->nCol++
7bc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
7bd0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7be0: 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20  d by the parser 
7bf0: 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64  while in the mid
7c00: 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e  dle of.** parsin
7c10: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
7c20: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22   statement.  A "
7c30: 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72  NOT NULL" constr
7c40: 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e  aint has.** been
7c50: 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d   seen on a colum
7c60: 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  n.  This routine
7c70: 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c   sets the notNul
7c80: 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65  l flag on.** the
7c90: 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c   column currentl
7ca0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
7cb0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
7cc0: 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28  lite3AddNotNull(
7cd0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
7ce0: 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54  nt onError){.  T
7cf0: 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69  able *p;.  int i
7d00: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
7d10: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
7d20: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
7d30: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
7d40: 69 66 28 20 69 3e 3d 30 20 29 20 70 2d 3e 61 43  if( i>=0 ) p->aC
7d50: 6f 6c 5b 69 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20  ol[i].notNull = 
7d60: 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a  (u8)onError;.}..
7d70: 2f 2a 0a 2a 2a 20 53 63 61 6e 20 74 68 65 20 63  /*.** Scan the c
7d80: 6f 6c 75 6d 6e 20 74 79 70 65 20 6e 61 6d 65 20  olumn type name 
7d90: 7a 54 79 70 65 20 28 6c 65 6e 67 74 68 20 6e 54  zType (length nT
7da0: 79 70 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ype) and return 
7db0: 74 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  the.** associate
7dc0: 64 20 61 66 66 69 6e 69 74 79 20 74 79 70 65 2e  d affinity type.
7dd0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7de0: 69 6e 65 20 64 6f 65 73 20 61 20 63 61 73 65 2d  ine does a case-
7df0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 61 72  independent sear
7e00: 63 68 20 6f 66 20 7a 54 79 70 65 20 66 6f 72 20  ch of zType for 
7e10: 74 68 65 20 0a 2a 2a 20 73 75 62 73 74 72 69 6e  the .** substrin
7e20: 67 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  gs in the follow
7e30: 69 6e 67 20 74 61 62 6c 65 2e 20 49 66 20 6f 6e  ing table. If on
7e40: 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72 69  e of the substri
7e50: 6e 67 73 20 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c  ngs is.** found,
7e60: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
7e70: 6e 67 20 61 66 66 69 6e 69 74 79 20 69 73 20 72  ng affinity is r
7e80: 65 74 75 72 6e 65 64 2e 20 49 66 20 7a 54 79 70  eturned. If zTyp
7e90: 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f  e contains.** mo
7ea0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 6f 66 20 74  re than one of t
7eb0: 68 65 20 73 75 62 73 74 72 69 6e 67 73 2c 20 65  he substrings, e
7ec0: 6e 74 72 69 65 73 20 74 6f 77 61 72 64 20 74 68  ntries toward th
7ed0: 65 20 74 6f 70 20 6f 66 20 0a 2a 2a 20 74 68 65  e top of .** the
7ee0: 20 74 61 62 6c 65 20 74 61 6b 65 20 70 72 69 6f   table take prio
7ef0: 72 69 74 79 2e 20 46 6f 72 20 65 78 61 6d 70 6c  rity. For exampl
7f00: 65 2c 20 69 66 20 7a 54 79 70 65 20 69 73 20 27  e, if zType is '
7f10: 42 4c 4f 42 49 4e 54 27 2c 20 0a 2a 2a 20 53 51  BLOBINT', .** SQ
7f20: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
7f30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
7f40: 0a 2a 2a 20 53 75 62 73 74 72 69 6e 67 20 20 20  .** Substring   
7f50: 20 20 7c 20 41 66 66 69 6e 69 74 79 0a 2a 2a 20    | Affinity.** 
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f80: 0a 2a 2a 20 27 49 4e 54 27 20 20 20 20 20 20 20  .** 'INT'       
7f90: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 49    | SQLITE_AFF_I
7fa0: 4e 54 45 47 45 52 0a 2a 2a 20 27 43 48 41 52 27  NTEGER.** 'CHAR'
7fb0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
7fc0: 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 43 4c  _AFF_TEXT.** 'CL
7fd0: 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c  OB'        | SQL
7fe0: 49 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20  ITE_AFF_TEXT.** 
7ff0: 27 54 45 58 54 27 20 20 20 20 20 20 20 20 7c 20  'TEXT'        | 
8000: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 0a  SQLITE_AFF_TEXT.
8010: 2a 2a 20 27 42 4c 4f 42 27 20 20 20 20 20 20 20  ** 'BLOB'       
8020: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   | SQLITE_AFF_NO
8030: 4e 45 0a 2a 2a 20 27 52 45 41 4c 27 20 20 20 20  NE.** 'REAL'    
8040: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8050: 5f 52 45 41 4c 0a 2a 2a 20 27 46 4c 4f 41 27 20  _REAL.** 'FLOA' 
8060: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8070: 41 46 46 5f 52 45 41 4c 0a 2a 2a 20 27 44 4f 55  AFF_REAL.** 'DOU
8080: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
8090: 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a  TE_AFF_REAL.**.*
80a0: 2a 20 49 66 20 6e 6f 6e 65 20 6f 66 20 74 68 65  * If none of the
80b0: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
80c0: 68 65 20 61 62 6f 76 65 20 74 61 62 6c 65 20 61  he above table a
80d0: 72 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c  re found,.** SQL
80e0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
80f0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
8100: 63 68 61 72 20 73 71 6c 69 74 65 33 41 66 66 69  char sqlite3Affi
8110: 6e 69 74 79 54 79 70 65 28 63 6f 6e 73 74 20 54  nityType(const T
8120: 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20  oken *pType){.  
8130: 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63 68 61  u32 h = 0;.  cha
8140: 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41  r aff = SQLITE_A
8150: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 63 6f  FF_NUMERIC;.  co
8160: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
8170: 72 20 2a 7a 49 6e 20 3d 20 70 54 79 70 65 2d 3e  r *zIn = pType->
8180: 7a 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  z;.  const unsig
8190: 6e 65 64 20 63 68 61 72 20 2a 7a 45 6e 64 20 3d  ned char *zEnd =
81a0: 20 26 70 54 79 70 65 2d 3e 7a 5b 70 54 79 70 65   &pType->z[pType
81b0: 2d 3e 6e 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20  ->n];..  while( 
81c0: 7a 49 6e 21 3d 7a 45 6e 64 20 29 7b 0a 20 20 20  zIn!=zEnd ){.   
81d0: 20 68 20 3d 20 28 68 3c 3c 38 29 20 2b 20 73 71   h = (h<<8) + sq
81e0: 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77 65  lite3UpperToLowe
81f0: 72 5b 2a 7a 49 6e 5d 3b 0a 20 20 20 20 7a 49 6e  r[*zIn];.    zIn
8200: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28  ++;.    if( h==(
8210: 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c  ('c'<<24)+('h'<<
8220: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27  16)+('a'<<8)+'r'
8230: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
8240: 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20   /* CHAR */.    
8250: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
8260: 46 46 5f 54 45 58 54 3b 20 0a 20 20 20 20 7d 65  FF_TEXT; .    }e
8270: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 63 27  lse if( h==(('c'
8280: 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b  <<24)+('l'<<16)+
8290: 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 29 7b  ('o'<<8)+'b') ){
82a0: 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42 20 2a         /* CLOB *
82b0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
82c0: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
82d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
82e0: 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65 27 3c  (('t'<<24)+('e'<
82f0: 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b 27 74  <16)+('x'<<8)+'t
8300: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 54  ') ){       /* T
8310: 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  EXT */.      aff
8320: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
8330: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
8340: 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34 29 2b  ( h==(('b'<<24)+
8350: 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c  ('l'<<16)+('o'<<
8360: 38 29 2b 27 62 27 29 20 20 20 20 20 20 20 20 20  8)+'b')         
8370: 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20 20 20   /* BLOB */.    
8380: 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51 4c      && (aff==SQL
8390: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
83a0: 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  || aff==SQLITE_A
83b0: 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20 20 20  FF_REAL) ){.    
83c0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
83d0: 46 46 5f 4e 4f 4e 45 3b 0a 23 69 66 6e 64 65 66  FF_NONE;.#ifndef
83e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
83f0: 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
8400: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
8410: 72 27 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36  r'<<24)+('e'<<16
8420: 29 2b 28 27 61 27 3c 3c 38 29 2b 27 6c 27 29 20  )+('a'<<8)+'l') 
8430: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 45 41 4c           /* REAL
8440: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
8450: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
8460: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
8470: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
8480: 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _REAL;.    }else
8490: 20 69 66 28 20 68 3d 3d 28 28 27 66 27 3c 3c 32   if( h==(('f'<<2
84a0: 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f  4)+('l'<<16)+('o
84b0: 27 3c 3c 38 29 2b 27 61 27 29 20 20 20 20 20 20  '<<8)+'a')      
84c0: 20 20 20 20 2f 2a 20 46 4c 4f 41 20 2a 2f 0a 20      /* FLOA */. 
84d0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
84e0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
84f0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
8500: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
8510: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8520: 68 3d 3d 28 28 27 64 27 3c 3c 32 34 29 2b 28 27  h==(('d'<<24)+('
8530: 6f 27 3c 3c 31 36 29 2b 28 27 75 27 3c 3c 38 29  o'<<16)+('u'<<8)
8540: 2b 27 62 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'b')          /
8550: 2a 20 44 4f 55 42 20 2a 2f 0a 20 20 20 20 20 20  * DOUB */.      
8560: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8570: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8580: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8590: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 23 65 6e  TE_AFF_REAL;.#en
85a0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  dif.    }else if
85b0: 28 20 28 68 26 30 78 30 30 46 46 46 46 46 46 29  ( (h&0x00FFFFFF)
85c0: 3d 3d 28 28 27 69 27 3c 3c 31 36 29 2b 28 27 6e  ==(('i'<<16)+('n
85d0: 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b 20 20 20  '<<8)+'t') ){   
85e0: 20 2f 2a 20 49 4e 54 20 2a 2f 0a 20 20 20 20 20   /* INT */.     
85f0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8600: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
8610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8620: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b  }..  return aff;
8630: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8640: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8650: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8660: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8670: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8680: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8690: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
86a0: 70 46 69 72 73 74 20 74 6f 6b 65 6e 20 69 73 20  pFirst token is 
86b0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 6f 6b  the first.** tok
86c0: 65 6e 20 69 6e 20 74 68 65 20 73 65 71 75 65 6e  en in the sequen
86d0: 63 65 20 6f 66 20 74 6f 6b 65 6e 73 20 74 68 61  ce of tokens tha
86e0: 74 20 64 65 73 63 72 69 62 65 20 74 68 65 20 74  t describe the t
86f0: 79 70 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f  ype of the.** co
8700: 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75  lumn currently u
8710: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
8720: 6e 2e 20 20 20 70 4c 61 73 74 20 69 73 20 74 68  n.   pLast is th
8730: 65 20 6c 61 73 74 20 74 6f 6b 65 6e 0a 2a 2a 20  e last token.** 
8740: 69 6e 20 74 68 65 20 73 65 71 75 65 6e 63 65 2e  in the sequence.
8750: 20 20 55 73 65 20 74 68 69 73 20 69 6e 66 6f 72    Use this infor
8760: 6d 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 73 74 72  mation to constr
8770: 75 63 74 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20  uct a string.** 
8780: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
8790: 65 20 74 79 70 65 6e 61 6d 65 20 6f 66 20 74 68  e typename of th
87a0: 65 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 73 74 6f  e column and sto
87b0: 72 65 20 74 68 61 74 20 73 74 72 69 6e 67 0a 2a  re that string.*
87c0: 2a 20 69 6e 20 7a 54 79 70 65 2e 0a 2a 2f 20 0a  * in zType..*/ .
87d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 43  void sqlite3AddC
87e0: 6f 6c 75 6d 6e 54 79 70 65 28 50 61 72 73 65 20  olumnType(Parse 
87f0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
8800: 70 54 79 70 65 29 7b 0a 20 20 54 61 62 6c 65 20  pType){.  Table 
8810: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43  *p;.  int i;.  C
8820: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73  olumn *pCol;.  s
8830: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
8840: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
8850: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
8860: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
8870: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
8880: 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <0 ) return;.  p
8890: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 69  Col = &p->aCol[i
88a0: 5d 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  ];.  db = pParse
88b0: 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 44  ->db;.  sqlite3D
88c0: 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e  bFree(db, pCol->
88d0: 7a 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e  zType);.  pCol->
88e0: 7a 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 4e  zType = sqlite3N
88f0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
8900: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
8910: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
8920: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
8930: 70 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pType);.}../*.**
8940: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
8950: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 76  is the default v
8960: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f 73  alue for the mos
8970: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
8980: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74 68   column.** of th
8990: 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c  e table currentl
89a0: 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
89b0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66 61  tion..**.** Defa
89c0: 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65 73  ult value expres
89d0: 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63 6f  sions must be co
89e0: 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20 61  nstant.  Raise a
89f0: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
8a00: 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74 68  his.** is not th
8a10: 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e case..**.** Th
8a20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8a30: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
8a40: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
8a50: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
8a60: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
8a70: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  BLE statement..*
8a80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8a90: 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50 61  dDefaultValue(Pa
8aa0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
8ab0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 61 62  r *pExpr){.  Tab
8ac0: 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e 20  le *p;.  Column 
8ad0: 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33  *pCol;.  sqlite3
8ae0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
8af0: 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50  b;.  if( (p = pP
8b00: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29  arse->pNewTable)
8b10: 21 3d 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 20  !=0 ){.    pCol 
8b20: 3d 20 26 28 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e  = &(p->aCol[p->n
8b30: 43 6f 6c 2d 31 5d 29 3b 0a 20 20 20 20 69 66 28  Col-1]);.    if(
8b40: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
8b50: 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74 69 6f  onstantOrFunctio
8b60: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
8b70: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8b80: 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61 75  g(pParse, "defau
8b90: 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75  lt value of colu
8ba0: 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63  mn [%s] is not c
8bb0: 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20  onstant",.      
8bc0: 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29      pCol->zName)
8bd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8be0: 20 20 20 45 78 70 72 20 2a 70 43 6f 70 79 3b 0a     Expr *pCopy;.
8bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8c00: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c  rDelete(db, pCol
8c10: 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20  ->pDflt);.      
8c20: 70 43 6f 6c 2d 3e 70 44 66 6c 74 20 3d 20 70 43  pCol->pDflt = pC
8c30: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  opy = sqlite3Exp
8c40: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 29 3b  rDup(db, pExpr);
8c50: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 70 79  .      if( pCopy
8c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8c70: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 64 62 2c  te3TokenCopy(db,
8c80: 20 26 70 43 6f 70 79 2d 3e 73 70 61 6e 2c 20 26   &pCopy->span, &
8c90: 70 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20  pExpr->span);.  
8ca0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
8cb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
8cc0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 3b 0a  ete(db, pExpr);.
8cd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61  }../*.** Designa
8ce0: 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  te the PRIMARY K
8cf0: 45 59 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  EY for the table
8d00: 2e 20 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  .  pList is a li
8d10: 73 74 20 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20  st of names .** 
8d20: 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
8d30: 66 6f 72 6d 20 74 68 65 20 70 72 69 6d 61 72 79  form the primary
8d40: 20 6b 65 79 2e 20 20 49 66 20 70 4c 69 73 74 20   key.  If pList 
8d50: 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
8d60: 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74  e.** most recent
8d70: 6c 79 20 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20  ly added column 
8d80: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
8d90: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  the primary key.
8da0: 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63  .**.** A table c
8db0: 61 6e 20 68 61 76 65 20 61 74 20 6d 6f 73 74 20  an have at most 
8dc0: 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e  one primary key.
8dd0: 20 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 61    If the table a
8de0: 6c 72 65 61 64 79 20 68 61 73 0a 2a 2a 20 61 20  lready has.** a 
8df0: 70 72 69 6d 61 72 79 20 6b 65 79 20 28 61 6e 64  primary key (and
8e00: 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
8e10: 6f 6e 64 20 70 72 69 6d 61 72 79 20 6b 65 79 29  ond primary key)
8e20: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 6e 0a   then create an.
8e30: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
8e40: 49 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  If the PRIMARY K
8e50: 45 59 20 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c  EY is on a singl
8e60: 65 20 63 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64  e column whose d
8e70: 61 74 61 74 79 70 65 20 69 73 20 49 4e 54 45 47  atatype is INTEG
8e80: 45 52 2c 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77  ER,.** then we w
8e90: 69 6c 6c 20 74 72 79 20 74 6f 20 75 73 65 20 74  ill try to use t
8ea0: 68 61 74 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68  hat column as th
8eb0: 65 20 72 6f 77 69 64 2e 20 20 53 65 74 20 74 68  e rowid.  Set th
8ec0: 65 20 54 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a  e Table.iPKey.**
8ed0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 74 61   field of the ta
8ee0: 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ble under constr
8ef0: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 74 68 65  uction to be the
8f00: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a   index of the.**
8f10: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8f20: 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61   KEY column.  Ta
8f30: 62 6c 65 2e 69 50 4b 65 79 20 69 73 20 73 65 74  ble.iPKey is set
8f40: 20 74 6f 20 2d 31 20 69 66 20 74 68 65 72 65 20   to -1 if there 
8f50: 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52  is.** no INTEGER
8f60: 20 50 52 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a   PRIMARY KEY..**
8f70: 0a 2a 2a 20 49 66 20 74 68 65 20 6b 65 79 20 69  .** If the key i
8f80: 73 20 6e 6f 74 20 61 6e 20 49 4e 54 45 47 45 52  s not an INTEGER
8f90: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 74 68   PRIMARY KEY, th
8fa0: 65 6e 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  en create a uniq
8fb0: 75 65 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  ue.** index for 
8fc0: 74 68 65 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64  the key.  No ind
8fd0: 65 78 20 69 73 20 63 72 65 61 74 65 64 20 66 6f  ex is created fo
8fe0: 72 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  r INTEGER PRIMAR
8ff0: 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20  Y KEYs..*/.void 
9000: 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72  sqlite3AddPrimar
9010: 79 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70  yKey(.  Parse *p
9020: 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
9030: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
9040: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9050: 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66  t,  /* List of f
9060: 69 65 6c 64 20 6e 61 6d 65 73 20 74 6f 20 62 65  ield names to be
9070: 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
9080: 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
9090: 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
90a0: 74 68 20 61 20 75 6e 69 71 75 65 6e 65 73 73 20  th a uniqueness 
90b0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e  conflict */.  in
90c0: 74 20 61 75 74 6f 49 6e 63 2c 20 20 20 20 20 20  t autoInc,      
90d0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 41  /* True if the A
90e0: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79  UTOINCREMENT key
90f0: 77 6f 72 64 20 69 73 20 70 72 65 73 65 6e 74 20  word is present 
9100: 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
9110: 65 72 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  er     /* SQLITE
9120: 5f 53 4f 5f 41 53 43 20 6f 72 20 53 51 4c 49 54  _SO_ASC or SQLIT
9130: 45 5f 53 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a  E_SO_DESC */.){.
9140: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
9150: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
9160: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 79 70 65  e;.  char *zType
9170: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
9180: 20 3d 20 2d 31 2c 20 69 3b 0a 20 20 69 66 28 20   = -1, i;.  if( 
9190: 70 54 61 62 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45  pTab==0 || IN_DE
91a0: 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
91b0: 6f 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78  o primary_key_ex
91c0: 69 74 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e  it;.  if( pTab->
91d0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 48 61  tabFlags & TF_Ha
91e0: 73 50 72 69 6d 61 72 79 4b 65 79 20 29 7b 0a 20  sPrimaryKey ){. 
91f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9200: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
9210: 20 20 22 74 61 62 6c 65 20 5c 22 25 73 5c 22 20    "table \"%s\" 
9220: 68 61 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  has more than on
9230: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 22 2c 20  e primary key", 
9240: 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
9250: 20 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b    goto primary_k
9260: 65 79 5f 65 78 69 74 3b 0a 20 20 7d 0a 20 20 70  ey_exit;.  }.  p
9270: 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d  Tab->tabFlags |=
9280: 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65   TF_HasPrimaryKe
9290: 79 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  y;.  if( pList==
92a0: 30 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  0 ){.    iCol = 
92b0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d 20 31 3b 0a  pTab->nCol - 1;.
92c0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
92d0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
92e0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
92f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
9300: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
9310: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
9320: 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
9330: 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
9340: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
9350: 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b  trICmp(pList->a[
9360: 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  i].zName, pTab->
9370: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65  aCol[iCol].zName
9380: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9390: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
93a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
93b0: 20 69 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e   if( iCol<pTab->
93c0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
93d0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
93e0: 2e 69 73 50 72 69 6d 4b 65 79 20 3d 20 31 3b 0a  .isPrimKey = 1;.
93f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9400: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
9410: 70 72 3e 31 20 29 20 69 43 6f 6c 20 3d 20 2d 31  pr>1 ) iCol = -1
9420: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c  ;.  }.  if( iCol
9430: 3e 3d 30 20 26 26 20 69 43 6f 6c 3c 70 54 61 62  >=0 && iCol<pTab
9440: 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 54  ->nCol ){.    zT
9450: 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ype = pTab->aCol
9460: 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20  [iCol].zType;.  
9470: 7d 0a 20 20 69 66 28 20 7a 54 79 70 65 20 26 26  }.  if( zType &&
9480: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
9490: 7a 54 79 70 65 2c 20 22 49 4e 54 45 47 45 52 22  zType, "INTEGER"
94a0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
94b0: 73 6f 72 74 4f 72 64 65 72 3d 3d 53 51 4c 49 54  sortOrder==SQLIT
94c0: 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20 20  E_SO_ASC ){.    
94d0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 69 43  pTab->iPKey = iC
94e0: 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e 6b 65  ol;.    pTab->ke
94f0: 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e 45 72  yConf = (u8)onEr
9500: 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ror;.    assert(
9510: 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c 20 61   autoInc==0 || a
9520: 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  utoInc==1 );.   
9530: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
9540: 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f 41 75  |= autoInc*TF_Au
9550: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20 20 7d  toincrement;.  }
9560: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
9570: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
9580: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
9590: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
95a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
95b0: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
95c0: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
95d0: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
95e0: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
95f0: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
9600: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
9610: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
9620: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
9630: 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72 2c 20  pList, onError, 
9640: 30 2c 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c  0, 0, sortOrder,
9650: 20 30 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d   0);.    pList =
9660: 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79   0;.  }..primary
9670: 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c  _key_exit:.  sql
9680: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
9690: 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  te(pParse->db, p
96a0: 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b  List);.  return;
96b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
96c0: 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  new CHECK constr
96d0: 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c  aint to the tabl
96e0: 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
96f0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
9700: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9710: 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e  ddCheckConstrain
9720: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
9730: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
9740: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
9750: 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20  xpr *pCheckExpr 
9760: 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78   /* The check ex
9770: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  pression */.){. 
9780: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9790: 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64  Parse->db;.#ifnd
97a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  ef SQLITE_OMIT_C
97b0: 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a 70 54  HECK.  Table *pT
97c0: 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65  ab = pParse->pNe
97d0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 54  wTable;.  if( pT
97e0: 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52  ab && !IN_DECLAR
97f0: 45 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 2f 2a  E_VTAB ){.    /*
9800: 20 54 68 65 20 43 48 45 43 4b 20 65 78 70 72 65   The CHECK expre
9810: 73 73 69 6f 6e 20 6d 75 73 74 20 62 65 20 64 75  ssion must be du
9820: 70 6c 69 63 61 74 65 64 20 73 6f 20 74 68 61 74  plicated so that
9830: 20 74 6f 6b 65 6e 73 20 72 65 66 65 72 0a 20 20   tokens refer.  
9840: 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c 6f 63 65 64    ** to malloced
9850: 20 73 70 61 63 65 20 61 6e 64 20 6e 6f 74 20 74   space and not t
9860: 68 65 20 28 65 70 68 65 6d 65 72 61 6c 29 20 74  he (ephemeral) t
9870: 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41 54  ext of the CREAT
9880: 45 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 73  E TABLE.    ** s
9890: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
98a0: 70 54 61 62 2d 3e 70 43 68 65 63 6b 20 3d 20 73  pTab->pCheck = s
98b0: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 64 62  qlite3ExprAnd(db
98c0: 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b 2c 20  , pTab->pCheck, 
98d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75     sqlite3ExprDu
9900: 70 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70 72  p(db, pCheckExpr
9910: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ));.  }.#endif. 
9920: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
9930: 74 65 28 64 62 2c 20 70 43 68 65 63 6b 45 78 70  te(db, pCheckExp
9940: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  r);.}../*.** Set
9950: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66   the collation f
9960: 75 6e 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  unction of the m
9970: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
9980: 73 65 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  sed table column
9990: 0a 2a 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53  .** to the CollS
99a0: 65 71 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69  eq given..*/.voi
99b0: 64 20 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c  d sqlite3AddColl
99c0: 61 74 65 54 79 70 65 28 50 61 72 73 65 20 2a 70  ateType(Parse *p
99d0: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54  Parse, Token *pT
99e0: 6f 6b 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oken){.  Table *
99f0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
9a00: 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20  ar *zColl;      
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f          /* Dequo
9a20: 74 65 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c  ted name of coll
9a30: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a  ation sequence *
9a40: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
9a50: 0a 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ..  if( (p = pPa
9a60: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
9a70: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
9a80: 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20   = p->nCol-1;.  
9a90: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9aa0: 0a 20 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  zColl = sqlit
9ab0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
9ac0: 64 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69  db, pToken);.  i
9ad0: 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75  f( !zColl ) retu
9ae0: 72 6e 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  rn;..  if( sqlit
9af0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
9b00: 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d  pParse, zColl, -
9b10: 31 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  1) ){.    Index 
9b20: 2a 70 49 64 78 3b 0a 20 20 20 20 70 2d 3e 61 43  *pIdx;.    p->aC
9b30: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
9b40: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
9b50: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
9b60: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
9b70: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
9b80: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
9b90: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
9ba0: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
9bb0: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
9bc0: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
9bd0: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
9be0: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
9bf0: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
9c00: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
9c10: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
9c20: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
9c30: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
9c40: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
9c50: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
9c60: 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20 29 3b  x->nColumn==1 );
9c70: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
9c80: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
9c90: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
9ca0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
9cb0: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
9cc0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9cd0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
9ce0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
9cf0: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
9d00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
9d10: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
9d20: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
9d30: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
9d40: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
9d50: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
9d60: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
9d70: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
9d80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
9d90: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
9da0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
9db0: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
9dc0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
9dd0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
9de0: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
9df0: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
9e00: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
9e10: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
9e20: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
9e30: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
9e40: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
9e50: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
9e60: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
9e70: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
9e80: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
9e90: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
9ea0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
9eb0: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
9ec0: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
9ed0: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
9ee0: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
9ef0: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
9f00: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
9f10: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
9f20: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
9f30: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
9f40: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
9f50: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
9f60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9f70: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
9f80: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
9f90: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
9fa0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
9fb0: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
9fc0: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
9fd0: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
9fe0: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
9ff0: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
a000: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
a010: 61 67 65 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20  age..*/.CollSeq 
a020: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  *sqlite3LocateCo
a030: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
a040: 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  rse, const char 
a050: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 6e 4e 61 6d  *zName, int nNam
a060: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
a070: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a080: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64    u8 enc = ENC(d
a090: 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73  b);.  u8 initbus
a0a0: 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  y = db->init.bus
a0b0: 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  y;.  CollSeq *pC
a0c0: 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  oll;..  pColl = 
a0d0: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
a0e0: 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d  eq(db, enc, zNam
a0f0: 65 2c 20 6e 4e 61 6d 65 2c 20 69 6e 69 74 62 75  e, nName, initbu
a100: 73 79 29 3b 0a 20 20 69 66 28 20 21 69 6e 69 74  sy);.  if( !init
a110: 62 75 73 79 20 26 26 20 28 21 70 43 6f 6c 6c 20  busy && (!pColl 
a120: 7c 7c 20 21 70 43 6f 6c 6c 2d 3e 78 43 6d 70 29  || !pColl->xCmp)
a130: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20   ){.    pColl = 
a140: 73 71 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65  sqlite3GetCollSe
a150: 71 28 64 62 2c 20 70 43 6f 6c 6c 2c 20 7a 4e 61  q(db, pColl, zNa
a160: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
a170: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
a180: 20 20 20 20 69 66 28 20 6e 4e 61 6d 65 3c 30 20      if( nName<0 
a190: 29 7b 0a 20 20 20 20 20 20 20 20 6e 4e 61 6d 65  ){.        nName
a1a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a1b0: 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  (db, zName);.   
a1c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
a1d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
a1e0: 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
a1f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
a200: 25 2e 2a 73 22 2c 20 6e 4e 61 6d 65 2c 20 7a 4e  %.*s", nName, zN
a210: 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c  ame);.      pCol
a220: 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
a230: 0a 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  ..  return pColl
a240: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ;.}.../*.** Gene
a250: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77  rate code that w
a260: 69 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ill increment th
a270: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e  e schema cookie.
a280: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  .**.** The schem
a290: 61 20 63 6f 6f 6b 69 65 20 69 73 20 75 73 65 64  a cookie is used
a2a0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
a2b0: 65 6e 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f  en the schema fo
a2c0: 72 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  r the.** databas
a2d0: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 66 74 65  e changes.  Afte
a2e0: 72 20 65 61 63 68 20 73 63 68 65 6d 61 20 63 68  r each schema ch
a2f0: 61 6e 67 65 2c 20 74 68 65 20 63 6f 6f 6b 69 65  ange, the cookie
a300: 20 76 61 6c 75 65 0a 2a 2a 20 63 68 61 6e 67 65   value.** change
a310: 73 2e 20 20 57 68 65 6e 20 61 20 70 72 6f 63 65  s.  When a proce
a320: 73 73 20 66 69 72 73 74 20 72 65 61 64 73 20 74  ss first reads t
a330: 68 65 20 73 63 68 65 6d 61 20 69 74 20 72 65 63  he schema it rec
a340: 6f 72 64 73 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b  ords the.** cook
a350: 69 65 2e 20 20 54 68 65 72 65 61 66 74 65 72 2c  ie.  Thereafter,
a360: 20 77 68 65 6e 65 76 65 72 20 69 74 20 67 6f 65   whenever it goe
a370: 73 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  s to access the 
a380: 64 61 74 61 62 61 73 65 2c 0a 2a 2a 20 69 74 20  database,.** it 
a390: 63 68 65 63 6b 73 20 74 68 65 20 63 6f 6f 6b 69  checks the cooki
a3a0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
a3b0: 68 65 20 73 63 68 65 6d 61 20 68 61 73 20 6e 6f  he schema has no
a3c0: 74 20 63 68 61 6e 67 65 64 0a 2a 2a 20 73 69 6e  t changed.** sin
a3d0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 72  ce it was last r
a3e0: 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ead..**.** This 
a3f0: 70 6c 61 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70  plan is not comp
a400: 6c 65 74 65 6c 79 20 62 75 6c 6c 65 74 2d 70 72  letely bullet-pr
a410: 6f 6f 66 2e 20 20 49 74 20 69 73 20 70 6f 73 73  oof.  It is poss
a420: 69 62 6c 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  ible for.** the 
a430: 73 63 68 65 6d 61 20 74 6f 20 63 68 61 6e 67 65  schema to change
a440: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
a450: 61 6e 64 20 66 6f 72 20 74 68 65 20 63 6f 6f 6b  and for the cook
a460: 69 65 20 74 6f 20 62 65 0a 2a 2a 20 73 65 74 20  ie to be.** set 
a470: 62 61 63 6b 20 74 6f 20 70 72 69 6f 72 20 76 61  back to prior va
a480: 6c 75 65 2e 20 20 42 75 74 20 73 63 68 65 6d 61  lue.  But schema
a490: 20 63 68 61 6e 67 65 73 20 61 72 65 20 69 6e 66   changes are inf
a4a0: 72 65 71 75 65 6e 74 0a 2a 2a 20 61 6e 64 20 74  requent.** and t
a4b0: 68 65 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f  he probability o
a4c0: 66 20 68 69 74 74 69 6e 67 20 74 68 65 20 73 61  f hitting the sa
a4d0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  me cookie value 
a4e0: 69 73 20 6f 6e 6c 79 0a 2a 2a 20 31 20 63 68 61  is only.** 1 cha
a4f0: 6e 63 65 20 69 6e 20 32 5e 33 32 2e 20 20 53 6f  nce in 2^32.  So
a500: 20 77 65 27 72 65 20 73 61 66 65 20 65 6e 6f 75   we're safe enou
a510: 67 68 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  gh..*/.void sqli
a520: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
a530: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
a540: 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20 72  nt iDb){.  int r
a550: 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
a560: 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
a570: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a580: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62  Parse->db;.  Vdb
a590: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
a5a0: 56 64 62 65 3b 0a 20 20 73 71 6c 69 74 65 33 56  Vdbe;.  sqlite3V
a5b0: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
a5c0: 49 6e 74 65 67 65 72 2c 20 64 62 2d 3e 61 44 62  Integer, db->aDb
a5d0: 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73  [iDb].pSchema->s
a5e0: 63 68 65 6d 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20  chema_cookie+1, 
a5f0: 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
a600: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
a610: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 30  etCookie, iDb, 0
a620: 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  , r1);.  sqlite3
a630: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
a640: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
a650: 2a 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65  *.** Measure the
a660: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   number of chara
a670: 63 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20  cters needed to 
a680: 6f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  output the given
a690: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
a6a0: 20 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   The number retu
a6b0: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e  rned includes an
a6c0: 79 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a  y quotes used.**
a6d0: 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e   but does not in
a6e0: 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74  clude the null t
a6f0: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a  erminator..**.**
a700: 20 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73   The estimate is
a710: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20   conservative.  
a720: 49 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  It might be larg
a730: 65 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a  er that what is.
a740: 2a 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64  ** really needed
a750: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a760: 69 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73  identLength(cons
a770: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
a780: 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20  t n;.  for(n=0; 
a790: 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20  *z; n++, z++){. 
a7a0: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29     if( *z=='"' )
a7b0: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72  { n++; }.  }.  r
a7c0: 65 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a  eturn n + 2;.}..
a7d0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20 69  /*.** Write an i
a7e0: 64 65 6e 74 69 66 69 65 72 20 6f 6e 74 6f 20 74  dentifier onto t
a7f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 67 69  he end of the gi
a800: 76 65 6e 20 73 74 72 69 6e 67 2e 20 20 41 64 64  ven string.  Add
a810: 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63  .** quote charac
a820: 74 65 72 73 20 61 73 20 6e 65 65 64 65 64 2e 0a  ters as needed..
a830: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
a840: 64 65 6e 74 50 75 74 28 63 68 61 72 20 2a 7a 2c  dentPut(char *z,
a850: 20 69 6e 74 20 2a 70 49 64 78 2c 20 63 68 61 72   int *pIdx, char
a860: 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e 74 29 7b   *zSignedIdent){
a870: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a880: 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75 6e 73 69   *zIdent = (unsi
a890: 67 6e 65 64 20 63 68 61 72 2a 29 7a 53 69 67 6e  gned char*)zSign
a8a0: 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e 74 20 69  edIdent;.  int i
a8b0: 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74 65 3b 0a  , j, needQuote;.
a8c0: 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a 20 20 66    i = *pIdx;.  f
a8d0: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
a8e0: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; j++){.    if(
a8f0: 20 21 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d   !sqlite3Isalnum
a900: 28 7a 49 64 65 6e 74 5b 6a 5d 29 20 26 26 20 7a  (zIdent[j]) && z
a910: 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f 27 20 29 20  Ident[j]!='_' ) 
a920: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 6e 65 65  break;.  }.  nee
a930: 64 51 75 6f 74 65 20 3d 20 20 7a 49 64 65 6e 74  dQuote =  zIdent
a940: 5b 6a 5d 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  [j]!=0 || sqlite
a950: 33 49 73 64 69 67 69 74 28 7a 49 64 65 6e 74 5b  3Isdigit(zIdent[
a960: 30 5d 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  0]).            
a970: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
a980: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
a990: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 3b 0a 20  nt, j)!=TK_ID;. 
a9a0: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
a9b0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
a9c0: 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74   for(j=0; zIdent
a9d0: 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a  [j]; j++){.    z
a9e0: 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a  [i++] = zIdent[j
a9f0: 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e  ];.    if( zIden
aa00: 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b  t[j]=='"' ) z[i+
aa10: 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20  +] = '"';.  }.  
aa20: 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20  if( needQuote ) 
aa30: 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20  z[i++] = '"';.  
aa40: 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64  z[i] = 0;.  *pId
aa50: 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  x = i;.}../*.** 
aa60: 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41 54  Generate a CREAT
aa70: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
aa80: 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  t appropriate fo
aa90: 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74  r the given.** t
aaa0: 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f  able.  Memory to
aab0: 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f   hold the text o
aac0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
aad0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
aae0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
aaf0: 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  () and must be f
ab00: 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
ab10: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
ab20: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63 72  .static char *cr
ab30: 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71  eateTableStmt(sq
ab40: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
ab50: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b   *p){.  int i, k
ab60: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74  , n;.  char *zSt
ab70: 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70  mt;.  char *zSep
ab80: 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 2c  , *zSep2, *zEnd,
ab90: 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70   *z;.  Column *p
aba0: 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20  Col;.  n = 0;.  
abb0: 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43  for(pCol = p->aC
abc0: 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  ol, i=0; i<p->nC
abd0: 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; i++, pCol++)
abe0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74  {.    n += ident
abf0: 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61  Length(pCol->zNa
ac00: 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20 70 43 6f  me);.    z = pCo
ac10: 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20 69 66  l->zType;.    if
ac20: 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b  ( z ){.      n +
ac30: 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
ac40: 33 30 28 7a 29 20 2b 20 31 29 3b 0a 20 20 20 20  30(z) + 1);.    
ac50: 7d 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64 65  }.  }.  n += ide
ac60: 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61 6d  ntLength(p->zNam
ac70: 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20 29  e);.  if( n<50 )
ac80: 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22 22 3b  {.    zSep = "";
ac90: 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 22  .    zSep2 = ","
aca0: 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 29 22  ;.    zEnd = ")"
acb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
acc0: 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a 20 20  Sep = "\n  ";.  
acd0: 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e 20 20    zSep2 = ",\n  
ace0: 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22 5c  ";.    zEnd = "\
acf0: 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20  n)";.  }.  n += 
ad00: 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a  35 + 6*p->nCol;.
ad10: 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65    zStmt = sqlite
ad20: 33 4d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20  3Malloc( n );.  
ad30: 69 66 28 20 7a 53 74 6d 74 3d 3d 30 20 29 7b 0a  if( zStmt==0 ){.
ad40: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
ad50: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65  iled = 1;.    re
ad60: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
ad70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
ad80: 2c 20 7a 53 74 6d 74 2c 20 22 43 52 45 41 54 45  , zStmt, "CREATE
ad90: 20 54 41 42 4c 45 20 22 29 3b 0a 20 20 6b 20 3d   TABLE ");.  k =
ada0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
adb0: 28 7a 53 74 6d 74 29 3b 0a 20 20 69 64 65 6e 74  (zStmt);.  ident
adc0: 50 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 70  Put(zStmt, &k, p
add0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7a 53 74 6d  ->zName);.  zStm
ade0: 74 5b 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20  t[k++] = '(';.  
adf0: 66 6f 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c  for(pCol=p->aCol
ae00: 2c 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c  , i=0; i<p->nCol
ae10: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
ae20: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
ae30: 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74  intf(n-k, &zStmt
ae40: 5b 6b 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20  [k], zSep);.    
ae50: 6b 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  k += sqlite3Strl
ae60: 65 6e 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b  en30(&zStmt[k]);
ae70: 0a 20 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70  .    zSep = zSep
ae80: 32 3b 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28  2;.    identPut(
ae90: 7a 53 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d  zStmt, &k, pCol-
aea0: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  >zName);.    if(
aeb0: 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70   (z = pCol->zTyp
aec0: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a  e)!=0 ){.      z
aed0: 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b  Stmt[k++] = ' ';
aee0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
aef0: 69 6e 74 29 28 73 71 6c 69 74 65 33 53 74 72 6c  int)(sqlite3Strl
af00: 65 6e 33 30 28 7a 29 2b 6b 2b 31 29 3c 3d 6e 20  en30(z)+k+1)<=n 
af10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
af20: 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26  _snprintf(n-k, &
af30: 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20  zStmt[k], "%s", 
af40: 7a 29 3b 0a 20 20 20 20 20 20 6b 20 2b 3d 20 73  z);.      k += s
af50: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
af60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
af70: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
af80: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
af90: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
afa0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
afb0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
afc0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
afd0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
afe0: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
aff0: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
b000: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b010: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
b020: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
b030: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
b040: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
b050: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
b060: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
b070: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
b080: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
b090: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
b0a0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
b0b0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
b0c0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
b0d0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
b0e0: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
b0f0: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
b100: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
b110: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
b120: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
b130: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
b140: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
b150: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
b160: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
b170: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
b180: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
b190: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
b1a0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
b1b0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
b1c0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
b1d0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
b1e0: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
b1f0: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
b200: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
b210: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
b220: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
b230: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
b240: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
b250: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
b260: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
b270: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
b280: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
b290: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
b2a0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
b2b0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
b2c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
b2d0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
b2e0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
b2f0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
b300: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
b310: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
b320: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
b330: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
b340: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
b350: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
b360: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
b370: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
b380: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
b390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b3a0: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
b3b0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
b3c0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
b3d0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
b3e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61       /* The fina
b3f0: 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74  l ')' token in t
b400: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
b410: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
b420: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
b430: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
b440: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
b450: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
b460: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
b470: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b480: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
b490: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
b4a0: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
b4b0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
b4c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b4d0: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b   ) {.    return;
b4e0: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
b4f0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
b500: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
b510: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
b520: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
b530: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
b540: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
b550: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
b560: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
b570: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b580: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
b590: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
b5a0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
b5b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
b5c0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
b5d0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
b5e0: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
b5f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
b600: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
b610: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
b620: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
b630: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
b640: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
b650: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
b660: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
b670: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
b680: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
b690: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
b6a0: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
b6b0: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
b6c0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
b6d0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
b6e0: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
b6f0: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
b700: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
b710: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
b720: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
b730: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
b740: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
b750: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
b760: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
b770: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
b780: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
b790: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
b7a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
b7b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
b7c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
b7d0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
b7e0: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
b7f0: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
b800: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
b810: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
b820: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
b830: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
b840: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
b850: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
b860: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
b870: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
b880: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
b890: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
b8a0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
b8b0: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
b8c0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
b8d0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
b8e0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
b8f0: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
b900: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
b910: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
b920: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
b930: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
b940: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
b950: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
b960: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
b970: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
b980: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
b990: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
b9a0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
b9b0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
b9c0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
b9d0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
b9e0: 20 54 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62   The record numb
b9f0: 65 72 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  er.  ** for the 
ba00: 6e 65 77 20 74 61 62 6c 65 20 65 6e 74 72 79 20  new table entry 
ba10: 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
ba20: 65 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  e on the stack..
ba30: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
ba40: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
ba50: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
ba60: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
ba70: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
ba80: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
ba90: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
baa0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
bab0: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
bac0: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
bad0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
bae0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
baf0: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
bb00: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
bb10: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
bb20: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
bb30: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
bb40: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
bb50: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
bb60: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
bb70: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
bb80: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
bb90: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
bba0: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
bbb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
bbc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bbd0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
bbe0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72  , 0);..    /* Cr
bbf0: 65 61 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67  eate the rootpag
bc00: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61  e for the new ta
bc10: 62 6c 65 20 61 6e 64 20 70 75 73 68 20 69 74 20  ble and push it 
bc20: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
bc30: 20 20 20 20 2a 2a 20 41 20 76 69 65 77 20 68 61      ** A view ha
bc40: 73 20 6e 6f 20 72 6f 6f 74 70 61 67 65 2c 20 73  s no rootpage, s
bc50: 6f 20 6a 75 73 74 20 70 75 73 68 20 61 20 7a 65  o just push a ze
bc60: 72 6f 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ro onto the stac
bc70: 6b 20 66 6f 72 0a 20 20 20 20 2a 2a 20 76 69 65  k for.    ** vie
bc80: 77 73 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  ws.  Initialize 
bc90: 7a 54 79 70 65 20 61 74 20 74 68 65 20 73 61 6d  zType at the sam
bca0: 65 20 74 69 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  e time..    */. 
bcb0: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
bcc0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
bcd0: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
bce0: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
bcf0: 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
bd00: 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
bd10: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
bd20: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
bd30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
bd40: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
bd50: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
bd60: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
bd70: 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
bd80: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
bd90: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
bda0: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
bdb0: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
bdc0: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
bdd0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
bde0: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
bdf0: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
be00: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
be10: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
be20: 61 62 6c 65 20 69 73 20 6f 6e 20 74 68 65 20 74  able is on the t
be30: 6f 70 20 6f 66 20 74 68 65 20 76 64 62 65 20 73  op of the vdbe s
be40: 74 61 63 6b 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  tack..    **.   
be50: 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c   ** Once the SEL
be60: 45 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64  ECT has been cod
be70: 65 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c  ed by sqlite3Sel
be80: 65 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20  ect(), it is in 
be90: 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c  a.    ** suitabl
bea0: 65 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79  e state to query
beb0: 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20   for the column 
bec0: 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20  names and types 
bed0: 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a  to be used.    *
bee0: 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62  * by the new tab
bef0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
bf00: 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65  * A shared-cache
bf10: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e   write-lock is n
bf20: 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77  ot required to w
bf30: 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20  rite to the new 
bf40: 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73  table,.    ** as
bf50: 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d   a schema-lock m
bf60: 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ust have already
bf70: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74   been obtained t
bf80: 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e  o create it. Sin
bf90: 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65  ce.    ** a sche
bfa0: 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73  ma-lock excludes
bfb0: 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62   all other datab
bfc0: 61 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77  ase users, the w
bfd0: 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a  rite-lock would.
bfe0: 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64      ** be redund
bff0: 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ant..    */.    
c000: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
c010: 20 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20       SelectDest 
c020: 64 65 73 74 3b 0a 20 20 20 20 20 20 54 61 62 6c  dest;.      Tabl
c030: 65 20 2a 70 53 65 6c 54 61 62 3b 0a 0a 20 20 20  e *pSelTab;..   
c040: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
c050: 2d 3e 6e 54 61 62 3d 3d 30 29 3b 0a 20 20 20 20  ->nTab==0);.    
c060: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c070: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72  Op3(v, OP_OpenWr
c080: 69 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e  ite, 1, pParse->
c090: 72 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20  regRoot, iDb);. 
c0a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c0b0: 43 68 61 6e 67 65 50 35 28 76 2c 20 31 29 3b 0a  ChangeP5(v, 1);.
c0c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54        pParse->nT
c0d0: 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71  ab = 2;.      sq
c0e0: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49  lite3SelectDestI
c0f0: 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 54  nit(&dest, SRT_T
c100: 61 62 6c 65 2c 20 31 29 3b 0a 20 20 20 20 20 20  able, 1);.      
c110: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
c120: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26  arse, pSelect, &
c130: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
c140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
c150: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 31 29 3b 0a  , OP_Close, 1);.
c160: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
c170: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
c180: 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20 73       pSelTab = s
c190: 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74 4f  qlite3ResultSetO
c1a0: 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  fSelect(pParse, 
c1b0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
c1c0: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
c1d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
c1e0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43     assert( p->aC
c1f0: 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ol==0 );.       
c200: 20 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54   p->nCol = pSelT
c210: 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->nCol;.      
c220: 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c    p->aCol = pSel
c230: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
c240: 20 20 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c     pSelTab->nCol
c250: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 53   = 0;.        pS
c260: 65 6c 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b  elTab->aCol = 0;
c270: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c280: 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53 65 6c  DeleteTable(pSel
c290: 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Tab);.      }.  
c2a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
c2b0: 75 74 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ute the complete
c2c0: 20 74 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   text of the CRE
c2d0: 41 54 45 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  ATE statement */
c2e0: 0a 20 20 20 20 69 66 28 20 70 53 65 6c 65 63 74  .    if( pSelect
c2f0: 20 29 7b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20   ){.      zStmt 
c300: 3d 20 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d  = createTableStm
c310: 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 7d 65  t(db, p);.    }e
c320: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 28  lse{.      n = (
c330: 69 6e 74 29 28 70 45 6e 64 2d 3e 7a 20 2d 20 70  int)(pEnd->z - p
c340: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
c350: 6e 2e 7a 29 20 2b 20 31 3b 0a 20 20 20 20 20 20  n.z) + 1;.      
c360: 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
c370: 50 72 69 6e 74 66 28 64 62 2c 20 0a 20 20 20 20  Printf(db, .    
c380: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 25 73        "CREATE %s
c390: 20 25 2e 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20   %.*s", zType2, 
c3a0: 6e 2c 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65  n, pParse->sName
c3b0: 54 6f 6b 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b  Token.z.      );
c3c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
c3d0: 20 73 6c 6f 74 20 66 6f 72 20 74 68 65 20 72 65   slot for the re
c3e0: 63 6f 72 64 20 68 61 73 20 61 6c 72 65 61 64 79  cord has already
c3f0: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
c400: 69 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 53  in the .    ** S
c410: 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62  QLITE_MASTER tab
c420: 6c 65 2e 20 20 57 65 20 6a 75 73 74 20 6e 65 65  le.  We just nee
c430: 64 20 74 6f 20 75 70 64 61 74 65 20 74 68 61 74  d to update that
c440: 20 73 6c 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20   slot with all. 
c450: 20 20 20 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d     ** the inform
c460: 61 74 69 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c  ation we've coll
c470: 65 63 74 65 64 2e 20 20 54 68 65 20 72 6f 77 69  ected.  The rowi
c480: 64 20 66 6f 72 20 74 68 65 20 70 72 65 61 6c 6c  d for the preall
c490: 6f 63 61 74 65 64 0a 20 20 20 20 2a 2a 20 73 6c  ocated.    ** sl
c4a0: 6f 74 20 69 73 20 74 68 65 20 32 6e 64 20 69 74  ot is the 2nd it
c4b0: 65 6d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  em on the stack.
c4c0: 20 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65    The top of the
c4d0: 20 73 74 61 63 6b 20 69 73 20 74 68 65 0a 20 20   stack is the.  
c4e0: 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 66    ** root page f
c4f0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
c500: 20 28 6f 72 20 61 20 30 20 69 66 20 74 68 69 73   (or a 0 if this
c510: 20 69 73 20 61 20 76 69 65 77 29 2e 0a 20 20 20   is a view)..   
c520: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
c530: 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
c540: 65 2c 0a 20 20 20 20 20 20 22 55 50 44 41 54 45  e,.      "UPDATE
c550: 20 25 51 2e 25 73 20 22 0a 20 20 20 20 20 20 20   %Q.%s ".       
c560: 20 20 22 53 45 54 20 74 79 70 65 3d 27 25 73 27    "SET type='%s'
c570: 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62 6c 5f 6e  , name=%Q, tbl_n
c580: 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70 61 67 65  ame=%Q, rootpage
c590: 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20 22 0a 20  =#%d, sql=%Q ". 
c5a0: 20 20 20 20 20 20 22 57 48 45 52 45 20 72 6f 77        "WHERE row
c5b0: 69 64 3d 23 25 64 22 2c 0a 20 20 20 20 20 20 64  id=#%d",.      d
c5c0: 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
c5d0: 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
c5e0: 69 44 62 29 2c 0a 20 20 20 20 20 20 7a 54 79 70  iDb),.      zTyp
c5f0: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
c600: 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a 4e 61 6d  e,.      p->zNam
c610: 65 2c 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  e,.      pParse-
c620: 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20 20 20 20  >regRoot,.      
c630: 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20 70 50 61  zStmt,.      pPa
c640: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 0a 20 20  rse->regRowid.  
c650: 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
c660: 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
c670: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68  );.    sqlite3Ch
c680: 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73  angeCookie(pPars
c690: 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65  e, iDb);..#ifnde
c6a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
c6b0: 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
c6c0: 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
c6d0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  if we need to cr
c6e0: 65 61 74 65 20 61 6e 20 73 71 6c 69 74 65 5f 73  eate an sqlite_s
c6f0: 65 71 75 65 6e 63 65 20 74 61 62 6c 65 20 66 6f  equence table fo
c700: 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70 69 6e 67  r.    ** keeping
c710: 20 74 72 61 63 6b 20 6f 66 20 61 75 74 6f 69 6e   track of autoin
c720: 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e 0a 20 20  crement keys..  
c730: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
c740: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
c750: 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20  toincrement ){. 
c760: 20 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26       Db *pDb = &
c770: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20  db->aDb[iDb];.  
c780: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
c790: 68 65 6d 61 2d 3e 70 53 65 71 54 61 62 3d 3d 30  hema->pSeqTab==0
c7a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c7b0: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
c7c0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
c7d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25   "CREATE TABLE %
c7e0: 51 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  Q.sqlite_sequenc
c7f0: 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c 0a 20 20  e(name,seq)",.  
c800: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
c810: 6d 65 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  me.        );.  
c820: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
c830: 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65 70 61 72  if..    /* Repar
c840: 73 65 20 65 76 65 72 79 74 68 69 6e 67 20 74 6f  se everything to
c850: 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74 65   update our inte
c860: 72 6e 61 6c 20 64 61 74 61 20 73 74 72 75 63 74  rnal data struct
c870: 75 72 65 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ures */.    sqli
c880: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
c890: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
c8a0: 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20 20 20   iDb, 0, 0,.    
c8b0: 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e      sqlite3MPrin
c8c0: 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65  tf(db, "tbl_name
c8d0: 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61 6d 65 29  ='%q'",p->zName)
c8e0: 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
c8f0: 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68   }...  /* Add th
c900: 65 20 74 61 62 6c 65 20 74 6f 20 74 68 65 20 69  e table to the i
c910: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
c920: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  ntation of the d
c930: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
c940: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
c950: 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 45 72  y && pParse->nEr
c960: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54 61 62 6c  r==0 ){.    Tabl
c970: 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20 46 4b 65  e *pOld;.    FKe
c980: 79 20 2a 70 46 4b 65 79 3b 20 0a 20 20 20 20 53  y *pFKey; .    S
c990: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
c9a0: 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20   p->pSchema;.   
c9b0: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33 48   pOld = sqlite3H
c9c0: 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68 65  ashInsert(&pSche
c9d0: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d 3e  ma->tblHash, p->
c9e0: 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca00: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65      sqlite3Strle
ca10: 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2b 31 2c  n30(p->zName)+1,
ca20: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  p);.    if( pOld
ca30: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
ca40: 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a  ( p==pOld );  /*
ca50: 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76   Malloc must hav
ca60: 65 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20  e failed inside 
ca70: 48 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a  HashInsert() */.
ca80: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
ca90: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
caa0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
cab0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
cac0: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
cad0: 20 20 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 2d      for(pFKey=p-
cae0: 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b 20 70  >pFKey; pFKey; p
caf0: 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70 4e 65 78  FKey=pFKey->pNex
cb00: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 76 6f  tFrom){.      vo
cb10: 69 64 20 2a 64 61 74 61 3b 0a 20 20 20 20 20 20  id *data;.      
cb20: 69 6e 74 20 6e 54 6f 20 3d 20 73 71 6c 69 74 65  int nTo = sqlite
cb30: 33 53 74 72 6c 65 6e 33 30 28 70 46 4b 65 79 2d  3Strlen30(pFKey-
cb40: 3e 7a 54 6f 29 20 2b 20 31 3b 0a 20 20 20 20 20  >zTo) + 1;.     
cb50: 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20   pFKey->pNextTo 
cb60: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
cb70: 64 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65  d(&pSchema->aFKe
cb80: 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e  y, pFKey->zTo, n
cb90: 54 6f 29 3b 0a 20 20 20 20 20 20 64 61 74 61 20  To);.      data 
cba0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
cbb0: 65 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46  ert(&pSchema->aF
cbc0: 4b 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c  Key, pFKey->zTo,
cbd0: 20 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20   nTo, pFKey);.  
cbe0: 20 20 20 20 69 66 28 20 64 61 74 61 3d 3d 28 76      if( data==(v
cbf0: 6f 69 64 20 2a 29 70 46 4b 65 79 20 29 7b 0a 20  oid *)pFKey ){. 
cc00: 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f         db->mallo
cc10: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
cc20: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
cc30: 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e  f.    pParse->pN
cc40: 65 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20  ewTable = 0;.   
cc50: 20 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20   db->nTable++;. 
cc60: 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
cc70: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
cc80: 6e 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53  nges;..#ifndef S
cc90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52  QLITE_OMIT_ALTER
cca0: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70  TABLE.    if( !p
ccb0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
ccc0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
ccd0: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
cce0: 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61  ar *)pParse->sNa
ccf0: 6d 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  meToken.z;.     
cd00: 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20   int nName;.    
cd10: 20 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65    assert( !pSele
cd20: 63 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70  ct && pCons && p
cd30: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  End );.      if(
cd40: 20 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a   pCons->z==0 ){.
cd50: 20 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20          pCons = 
cd60: 70 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pEnd;.      }.  
cd70: 20 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74      nName = (int
cd80: 29 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  )((const char *)
cd90: 70 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65  pCons->z - zName
cda0: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43  );.      p->addC
cdb0: 6f 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20  olOffset = 13 + 
cdc0: 73 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c  sqlite3Utf8CharL
cdd0: 65 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  en(zName, nName)
cde0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
cdf0: 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
ce00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f  LITE_OMIT_VIEW./
ce10: 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20  *.** The parser 
ce20: 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69  calls this routi
ce30: 6e 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ne in order to c
ce40: 72 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57  reate a new VIEW
ce50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ce60: 43 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61  CreateView(.  Pa
ce70: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
ce80: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
ce90: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b  context */.  Tok
cea0: 65 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20  en *pBegin,     
ceb0: 2f 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f  /* The CREATE to
cec0: 6b 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20  ken that begins 
ced0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
cee0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
cef0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
cf00: 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
cf10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
cf20: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
cf30: 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68  Name2,     /* Th
cf40: 65 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c  e token that hol
cf50: 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ds the name of t
cf60: 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c  he view */.  Sel
cf70: 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20  ect *pSelect,   
cf80: 2f 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74  /* A SELECT stat
cf90: 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20  ement that will 
cfa0: 62 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76  become the new v
cfb0: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
cfc0: 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  emp,        /* T
cfd0: 52 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52  RUE for a TEMPOR
cfe0: 41 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  ARY view */.  in
cff0: 74 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20  t noErr         
d000: 20 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72   /* Suppress err
d010: 6f 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56  or messages if V
d020: 49 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73  IEW already exis
d030: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ts */.){.  Table
d040: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *p;.  int n;.  
d050: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
d060: 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
d070: 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
d080: 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
d090: 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b  Name;.  int iDb;
d0a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d0b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
d0c0: 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  if( pParse->nVar
d0d0: 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  >0 ){.    sqlite
d0e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d0f0: 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72  , "parameters ar
d100: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
d110: 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71   views");.    sq
d120: 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
d130: 65 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a  e(db, pSelect);.
d140: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d150: 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61    sqlite3StartTa
d160: 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ble(pParse, pNam
d170: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65  e1, pName2, isTe
d180: 6d 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29  mp, 1, 0, noErr)
d190: 3b 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  p = pParse->
d1a0: 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28  pNewTable;.  if(
d1b0: 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d   p==0 || pParse-
d1c0: 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c  >nErr ){.    sql
d1d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
d1e0: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
d1f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
d200: 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
d210: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
d220: 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61  e1, pName2, &pNa
d230: 6d 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c  me);.  iDb = sql
d240: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
d250: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
d260: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
d270: 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70  FixInit(&sFix, p
d280: 50 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65  Parse, iDb, "vie
d290: 77 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26  w", pName).    &
d2a0: 26 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65  & sqlite3FixSele
d2b0: 63 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63  ct(&sFix, pSelec
d2c0: 74 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69  t).  ){.    sqli
d2d0: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d2e0: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d2f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
d300: 20 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20   /* Make a copy 
d310: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45  of the entire SE
d320: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
d330: 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20  hat defines the 
d340: 76 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20  view..  ** This 
d350: 77 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74  will force all t
d360: 68 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20  he Expr.token.z 
d370: 76 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e  values to be dyn
d380: 61 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c  amically.  ** al
d390: 6c 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74  located rather t
d3a0: 68 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  han point to the
d3b0: 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20   input string - 
d3c0: 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74  which means that
d3d0: 0a 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20  .  ** they will 
d3e0: 70 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68  persist after th
d3f0: 65 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65  e current sqlite
d400: 33 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65  3_exec() call re
d410: 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d  turns..  */.  p-
d420: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
d430: 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20  e3SelectDup(db, 
d440: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
d450: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
d460: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
d470: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
d480: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
d490: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  rn;.  }.  if( !d
d4a0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
d4b0: 20 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47      sqlite3ViewG
d4c0: 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50  etColumnNames(pP
d4d0: 61 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20  arse, p);.  }.. 
d4e0: 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65   /* Locate the e
d4f0: 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45  nd of the CREATE
d500: 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e   VIEW statement.
d510: 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e    Make sEnd poin
d520: 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e  t to.  ** the en
d530: 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d  d..  */.  sEnd =
d540: 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f   pParse->sLastTo
d550: 6b 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e  ken;.  if( sEnd.
d560: 7a 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e  z[0]!=0 && sEnd.
d570: 7a 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20  z[0]!=';' ){.   
d580: 20 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e   sEnd.z += sEnd.
d590: 6e 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20  n;.  }.  sEnd.n 
d5a0: 3d 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  = 0;.  n = (int)
d5b0: 28 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e  (sEnd.z - pBegin
d5c0: 2d 3e 7a 29 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e  ->z);.  z = (con
d5d0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
d5e0: 2a 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77  *)pBegin->z;.  w
d5f0: 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b  hile( n>0 && (z[
d600: 6e 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 73 71 6c  n-1]==';' || sql
d610: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
d620: 31 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20  1])) ){ n--; }. 
d630: 20 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31   sEnd.z = &z[n-1
d640: 5d 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b  ];.  sEnd.n = 1;
d650: 0a 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74  ..  /* Use sqlit
d660: 65 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20  e3EndTable() to 
d670: 61 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20  add the view to 
d680: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45  the SQLITE_MASTE
d690: 52 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  R table */.  sql
d6a0: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61  ite3EndTable(pPa
d6b0: 72 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30  rse, 0, &sEnd, 0
d6c0: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23  );.  return;.}.#
d6d0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d6e0: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69  OMIT_VIEW */..#i
d6f0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
d700: 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
d710: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
d720: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d730: 45 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62  E)./*.** The Tab
d740: 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61  le structure pTa
d750: 62 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ble is really a 
d760: 56 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74  VIEW.  Fill in t
d770: 68 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74  he names of.** t
d780: 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68  he columns of th
d790: 65 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54  e view in the pT
d7a0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20  able structure. 
d7b0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d7c0: 65 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e  er.** of errors.
d7d0: 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
d7e0: 20 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65   seen leave an e
d7f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
d800: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
d810: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
d820: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
d830: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
d840: 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b   Table *pTable){
d850: 0a 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61  .  Table *pSelTa
d860: 62 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74  b;   /* A fake t
d870: 61 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20  able from which 
d880: 77 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c  we get the resul
d890: 74 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63  t set */.  Selec
d8a0: 74 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20  t *pSel;     /* 
d8b0: 43 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45  Copy of the SELE
d8c0: 43 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  CT that implemen
d8d0: 74 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20  ts the view */. 
d8e0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20   int nErr = 0;  
d8f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d900: 65 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72  errors encounter
d910: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ed */.  int n;  
d920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
d930: 70 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74  porarily holds t
d940: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72  he number of cur
d950: 73 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f  sors assigned */
d960: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
d970: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
d980: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
d990: 74 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20  tion for malloc 
d9a0: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
d9b0: 28 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69  (*xAuth)(void*,i
d9c0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  nt,const char*,c
d9d0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
d9e0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
d9f0: 72 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  r*);..  assert( 
da00: 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64  pTable );..#ifnd
da10: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
da20: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
da30: 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c  ( sqlite3VtabCal
da40: 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c  lConnect(pParse,
da50: 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20   pTable) ){.    
da60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
da70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49  ROR;.  }.  if( I
da80: 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29  sVirtual(pTable)
da90: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e   ) return 0;.#en
daa0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
dab0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20  ITE_OMIT_VIEW.  
dac0: 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43  /* A positive nC
dad0: 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c  ol means the col
dae0: 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74  umns names for t
daf0: 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a  his view are.  *
db00: 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e  * already known.
db10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
db20: 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74  le->nCol>0 ) ret
db30: 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e  urn 0;..  /* A n
db40: 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20  egative nCol is 
db50: 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72  a special marker
db60: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65   meaning that we
db70: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   are currently. 
db80: 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f   ** trying to co
db90: 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e  mpute the column
dba0: 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65   names.  If we e
dbb0: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
dbc0: 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65  e with.  ** a ne
dbd0: 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20  gative nCol, it 
dbe0: 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72  means two or mor
dbf0: 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c  e views form a l
dc00: 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a  oop, like this:.
dc10: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52    **.  **     CR
dc20: 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53  EATE VIEW one AS
dc30: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
dc40: 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45  wo;.  **     CRE
dc50: 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20  ATE VIEW two AS 
dc60: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e  SELECT * FROM on
dc70: 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  e;.  **.  ** Act
dc80: 75 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f  ually, this erro
dc90: 72 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76  r is caught prev
dca0: 69 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68  iously and so th
dcb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74  e following test
dcc0: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77  .  ** should alw
dcd0: 61 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77  ays fail.  But w
dce0: 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20  e will leave it 
dcf0: 69 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f  in place just to
dd00: 20 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20   be safe..  */. 
dd10: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f   if( pTable->nCo
dd20: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
dd30: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
dd40: 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63  e, "view %s is c
dd50: 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65  ircularly define
dd60: 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d  d", pTable->zNam
dd70: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
dd80: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
dd90: 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20  pTable->nCol>=0 
dda0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67  );..  /* If we g
ddb0: 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
ddc0: 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f  means we need to
ddd0: 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62   compute the tab
dde0: 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e  le names..  ** N
ddf0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c  ote that the cal
de00: 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75  l to sqlite3Resu
de10: 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20  ltSetOfSelect() 
de20: 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a  will expand any.
de30: 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74    ** "*" element
de40: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73  s in the results
de50: 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77   set of the view
de60: 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e   and will assign
de70: 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f   cursors.  ** to
de80: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66   the elements of
de90: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
dea0: 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74  .  But we do not
deb0: 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e   want these chan
dec0: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70  ges.  ** to be p
ded0: 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68  ermanent.  So th
dee0: 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73  e computation is
def0: 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20   done on a copy 
df00: 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  of the SELECT.  
df10: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ** statement tha
df20: 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69  t defines the vi
df30: 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ew..  */.  asser
df40: 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  t( pTable->pSele
df50: 63 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73  ct );.  pSel = s
df60: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
df70: 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  db, pTable->pSel
df80: 65 63 74 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  ect);.  if( pSel
df90: 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 72   ){.    n = pPar
dfa0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73 71  se->nTab;.    sq
dfb0: 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73 69  lite3SrcListAssi
dfc0: 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73 65  gnCursors(pParse
dfd0: 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a 20  , pSel->pSrc);. 
dfe0: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
dff0: 3d 20 2d 31 3b 0a 23 69 66 6e 64 65 66 20 53 51  = -1;.#ifndef SQ
e000: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
e010: 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75 74  IZATION.    xAut
e020: 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20  h = db->xAuth;. 
e030: 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30     db->xAuth = 0
e040: 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d 20  ;.    pSelTab = 
e050: 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65 74  sqlite3ResultSet
e060: 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  OfSelect(pParse,
e070: 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d 3e   pSel);.    db->
e080: 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a 23  xAuth = xAuth;.#
e090: 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61 62  else.    pSelTab
e0a0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
e0b0: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
e0c0: 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64 69  se, pSel);.#endi
e0d0: 66 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54  f.    pParse->nT
e0e0: 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20  ab = n;.    if( 
e0f0: 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20  pSelTab ){.     
e100: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d   assert( pTable-
e110: 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  >aCol==0 );.    
e120: 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
e130: 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
e140: 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43        pTable->aC
e150: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
e160: 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  ol;.      pSelTa
e170: 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  b->nCol = 0;.   
e180: 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c     pSelTab->aCol
e190: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
e1a0: 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70  te3DeleteTable(p
e1b0: 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70  SelTab);.      p
e1c0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e  Table->pSchema->
e1d0: 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  flags |= DB_Unre
e1e0: 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65  setViews;.    }e
e1f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c  lse{.      pTabl
e200: 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  e->nCol = 0;.   
e210: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d     nErr++;.    }
e220: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
e230: 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65  ctDelete(db, pSe
e240: 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  l);.  } else {. 
e250: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23     nErr++;.  }.#
e260: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
e270: 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72  OMIT_VIEW */.  r
e280: 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a  eturn nErr;  .}.
e290: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
e2a0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
e2b0: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
e2c0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52  (SQLITE_OMIT_VIR
e2d0: 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23  TUALTABLE) */..#
e2e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e2f0: 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c  IT_VIEW./*.** Cl
e300: 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ear the column n
e310: 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20  ames from every 
e320: 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65  VIEW in database
e330: 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   idx..*/.static 
e340: 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52  void sqliteViewR
e350: 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20  esetAll(sqlite3 
e360: 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  *db, int idx){. 
e370: 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20   HashElem *i;.  
e380: 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72  if( !DbHasProper
e390: 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
e3a0: 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72  nresetViews) ) r
e3b0: 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73  eturn;.  for(i=s
e3c0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
e3d0: 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63  db->aDb[idx].pSc
e3e0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
e3f0: 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  i;i=sqliteHashNe
e400: 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c  xt(i)){.    Tabl
e410: 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
e420: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
e430: 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
e440: 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ct ){.      sqli
e450: 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d  teResetColumnNam
e460: 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  es(pTab);.    }.
e470: 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f    }.  DbClearPro
e480: 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44  perty(db, idx, D
e490: 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b  B_UnresetViews);
e4a0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
e4b0: 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65  e sqliteViewRese
e4c0: 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66  tAll(A,B).#endif
e4d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
e4e0: 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  VIEW */../*.** T
e4f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
e500: 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44  called by the VD
e510: 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  BE to adjust the
e520: 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
e530: 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69  .** used by SQLi
e540: 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65  te when the btre
e550: 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20  e layer moves a 
e560: 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e  table root page.
e570: 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67   The.** root-pag
e580: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
e590: 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73  index in databas
e5a0: 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65  e iDb has change
e5b0: 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20  d from iFrom.** 
e5c0: 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69  to iTo..**.** Ti
e5d0: 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65  cket #1728:  The
e5e0: 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69   symbol table mi
e5f0: 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69  ght still contai
e600: 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  n information.**
e610: 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f   on tables and/o
e620: 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61  r indices that a
e630: 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  re the process o
e640: 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e  f being deleted.
e650: 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75  .** If you are u
e660: 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74  nlucky, one of t
e670: 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64  hose deleted ind
e680: 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d  ices or tables m
e690: 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65  ight.** have the
e6a0: 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e   same rootpage n
e6b0: 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61  umber as the rea
e6c0: 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78  l table or index
e6d0: 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e   that is.** bein
e6e0: 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20  g moved.  So we 
e6f0: 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72  cannot stop sear
e700: 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  ching after the 
e710: 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20  first match .** 
e720: 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73  because the firs
e730: 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65  t match might be
e740: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
e750: 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a  deleted indices.
e760: 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64  ** or tables and
e770: 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69   not the table/i
e780: 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74  ndex that is act
e790: 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65  ually being move
e7a0: 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f  d..** We must co
e7b0: 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75  ntinue looping u
e7c0: 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20  ntil all tables 
e7d0: 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68  and indices with
e7e0: 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46  .** rootpage==iF
e7f0: 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f  rom have been co
e800: 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20  nverted to have 
e810: 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54  a rootpage of iT
e820: 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  o.** in order to
e830: 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74   be certain that
e840: 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68   we got the righ
e850: 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  t one..*/.#ifnde
e860: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e870: 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71  TOVACUUM.void sq
e880: 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76  lite3RootPageMov
e890: 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20  ed(Db *pDb, int 
e8a0: 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
e8b0: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c  .  HashElem *pEl
e8c0: 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73  em;.  Hash *pHas
e8d0: 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70  h;..  pHash = &p
e8e0: 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
e8f0: 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65  Hash;.  for(pEle
e900: 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  m=sqliteHashFirs
e910: 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b  t(pHash); pElem;
e920: 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73   pElem=sqliteHas
e930: 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20  hNext(pElem)){. 
e940: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
e950: 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28   sqliteHashData(
e960: 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20  pElem);.    if( 
e970: 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f  pTab->tnum==iFro
e980: 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  m ){.      pTab-
e990: 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20  >tnum = iTo;.   
e9a0: 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d   }.  }.  pHash =
e9b0: 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e   &pDb->pSchema->
e9c0: 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70  idxHash;.  for(p
e9d0: 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46  Elem=sqliteHashF
e9e0: 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c  irst(pHash); pEl
e9f0: 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65  em; pElem=sqlite
ea00: 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29  HashNext(pElem))
ea10: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
ea20: 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61  x = sqliteHashDa
ea30: 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69  ta(pElem);.    i
ea40: 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69  f( pIdx->tnum==i
ea50: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49  From ){.      pI
ea60: 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a  dx->tnum = iTo;.
ea70: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
ea80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
ea90: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68  code to erase th
eaa0: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
eab0: 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72  t-page iTable fr
eac0: 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  om database iDb.
ead0: 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63  .** Also write c
eae0: 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ode to modify th
eaf0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
eb00: 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e  table and intern
eb10: 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20  al schema.** if 
eb20: 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  a root-page of a
eb30: 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20  nother table is 
eb40: 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72  moved by the btr
eb50: 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a  ee-layer whilst.
eb60: 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c  ** erasing iTabl
eb70: 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70  e (this can happ
eb80: 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d  en with an auto-
eb90: 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29  vacuum database)
eba0: 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69  ..*/ .static voi
ebb0: 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67  d destroyRootPag
ebc0: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
ebd0: 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
ebe0: 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76   iDb){.  Vdbe *v
ebf0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ec00: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74  e(pParse);.  int
ec10: 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
ec20: 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
ec30: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
ec40: 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72  dOp3(v, OP_Destr
ec50: 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20  oy, iTable, r1, 
ec60: 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  iDb);.#ifndef SQ
ec70: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
ec80: 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73  CUUM.  /* OP_Des
ec90: 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69  troy stores an i
eca0: 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66  n integer r1. If
ecb0: 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20   this integer.  
ecc0: 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ** is non-zero, 
ecd0: 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72  then it is the r
ece0: 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  oot page number 
ecf0: 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64  of a table moved
ed00: 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f   to.  ** locatio
ed10: 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f  n iTable. The fo
ed20: 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64  llowing code mod
ed30: 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65  ifies the sqlite
ed40: 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f  _master table to
ed50: 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68  .  ** reflect th
ed60: 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  is..  **.  ** Th
ed70: 65 20 22 23 25 64 22 20 69 6e 20 74 68 65 20 53  e "#%d" in the S
ed80: 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
ed90: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
eda0: 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
edb0: 75 65 0a 20 20 2a 2a 20 69 73 20 6f 6e 20 74 68  ue.  ** is on th
edc0: 65 20 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61  e top of the sta
edd0: 63 6b 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ck.  See sqlite3
ede0: 52 65 67 69 73 74 65 72 45 78 70 72 28 29 2e 0a  RegisterExpr()..
edf0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e 65    */.  sqlite3Ne
ee00: 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
ee10: 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45 20  , .     "UPDATE 
ee20: 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70 61  %Q.%s SET rootpa
ee30: 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64 20  ge=%d WHERE #%d 
ee40: 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25 64  AND rootpage=#%d
ee50: 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d 3e  ",.     pParse->
ee60: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
ee70: 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
ee80: 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20 72  (iDb), iTable, r
ee90: 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a 20  1, r1);.#endif. 
eea0: 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
eeb0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
eec0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  1);.}../*.** Wri
eed0: 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f 20  te VDBE code to 
eee0: 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61 62  erase table pTab
eef0: 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69 61   and all associa
ef00: 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20 64  ted indices on d
ef10: 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f 20  isk..** Code to 
ef20: 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69 74  update the sqlit
ef30: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73 20  e_master tables 
ef40: 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  and internal sch
ef50: 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a  ema definitions.
ef60: 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f 6f  ** in case a roo
ef70: 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  t-page belonging
ef80: 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62 6c   to another tabl
ef90: 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74 68  e is moved by th
efa0: 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a 2a  e btree layer.**
efb0: 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20 28   is also added (
efc0: 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20  this can happen 
efd0: 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63  with an auto-vac
efe0: 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a  uum database)..*
eff0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
f000: 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73 65  stroyTable(Parse
f010: 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
f020: 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20 53  *pTab){.#ifdef S
f030: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f040: 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a 70  ACUUM.  Index *p
f050: 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20 3d  Idx;.  int iDb =
f060: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f070: 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62  Index(pParse->db
f080: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
f090: 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50  ;.  destroyRootP
f0a0: 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  age(pParse, pTab
f0b0: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
f0c0: 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70  for(pIdx=pTab->p
f0d0: 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64  Index; pIdx; pId
f0e0: 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a  x=pIdx->pNext){.
f0f0: 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50      destroyRootP
f100: 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64 78  age(pParse, pIdx
f110: 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
f120: 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66 20  }.#else.  /* If 
f130: 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
f140: 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   be auto-vacuum 
f150: 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c 49  capable (if SQLI
f160: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f170: 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64  UM.  ** is not d
f180: 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69 74  efined), then it
f190: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
f1a0: 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f 79   call OP_Destroy
f1b0: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61 62   on the.  ** tab
f1c0: 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f 6f  le and index roo
f1d0: 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65 72  t-pages in order
f1e0: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
f1f0: 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79 20  the numerically 
f200: 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72 6f  .  ** largest ro
f210: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ot-page number. 
f220: 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73 20  This guarantees 
f230: 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68 65  that none of the
f240: 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a 2a   root-pages.  **
f250: 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65 64   to be destroyed
f260: 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62 79   is relocated by
f270: 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f 44   an earlier OP_D
f280: 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66 20  estroy. i.e. if 
f290: 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69  the.  ** followi
f2a0: 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a 20  ng were coded:. 
f2b0: 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74   **.  ** OP_Dest
f2c0: 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e 2e  roy 4 0.  ** ...
f2d0: 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79  .  ** OP_Destroy
f2e0: 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61   5 0.  **.  ** a
f2f0: 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20 68  nd root page 5 h
f300: 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74 68  appened to be th
f310: 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
f320: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74 68  age number in th
f330: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
f340: 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65 20   then root page 
f350: 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65 64  5 would be moved
f360: 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74 68   to page 4 by th
f370: 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73 74  e .  ** "OP_Dest
f380: 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65 2e  roy 4 0" opcode.
f390: 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74 20   The subsequent 
f3a0: 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 22  "OP_Destroy 5 0"
f3b0: 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a 20   would hit.  ** 
f3c0: 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67 65  a free-list page
f3d0: 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ..  */.  int iTa
f3e0: 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a  b = pTab->tnum;.
f3f0: 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65 64    int iDestroyed
f400: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
f410: 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a  1 ){.    Index *
f420: 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69 4c  pIdx;.    int iL
f430: 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20  argest = 0;..   
f440: 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64 3d   if( iDestroyed=
f450: 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73 74  =0 || iTab<iDest
f460: 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20 69  royed ){.      i
f470: 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b 0a  Largest = iTab;.
f480: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 49      }.    for(pI
f490: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
f4a0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f4b0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
f4c0: 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78 2d  int iIdx = pIdx-
f4d0: 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73 73  >tnum;.      ass
f4e0: 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68 65  ert( pIdx->pSche
f4f0: 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
f500: 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  a );.      if( (
f510: 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c  iDestroyed==0 ||
f520: 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79 65   (iIdx<iDestroye
f530: 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61 72  d)) && iIdx>iLar
f540: 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  gest ){.        
f550: 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78 3b  iLargest = iIdx;
f560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f570: 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74 3d     if( iLargest=
f580: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
f590: 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rn;.    }else{. 
f5a0: 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73       int iDb = s
f5b0: 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e  qlite3SchemaToIn
f5c0: 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  dex(pParse->db, 
f5d0: 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
f5e0: 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f        destroyRoo
f5f0: 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
f600: 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20  argest, iDb);.  
f610: 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
f620: 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d   iLargest;.    }
f630: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
f640: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f650: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 64  e is called to d
f660: 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 61 20  o the work of a 
f670: 44 52 4f 50 20 54 41 42 4c 45 20 73 74 61 74 65  DROP TABLE state
f680: 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d 65 20 69  ment..** pName i
f690: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
f6a0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 64 72  e table to be dr
f6b0: 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  opped..*/.void s
f6c0: 71 6c 69 74 65 33 44 72 6f 70 54 61 62 6c 65 28  qlite3DropTable(
f6d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53  Parse *pParse, S
f6e0: 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69  rcList *pName, i
f6f0: 6e 74 20 69 73 56 69 65 77 2c 20 69 6e 74 20 6e  nt isView, int n
f700: 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a  oErr){.  Table *
f710: 70 54 61 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b  pTab;.  Vdbe *v;
f720: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f730: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
f740: 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70  nt iDb;..  if( p
f750: 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64  Parse->nErr || d
f760: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f770: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
f780: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
f790: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
f7a0: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 70  ->nSrc==1 );.  p
f7b0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63  Tab = sqlite3Loc
f7c0: 61 74 65 54 61 62 6c 65 28 70 50 61 72 73 65 2c  ateTable(pParse,
f7d0: 20 69 73 56 69 65 77 2c 20 0a 20 20 20 20 20 20   isView, .      
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 61 5b 30        pName->a[0
f800: 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e  ].zName, pName->
f810: 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
f820: 0a 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20  ..  if( pTab==0 
f830: 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f 45 72 72  ){.    if( noErr
f840: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f850: 33 45 72 72 6f 72 43 6c 65 61 72 28 70 50 61 72  3ErrorClear(pPar
f860: 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  se);.    }.    g
f870: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
f880: 62 6c 65 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ble;.  }.  iDb =
f890: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f   sqlite3SchemaTo
f8a0: 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e  Index(db, pTab->
f8b0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 61 73 73 65  pSchema);.  asse
f8c0: 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44  rt( iDb>=0 && iD
f8d0: 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20  b<db->nDb );..  
f8e0: 2f 2a 20 49 66 20 70 54 61 62 20 69 73 20 61 20  /* If pTab is a 
f8f0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 63  virtual table, c
f900: 61 6c 6c 20 56 69 65 77 47 65 74 43 6f 6c 75 6d  all ViewGetColum
f910: 6e 4e 61 6d 65 73 28 29 20 74 6f 20 65 6e 73 75  nNames() to ensu
f920: 72 65 0a 20 20 2a 2a 20 69 74 20 69 73 20 69 6e  re.  ** it is in
f930: 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
f940: 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
f950: 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65 33  pTab) && sqlite3
f960: 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d  ViewGetColumnNam
f970: 65 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 29  es(pParse, pTab)
f980: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
f990: 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
f9a0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
f9b0: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
f9c0: 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  ION.  {.    int 
f9d0: 63 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  code;.    const 
f9e0: 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43 48  char *zTab = SCH
f9f0: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a  EMA_TABLE(iDb);.
fa00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fa10: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
fa20: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f  b].zName;.    co
fa30: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 32 20  nst char *zArg2 
fa40: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  = 0;.    if( sql
fa50: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
fa60: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c  arse, SQLITE_DEL
fa70: 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44  ETE, zTab, 0, zD
fa80: 62 29 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  b)){.      goto 
fa90: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
faa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
fab0: 73 56 69 65 77 20 29 7b 0a 20 20 20 20 20 20 69  sView ){.      i
fac0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
fad0: 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
fae0: 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
faf0: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45  TE_DROP_TEMP_VIE
fb00: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  W;.      }else{.
fb10: 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53          code = S
fb20: 51 4c 49 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b  QLITE_DROP_VIEW;
fb30: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
fb40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
fb50: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65  TUALTABLE.    }e
fb60: 6c 73 65 20 69 66 28 20 49 73 56 69 72 74 75 61  lse if( IsVirtua
fb70: 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  l(pTab) ){.     
fb80: 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
fb90: 52 4f 50 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20  ROP_VTABLE;.    
fba0: 20 20 7a 41 72 67 32 20 3d 20 70 54 61 62 2d 3e    zArg2 = pTab->
fbb0: 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
fbc0: 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
fbd0: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
fbe0: 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
fbf0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
fc00: 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
fc10: 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
fc20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
fc30: 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
fc40: 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
fc50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
fc60: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
fc70: 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
fc80: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
fc90: 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
fca0: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
fcb0: 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
fcc0: 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
fcd0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
fce0: 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
fcf0: 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
fd00: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
fd10: 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
fd20: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
fd30: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
fd40: 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
fd50: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
fd60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
fd70: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
fd80: 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61  se, "table %s ma
fd90: 79 20 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  y not be dropped
fda0: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
fdb0: 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
fdc0: 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a  rop_table;.  }..
fdd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
fde0: 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e  MIT_VIEW.  /* En
fdf0: 73 75 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20  sure DROP TABLE 
fe00: 69 73 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61  is not used on a
fe10: 20 76 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20   view, and DROP 
fe20: 56 49 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64  VIEW is not used
fe30: 0a 20 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65  .  ** on a table
fe40: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56  ..  */.  if( isV
fe50: 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
fe60: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73  lect==0 ){.    s
fe70: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
fe80: 50 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50  Parse, "use DROP
fe90: 20 54 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65   TABLE to delete
fea0: 20 74 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62   table %s", pTab
feb0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f  ->zName);.    go
fec0: 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62  to exit_drop_tab
fed0: 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69  le;.  }.  if( !i
fee0: 73 56 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70  sView && pTab->p
fef0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71  Select ){.    sq
ff00: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
ff10: 61 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20  arse, "use DROP 
ff20: 56 49 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76  VIEW to delete v
ff30: 69 65 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a  iew %s", pTab->z
ff40: 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
ff50: 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b  exit_drop_table;
ff60: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
ff70: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ff80: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61  to remove the ta
ff90: 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73  ble from the mas
ffa0: 74 65 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  ter table.  ** o
ffb0: 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76  n disk..  */.  v
ffc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
ffd0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
ffe0: 20 76 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65   v ){.    Trigge
fff0: 72 20 2a 70 54 72 69 67 67 65 72 3b 0a 20 20 20  r *pTrigger;.   
10000 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
10010 61 44 62 5b 69 44 62 5d 3b 0a 20 20 20 20 73 71  aDb[iDb];.    sq
10020 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
10030 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
10040 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64   1, iDb);..#ifnd
10050 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10060 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
10070 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
10080 61 62 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ab) ){.      if(
10090 20 76 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71   v ){.        sq
100a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
100b0 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
100c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
100d0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70  dif..    /* Drop
100e0 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61 73   all triggers as
100f0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
10100 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
10110 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 20 20  opped. Code.    
10120 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  ** is generated 
10130 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65  to remove entrie
10140 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61  s from sqlite_ma
10150 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 20 20  ster and/or.    
10160 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
10170 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
10180 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 54  d..    */.    pT
10190 72 69 67 67 65 72 20 3d 20 70 54 61 62 2d 3e 70  rigger = pTab->p
101a0 54 72 69 67 67 65 72 3b 0a 20 20 20 20 77 68 69  Trigger;.    whi
101b0 6c 65 28 20 70 54 72 69 67 67 65 72 20 29 7b 0a  le( pTrigger ){.
101c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
101d0 72 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d  rigger->pSchema=
101e0 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20 7c  =pTab->pSchema |
101f0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70 54 72  | .          pTr
10200 69 67 67 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d  igger->pSchema==
10210 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
10220 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ma );.      sqli
10230 74 65 33 44 72 6f 70 54 72 69 67 67 65 72 50 74  te3DropTriggerPt
10240 72 28 70 50 61 72 73 65 2c 20 70 54 72 69 67 67  r(pParse, pTrigg
10250 65 72 29 3b 0a 20 20 20 20 20 20 70 54 72 69 67  er);.      pTrig
10260 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d 3e  ger = pTrigger->
10270 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 0a 23 69  pNext;.    }..#i
10280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10290 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
102a0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e      /* Remove an
102b0 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
102c0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
102d0 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
102e0 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68  d with.    ** th
102f0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72  e table being dr
10300 6f 70 70 65 64 2e 20 54 68 69 73 20 69 73 20 64  opped. This is d
10310 6f 6e 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  one before the t
10320 61 62 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a  able is dropped.
10330 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 62 74      ** at the bt
10340 72 65 65 20 6c 65 76 65 6c 2c 20 69 6e 20 63 61  ree level, in ca
10350 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65  se the sqlite_se
10360 71 75 65 6e 63 65 20 74 61 62 6c 65 20 6e 65 65  quence table nee
10370 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76  ds to.    ** mov
10380 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
10390 20 74 68 65 20 64 72 6f 70 20 28 63 61 6e 20 68   the drop (can h
103a0 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d 76 61  appen in auto-va
103b0 63 75 75 6d 20 6d 6f 64 65 29 2e 0a 20 20 20 20  cuum mode)..    
103c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d  */.    if( pTab-
103d0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
103e0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29 7b 0a  utoincrement ){.
103f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73        sqlite3Nes
10400 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c  tedParse(pParse,
10410 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54 45  .        "DELETE
10420 20 46 52 4f 4d 20 25 73 2e 73 71 6c 69 74 65 5f   FROM %s.sqlite_
10430 73 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e  sequence WHERE n
10440 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20  ame=%Q",.       
10450 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
10460 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29  b->zName.      )
10470 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
10480 20 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20      /* Drop all 
10490 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
104a0 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 65 6e  ble and index en
104b0 74 72 69 65 73 20 74 68 61 74 20 72 65 66 65 72  tries that refer
104c0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   to the.    ** t
104d0 61 62 6c 65 2e 20 54 68 65 20 70 72 6f 67 72 61  able. The progra
104e0 6d 20 6e 61 6d 65 20 6c 6f 6f 70 73 20 74 68 72  m name loops thr
104f0 6f 75 67 68 20 74 68 65 20 6d 61 73 74 65 72 20  ough the master 
10500 74 61 62 6c 65 20 61 6e 64 20 64 65 6c 65 74 65  table and delete
10510 73 0a 20 20 20 20 2a 2a 20 65 76 65 72 79 20 72  s.    ** every r
10520 6f 77 20 74 68 61 74 20 72 65 66 65 72 73 20 74  ow that refers t
10530 6f 20 61 20 74 61 62 6c 65 20 6f 66 20 74 68 65  o a table of the
10540 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
10550 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20 20 20 20  e one being.    
10560 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69 67  ** dropped. Trig
10570 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65 64  gers are handled
10580 20 73 65 70 65 72 61 74 65 6c 79 20 62 65 63 61   seperately beca
10590 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63 61  use a trigger ca
105a0 6e 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  n be.    ** crea
105b0 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20  ted in the temp 
105c0 64 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65  database that re
105d0 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
105e0 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a  in another.    *
105f0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  * database..    
10600 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
10610 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
10620 2c 20 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  , .        "DELE
10630 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48  TE FROM %Q.%s WH
10640 45 52 45 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 20  ERE tbl_name=%Q 
10650 61 6e 64 20 74 79 70 65 21 3d 27 74 72 69 67 67  and type!='trigg
10660 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 70 44  er'",.        pD
10670 62 2d 3e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b->zName, SCHEMA
10680 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 70 54 61  _TABLE(iDb), pTa
10690 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20  b->zName);..    
106a0 2f 2a 20 44 72 6f 70 20 61 6e 79 20 73 74 61 74  /* Drop any stat
106b0 69 73 74 69 63 73 20 66 72 6f 6d 20 74 68 65 20  istics from the 
106c0 73 71 6c 69 74 65 5f 73 74 61 74 31 20 74 61 62  sqlite_stat1 tab
106d0 6c 65 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  le, if it exists
106e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
106f0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
10700 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c   "sqlite_stat1",
10710 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
10720 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
10730 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
10740 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
10750 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
10760 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48  .sqlite_stat1 WH
10770 45 52 45 20 74 62 6c 3d 25 51 22 2c 20 70 44 62  ERE tbl=%Q", pDb
10780 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
10790 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
107a0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 69 73    }..    if( !is
107b0 56 69 65 77 20 26 26 20 21 49 73 56 69 72 74 75  View && !IsVirtu
107c0 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
107d0 20 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 70    destroyTable(p
107e0 50 61 72 73 65 2c 20 70 54 61 62 29 3b 0a 20 20  Parse, pTab);.  
107f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f    }..    /* Remo
10800 76 65 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  ve the table ent
10810 72 79 20 66 72 6f 6d 20 53 51 4c 69 74 65 27 73  ry from SQLite's
10820 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61   internal schema
10830 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20 20 20 20   and modify.    
10840 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  ** the schema co
10850 6f 6b 69 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  okie..    */.   
10860 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
10870 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 73 71  Tab) ){.      sq
10880 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
10890 76 2c 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20  v, OP_VDestroy, 
108a0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
108b0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
108c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
108d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
108e0 6f 70 54 61 62 6c 65 2c 20 69 44 62 2c 20 30 2c  opTable, iDb, 0,
108f0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c   0, pTab->zName,
10900 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
10910 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
10920 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  rse, iDb);.  }. 
10930 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
10940 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 0a 65  All(db, iDb);..e
10950 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3a 0a  xit_drop_table:.
10960 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
10970 44 65 6c 65 74 65 28 64 62 2c 20 70 4e 61 6d 65  Delete(db, pName
10980 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
10990 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
109a0 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e  ed to create a n
109b0 65 77 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f  ew foreign key o
109c0 6e 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20 63  n the table.** c
109d0 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
109e0 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 70 46  onstruction.  pF
109f0 72 6f 6d 43 6f 6c 20 64 65 74 65 72 6d 69 6e 65  romCol determine
10a00 73 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 0a  s which columns.
10a10 2a 2a 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ** in the curren
10a20 74 20 74 61 62 6c 65 20 70 6f 69 6e 74 20 74 6f  t table point to
10a30 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
10a40 2e 20 20 49 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d  .  If pFromCol==
10a50 30 20 74 68 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63  0 then.** connec
10a60 74 20 74 68 65 20 6b 65 79 20 74 6f 20 74 68 65  t the key to the
10a70 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 69 6e 73   last column ins
10a80 65 72 74 65 64 2e 20 20 70 54 6f 20 69 73 20 74  erted.  pTo is t
10a90 68 65 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 74 68  he name of.** th
10aa0 65 20 74 61 62 6c 65 20 72 65 66 65 72 72 65 64  e table referred
10ab0 20 74 6f 2e 20 20 70 54 6f 43 6f 6c 20 69 73 20   to.  pToCol is 
10ac0 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  a list of tables
10ad0 20 69 6e 20 74 68 65 20 6f 74 68 65 72 0a 2a 2a   in the other.**
10ae0 20 70 54 6f 20 74 61 62 6c 65 20 74 68 61 74 20   pTo table that 
10af0 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  the foreign key 
10b00 70 6f 69 6e 74 73 20 74 6f 2e 20 20 66 6c 61 67  points to.  flag
10b10 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a  s contains all.*
10b20 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * information ab
10b30 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  out the conflict
10b40 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f   resolution algo
10b50 72 69 74 68 6d 73 20 73 70 65 63 69 66 69 65 64  rithms specified
10b60 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 44 45  .** in the ON DE
10b70 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41 54 45 20  LETE, ON UPDATE 
10b80 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54 20 63 6c  and ON INSERT cl
10b90 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  auses..**.** An 
10ba0 46 4b 65 79 20 73 74 72 75 63 74 75 72 65 20 69  FKey structure i
10bb0 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 64  s created and ad
10bc0 64 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ded to the table
10bd0 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e   currently.** un
10be0 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
10bf0 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 2d 3e   in the pParse->
10c00 70 4e 65 77 54 61 62 6c 65 20 66 69 65 6c 64 2e  pNewTable field.
10c10 20 20 54 68 65 20 6e 65 77 20 46 4b 65 79 0a 2a    The new FKey.*
10c20 2a 20 69 73 20 6e 6f 74 20 6c 69 6e 6b 65 64 20  * is not linked 
10c30 69 6e 74 6f 20 64 62 2d 3e 61 46 4b 65 79 20 61  into db->aFKey a
10c40 74 20 74 68 69 73 20 70 6f 69 6e 74 20 2d 20 74  t this point - t
10c50 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 68 61 70  hat does not hap
10c60 70 65 6e 0a 2a 2a 20 75 6e 74 69 6c 20 73 71 6c  pen.** until sql
10c70 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 2e 0a  ite3EndTable()..
10c80 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 65 69 67  **.** The foreig
10c90 6e 20 6b 65 79 20 69 73 20 73 65 74 20 66 6f 72  n key is set for
10ca0 20 49 4d 4d 45 44 49 41 54 45 20 70 72 6f 63 65   IMMEDIATE proce
10cb0 73 73 69 6e 67 2e 20 20 41 20 73 75 62 73 65 71  ssing.  A subseq
10cc0 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  uent call.** to 
10cd0 73 71 6c 69 74 65 33 44 65 66 65 72 46 6f 72 65  sqlite3DeferFore
10ce0 69 67 6e 4b 65 79 28 29 20 6d 69 67 68 74 20 63  ignKey() might c
10cf0 68 61 6e 67 65 20 74 68 69 73 20 74 6f 20 44 45  hange this to DE
10d00 46 45 52 52 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20  FERRED..*/.void 
10d10 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 6f 72  sqlite3CreateFor
10d20 65 69 67 6e 4b 65 79 28 0a 20 20 50 61 72 73 65  eignKey(.  Parse
10d30 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
10d40 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
10d50 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
10d60 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20   *pFromCol,  /* 
10d70 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 69 73 20  Columns in this 
10d80 74 61 62 6c 65 20 74 68 61 74 20 70 6f 69 6e 74  table that point
10d90 20 74 6f 20 6f 74 68 65 72 20 74 61 62 6c 65 20   to other table 
10da0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c  */.  Token *pTo,
10db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
10dc0 65 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 74  e of the other t
10dd0 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
10de0 73 74 20 2a 70 54 6f 43 6f 6c 2c 20 20 20 20 2f  st *pToCol,    /
10df0 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  * Columns in the
10e00 20 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a   other table */.
10e10 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
10e20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69         /* Confli
10e30 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c  ct resolution al
10e40 67 6f 72 69 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a  gorithms. */.){.
10e50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
10e60 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 69 66 6e  pParse->db;.#ifn
10e70 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10e80 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 46 4b  FOREIGN_KEY.  FK
10e90 65 79 20 2a 70 46 4b 65 79 20 3d 20 30 3b 0a 20  ey *pFKey = 0;. 
10ea0 20 54 61 62 6c 65 20 2a 70 20 3d 20 70 50 61 72   Table *p = pPar
10eb0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
10ec0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 6e   int nByte;.  in
10ed0 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b  t i;.  int nCol;
10ee0 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 61  .  char *z;..  a
10ef0 73 73 65 72 74 28 20 70 54 6f 21 3d 30 20 29 3b  ssert( pTo!=0 );
10f00 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
10f10 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 49  Parse->nErr || I
10f20 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
10f30 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
10f40 69 66 28 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20  if( pFromCol==0 
10f50 29 7b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 20  ){.    int iCol 
10f60 3d 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20  = p->nCol-1;.   
10f70 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 20 67 6f   if( iCol<0 ) go
10f80 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69  to fk_end;.    i
10f90 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
10fa0 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b  Col->nExpr!=1 ){
10fb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
10fc0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10fd0 66 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25  foreign key on %
10fe0 73 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68  s".         " sh
10ff0 6f 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f  ould reference o
11000 6e 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f  nly one column o
11010 66 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20  f table %T",.   
11020 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43        p->aCol[iC
11030 6f 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b  ol].zName, pTo);
11040 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  .      goto fk_e
11050 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  nd;.    }.    nC
11060 6f 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ol = 1;.  }else 
11070 69 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54  if( pToCol && pT
11080 6f 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72  oCol->nExpr!=pFr
11090 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a  omCol->nExpr ){.
110a0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
110b0 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
110c0 20 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63      "number of c
110d0 6f 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67  olumns in foreig
110e0 6e 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  n key does not m
110f0 61 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20  atch the number 
11100 6f 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f  of ".        "co
11110 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66  lumns in the ref
11120 65 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b  erenced table");
11130 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64  .    goto fk_end
11140 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
11150 43 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e  Col = pFromCol->
11160 6e 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79  nExpr;.  }.  nBy
11170 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b  te = sizeof(*pFK
11180 65 79 29 20 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f  ey) + nCol*sizeo
11190 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
111a0 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
111b0 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
111c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
111d0 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
111e0 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
111f0 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
11200 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
11210 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
11220 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
11230 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
11240 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  ero(db, nByte );
11250 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
11260 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  ){.    goto fk_e
11270 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d  nd;.  }.  pFKey-
11280 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
11290 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
112a0 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
112b0 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 5b 31   (char*)&pFKey[1
112c0 5d 3b 0a 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c  ];.  pFKey->aCol
112d0 20 3d 20 28 73 74 72 75 63 74 20 73 43 6f 6c 4d   = (struct sColM
112e0 61 70 2a 29 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69  ap*)z;.  z += si
112f0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 43 6f 6c  zeof(struct sCol
11300 4d 61 70 29 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b  Map)*nCol;.  pFK
11310 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
11320 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
11330 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
11340 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 7a 20 2b  o->n] = 0;.  z +
11350 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70 46  = pTo->n+1;.  pF
11360 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 30  Key->pNextTo = 0
11370 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
11380 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
11390 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
113a0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
113b0 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
113c0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
113d0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
113e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
113f0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
11400 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
11410 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
11420 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
11430 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
11440 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
11450 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
11460 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
11470 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
11480 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11490 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
114a0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
114b0 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
114c0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
114d0 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
114e0 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
114f0 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
11500 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
11510 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
11520 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
11530 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
11540 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
11550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11560 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
11570 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
11580 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11590 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
115a0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
115b0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
115c0 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
115d0 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
115e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
115f0 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
11600 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
11610 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
11620 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
11630 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
11640 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
11650 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d  ey->deleteConf =
11660 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
11670 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70  ff);.  pFKey->up
11680 64 61 74 65 43 6f 6e 66 20 3d 20 28 75 38 29 28  dateConf = (u8)(
11690 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20  (flags >> 8 ) & 
116a0 30 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e  0xff);.  pFKey->
116b0 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 75 38  insertConf = (u8
116c0 29 28 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29  )((flags >> 16 )
116d0 20 26 20 30 78 66 66 29 3b 0a 0a 20 20 2f 2a 20   & 0xff);..  /* 
116e0 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e  Link the foreign
116f0 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c   key to the tabl
11700 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74  e as the last st
11710 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46  ep..  */.  p->pF
11720 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70  Key = pFKey;.  p
11730 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e  FKey = 0;..fk_en
11740 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  d:.  sqlite3DbFr
11750 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23  ee(db, pFKey);.#
11760 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
11770 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  d(SQLITE_OMIT_FO
11780 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20  REIGN_KEY) */.  
11790 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
117a0 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43  elete(db, pFromC
117b0 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
117c0 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
117d0 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a   pToCol);.}../*.
117e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
117f0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
11800 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45  n INITIALLY IMME
11810 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c  DIATE or INITIAL
11820 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63  LY DEFERRED.** c
11830 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73  lause is seen as
11840 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69   part of a forei
11850 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f  gn key definitio
11860 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72  n.  The isDeferr
11870 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  ed.** parameter 
11880 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c  is 1 for INITIAL
11890 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20  LY DEFERRED and 
118a0 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20  0 for INITIALLY 
118b0 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68  IMMEDIATE..** Th
118c0 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
118d0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
118e0 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20  created foreign 
118f0 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a  key is adjusted.
11900 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  ** accordingly..
11910 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
11920 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50  eferForeignKey(P
11930 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
11940 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23  t isDeferred){.#
11950 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11960 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
11970 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
11980 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69  FKey *pFKey;.  i
11990 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73  f( (pTab = pPars
119a0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
119b0 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61   || (pFKey = pTa
119c0 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72  b->pFKey)==0 ) r
119d0 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
119e0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c   isDeferred==0 |
119f0 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20  | isDeferred==1 
11a00 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65  );.  pFKey->isDe
11a10 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44  ferred = (u8)isD
11a20 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a  eferred;.#endif.
11a30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
11a40 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
11a50 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c   erase and refil
11a60 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20  l index *pIdx.  
11a70 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20  This is.** used 
11a80 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  to initialize a 
11a90 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e  newly created in
11aa0 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70  dex or to recomp
11ab0 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ute the.** conte
11ac0 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69  nt of an index i
11ad0 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20  n response to a 
11ae0 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e  REINDEX command.
11af0 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f  .**.** if memRoo
11b00 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67  tPage is not neg
11b10 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20  ative, it means 
11b20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69  that the index i
11b30 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74  s newly.** creat
11b40 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ed.  The registe
11b50 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d  r specified by m
11b60 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61  emRootPage conta
11b70 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20  ins the.** root 
11b80 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
11b90 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65  he index.  If me
11ba0 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67  mRootPage is neg
11bb0 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  ative, then.** t
11bc0 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  he index already
11bd0 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74   exists and must
11be0 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
11bf0 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65  re being refille
11c00 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f  d and.** the roo
11c10 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  t page number of
11c20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61   the index is ta
11c30 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d  ken from pIndex-
11c40 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  >tnum..*/.static
11c50 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66   void sqlite3Ref
11c60 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a  illIndex(Parse *
11c70 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70  pParse, Index *p
11c80 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f  Index, int memRo
11c90 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65  otPage){.  Table
11ca0 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d   *pTab = pIndex-
11cb0 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65  >pTable;  /* The
11cc0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69   table that is i
11cd0 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ndexed */.  int 
11ce0 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iTab = pParse->n
11cf0 54 61 62 3b 20 20 20 20 20 20 20 2f 2a 20 42 74  Tab;       /* Bt
11d00 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ree cursor used 
11d10 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e  for pTab */.  in
11d20 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d  t iIdx = pParse-
11d30 3e 6e 54 61 62 2b 31 3b 20 20 20 20 20 2f 2a 20  >nTab+1;     /* 
11d40 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65  Btree cursor use
11d50 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a  d for pIndex */.
11d60 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20    int addr1;    
11d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d80 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74   /* Address of t
11d90 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  op of loop */.  
11da0 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20  int tnum;       
11db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11dc0 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  * Root page of i
11dd0 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
11de0 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
11df0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65           /* Gene
11e00 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
11e10 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
11e20 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f  ine */.  KeyInfo
11e30 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20   *pKey;         
11e40 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e          /* KeyIn
11e50 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a  fo for index */.
11e60 20 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b    int regIdxKey;
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e80 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f   /* Registers co
11e90 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
11ea0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ex key */.  int 
11eb0 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20  regRecord;      
11ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
11ed0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
11ee0 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20  ssemblied index 
11ef0 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
11f00 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
11f10 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
11f20 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11f30 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
11f40 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
11f50 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
11f60 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
11f70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11f80 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
11f90 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
11fa0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
11fb0 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
11fc0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
11fd0 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
11fe0 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
11ff0 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
12000 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
12010 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
12020 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
12030 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
12040 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
12050 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
12060 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
12070 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
12080 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
12090 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
120a0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
120b0 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
120c0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
120d0 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
120e0 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
120f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
12100 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
12110 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12120 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65  AddOp2(v, OP_Cle
12130 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a  ar, tnum, iDb);.
12140 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c    }.  pKey = sql
12150 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
12160 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29  (pParse, pIndex)
12170 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
12180 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
12190 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75  Write, iIdx, tnu
121a0 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20  m, iDb, .       
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
121c0 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  ar *)pKey, P4_KE
121d0 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
121e0 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
121f0 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  e>=0 ){.    sqli
12200 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
12210 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v, 1);.  }.  sql
12220 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
12230 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c  arse, iTab, iDb,
12240 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65   pTab, OP_OpenRe
12250 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  ad);.  addr1 = s
12260 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
12270 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
12280 54 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65  Tab, 0);.  regRe
12290 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
122a0 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
122b0 3b 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20  ;.  regIdxKey = 
122c0 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49  sqlite3GenerateI
122d0 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20  ndexKey(pParse, 
122e0 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65  pIndex, iTab, re
122f0 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69  gRecord, 1);.  i
12300 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  f( pIndex->onErr
12310 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
12320 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20     int j1, j2;. 
12330 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b     int regRowid;
12340 0a 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d  ..    regRowid =
12350 20 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49 6e   regIdxKey + pIn
12360 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20  dex->nColumn;.  
12370 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64    j1 = sqlite3Vd
12380 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
12390 73 4e 75 6c 6c 2c 20 72 65 67 49 64 78 4b 65 79  sNull, regIdxKey
123a0 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f  , 0, pIndex->nCo
123b0 6c 75 6d 6e 29 3b 0a 20 20 20 20 6a 32 20 3d 20  lumn);.    j2 = 
123c0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
123d0 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65  4(v, OP_IsUnique
123e0 2c 20 69 49 64 78 2c 0a 20 20 20 20 20 20 20 20  , iIdx,.        
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12400 20 20 20 30 2c 20 72 65 67 52 6f 77 69 64 2c 20     0, regRowid, 
12410 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
12420 52 28 72 65 67 52 65 63 6f 72 64 29 2c 20 50 34  R(regRecord), P4
12430 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c  _INT32);.    sql
12440 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
12450 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54  , OP_Halt, SQLIT
12460 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45  E_CONSTRAINT, OE
12470 5f 41 62 6f 72 74 2c 20 30 2c 0a 20 20 20 20 20  _Abort, 0,.     
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
12490 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20  indexed columns 
124a0 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c  are not unique",
124b0 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P4_STATIC);.   
124c0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
124d0 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20  Here(v, j1);.   
124e0 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
124f0 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d  Here(v, j2);.  }
12500 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12510 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e  dOp2(v, OP_IdxIn
12520 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52  sert, iIdx, regR
12530 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
12540 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
12550 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
12560 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
12570 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
12580 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b  xt, iTab, addr1+
12590 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
125a0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
125b0 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  r1);.  sqlite3Vd
125c0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
125d0 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
125e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
125f0 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
12600 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  dx);.}../*.** Cr
12610 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78  eate a new index
12620 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c   for an SQL tabl
12630 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65  e.  pName1.pName
12640 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  2 is the name of
12650 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61   the index .** a
12660 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74  nd pTblList is t
12670 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
12680 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20  able that is to 
12690 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74  be indexed.  Bot
126a0 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55  h will .** be NU
126b0 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79  LL for a primary
126c0 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78   key or an index
126d0 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64   that is created
126e0 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a   to satisfy a.**
126f0 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
12700 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61  nt.  If pTable a
12710 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55  nd pIndex are NU
12720 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e  LL, use pParse->
12730 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20  pNewTable.** as 
12740 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
12750 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65  indexed.  pParse
12760 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61  ->pNewTable is a
12770 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a   table that is.*
12780 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  * currently bein
12790 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79  g constructed by
127a0 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
127b0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  statement..**.**
127c0 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74   pList is a list
127d0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
127e0 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73  e indexed.  pLis
127f0 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69  t will be NULL i
12800 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70  f this.** is a p
12810 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e  rimary key or un
12820 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20  ique-constraint 
12830 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
12840 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a  nt column added.
12850 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ** to the table 
12860 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
12870 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a  construction.  .
12880 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
12890 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61  reateIndex(.  Pa
128a0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
128b0 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74   /* All informat
128c0 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70  ion about this p
128d0 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  arse */.  Token 
128e0 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20  *pName1,     /* 
128f0 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e  First part of in
12900 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65  dex name. May be
12910 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
12920 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a   *pName2,     /*
12930 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20   Second part of 
12940 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20  index name. May 
12950 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63  be NULL */.  Src
12960 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20  List *pTblName, 
12970 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65  /* Table to inde
12980 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70  x. Use pParse->p
12990 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f  NewTable if 0 */
129a0 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
129b0 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  st,   /* A list 
129c0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
129d0 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e   indexed */.  in
129e0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
129f0 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45   /* OE_Abort, OE
12a00 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c  _Ignore, OE_Repl
12a10 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20  ace, or OE_None 
12a20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61  */.  Token *pSta
12a30 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  rt,     /* The C
12a40 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
12a50 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61   begins this sta
12a60 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65  tement */.  Toke
12a70 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f  n *pEnd,       /
12a80 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63  * The ")" that c
12a90 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45  loses the CREATE
12aa0 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
12ab0 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
12ac0 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74  der,     /* Sort
12ad0 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72   order of primar
12ae0 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74  y key when pList
12af0 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  ==NULL */.  int 
12b00 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f  ifNotExist     /
12b10 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20  * Omit error if 
12b20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78  index already ex
12b30 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ists */.){.  Tab
12b40 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20  le *pTab = 0;   
12b50 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65    /* Table to be
12b60 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e   indexed */.  In
12b70 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b  dex *pIndex = 0;
12b80 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
12b90 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f  to be created */
12ba0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
12bb0 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20   0;     /* Name 
12bc0 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  of the index */.
12bd0 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20    int nName;    
12be0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12bf0 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
12c00 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  n zName */.  int
12c10 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e   i, j;.  Token n
12c20 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a  ullId;        /*
12c30 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20   Fake token for 
12c40 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74  an empty ID list
12c50 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46   */.  DbFixer sF
12c60 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ix;        /* Fo
12c70 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61  r assigning data
12c80 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54  base names to pT
12c90 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f  able */.  int so
12ca0 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f  rtOrderMask;   /
12cb0 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53  * 1 to honor DES
12cc0 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74  C in index.  0 t
12cd0 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73  o ignore. */.  s
12ce0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
12cf0 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70  rse->db;.  Db *p
12d00 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
12d10 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
12d20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
12d30 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74   the indexed dat
12d40 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69  abase */.  int i
12d50 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
12d60 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
12d70 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
12d80 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a   being written *
12d90 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
12da0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75   = 0;    /* Unqu
12db0 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20  alified name of 
12dc0 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65  the index to cre
12dd0 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ate */.  struct 
12de0 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
12df0 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72  ListItem; /* For
12e00 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c   looping over pL
12e10 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ist */.  int nCo
12e20 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20  l;.  int nExtra 
12e30 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78  = 0;.  char *zEx
12e40 74 72 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  tra;..  if( pPar
12e50 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
12e60 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
12e70 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
12e80 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  ){.    goto exit
12e90 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
12ea0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
12eb0 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  nd the table tha
12ec0 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78  t is to be index
12ed0 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c  ed.  Return earl
12ee0 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  y if not found..
12ef0 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e    */.  if( pTblN
12f00 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f  ame!=0 ){..    /
12f10 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61  * Use the two-pa
12f20 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f  rt index name to
12f30 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64   determine the d
12f40 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20  atabase .    ** 
12f50 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68  to search for th
12f60 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74  e table. 'Fix' t
12f70 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  he table name to
12f80 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20   this db.    ** 
12f90 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75  before looking u
12fa0 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  p the table..   
12fb0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
12fc0 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32  pName1 && pName2
12fd0 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   );.    iDb = sq
12fe0 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
12ff0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
13000 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
13010 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20  ;.    if( iDb<0 
13020 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61  ) goto exit_crea
13030 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64  te_index;..#ifnd
13040 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
13050 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20  EMPDB.    /* If 
13060 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77  the index name w
13070 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20  as unqualified, 
13080 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65  check if the the
13090 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73   table.    ** is
130a0 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49   a temp table. I
130b0 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61  f so, set the da
130c0 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20  tabase to 1. Do 
130d0 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20  not do this.    
130e0 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69  ** if initialisi
130f0 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63  ng a database sc
13100 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  hema..    */.   
13110 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
13120 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61  usy ){.      pTa
13130 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  b = sqlite3SrcLi
13140 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c  stLookup(pParse,
13150 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20   pTblName);.    
13160 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
13170 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20  pName2->n==0 && 
13180 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53  pTab && pTab->pS
13190 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31  chema==db->aDb[1
131a0 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
131b0 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20       iDb = 1;.  
131c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
131d0 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  if..    if( sqli
131e0 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78  te3FixInit(&sFix
131f0 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22  , pParse, iDb, "
13200 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26  index", pName) &
13210 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  &.        sqlite
13220 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69  3FixSrcList(&sFi
13230 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20  x, pTblName).   
13240 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63   ){.      /* Bec
13250 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20  ause the parser 
13260 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e  constructs pTblN
13270 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  ame from a singl
13280 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20  e identifier,.  
13290 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69      ** sqlite3Fi
132a0 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76  xSrcList can nev
132b0 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20  er fail. */.    
132c0 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20    assert(0);.   
132d0 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71   }.    pTab = sq
132e0 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
132f0 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c  (pParse, 0, pTbl
13300 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
13310 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e  , .        pTblN
13320 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62  ame->a[0].zDatab
13330 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ase);.    if( !p
13340 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Tab || db->mallo
13350 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65  cFailed ) goto e
13360 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13370 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
13380 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
13390 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma==pTab->pSchem
133a0 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  a );.  }else{.  
133b0 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d    assert( pName=
133c0 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d  =0 );.    pTab =
133d0 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
133e0 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61  le;.    if( !pTa
133f0 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  b ) goto exit_cr
13400 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13410 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
13420 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
13430 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
13440 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e   }.  pDb = &db->
13450 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28  aDb[iDb];..  if(
13460 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72   pTab==0 || pPar
13470 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20  se->nErr ) goto 
13480 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13490 78 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  x;.  if( sqlite3
134a0 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a  StrNICmp(pTab->z
134b0 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
134c0 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26   7)==0 .       &
134d0 26 20 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d 3e  & memcmp(&pTab->
134e0 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74  zName[7],"altert
134f0 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20  ab_",9)!=0 ){.  
13500 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13510 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65  g(pParse, "table
13520 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69   %s may not be i
13530 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a  ndexed", pTab->z
13540 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Name);.    goto 
13550 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13560 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  x;.  }.#ifndef S
13570 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
13580 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
13590 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ect ){.    sqlit
135a0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
135b0 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f  e, "views may no
135c0 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a  t be indexed");.
135d0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
135e0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  eate_index;.  }.
135f0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
13600 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
13610 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73  ALTABLE.  if( Is
13620 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
13630 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
13640 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69  rMsg(pParse, "vi
13650 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79  rtual tables may
13660 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22   not be indexed"
13670 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74  );.    goto exit
13680 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13690 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a   }.#endif..  /*.
136a0 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61    ** Find the na
136b0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  me of the index.
136c0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72    Make sure ther
136d0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
136e0 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e   another.  ** in
136f0 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74  dex or table wit
13700 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e  h the same name.
13710 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63    .  **.  ** Exc
13720 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61  eption:  If we a
13730 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e  re reading the n
13740 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e  ames of permanen
13750 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74  t indices from t
13760 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d  he.  ** sqlite_m
13770 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63  aster table (bec
13780 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  ause some other 
13790 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20  process changed 
137a0 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a  the schema) and.
137b0 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20    ** one of the 
137c0 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c  index names coll
137d0 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61  ides with the na
137e0 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72  me of a temporar
137f0 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20  y table or.  ** 
13800 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77  index, then we w
13810 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20  ill continue to 
13820 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64  process this ind
13830 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  ex..  **.  ** If
13840 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61   pName==0 it mea
13850 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20  ns that we are. 
13860 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68   ** dealing with
13870 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f   a primary key o
13880 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
13890 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f  int.  We have to
138a0 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a   invent our.  **
138b0 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a   own name..  */.
138c0 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20    if( pName ){. 
138d0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
138e0 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
138f0 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20  db, pName);.    
13900 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
13910 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
13920 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20  (pParse) ) goto 
13930 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13940 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  x;.    if( zName
13950 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
13960 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13970 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
13980 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
13990 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
139a0 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20  zName) ){.      
139b0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
139c0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
139d0 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
139e0 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66  busy ){.      if
139f0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
13a00 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
13a10 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78  Parse) ) goto ex
13a20 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13a30 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
13a40 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
13a50 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a  zName, 0)!=0 ){.
13a60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
13a70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
13a80 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64  "there is alread
13a90 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20  y a table named 
13aa0 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  %s", zName);.   
13ab0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
13ac0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13ad0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
13ae0 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e  f( sqlite3FindIn
13af0 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  dex(db, zName, p
13b00 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b  Db->zName)!=0 ){
13b10 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f  .      if( !ifNo
13b20 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20  tExist ){.      
13b30 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
13b40 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78  g(pParse, "index
13b50 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73   %s already exis
13b60 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ts", zName);.   
13b70 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
13b80 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13b90 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
13ba0 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
13bb0 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
13bc0 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
13bd0 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
13be0 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
13bf0 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
13c00 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
13c10 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
13c20 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
13c30 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
13c40 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
13c50 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
13c60 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
13c70 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13c80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
13c90 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
13ca0 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
13cb0 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
13cc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13cd0 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
13ce0 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
13cf0 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
13d00 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
13d10 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
13d20 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
13d30 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
13d40 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
13d50 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13d60 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13d70 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
13d80 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
13d90 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
13da0 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
13db0 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
13dc0 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
13dd0 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
13de0 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
13df0 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
13e00 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
13e10 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
13e20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13e30 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
13e40 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
13e50 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
13e60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
13e70 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
13e80 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
13e90 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
13ea0 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
13eb0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
13ec0 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
13ed0 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
13ee0 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
13ef0 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
13f00 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
13f10 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e  0 ){.    nullId.
13f20 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61  z = (u8*)pTab->a
13f30 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31  Col[pTab->nCol-1
13f40 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c  ].zName;.    nul
13f50 6c 49 64 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  lId.n = sqlite3S
13f60 74 72 6c 65 6e 33 30 28 28 63 68 61 72 2a 29 6e  trlen30((char*)n
13f70 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c  ullId.z);.    pL
13f80 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
13f90 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
13fa0 73 65 2c 20 30 2c 20 30 2c 20 26 6e 75 6c 6c 49  se, 0, 0, &nullI
13fb0 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  d);.    if( pLis
13fc0 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  t==0 ) goto exit
13fd0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
13fe0 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73     pList->a[0].s
13ff0 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73  ortOrder = (u8)s
14000 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20  ortOrder;.  }.. 
14010 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
14020 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ow many bytes of
14030 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69   space are requi
14040 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70  red to store exp
14050 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65  licitly.  ** spe
14060 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  cified collation
14070 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e   sequence names.
14080 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
14090 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
140a0 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
140b0 2a 70 45 78 70 72 3b 0a 20 20 20 20 43 6f 6c 6c  *pExpr;.    Coll
140c0 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
140d0 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 4c 69  if( (pExpr = pLi
140e0 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 21  st->a[i].pExpr)!
140f0 3d 30 20 26 26 20 28 70 43 6f 6c 6c 20 3d 20 70  =0 && (pColl = p
14100 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 21 3d 30 20  Expr->pColl)!=0 
14110 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
14120 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53  += (1 + sqlite3S
14130 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a  trlen30(pColl->z
14140 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Name));.    }.  
14150 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c  }..  /* .  ** Al
14160 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78  locate the index
14170 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a   structure. .  *
14180 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  /.  nName = sqli
14190 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
141a0 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69  e);.  nCol = pLi
141b0 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e  st->nExpr;.  pIn
141c0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  dex = sqlite3DbM
141d0 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20  allocZero(db, . 
141e0 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65       sizeof(Inde
141f0 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  x) +            
14200 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63    /* Index struc
14210 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73  ture  */.      s
14220 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20  izeof(int)*nCol 
14230 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  +           /* I
14240 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20  ndex.aiColumn   
14250 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14260 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20  int)*(nCol+1) + 
14270 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61        /* Index.a
14280 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20  iRowEst   */.   
14290 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a     sizeof(char *
142a0 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20  )*nCol +        
142b0 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20  /* Index.azColl 
142c0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a      */.      siz
142d0 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20  eof(u8)*nCol +  
142e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
142f0 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f  ex.aSortOrder */
14300 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31  .      nName + 1
14310 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
14320 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61      /* Index.zNa
14330 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  me      */.     
14340 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20   nExtra         
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14360 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
14370 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29  nce names */.  )
14380 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14390 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
143a0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
143b0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49  _index;.  }.  pI
143c0 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28  ndex->azColl = (
143d0 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b  char**)(&pIndex[
143e0 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  1]);.  pIndex->a
143f0 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a  iColumn = (int *
14400 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c  )(&pIndex->azCol
14410 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64  l[nCol]);.  pInd
14420 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28  ex->aiRowEst = (
14430 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e  unsigned *)(&pIn
14440 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  dex->aiColumn[nC
14450 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  ol]);.  pIndex->
14460 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
14470 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52   *)(&pIndex->aiR
14480 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a  owEst[nCol+1]);.
14490 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20    pIndex->zName 
144a0 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
144b0 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  ex->aSortOrder[n
144c0 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20  Col]);.  zExtra 
144d0 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64  = (char *)(&pInd
144e0 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b  ex->zName[nName+
144f0 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49  1]);.  memcpy(pI
14500 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  ndex->zName, zNa
14510 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20  me, nName+1);.  
14520 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d  pIndex->pTable =
14530 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d   pTab;.  pIndex-
14540 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74  >nColumn = pList
14550 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65  ->nExpr;.  pInde
14560 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38  x->onError = (u8
14570 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64  )onError;.  pInd
14580 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20  ex->autoIndex = 
14590 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a  (u8)(pName==0);.
145a0 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d    pIndex->pSchem
145b0 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
145c0 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20  .pSchema;..  /* 
145d0 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
145e0 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20  we should honor 
145f0 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e  DESC requests on
14600 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20   index columns. 
14610 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70   */.  if( pDb->p
14620 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72  Schema->file_for
14630 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f  mat>=4 ){.    so
14640 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31  rtOrderMask = -1
14650 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53  ;   /* Honor DES
14660 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  C */.  }else{.  
14670 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20    sortOrderMask 
14680 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72  = 0;    /* Ignor
14690 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20  e DESC */.  }.. 
146a0 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d   /* Scan the nam
146b0 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  es of the column
146c0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  s of the table t
146d0 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64  o be indexed and
146e0 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63  .  ** load the c
146f0 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e  olumn indices in
14700 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72  to the Index str
14710 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20  ucture.  Report 
14720 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66  an error.  ** if
14730 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e   any column is n
14740 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20  ot found..  */. 
14750 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49   for(i=0, pListI
14760 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
14770 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
14780 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b  +, pListItem++){
14790 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
147a0 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73  *zColName = pLis
147b0 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20  tItem->zName;.  
147c0 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f    Column *pTabCo
147d0 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65  l;.    int reque
147e0 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20  stedSortOrder;. 
147f0 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20     char *zColl; 
14800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14810 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73    /* Collation s
14820 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a  equence name */.
14830 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54  .    for(j=0, pT
14840 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c  abCol=pTab->aCol
14850 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  ; j<pTab->nCol; 
14860 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b  j++, pTabCol++){
14870 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
14880 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61  e3StrICmp(zColNa
14890 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61  me, pTabCol->zNa
148a0 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
148b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e      }.    if( j>
148c0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  =pTab->nCol ){. 
148d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
148e0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61  rMsg(pParse, "ta
148f0 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f  ble %s has no co
14900 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a  lumn named %s",.
14910 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e          pTab->zN
14920 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a  ame, zColName);.
14930 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14940 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14950 20 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a    }.    /* TODO:
14960 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20    Add a test to 
14970 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
14980 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69  he same column i
14990 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20  s not named.    
149a0 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  ** more than onc
149b0 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  e within the sam
149c0 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74  e index.  Only t
149d0 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63  he first instanc
149e0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  e of.    ** the 
149f0 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72  column will ever
14a00 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20   be used by the 
14a10 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65  optimizer.  Note
14a20 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a   that using the.
14a30 20 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75      ** same colu
14a40 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63  mn more than onc
14a50 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65  e cannot be an e
14a60 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61  rror because tha
14a70 74 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20  t would .    ** 
14a80 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20  break backwards 
14a90 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20  compatibility - 
14aa0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61  it needs to be a
14ab0 20 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f   warning..    */
14ac0 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43  .    pIndex->aiC
14ad0 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20  olumn[i] = j;.  
14ae0 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
14af0 3e 70 45 78 70 72 20 26 26 20 70 4c 69 73 74 49  >pExpr && pListI
14b00 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c  tem->pExpr->pCol
14b10 6c 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  l ){.      asser
14b20 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45  t( pListItem->pE
14b30 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20  xpr->pColl );.  
14b40 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74      zColl = zExt
14b50 72 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ra;.      sqlite
14b60 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 78 74 72  3_snprintf(nExtr
14b70 61 2c 20 7a 45 78 74 72 61 2c 20 22 25 73 22 2c  a, zExtra, "%s",
14b80 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70   pListItem->pExp
14b90 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29  r->pColl->zName)
14ba0 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b  ;.      zExtra +
14bb0 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  = (sqlite3Strlen
14bc0 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a  30(zColl) + 1);.
14bd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14be0 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61   zColl = pTab->a
14bf0 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20  Col[j].zColl;.  
14c00 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
14c10 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20  {.        zColl 
14c20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d  = db->pDfltColl-
14c30 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  >zName;.      }.
14c40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64      }.    if( !d
14c50 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20  b->init.busy && 
14c60 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f  !sqlite3LocateCo
14c70 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
14c80 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20  oll, -1) ){.    
14c90 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
14ca0 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
14cb0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f      pIndex->azCo
14cc0 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20  ll[i] = zColl;. 
14cd0 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74     requestedSort
14ce0 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65  Order = pListIte
14cf0 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73  m->sortOrder & s
14d00 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20  ortOrderMask;.  
14d10 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f    pIndex->aSortO
14d20 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65  rder[i] = (u8)re
14d30 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72  questedSortOrder
14d40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
14d50 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e  efaultRowEst(pIn
14d60 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61  dex);..  if( pTa
14d70 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54  b==pParse->pNewT
14d80 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54  able ){.    /* T
14d90 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20  his routine has 
14da0 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63  been called to c
14db0 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74  reate an automat
14dc0 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20  ic index as a.  
14dd0 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61    ** result of a
14de0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
14df0 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e  UNIQUE clause on
14e00 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69   a column defini
14e10 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20  tion, or.    ** 
14e20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
14e30 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66   UNIQUE clause f
14e40 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c  ollowing the col
14e50 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e  umn definitions.
14e60 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65  .    ** i.e. one
14e70 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   of:.    **.    
14e80 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
14e90 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  t(x PRIMARY KEY,
14ea0 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41   y);.    ** CREA
14eb0 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c  TE TABLE t(x, y,
14ec0 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a   UNIQUE(x, y));.
14ed0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69      **.    ** Ei
14ee0 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20  ther way, check 
14ef0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61  to see if the ta
14f00 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20  ble already has 
14f10 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49  such an index. I
14f20 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e  f.    ** so, don
14f30 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69  't bother creati
14f40 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69  ng this one. Thi
14f50 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74  s only applies t
14f60 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74  o.    ** automat
14f70 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69  ically created i
14f80 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61  ndices. Users ca
14f90 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73  n do as they wis
14fa0 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78  h with.    ** ex
14fb0 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a  plicit indices..
14fc0 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78      */.    Index
14fd0 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28   *pIdx;.    for(
14fe0 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
14ff0 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
15000 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
15010 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61    int k;.      a
15020 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45  ssert( pIdx->onE
15030 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b  rror!=OE_None );
15040 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15050 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29  Idx->autoIndex )
15060 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
15070 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21  pIndex->onError!
15080 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20  =OE_None );..   
15090 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f     if( pIdx->nCo
150a0 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43  lumn!=pIndex->nC
150b0 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65  olumn ) continue
150c0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b  ;.      for(k=0;
150d0 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   k<pIdx->nColumn
150e0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
150f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d  const char *z1 =
15100 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d   pIdx->azColl[k]
15110 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
15120 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65  char *z2 = pInde
15130 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
15140 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
15150 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e  aiColumn[k]!=pIn
15160 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d  dex->aiColumn[k]
15170 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
15180 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72    if( pIdx->aSor
15190 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65  tOrder[k]!=pInde
151a0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d  x->aSortOrder[k]
151b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
151c0 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20    if( z1!=z2 && 
151d0 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
151e0 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a  1, z2) ) break;.
151f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15200 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75  ( k==pIdx->nColu
15210 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  mn ){.        if
15220 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21  ( pIdx->onError!
15230 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72  =pIndex->onError
15240 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
15250 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   This constraint
15260 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d   creates the sam
15270 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65  e index as a pre
15280 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20  vious.          
15290 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70  ** constraint sp
152a0 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72  ecified somewher
152b0 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20  e in the CREATE 
152c0 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
152d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f  .          ** Ho
152e0 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e  wever the ON CON
152f0 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72  FLICT clauses ar
15300 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20  e different. If 
15310 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20  both this .     
15320 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69       ** constrai
15330 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69  nt and the previ
15340 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63  ous equivalent c
15350 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65  onstraint have e
15360 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20  xplicit.        
15370 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54    ** ON CONFLICT
15380 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73   clauses this is
15390 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72   an error. Other
153a0 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20  wise, use the.  
153b0 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69          ** expli
153c0 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20  citly specified 
153d0 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68  behaviour for th
153e0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
153f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
15400 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
15410 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
15420 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
15430 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
15440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
15450 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
15460 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
15470 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
15480 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
15490 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
154a0 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
154b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
154c0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
154d0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
154e0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
154f0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
15500 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
15510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15520 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20   }.        goto 
15530 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15540 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
15550 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20  .  }..  /* Link 
15560 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74  the new Index st
15570 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74  ructure to its t
15580 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20  able and to the 
15590 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65  other.  ** in-me
155a0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74  mory database st
155b0 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a  ructures. .  */.
155c0 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62    if( db->init.b
155d0 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78  usy ){.    Index
155e0 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c   *p;.    p = sql
155f0 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
15600 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
15610 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
15620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15630 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
15640 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  me, sqlite3Strle
15650 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  n30(pIndex->zNam
15660 65 29 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20  e)+1,.          
15670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15680 70 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28  pIndex);.    if(
15690 20 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65   p ){.      asse
156a0 72 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b  rt( p==pIndex );
156b0 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74    /* Malloc must
156c0 20 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a   have failed */.
156d0 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
156e0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
156f0 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
15700 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  te_index;.    }.
15710 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d      db->flags |=
15720 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
15730 61 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70  anges;.    if( p
15740 54 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20  TblName!=0 ){.  
15750 20 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d      pIndex->tnum
15760 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
15770 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  num;.    }.  }..
15780 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e    /* If the db->
15790 69 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74  init.busy is 0 t
157a0 68 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69  hen create the i
157b0 6e 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54  ndex on disk.  T
157c0 68 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65  his.  ** involve
157d0 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e  s writing the in
157e0 64 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73  dex into the mas
157f0 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69  ter table and fi
15800 6c 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a  lling in the.  *
15810 2a 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65  * index with the
15820 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63   current table c
15830 6f 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20  ontents..  **.  
15840 2a 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e  ** The db->init.
15850 62 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74  busy is 0 when t
15860 68 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e  he user first en
15870 74 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e  ters a CREATE IN
15880 44 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e  DEX .  ** comman
15890 64 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  d.  db->init.bus
158a0 79 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61  y is 1 when a da
158b0 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
158c0 20 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54   and .  ** CREAT
158d0 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
158e0 74 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20  ts are read out 
158f0 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  of the master ta
15900 62 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68  ble.  In.  ** th
15910 65 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68  e latter case th
15920 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
15930 65 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20  exists on disk, 
15940 77 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a  which is why.  *
15950 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20  * we don't want 
15960 74 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a  to recreate it..
15970 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62    **.  ** If pTb
15980 6c 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  lName==0 it mean
15990 73 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20  s this index is 
159a0 67 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70  generated as a p
159b0 72 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20  rimary key.  ** 
159c0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
159d0 61 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45  aint of a CREATE
159e0 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
159f0 2e 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62  .  Since the tab
15a00 6c 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74  le.  ** has just
15a10 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69   been created, i
15a20 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61  t contains no da
15a30 74 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ta and the index
15a40 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
15a50 20 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65    ** step can be
15a60 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20   skipped..  */. 
15a70 20 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e   else if( db->in
15a80 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
15a90 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63    Vdbe *v;.    c
15aa0 68 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20  har *zStmt;.    
15ab0 69 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61  int iMem = ++pPa
15ac0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20  rse->nMem;..    
15ad0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
15ae0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  be(pParse);.    
15af0 69 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20  if( v==0 ) goto 
15b00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
15b10 78 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  x;...    /* Crea
15b20 74 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20  te the rootpage 
15b30 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20  for the index.  
15b40 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
15b50 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74  BeginWriteOperat
15b60 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69  ion(pParse, 1, i
15b70 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Db);.    sqlite3
15b80 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15b90 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44  _CreateIndex, iD
15ba0 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f  b, iMem);..    /
15bb0 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d  * Gather the com
15bc0 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
15bd0 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  e CREATE INDEX s
15be0 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20  tatement into.  
15bf0 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76    ** the zStmt v
15c00 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20  ariable.    */. 
15c10 20 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26     if( pStart &&
15c20 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f   pEnd ){.      /
15c30 2a 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  * A named index 
15c40 77 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74  with an explicit
15c50 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
15c60 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20  atement */.     
15c70 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
15c80 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45  MPrintf(db, "CRE
15c90 41 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73  ATE%s INDEX %.*s
15ca0 22 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72  ",.        onErr
15cb0 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22  or==OE_None ? ""
15cc0 20 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20   : " UNIQUE",.  
15cd0 20 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20        pEnd->z - 
15ce0 70 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20  pName->z + 1,.  
15cf0 20 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b        pName->z);
15d00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15d10 20 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69    /* An automati
15d20 63 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20  c index created 
15d30 62 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59  by a PRIMARY KEY
15d40 20 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74   or UNIQUE const
15d50 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  raint */.      /
15d60 2a 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  * zStmt = sqlite
15d70 33 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f  3MPrintf(""); */
15d80 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30  .      zStmt = 0
15d90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
15da0 41 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  Add an entry in 
15db0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f  sqlite_master fo
15dc0 72 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20  r this index.   
15dd0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e   */.    sqlite3N
15de0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
15df0 65 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53  e, .        "INS
15e00 45 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56  ERT INTO %Q.%s V
15e10 41 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51  ALUES('index',%Q
15e20 2c 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20  ,%Q,#%d,%Q);",. 
15e30 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
15e40 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
15e50 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
15e60 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
15e70 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61  ame,.        pTa
15e80 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
15e90 20 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20    iMem,.        
15ea0 7a 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20  zStmt.    );.   
15eb0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15ec0 62 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20  b, zStmt);..    
15ed0 2f 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65  /* Fill the inde
15ee0 78 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20  x with data and 
15ef0 72 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65  reparse the sche
15f00 6d 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45  ma. Code an OP_E
15f10 78 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20  xpire.    ** to 
15f20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
15f30 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
15f40 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20  ements..    */. 
15f50 20 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20     if( pTblName 
15f60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15f70 52 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72  RefillIndex(pPar
15f80 73 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d  se, pIndex, iMem
15f90 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15fa0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
15fb0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  rse, iDb);.     
15fc0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15fd0 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p4(v, OP_ParseSc
15fe0 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c  hema, iDb, 0, 0,
15ff0 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
16000 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61  3MPrintf(db, "na
16010 6d 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78  me='%q'", pIndex
16020 2d 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e  ->zName), P4_DYN
16030 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c  AMIC);.      sql
16040 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16050 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b  , OP_Expire, 0);
16060 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
16070 20 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20   When adding an 
16080 69 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73  index to the lis
16090 74 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72  t of indices for
160a0 20 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20   a table, make. 
160b0 20 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64   ** sure all ind
160c0 69 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f  ices labeled OE_
160d0 52 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74  Replace come aft
160e0 65 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62  er all those lab
160f0 65 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e  eled.  ** OE_Ign
16100 6f 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ore.  This is ne
16110 63 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20  cessary for the 
16120 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
16130 6e 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a  n of UPDATE.  **
16140 20 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a   and INSERT..  *
16150 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
16160 2e 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d  .busy || pTblNam
16170 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  e==0 ){.    if( 
16180 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
16190 61 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e  ace || pTab->pIn
161a0 64 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dex==0.         
161b0 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d  || pTab->pIndex-
161c0 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70  >onError==OE_Rep
161d0 6c 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e  lace){.      pIn
161e0 64 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61  dex->pNext = pTa
161f0 62 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20  b->pIndex;.     
16200 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20   pTab->pIndex = 
16210 70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73  pIndex;.    }els
16220 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a  e{.      Index *
16230 70 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70  pOther = pTab->p
16240 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69  Index;.      whi
16250 6c 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78  le( pOther->pNex
16260 74 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65  t && pOther->pNe
16270 78 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  xt->onError!=OE_
16280 52 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20  Replace ){.     
16290 20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68     pOther = pOth
162a0 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  er->pNext;.     
162b0 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d   }.      pIndex-
162c0 3e 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d  >pNext = pOther-
162d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f  >pNext;.      pO
162e0 74 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49  ther->pNext = pI
162f0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
16300 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a  pIndex = 0;.  }.
16310 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62  .  /* Clean up b
16320 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
16330 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64  .exit_create_ind
16340 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78  ex:.  if( pIndex
16350 20 29 7b 0a 20 20 20 20 66 72 65 65 49 6e 64 65   ){.    freeInde
16360 78 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20  x(pIndex);.  }. 
16370 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
16380 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
16390 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
163a0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
163b0 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
163c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
163d0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  me);.  return;.}
163e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
163f0 20 63 6f 64 65 20 74 6f 20 6d 61 6b 65 20 73 75   code to make su
16400 72 65 20 74 68 65 20 66 69 6c 65 20 66 6f 72 6d  re the file form
16410 61 74 20 6e 75 6d 62 65 72 20 69 73 20 61 74 20  at number is at 
16420 6c 65 61 73 74 20 6d 69 6e 46 6f 72 6d 61 74 2e  least minFormat.
16430 0a 2a 2a 20 54 68 65 20 67 65 6e 65 72 61 74 65  .** The generate
16440 64 20 63 6f 64 65 20 77 69 6c 6c 20 69 6e 63 72  d code will incr
16450 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 66 6f  ease the file fo
16460 72 6d 61 74 20 6e 75 6d 62 65 72 20 69 66 20 6e  rmat number if n
16470 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 76 6f 69  ecessary..*/.voi
16480 64 20 73 71 6c 69 74 65 33 4d 69 6e 69 6d 75 6d  d sqlite3Minimum
16490 46 69 6c 65 46 6f 72 6d 61 74 28 50 61 72 73 65  FileFormat(Parse
164a0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44   *pParse, int iD
164b0 62 2c 20 69 6e 74 20 6d 69 6e 46 6f 72 6d 61 74  b, int minFormat
164c0 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  ){.  Vdbe *v;.  
164d0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
164e0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
164f0 28 20 76 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ( v ){.    int r
16500 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  1 = sqlite3GetTe
16510 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16520 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
16530 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
16540 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 6a  arse);.    int j
16550 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  1;.    sqlite3Vd
16560 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52  beAddOp3(v, OP_R
16570 65 61 64 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20  eadCookie, iDb, 
16580 72 31 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69  r1, 1);.    sqli
16590 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
165a0 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  (v, iDb);.    sq
165b0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
165c0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6d  v, OP_Integer, m
165d0 69 6e 46 6f 72 6d 61 74 2c 20 72 32 29 3b 0a 20  inFormat, r2);. 
165e0 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
165f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16600 47 65 2c 20 72 32 2c 20 30 2c 20 72 31 29 3b 0a  Ge, r2, 0, r1);.
16610 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
16620 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
16630 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72  ookie, iDb, 1, r
16640 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  2);.    sqlite3V
16650 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
16660 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  1);.    sqlite3R
16670 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16680 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 73  arse, r1);.    s
16690 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
166a0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 32 29  pReg(pParse, r2)
166b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
166c0 69 6c 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69  ill the Index.ai
166d0 52 6f 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77  RowEst[] array w
166e0 69 74 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f  ith default info
166f0 72 6d 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d  rmation - inform
16700 61 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75  ation.** to be u
16710 73 65 64 20 77 68 65 6e 20 77 65 20 68 61 76 65  sed when we have
16720 20 6e 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41   not run the ANA
16730 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  LYZE command..**
16740 0a 2a 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20  .** aiRowEst[0] 
16750 69 73 20 73 75 70 70 6f 73 65 20 74 6f 20 63 6f  is suppose to co
16760 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
16770 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
16780 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69  the index..** Si
16790 6e 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e  nce we do not kn
167a0 6f 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c  ow, guess 1 mill
167b0 69 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31  ion.  aiRowEst[1
167c0 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65  ] is an estimate
167d0 20 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65   of the.** numbe
167e0 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65  r of rows in the
167f0 20 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63   table that matc
16800 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72  h any particular
16810 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a   value of the.**
16820 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
16830 20 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52   the index.  aiR
16840 6f 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65  owEst[2] is an e
16850 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e  stimate of the n
16860 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73  umber.** of rows
16870 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
16880 70 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69  particular combi
16890 6e 69 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  niation of the f
168a0 69 72 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a  irst 2 columns.*
168b0 2a 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  * of the index. 
168c0 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
168d0 49 74 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62  It must always b
168e0 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74 0a  e the case that.
168f0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  *.**           a
16900 69 52 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f  iRowEst[N]<=aiRo
16910 77 45 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20  wEst[N-1].**    
16920 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
16930 4e 5d 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72  N]>=1.**.** Apar
16940 74 20 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20  t from that, we 
16950 68 61 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67  have little to g
16960 6f 20 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74  o on besides int
16970 75 69 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20  uition as to.** 
16980 68 6f 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73  how aiRowEst[] s
16990 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c  hould be initial
169a0 69 7a 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65  ized.  The numbe
169b0 72 73 20 67 65 6e 65 72 61 74 65 64 20 68 65 72  rs generated her
169c0 65 0a 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f  e.** are based o
169d0 6e 20 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73  n typical values
169e0 20 66 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c   found in actual
169f0 20 69 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69   indices..*/.voi
16a00 64 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74  d sqlite3Default
16a10 52 6f 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49  RowEst(Index *pI
16a20 64 78 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  dx){.  unsigned 
16a30 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
16a40 45 73 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Est;.  int i;.  
16a50 61 73 73 65 72 74 28 20 61 21 3d 30 20 29 3b 0a  assert( a!=0 );.
16a60 20 20 61 5b 30 5d 20 3d 20 31 30 30 30 30 30 30    a[0] = 1000000
16a70 3b 0a 20 20 66 6f 72 28 69 3d 70 49 64 78 2d 3e  ;.  for(i=pIdx->
16a80 6e 43 6f 6c 75 6d 6e 3b 20 69 3e 3d 35 3b 20 69  nColumn; i>=5; i
16a90 2d 2d 29 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20  --){.    a[i] = 
16aa0 35 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  5;.  }.  while( 
16ab0 69 3e 3d 31 20 29 7b 0a 20 20 20 20 61 5b 69 5d  i>=1 ){.    a[i]
16ac0 20 3d 20 31 31 20 2d 20 69 3b 0a 20 20 20 20 69   = 11 - i;.    i
16ad0 2d 2d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  --;.  }.  if( pI
16ae0 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  dx->onError!=OE_
16af0 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 61 5b 70 49  None ){.    a[pI
16b00 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 5d 20 3d 20 31  dx->nColumn] = 1
16b10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
16b20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
16b30 20 64 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e   drop an existin
16b40 67 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20  g named index.  
16b50 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
16b60 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44  implements the D
16b70 52 4f 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d  ROP INDEX statem
16b80 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ent..*/.void sql
16b90 69 74 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61  ite3DropIndex(Pa
16ba0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63  rse *pParse, Src
16bb0 4c 69 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74  List *pName, int
16bc0 20 69 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e   ifExists){.  In
16bd0 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56  dex *pIndex;.  V
16be0 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65  dbe *v;.  sqlite
16bf0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16c00 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a  db;.  int iDb;..
16c10 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
16c20 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
16c30 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
16c40 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
16c50 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ex;.  }.  assert
16c60 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31  ( pName->nSrc==1
16c70 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
16c80 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64  _OK!=sqlite3Read
16c90 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29  Schema(pParse) )
16ca0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
16cb0 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
16cc0 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
16cd0 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20  e3FindIndex(db, 
16ce0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
16cf0 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
16d00 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
16d10 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20   pIndex==0 ){.  
16d20 20 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20    if( !ifExists 
16d30 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
16d40 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
16d50 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
16d60 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b   %S", pName, 0);
16d70 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
16d80 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
16d90 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
16da0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
16db0 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
16dc0 61 75 74 6f 49 6e 64 65 78 20 29 7b 0a 20 20 20  autoIndex ){.   
16dd0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
16de0 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
16df0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
16e00 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20 20 22  UNIQUE ".      "
16e10 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  or PRIMARY KEY c
16e20 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e 6f 74  onstraint cannot
16e30 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 30 29   be dropped", 0)
16e40 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
16e50 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
16e60 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
16e70 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
16e80 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
16e90 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
16ea0 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
16eb0 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69 6e 74  TION.  {.    int
16ec0 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44   code = SQLITE_D
16ed0 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 54  ROP_INDEX;.    T
16ee0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 49 6e  able *pTab = pIn
16ef0 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20 20 20  dex->pTable;.   
16f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
16f10 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
16f20 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
16f30 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 53 43   char *zTab = SC
16f40 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 3b  HEMA_TABLE(iDb);
16f50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
16f60 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16f70 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c  , SQLITE_DELETE,
16f80 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 20 29   zTab, 0, zDb) )
16f90 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
16fa0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
16fb0 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49    }.    if( !OMI
16fc0 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 20  T_TEMPDB && iDb 
16fd0 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  ) code = SQLITE_
16fe0 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58 3b  DROP_TEMP_INDEX;
16ff0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
17000 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
17010 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78 2d 3e  , code, pIndex->
17020 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
17030 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  me, zDb) ){.    
17040 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17050 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
17060 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47  }.#endif..  /* G
17070 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
17080 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
17090 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20 6d 61   and from the ma
170a0 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ster table */.  
170b0 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
170c0 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66  be(pParse);.  if
170d0 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ( v ){.    sqlit
170e0 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
170f0 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
17100 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74   iDb);.    sqlit
17110 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
17120 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22 44 45  arse,.       "DE
17130 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25 73 20  LETE FROM %Q.%s 
17140 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 22 2c 0a  WHERE name=%Q",.
17150 20 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69         db->aDb[i
17160 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d  Db].zName, SCHEM
17170 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20  A_TABLE(iDb),.  
17180 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
17190 6d 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  me.    );.    if
171a0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
171b0 6c 65 28 64 62 2c 20 22 73 71 6c 69 74 65 5f 73  le(db, "sqlite_s
171c0 74 61 74 31 22 2c 20 64 62 2d 3e 61 44 62 5b 69  tat1", db->aDb[i
171d0 44 62 5d 2e 7a 4e 61 6d 65 29 20 29 7b 0a 20 20  Db].zName) ){.  
171e0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
171f0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
17200 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
17210 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73 74  ROM %Q.sqlite_st
17220 61 74 31 20 57 48 45 52 45 20 69 64 78 3d 25 51  at1 WHERE idx=%Q
17230 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  ",.        db->a
17240 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 70  Db[iDb].zName, p
17250 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
17260 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
17270 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f  sqlite3ChangeCoo
17280 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  kie(pParse, iDb)
17290 3b 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f  ;.    destroyRoo
172a0 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49  tPage(pParse, pI
172b0 6e 64 65 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  ndex->tnum, iDb)
172c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
172d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 44 72  eAddOp4(v, OP_Dr
172e0 6f 70 49 6e 64 65 78 2c 20 69 44 62 2c 20 30 2c  opIndex, iDb, 0,
172f0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d   0, pIndex->zNam
17300 65 2c 20 30 29 3b 0a 20 20 7d 0a 0a 65 78 69 74  e, 0);.  }..exit
17310 5f 64 72 6f 70 5f 69 6e 64 65 78 3a 0a 20 20 73  _drop_index:.  s
17320 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
17330 65 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a  ete(db, pName);.
17340 7d 0a 0a 2f 2a 0a 2a 2a 20 70 41 72 72 61 79 20  }../*.** pArray 
17350 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17360 61 6e 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65  an array of obje
17370 63 74 73 2e 20 20 45 61 63 68 20 6f 62 6a 65 63  cts.  Each objec
17380 74 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 72 61  t in the.** arra
17390 79 20 69 73 20 73 7a 45 6e 74 72 79 20 62 79 74  y is szEntry byt
173a0 65 73 20 69 6e 20 73 69 7a 65 2e 20 20 54 68 69  es in size.  Thi
173b0 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61  s routine alloca
173c0 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6f 62 6a  tes a new.** obj
173d0 65 63 74 20 6f 6e 20 74 68 65 20 65 6e 64 20 6f  ect on the end o
173e0 66 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 0a  f the array..**.
173f0 2a 2a 20 2a 70 6e 45 6e 74 72 79 20 69 73 20 74  ** *pnEntry is t
17400 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
17410 72 69 65 73 20 61 6c 72 65 61 64 79 20 69 6e 20  ries already in 
17420 75 73 65 2e 20 20 2a 70 6e 41 6c 6c 6f 63 20 69  use.  *pnAlloc i
17430 73 0a 2a 2a 20 74 68 65 20 70 72 65 76 69 6f 75  s.** the previou
17440 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  sly allocated si
17450 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
17460 20 20 69 6e 69 74 53 69 7a 65 20 69 73 20 74 68    initSize is th
17470 65 0a 2a 2a 20 73 75 67 67 65 73 74 65 64 20 69  e.** suggested i
17480 6e 69 74 69 61 6c 20 61 72 72 61 79 20 73 69 7a  nitial array siz
17490 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  e allocation..**
174a0 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 6f 66  .** The index of
174b0 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69   the new entry i
174c0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 20 2a 70  s returned in *p
174d0 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Idx..**.** This 
174e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
174f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
17500 20 61 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   array of object
17510 73 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 69 67 68  s.  This.** migh
17520 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
17530 20 74 68 65 20 70 41 72 72 61 79 20 70 61 72 61   the pArray para
17540 6d 65 74 65 72 20 6f 72 20 69 74 20 6d 69 67 68  meter or it migh
17550 74 20 62 65 20 61 20 64 69 66 66 65 72 65 6e 74  t be a different
17560 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 66 20 74  .** pointer if t
17570 68 65 20 61 72 72 61 79 20 77 61 73 20 72 65 73  he array was res
17580 69 7a 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ized..*/.void *s
17590 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
175a0 61 74 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ate(.  sqlite3 *
175b0 64 62 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  db,      /* Conn
175c0 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79  ection to notify
175d0 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   of malloc failu
175e0 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  res */.  void *p
175f0 41 72 72 61 79 2c 20 20 20 20 20 2f 2a 20 41 72  Array,     /* Ar
17600 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20  ray of objects. 
17610 20 4d 69 67 68 74 20 62 65 20 72 65 61 6c 6c 6f   Might be reallo
17620 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 73  cated */.  int s
17630 7a 45 6e 74 72 79 2c 20 20 20 20 20 20 2f 2a 20  zEntry,      /* 
17640 53 69 7a 65 20 6f 66 20 65 61 63 68 20 6f 62 6a  Size of each obj
17650 65 63 74 20 69 6e 20 74 68 65 20 61 72 72 61 79  ect in the array
17660 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 69 74 53 69   */.  int initSi
17670 7a 65 2c 20 20 20 20 20 2f 2a 20 53 75 67 67 65  ze,     /* Sugge
17680 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61 6c 6c  sted initial all
17690 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d  ocation, in elem
176a0 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ents */.  int *p
176b0 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e  nEntry,     /* N
176c0 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73  umber of objects
176d0 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
176e0 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 41 6c  e */.  int *pnAl
176f0 6c 6f 63 2c 20 20 20 20 20 2f 2a 20 43 75 72 72  loc,     /* Curr
17700 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
17710 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 65  allocation, in e
17720 6c 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  lements */.  int
17730 20 2a 70 49 64 78 20 20 20 20 20 20 20 20 20 2f   *pIdx         /
17740 2a 20 57 72 69 74 65 20 74 68 65 20 69 6e 64 65  * Write the inde
17750 78 20 6f 66 20 61 20 6e 65 77 20 73 6c 6f 74 20  x of a new slot 
17760 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  here */.){.  cha
17770 72 20 2a 7a 3b 0a 20 20 69 66 28 20 2a 70 6e 45  r *z;.  if( *pnE
17780 6e 74 72 79 20 3e 3d 20 2a 70 6e 41 6c 6c 6f 63  ntry >= *pnAlloc
17790 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e   ){.    void *pN
177a0 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 65 77 53  ew;.    int newS
177b0 69 7a 65 3b 0a 20 20 20 20 6e 65 77 53 69 7a 65  ize;.    newSize
177c0 20 3d 20 28 2a 70 6e 41 6c 6c 6f 63 29 2a 32 20   = (*pnAlloc)*2 
177d0 2b 20 69 6e 69 74 53 69 7a 65 3b 0a 20 20 20 20  + initSize;.    
177e0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62  pNew = sqlite3Db
177f0 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 41 72 72  Realloc(db, pArr
17800 61 79 2c 20 6e 65 77 53 69 7a 65 2a 73 7a 45 6e  ay, newSize*szEn
17810 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e  try);.    if( pN
17820 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  ew==0 ){.      *
17830 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pIdx = -1;.     
17840 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a   return pArray;.
17850 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 41 6c 6c      }.    *pnAll
17860 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  oc = sqlite3DbMa
17870 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65  llocSize(db, pNe
17880 77 29 2f 73 7a 45 6e 74 72 79 3b 0a 20 20 20 20  w)/szEntry;.    
17890 70 41 72 72 61 79 20 3d 20 70 4e 65 77 3b 0a 20  pArray = pNew;. 
178a0 20 7d 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29   }.  z = (char*)
178b0 70 41 72 72 61 79 3b 0a 20 20 6d 65 6d 73 65 74  pArray;.  memset
178c0 28 26 7a 5b 2a 70 6e 45 6e 74 72 79 20 2a 20 73  (&z[*pnEntry * s
178d0 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a 45 6e  zEntry], 0, szEn
178e0 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  try);.  *pIdx = 
178f0 2a 70 6e 45 6e 74 72 79 3b 0a 20 20 2b 2b 2a 70  *pnEntry;.  ++*p
17900 6e 45 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e  nEntry;.  return
17910 20 70 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a   pArray;.}../*.*
17920 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65  * Append a new e
17930 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69  lement to the gi
17940 76 65 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65  ven IdList.  Cre
17950 61 74 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74  ate a new IdList
17960 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a   if.** need be..
17970 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69  **.** A new IdLi
17980 73 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  st is returned, 
17990 6f 72 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f  or NULL if mallo
179a0 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64  c() fails..*/.Id
179b0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c  List *sqlite3IdL
179c0 69 73 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65  istAppend(sqlite
179d0 33 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70  3 *db, IdList *p
179e0 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
179f0 6b 65 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ken){.  int i;. 
17a00 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
17a10 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
17a20 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
17a30 28 64 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69  (db, sizeof(IdLi
17a40 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
17a50 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
17a60 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
17a70 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  Alloc = 0;.  }. 
17a80 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
17a90 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61 74 65  te3ArrayAllocate
17aa0 28 0a 20 20 20 20 20 20 64 62 2c 0a 20 20 20 20  (.      db,.    
17ab0 20 20 70 4c 69 73 74 2d 3e 61 2c 0a 20 20 20 20    pList->a,.    
17ac0 20 20 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e    sizeof(pList->
17ad0 61 5b 30 5d 29 2c 0a 20 20 20 20 20 20 35 2c 0a  a[0]),.      5,.
17ae0 20 20 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49        &pList->nI
17af0 64 2c 0a 20 20 20 20 20 20 26 70 4c 69 73 74 2d  d,.      &pList-
17b00 3e 6e 41 6c 6c 6f 63 2c 0a 20 20 20 20 20 20 26  >nAlloc,.      &
17b10 69 0a 20 20 29 3b 0a 20 20 69 66 28 20 69 3c 30  i.  );.  if( i<0
17b20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   ){.    sqlite3I
17b30 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
17b40 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
17b50 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73  rn 0;.  }.  pLis
17b60 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20 3d 20  t->a[i].zName = 
17b70 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
17b80 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65 6e 29  oken(db, pToken)
17b90 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  ;.  return pList
17ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
17bb0 65 20 61 6e 20 49 64 4c 69 73 74 2e 0a 2a 2f 0a  e an IdList..*/.
17bc0 76 6f 69 64 20 73 71 6c 69 74 65 33 49 64 4c 69  void sqlite3IdLi
17bd0 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
17be0 20 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c   *db, IdList *pL
17bf0 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
17c00 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
17c10 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
17c20 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
17c30 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
17c40 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
17c50 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  st->a[i].zName);
17c60 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
17c70 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e  Free(db, pList->
17c80 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  a);.  sqlite3DbF
17c90 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
17ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17cb0 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 4c 69  the index in pLi
17cc0 73 74 20 6f 66 20 74 68 65 20 69 64 65 6e 74 69  st of the identi
17cd0 66 69 65 72 20 6e 61 6d 65 64 20 7a 49 64 2e 20  fier named zId. 
17ce0 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
17cf0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69   not found..*/.i
17d00 6e 74 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74  nt sqlite3IdList
17d10 49 6e 64 65 78 28 49 64 4c 69 73 74 20 2a 70 4c  Index(IdList *pL
17d20 69 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ist, const char 
17d30 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
17d40 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
17d50 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
17d60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
17d70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
17d80 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
17d90 43 6d 70 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  Cmp(pList->a[i].
17da0 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 29 3d 3d 30  zName, zName)==0
17db0 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d   ) return i;.  }
17dc0 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
17dd0 0a 2f 2a 0a 2a 2a 20 45 78 70 61 6e 64 20 74 68  ./*.** Expand th
17de0 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  e space allocate
17df0 64 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  d for the given 
17e00 53 72 63 4c 69 73 74 20 6f 62 6a 65 63 74 20 62  SrcList object b
17e10 79 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 6e 45  y.** creating nE
17e20 78 74 72 61 20 6e 65 77 20 73 6c 6f 74 73 20 62  xtra new slots b
17e30 65 67 69 6e 6e 69 6e 67 20 61 74 20 69 53 74 61  eginning at iSta
17e40 72 74 2e 20 20 69 53 74 61 72 74 20 69 73 20 7a  rt.  iStart is z
17e50 65 72 6f 20 62 61 73 65 64 2e 0a 2a 2a 20 4e 65  ero based..** Ne
17e60 77 20 73 6c 6f 74 73 20 61 72 65 20 7a 65 72 6f  w slots are zero
17e70 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ed..**.** For ex
17e80 61 6d 70 6c 65 2c 20 73 75 70 70 6f 73 65 20 61  ample, suppose a
17e90 20 53 72 63 4c 69 73 74 20 69 6e 69 74 69 61 6c   SrcList initial
17ea0 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 77 6f 20  ly contains two 
17eb0 65 6e 74 72 69 65 73 3a 20 41 2c 42 2e 0a 2a 2a  entries: A,B..**
17ec0 20 54 6f 20 61 70 70 65 6e 64 20 33 20 6e 65 77   To append 3 new
17ed0 20 65 6e 74 72 69 65 73 20 6f 6e 74 6f 20 74 68   entries onto th
17ee0 65 20 65 6e 64 2c 20 64 6f 20 74 68 69 73 3a 0a  e end, do this:.
17ef0 2a 2a 0a 2a 2a 20 20 20 20 73 71 6c 69 74 65 33  **.**    sqlite3
17f00 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
17f10 62 2c 20 70 53 72 63 6c 69 73 74 2c 20 33 2c 20  b, pSrclist, 3, 
17f20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  2);.**.** After 
17f30 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 20 69  the call above i
17f40 74 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 3a  t would contain:
17f50 20 20 41 2c 20 42 2c 20 6e 69 6c 2c 20 6e 69 6c    A, B, nil, nil
17f60 2c 20 6e 69 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  , nil..** If the
17f70 20 69 53 74 61 72 74 20 61 72 67 75 6d 65 6e 74   iStart argument
17f80 20 68 61 64 20 62 65 65 6e 20 31 20 69 6e 73 74   had been 1 inst
17f90 65 61 64 20 6f 66 20 32 2c 20 74 68 65 6e 20 74  ead of 2, then t
17fa0 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 77 6f 75  he result.** wou
17fb0 6c 64 20 68 61 76 65 20 62 65 65 6e 3a 20 20 41  ld have been:  A
17fc0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  , nil, nil, nil,
17fd0 20 42 2e 20 20 54 6f 20 70 72 65 70 65 6e 64 20   B.  To prepend 
17fe0 74 68 65 20 6e 65 77 20 73 6c 6f 74 73 2c 0a 2a  the new slots,.*
17ff0 2a 20 74 68 65 20 69 53 74 61 72 74 20 76 61 6c  * the iStart val
18000 75 65 20 77 6f 75 6c 64 20 62 65 20 30 2e 20 20  ue would be 0.  
18010 54 68 65 20 72 65 73 75 6c 74 20 74 68 65 6e 20  The result then 
18020 77 6f 75 6c 64 0a 2a 2a 20 62 65 3a 20 6e 69 6c  would.** be: nil
18030 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 41 2c 20 42  , nil, nil, A, B
18040 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
18050 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66  ory allocation f
18060 61 69 6c 73 20 74 68 65 20 53 72 63 4c 69 73 74  ails the SrcList
18070 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 20 20   is unchanged.  
18080 54 68 65 0a 2a 2a 20 64 62 2d 3e 6d 61 6c 6c 6f  The.** db->mallo
18090 63 46 61 69 6c 65 64 20 66 6c 61 67 20 77 69 6c  cFailed flag wil
180a0 6c 20 62 65 20 73 65 74 20 74 6f 20 74 72 75 65  l be set to true
180b0 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71  ..*/.SrcList *sq
180c0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
180d0 72 67 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  rge(.  sqlite3 *
180e0 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db,       /* Dat
180f0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
18100 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 4f 4f   to notify of OO
18110 4d 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 53 72  M errors */.  Sr
18120 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
18130 20 2f 2a 20 54 68 65 20 53 72 63 4c 69 73 74 20   /* The SrcList 
18140 74 6f 20 62 65 20 65 6e 6c 61 72 67 65 64 20 2a  to be enlarged *
18150 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20  /.  int nExtra, 
18160 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18170 20 6f 66 20 6e 65 77 20 73 6c 6f 74 73 20 74 6f   of new slots to
18180 20 61 64 64 20 74 6f 20 70 53 72 63 2d 3e 61 5b   add to pSrc->a[
18190 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 72  ] */.  int iStar
181a0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  t         /* Ind
181b0 65 78 20 69 6e 20 70 53 72 63 2d 3e 61 5b 5d 20  ex in pSrc->a[] 
181c0 6f 66 20 66 69 72 73 74 20 6e 65 77 20 73 6c 6f  of first new slo
181d0 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
181e0 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
181f0 65 63 6b 69 6e 67 20 6f 6e 20 63 61 6c 6c 69 6e  ecking on callin
18200 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
18210 20 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74    assert( iStart
18220 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
18230 20 6e 45 78 74 72 61 3e 3d 31 20 29 3b 0a 20 20   nExtra>=1 );.  
18240 69 66 28 20 70 53 72 63 3d 3d 30 20 7c 7c 20 69  if( pSrc==0 || i
18250 53 74 61 72 74 3e 70 53 72 63 2d 3e 6e 53 72 63  Start>pSrc->nSrc
18260 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18270 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18280 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   );.    return p
18290 53 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  Src;.  }..  /* A
182a0 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e  llocate addition
182b0 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64  al space if need
182c0 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  ed */.  if( pSrc
182d0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3e 70 53  ->nSrc+nExtra>pS
182e0 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  rc->nAlloc ){.  
182f0 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
18300 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
18310 3d 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78  = pSrc->nSrc+nEx
18320 74 72 61 3b 0a 20 20 20 20 69 6e 74 20 6e 47 6f  tra;.    int nGo
18330 74 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71  t;.    pNew = sq
18340 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
18350 62 2c 20 70 53 72 63 2c 0a 20 20 20 20 20 20 20  b, pSrc,.       
18360 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 2a          sizeof(*
18370 70 53 72 63 29 20 2b 20 28 6e 41 6c 6c 6f 63 2d  pSrc) + (nAlloc-
18380 31 29 2a 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  1)*sizeof(pSrc->
18390 61 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  a[0]) );.    if(
183a0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
183b0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
183c0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
183d0 20 20 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b      return pSrc;
183e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 72 63 20  .    }.    pSrc 
183f0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 6e 47 6f 74  = pNew;.    nGot
18400 20 3d 20 28 73 71 6c 69 74 65 33 44 62 4d 61 6c   = (sqlite3DbMal
18410 6c 6f 63 53 69 7a 65 28 64 62 2c 20 70 4e 65 77  locSize(db, pNew
18420 29 20 2d 20 73 69 7a 65 6f 66 28 2a 70 53 72 63  ) - sizeof(*pSrc
18430 29 29 2f 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e  ))/sizeof(pSrc->
18440 61 5b 30 5d 29 2b 31 3b 0a 20 20 20 20 70 53 72  a[0])+1;.    pSr
18450 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28 75 31 36  c->nAlloc = (u16
18460 29 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  )nGot;.  }..  /*
18470 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73   Move existing s
18480 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61  lots that come a
18490 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69  fter the newly i
184a0 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20  nserted slots.  
184b0 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61  ** out of the wa
184c0 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72  y */.  for(i=pSr
184d0 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53  c->nSrc-1; i>=iS
184e0 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  tart; i--){.    
184f0 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61  pSrc->a[i+nExtra
18500 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  ] = pSrc->a[i];.
18510 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63    }.  pSrc->nSrc
18520 20 2b 3d 20 28 69 31 36 29 6e 45 78 74 72 61 3b   += (i16)nExtra;
18530 0a 0a 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20  ..  /* Zero the 
18540 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
18550 73 6c 6f 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65  slots */.  memse
18560 74 28 26 70 53 72 63 2d 3e 61 5b 69 53 74 61 72  t(&pSrc->a[iStar
18570 74 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 53  t], 0, sizeof(pS
18580 72 63 2d 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61  rc->a[0])*nExtra
18590 29 3b 0a 20 20 66 6f 72 28 69 3d 69 53 74 61 72  );.  for(i=iStar
185a0 74 3b 20 69 3c 69 53 74 61 72 74 2b 6e 45 78 74  t; i<iStart+nExt
185b0 72 61 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53  ra; i++){.    pS
185c0 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  rc->a[i].iCursor
185d0 20 3d 20 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   = -1;.  }..  /*
185e0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
185f0 72 20 74 6f 20 74 68 65 20 65 6e 6c 61 72 67 65  r to the enlarge
18600 64 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72  d SrcList */.  r
18610 65 74 75 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a  eturn pSrc;.}...
18620 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e  /*.** Append a n
18630 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f  ew table name to
18640 20 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69   the given SrcLi
18650 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
18660 77 20 53 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20  w SrcList if.** 
18670 6e 65 65 64 20 62 65 2e 20 20 41 20 6e 65 77 20  need be.  A new 
18680 65 6e 74 72 79 20 69 73 20 63 72 65 61 74 65 64  entry is created
18690 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
186a0 65 76 65 6e 20 69 66 20 70 54 6f 6b 65 6e 20 69  even if pToken i
186b0 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20  s NULL..**.** A 
186c0 53 72 63 4c 69 73 74 20 69 73 20 72 65 74 75 72  SrcList is retur
186d0 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20  ned, or NULL if 
186e0 74 68 65 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20  there is an OOM 
186f0 65 72 72 6f 72 2e 20 20 54 68 65 20 72 65 74 75  error.  The retu
18700 72 6e 65 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20  rned.** SrcList 
18710 6d 69 67 68 74 20 62 65 20 74 68 65 20 73 61 6d  might be the sam
18720 65 20 61 73 20 74 68 65 20 53 72 63 4c 69 73 74  e as the SrcList
18730 20 74 68 61 74 20 77 61 73 20 69 6e 70 75 74 20   that was input 
18740 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 0a 2a  or it might be.*
18750 2a 20 61 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66  * a new one.  If
18760 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f   an OOM error do
18770 65 73 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  es occurs, then 
18780 74 68 65 20 70 72 69 6f 72 20 76 61 6c 75 65 20  the prior value 
18790 6f 66 20 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74  of pList.** that
187a0 20 69 73 20 69 6e 70 75 74 20 74 6f 20 74 68 69   is input to thi
187b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 75 74  s routine is aut
187c0 6f 6d 61 74 69 63 61 6c 6c 79 20 66 72 65 65 64  omatically freed
187d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61  ..**.** If pData
187e0 62 61 73 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  base is not null
187f0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
18800 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 6e  the table has an
18810 20 6f 70 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74   optional.** dat
18820 61 62 61 73 65 20 6e 61 6d 65 20 70 72 65 66 69  abase name prefi
18830 78 2e 20 20 4c 69 6b 65 20 74 68 69 73 3a 20 20  x.  Like this:  
18840 22 64 61 74 61 62 61 73 65 2e 74 61 62 6c 65 22  "database.table"
18850 2e 20 20 54 68 65 20 70 44 61 74 61 62 61 73 65  .  The pDatabase
18860 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
18870 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  e table name and
18880 20 74 68 65 20 70 54 61 62 6c 65 20 70 6f 69 6e   the pTable poin
18890 74 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ts to the databa
188a0 73 65 20 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20  se name..** The 
188b0 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d  SrcList.a[].zNam
188c0 65 20 66 69 65 6c 64 20 69 73 20 66 69 6c 6c 65  e field is fille
188d0 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65  d with the table
188e0 20 6e 61 6d 65 20 77 68 69 63 68 20 6d 69 67 68   name which migh
188f0 74 0a 2a 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70  t.** come from p
18900 54 61 62 6c 65 20 28 69 66 20 70 44 61 74 61 62  Table (if pDatab
18910 61 73 65 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20  ase is NULL) or 
18920 66 72 6f 6d 20 70 44 61 74 61 62 61 73 65 2e 20  from pDatabase. 
18930 20 0a 2a 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d   .** SrcList.a[]
18940 2e 7a 44 61 74 61 62 61 73 65 20 69 73 20 66 69  .zDatabase is fi
18950 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 64 61  lled with the da
18960 74 61 62 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d  tabase name from
18970 20 70 54 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77   pTable,.** or w
18980 69 74 68 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64  ith NULL if no d
18990 61 74 61 62 61 73 65 20 69 73 20 73 70 65 63 69  atabase is speci
189a0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  fied..**.** In o
189b0 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 63  ther words, if c
189c0 61 6c 6c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  all like this:.*
189d0 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71 6c  *.**         sql
189e0 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e  ite3SrcListAppen
189f0 64 28 44 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a  d(D,A,B,0);.**.*
18a00 2a 20 54 68 65 6e 20 42 20 69 73 20 61 20 74 61  * Then B is a ta
18a10 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ble name and the
18a20 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69   database name i
18a30 73 20 75 6e 73 70 65 63 69 66 69 65 64 2e 20 20  s unspecified.  
18a40 49 66 20 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b  If called.** lik
18a50 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
18a60 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63        sqlite3Src
18a70 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42  ListAppend(D,A,B
18a80 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ,C);.**.** Then 
18a90 43 20 69 73 20 74 68 65 20 74 61 62 6c 65 20 6e  C is the table n
18aa0 61 6d 65 20 61 6e 64 20 42 20 69 73 20 74 68 65  ame and B is the
18ab0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 0a   database name..
18ac0 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c 69  */.SrcList *sqli
18ad0 74 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64  te3SrcListAppend
18ae0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
18af0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
18b00 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
18b10 6f 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  of malloc failur
18b20 65 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  es */.  SrcList 
18b30 2a 70 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 41  *pList,     /* A
18b40 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 53 72  ppend to this Sr
18b50 63 4c 69 73 74 2e 20 4e 55 4c 4c 20 63 72 65 61  cList. NULL crea
18b60 74 65 73 20 61 20 6e 65 77 20 53 72 63 4c 69 73  tes a new SrcLis
18b70 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54  t */.  Token *pT
18b80 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20 54 61  able,      /* Ta
18b90 62 6c 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  ble to append */
18ba0 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62  .  Token *pDatab
18bb0 61 73 65 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ase    /* Databa
18bc0 73 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  se of the table 
18bd0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  */.){.  struct S
18be0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
18bf0 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  em;.  if( pList=
18c00 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
18c10 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
18c20 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
18c30 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20  (SrcList) );.   
18c40 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
18c50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c  return 0;.    pL
18c60 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b  ist->nAlloc = 1;
18c70 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73  .  }.  pList = s
18c80 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c  qlite3SrcListEnl
18c90 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20  arge(db, pList, 
18ca0 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b  1, pList->nSrc);
18cb0 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
18cc0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73  cFailed ){.    s
18cd0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
18ce0 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
18cf0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18d00 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69  }.  pItem = &pLi
18d10 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72  st->a[pList->nSr
18d20 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74  c-1];.  if( pDat
18d30 61 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61  abase && pDataba
18d40 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  se->z==0 ){.    
18d50 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20  pDatabase = 0;. 
18d60 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61   }.  if( pDataba
18d70 73 65 20 26 26 20 70 54 61 62 6c 65 20 29 7b 0a  se && pTable ){.
18d80 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 65 6d 70      Token *pTemp
18d90 20 3d 20 70 44 61 74 61 62 61 73 65 3b 0a 20 20   = pDatabase;.  
18da0 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 70 54    pDatabase = pT
18db0 61 62 6c 65 3b 0a 20 20 20 20 70 54 61 62 6c 65  able;.    pTable
18dc0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 7d 0a 20 20   = pTemp;.  }.  
18dd0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  pItem->zName = s
18de0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
18df0 6b 65 6e 28 64 62 2c 20 70 54 61 62 6c 65 29 3b  ken(db, pTable);
18e00 0a 20 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  .  pItem->zDatab
18e10 61 73 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ase = sqlite3Nam
18e20 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18e30 44 61 74 61 62 61 73 65 29 3b 0a 20 20 72 65 74  Database);.  ret
18e40 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
18e50 0a 2a 2a 20 41 73 73 69 67 6e 20 56 64 62 65 43  .** Assign VdbeC
18e60 75 72 73 6f 72 20 69 6e 64 65 78 20 6e 75 6d 62  ursor index numb
18e70 65 72 73 20 74 6f 20 61 6c 6c 20 74 61 62 6c 65  ers to all table
18e80 73 20 69 6e 20 61 20 53 72 63 4c 69 73 74 0a 2a  s in a SrcList.*
18e90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72  /.void sqlite3Sr
18ea0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
18eb0 72 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  rs(Parse *pParse
18ec0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74  , SrcList *pList
18ed0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
18ee0 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
18ef0 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61 73 73 65  m *pItem;.  asse
18f00 72 74 28 70 4c 69 73 74 20 7c 7c 20 70 50 61 72  rt(pList || pPar
18f10 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
18f20 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 4c  iled );.  if( pL
18f30 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
18f40 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
18f50 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  >a; i<pList->nSr
18f60 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
18f70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  {.      if( pIte
18f80 6d 2d 3e 69 43 75 72 73 6f 72 3e 3d 30 20 29 20  m->iCursor>=0 ) 
18f90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 49 74  break;.      pIt
18fa0 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70 50  em->iCursor = pP
18fb0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20  arse->nTab++;.  
18fc0 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
18fd0 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
18fe0 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
18ff0 41 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50  AssignCursors(pP
19000 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
19010 6c 65 63 74 2d 3e 70 53 72 63 29 3b 0a 20 20 20  lect->pSrc);.   
19020 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
19030 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
19040 6e 20 65 6e 74 69 72 65 20 53 72 63 4c 69 73 74  n entire SrcList
19050 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 69   including all i
19060 74 73 20 73 75 62 73 74 72 75 63 74 75 72 65 2e  ts substructure.
19070 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19080 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 73 71  SrcListDelete(sq
19090 6c 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69  lite3 *db, SrcLi
190a0 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
190b0 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
190c0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
190d0 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  m;.  if( pList==
190e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
190f0 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
19100 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  , i=0; i<pList->
19110 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
19120 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
19130 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d  DbFree(db, pItem
19140 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
19150 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
19160 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  db, pItem->zName
19170 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
19180 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
19190 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 73 71 6c  zAlias);.    sql
191a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
191b0 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 29 3b 0a 20  Item->zIndex);. 
191c0 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65     sqlite3Delete
191d0 54 61 62 6c 65 28 70 49 74 65 6d 2d 3e 70 54 61  Table(pItem->pTa
191e0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53  b);.    sqlite3S
191f0 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20  electDelete(db, 
19200 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  pItem->pSelect);
19210 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
19220 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d  Delete(db, pItem
19230 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ->pOn);.    sqli
19240 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28  te3IdListDelete(
19250 64 62 2c 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e  db, pItem->pUsin
19260 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
19270 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73  3DbFree(db, pLis
19280 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  t);.}../*.** Thi
19290 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
192a0 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
192b0 72 20 74 6f 20 61 64 64 20 61 20 6e 65 77 20 74  r to add a new t
192c0 65 72 6d 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  erm to the.** en
192d0 64 20 6f 66 20 61 20 67 72 6f 77 69 6e 67 20 46  d of a growing F
192e0 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65  ROM clause.  The
192f0 20 22 70 22 20 70 61 72 61 6d 65 74 65 72 20 69   "p" parameter i
19300 73 20 74 68 65 20 70 61 72 74 20 6f 66 0a 2a 2a  s the part of.**
19310 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19320 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
19330 79 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74  y been construct
19340 65 64 2e 20 20 22 70 22 20 69 73 20 4e 55 4c 4c  ed.  "p" is NULL
19350 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74  .** if this is t
19360 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 66  he first term of
19370 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
19380 2e 20 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44  .  pTable and pD
19390 61 74 61 62 61 73 65 0a 2a 2a 20 61 72 65 20 74  atabase.** are t
193a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
193b0 61 62 6c 65 20 61 6e 64 20 64 61 74 61 62 61 73  able and databas
193c0 65 20 6e 61 6d 65 64 20 69 6e 20 74 68 65 20 46  e named in the F
193d0 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ROM clause term.
193e0 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 69 73  .** pDatabase is
193f0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 64 61 74   NULL if the dat
19400 61 62 61 73 65 20 6e 61 6d 65 20 71 75 61 6c 69  abase name quali
19410 66 69 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  fier is missing 
19420 2d 20 74 68 65 0a 2a 2a 20 75 73 75 61 6c 20 63  - the.** usual c
19430 61 73 65 2e 20 20 49 66 20 74 68 65 20 74 65 72  ase.  If the ter
19440 6d 20 68 61 73 20 61 20 61 6c 69 61 73 2c 20 74  m has a alias, t
19450 68 65 6e 20 70 41 6c 69 61 73 20 70 6f 69 6e 74  hen pAlias point
19460 73 20 74 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61  s to the.** alia
19470 73 20 74 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65  s token.  If the
19480 20 74 65 72 6d 20 69 73 20 61 20 73 75 62 71 75   term is a subqu
19490 65 72 79 2c 20 74 68 65 6e 20 70 53 75 62 71 75  ery, then pSubqu
194a0 65 72 79 20 69 73 20 74 68 65 0a 2a 2a 20 53 45  ery is the.** SE
194b0 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
194c0 68 61 74 20 74 68 65 20 73 75 62 71 75 65 72 79  hat the subquery
194d0 20 65 6e 63 6f 64 65 73 2e 20 20 54 68 65 20 70   encodes.  The p
194e0 54 61 62 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61  Table and.** pDa
194f0 74 61 62 61 73 65 20 70 61 72 61 6d 65 74 65 72  tabase parameter
19500 73 20 61 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73  s are NULL for s
19510 75 62 71 75 65 72 69 65 73 2e 20 20 54 68 65 20  ubqueries.  The 
19520 70 4f 6e 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a  pOn and pUsing.*
19530 2a 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65  * parameters are
19540 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
19550 74 68 65 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47  the ON and USING
19560 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
19570 52 65 74 75 72 6e 20 61 20 6e 65 77 20 53 72 63  Return a new Src
19580 4c 69 73 74 20 77 68 69 63 68 20 65 6e 63 6f 64  List which encod
19590 65 73 20 69 73 20 74 68 65 20 46 52 4f 4d 20 77  es is the FROM w
195a0 69 74 68 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74  ith the new.** t
195b0 65 72 6d 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72  erm added..*/.Sr
195c0 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
195d0 63 4c 69 73 74 41 70 70 65 6e 64 46 72 6f 6d 54  cListAppendFromT
195e0 65 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50  erm(.  Parse *pP
195f0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
19600 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
19610 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
19620 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
19630 2a 20 54 68 65 20 6c 65 66 74 20 70 61 72 74 20  * The left part 
19640 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
19650 73 65 20 61 6c 72 65 61 64 79 20 73 65 65 6e 20  se already seen 
19660 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62  */.  Token *pTab
19670 6c 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  le,          /* 
19680 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  Name of the tabl
19690 65 20 74 6f 20 61 64 64 20 74 6f 20 74 68 65 20  e to add to the 
196a0 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20  FROM clause */. 
196b0 20 54 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73   Token *pDatabas
196c0 65 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  e,       /* Name
196d0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
196e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 54 61 62   containing pTab
196f0 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  le */.  Token *p
19700 41 6c 69 61 73 2c 20 20 20 20 20 20 20 20 20 20  Alias,          
19710 2f 2a 20 54 68 65 20 72 69 67 68 74 2d 68 61 6e  /* The right-han
19720 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 41 53  d side of the AS
19730 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a   subexpression *
19740 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62  /.  Select *pSub
19750 71 75 65 72 79 2c 20 20 20 20 20 20 2f 2a 20 41  query,      /* A
19760 20 73 75 62 71 75 65 72 79 20 75 73 65 64 20 69   subquery used i
19770 6e 20 70 6c 61 63 65 20 6f 66 20 61 20 74 61 62  n place of a tab
19780 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  le name */.  Exp
19790 72 20 2a 70 4f 6e 2c 20 20 20 20 20 20 20 20 20  r *pOn,         
197a0 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63       /* The ON c
197b0 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20  lause of a join 
197c0 2a 2f 0a 20 20 49 64 4c 69 73 74 20 2a 70 55 73  */.  IdList *pUs
197d0 69 6e 67 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ing          /* 
197e0 54 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65  The USING clause
197f0 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b   of a join */.){
19800 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
19810 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
19820 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
19830 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
19840 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
19850 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54 61  ppend(db, p, pTa
19860 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29 3b  ble, pDatabase);
19870 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 70  .  if( p==0 || p
19880 2d 3e 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ->nSrc==0 ){.   
19890 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
198a0 74 65 28 64 62 2c 20 70 4f 6e 29 3b 0a 20 20 20  te(db, pOn);.   
198b0 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65   sqlite3IdListDe
198c0 6c 65 74 65 28 64 62 2c 20 70 55 73 69 6e 67 29  lete(db, pUsing)
198d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  ;.    sqlite3Sel
198e0 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
198f0 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 72 65  ubquery);.    re
19900 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20 70 49  turn p;.  }.  pI
19910 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e  tem = &p->a[p->n
19920 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 41  Src-1];.  if( pA
19930 6c 69 61 73 20 26 26 20 70 41 6c 69 61 73 2d 3e  lias && pAlias->
19940 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  n ){.    pItem->
19950 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65 33  zAlias = sqlite3
19960 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
19970 2c 20 70 41 6c 69 61 73 29 3b 0a 20 20 7d 0a 20  , pAlias);.  }. 
19980 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
19990 3d 20 70 53 75 62 71 75 65 72 79 3b 0a 20 20 70  = pSubquery;.  p
199a0 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 70 4f 6e 3b  Item->pOn = pOn;
199b0 0a 20 20 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67  .  pItem->pUsing
199c0 20 3d 20 70 55 73 69 6e 67 3b 0a 20 20 72 65 74   = pUsing;.  ret
199d0 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
199e0 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
199f0 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
19a00 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
19a10 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
19a20 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
19a30 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
19a40 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
19a50 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
19a60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
19a70 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
19a80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
19a90 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
19aa0 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
19ab0 20 20 69 66 28 20 70 49 6e 64 65 78 65 64 42 79    if( pIndexedBy
19ac0 20 26 26 20 70 20 26 26 20 70 2d 3e 6e 53 72 63   && p && p->nSrc
19ad0 3e 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  >0 ){.    struct
19ae0 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
19af0 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 70 2d 3e  Item = &p->a[p->
19b00 6e 53 72 63 2d 31 5d 3b 0a 20 20 20 20 61 73 73  nSrc-1];.    ass
19b10 65 72 74 28 20 70 49 74 65 6d 2d 3e 6e 6f 74 49  ert( pItem->notI
19b20 6e 64 65 78 65 64 3d 3d 30 20 26 26 20 70 49 74  ndexed==0 && pIt
19b30 65 6d 2d 3e 7a 49 6e 64 65 78 3d 3d 30 20 29 3b  em->zIndex==0 );
19b40 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 65  .    if( pIndexe
19b50 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21 70 49  dBy->n==1 && !pI
19b60 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b 0a 20  ndexedBy->z ){. 
19b70 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54 20 49       /* A "NOT I
19b80 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65 20 77  NDEXED" clause w
19b90 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53 65 65  as supplied. See
19ba0 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20 20 20   parse.y .      
19bb0 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22 69 6e  ** construct "in
19bc0 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72 20 64  dexed_opt" for d
19bd0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
19be0 20 70 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78   pItem->notIndex
19bf0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  ed = 1;.    }els
19c00 65 7b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  e{.      pItem->
19c10 7a 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33  zIndex = sqlite3
19c20 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
19c30 61 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78  arse->db, pIndex
19c40 65 64 42 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  edBy);.    }.  }
19c50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
19c60 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
19c70 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
19c80 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
19c90 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
19ca0 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
19cb0 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
19cc0 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
19cd0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
19ce0 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
19cf0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
19d00 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
19d10 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
19d20 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
19d30 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
19d40 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
19d50 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
19d60 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
19d70 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
19d80 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
19d90 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
19da0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
19db0 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
19dc0 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
19dd0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
19de0 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
19df0 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
19e00 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
19e10 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
19e20 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
19e30 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
19e40 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
19e50 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
19e60 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
19e70 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
19e80 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
19e90 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
19ea0 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
19eb0 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
19ec0 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
19ed0 70 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 70  p){.  if( p && p
19ee0 2d 3e 61 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ->a ){.    int i
19ef0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 70 2d 3e 6e  ;.    for(i=p->n
19f00 53 72 63 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29  Src-1; i>0; i--)
19f10 7b 0a 20 20 20 20 20 20 70 2d 3e 61 5b 69 5d 2e  {.      p->a[i].
19f20 6a 6f 69 6e 74 79 70 65 20 3d 20 70 2d 3e 61 5b  jointype = p->a[
19f30 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20  i-1].jointype;. 
19f40 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d     }.    p->a[0]
19f50 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20  .jointype = 0;. 
19f60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69   }.}../*.** Begi
19f70 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
19f80 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
19f90 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
19fa0 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
19fb0 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69  nt type){.  sqli
19fc0 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
19fd0 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  *v;.  int i;..  
19fe0 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c  if( pParse==0 ||
19ff0 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29   (db=pParse->db)
1a000 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30  ==0 || db->aDb[0
1a010 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72  ].pBt==0 ) retur
1a020 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  n;.  if( pParse-
1a030 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
1a040 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
1a050 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  rn;.  if( sqlite
1a060 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
1a070 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e, SQLITE_TRANSA
1a080 43 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20  CTION, "BEGIN", 
1a090 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
1a0a0 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1a0b0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1a0c0 20 69 66 28 20 21 76 20 29 20 72 65 74 75 72 6e   if( !v ) return
1a0d0 3b 0a 20 20 69 66 28 20 74 79 70 65 21 3d 54 4b  ;.  if( type!=TK
1a0e0 5f 44 45 46 45 52 52 45 44 20 29 7b 0a 20 20 20  _DEFERRED ){.   
1a0f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
1a100 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
1a110 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1a120 70 32 28 76 2c 20 4f 50 5f 54 72 61 6e 73 61 63  p2(v, OP_Transac
1a130 74 69 6f 6e 2c 20 69 2c 20 28 74 79 70 65 3d 3d  tion, i, (type==
1a140 54 4b 5f 45 58 43 4c 55 53 49 56 45 29 2b 31 29  TK_EXCLUSIVE)+1)
1a150 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1a160 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
1a170 69 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  i);.    }.  }.  
1a180 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a190 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1a1a0 69 74 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  it, 0, 0);.}../*
1a1b0 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 74 72 61  .** Commit a tra
1a1c0 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64  nsaction.*/.void
1a1d0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 54 72   sqlite3CommitTr
1a1e0 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1a1f0 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
1a200 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
1a210 2a 76 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  *v;..  if( pPars
1a220 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72  e==0 || (db=pPar
1a230 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62  se->db)==0 || db
1a240 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20  ->aDb[0].pBt==0 
1a250 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1a260 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
1a270 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1a280 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1a290 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1a2a0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1a2b0 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 43  _TRANSACTION, "C
1a2c0 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29 20  OMMIT", 0, 0) ) 
1a2d0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
1a2e0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a2f0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1a300 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a310 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1a320 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 30 29 3b  toCommit, 1, 0);
1a330 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  .  }.}../*.** Ro
1a340 6c 6c 62 61 63 6b 20 61 20 74 72 61 6e 73 61 63  llback a transac
1a350 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tion.*/.void sql
1a360 69 74 65 33 52 6f 6c 6c 62 61 63 6b 54 72 61 6e  ite3RollbackTran
1a370 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1a380 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 65  Parse){.  sqlite
1a390 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1a3a0 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 3d  ;..  if( pParse=
1a3b0 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61 72 73 65  =0 || (db=pParse
1a3c0 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ->db)==0 || db->
1a3d0 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30 20 29 20  aDb[0].pBt==0 ) 
1a3e0 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
1a3f0 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
1a400 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1a410 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73   return;.  if( s
1a420 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
1a430 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 54  pParse, SQLITE_T
1a440 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22 52 4f 4c  RANSACTION, "ROL
1a450 4c 42 41 43 4b 22 2c 20 30 2c 20 30 29 20 29 20  LBACK", 0, 0) ) 
1a460 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
1a470 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a480 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29  arse);.  if( v )
1a490 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
1a4a0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75  eAddOp2(v, OP_Au
1a4b0 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b  toCommit, 1, 1);
1a4c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1a4d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1a4e0 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
1a4f0 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72 73  ser when it pars
1a500 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  es a command to 
1a510 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61  create,.** relea
1a520 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61  se or rollback a
1a530 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e  n SQL savepoint.
1a540 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
1a550 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65  3Savepoint(Parse
1a560 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70   *pParse, int op
1a570 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
1a580 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  .  char *zName =
1a590 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1a5a0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
1a5b0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
1a5c0 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  zName ){.    Vdb
1a5d0 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
1a5e0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23  tVdbe(pParse);.#
1a5f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a600 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
1a610 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
1a620 74 20 63 68 61 72 20 2a 61 7a 5b 5d 20 3d 20 7b  t char *az[] = {
1a630 20 22 42 45 47 49 4e 22 2c 20 22 52 45 4c 45 41   "BEGIN", "RELEA
1a640 53 45 22 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 20  SE", "ROLLBACK" 
1a650 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  };.    assert( !
1a660 53 41 56 45 50 4f 49 4e 54 5f 42 45 47 49 4e 20  SAVEPOINT_BEGIN 
1a670 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  && SAVEPOINT_REL
1a680 45 41 53 45 3d 3d 31 20 26 26 20 53 41 56 45 50  EASE==1 && SAVEP
1a690 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3d 3d 32  OINT_ROLLBACK==2
1a6a0 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69   );.#endif.    i
1a6b0 66 28 20 21 76 20 7c 7c 20 73 71 6c 69 74 65 33  f( !v || sqlite3
1a6c0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1a6d0 2c 20 53 51 4c 49 54 45 5f 53 41 56 45 50 4f 49  , SQLITE_SAVEPOI
1a6e0 4e 54 2c 20 61 7a 5b 6f 70 5d 2c 20 7a 4e 61 6d  NT, az[op], zNam
1a6f0 65 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e, 0) ){.      s
1a700 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50 61  qlite3DbFree(pPa
1a710 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b  rse->db, zName);
1a720 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
1a730 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1a740 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
1a750 5f 53 61 76 65 70 6f 69 6e 74 2c 20 6f 70 2c 20  _Savepoint, op, 
1a760 30 2c 20 30 2c 20 7a 4e 61 6d 65 2c 20 50 34 5f  0, 0, zName, P4_
1a770 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a 7d 0a  DYNAMIC);.  }.}.
1a780 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1a790 20 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61   the TEMP databa
1a7a0 73 65 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 61  se is open and a
1a7b0 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
1a7c0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
1a7d0 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
1a7e0 73 2e 20 20 4c 65 61 76 65 20 61 6e 79 20 65 72  s.  Leave any er
1a7f0 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 20  ror messages in 
1a800 74 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63  the pParse struc
1a810 74 75 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ture..*/.int sql
1a820 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74 61  ite3OpenTempData
1a830 62 61 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  base(Parse *pPar
1a840 73 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  se){.  sqlite3 *
1a850 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1a860 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31  .  if( db->aDb[1
1a870 5d 2e 70 42 74 3d 3d 30 20 26 26 20 21 70 50 61  ].pBt==0 && !pPa
1a880 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 29 7b 0a  rse->explain ){.
1a890 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1a8a0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
1a8b0 20 66 6c 61 67 73 20 3d 20 0a 20 20 20 20 20 20   flags = .      
1a8c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1a8d0 52 45 41 44 57 52 49 54 45 20 7c 0a 20 20 20 20  READWRITE |.    
1a8e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
1a8f0 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20 20  N_CREATE |.     
1a900 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1a910 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
1a920 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1a930 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1a940 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1a950 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1a960 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
1a970 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 28  te3BtreeFactory(
1a980 64 62 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  db, 0, 0, SQLITE
1a990 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
1a9a0 49 5a 45 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20  IZE, flags,.    
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64 62               &db
1a9d0 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29 3b 0a 20  ->aDb[1].pBt);. 
1a9e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a9f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
1aa00 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
1aa10 61 72 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f  arse, "unable to
1aa20 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72   open a temporar
1aa30 79 20 64 61 74 61 62 61 73 65 20 22 0a 20 20 20  y database ".   
1aa40 20 20 20 20 20 22 66 69 6c 65 20 66 6f 72 20 73       "file for s
1aa50 74 6f 72 69 6e 67 20 74 65 6d 70 6f 72 61 72 79  toring temporary
1aa60 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20   tables");.     
1aa70 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 72 63   pParse->rc = rc
1aa80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1aa90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1aaa0 72 74 28 20 28 64 62 2d 3e 66 6c 61 67 73 20 26  rt( (db->flags &
1aab0 20 53 51 4c 49 54 45 5f 49 6e 54 72 61 6e 73 29   SQLITE_InTrans)
1aac0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43  ==0 || db->autoC
1aad0 6f 6d 6d 69 74 20 29 3b 0a 20 20 20 20 61 73 73  ommit );.    ass
1aae0 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  ert( db->aDb[1].
1aaf0 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
1ab00 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
1ab10 61 6c 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74  alMode(sqlite3Bt
1ab20 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
1ab30 5b 31 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20  [1].pBt),.      
1ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab50 20 20 20 20 20 20 64 62 2d 3e 64 66 6c 74 4a 6f        db->dfltJo
1ab60 75 72 6e 61 6c 4d 6f 64 65 29 3b 0a 20 20 7d 0a  urnalMode);.  }.
1ab70 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1ab80 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44  *.** Generate VD
1ab90 42 45 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  BE code that wil
1aba0 6c 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68  l verify the sch
1abb0 65 6d 61 20 63 6f 6f 6b 69 65 20 61 6e 64 20 73  ema cookie and s
1abc0 74 61 72 74 0a 2a 2a 20 61 20 72 65 61 64 2d 74  tart.** a read-t
1abd0 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 61  ransaction for a
1abe0 6c 6c 20 6e 61 6d 65 64 20 64 61 74 61 62 61 73  ll named databas
1abf0 65 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  e files..**.** I
1ac00 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
1ac10 68 61 74 20 61 6c 6c 20 73 63 68 65 6d 61 20 63  hat all schema c
1ac20 6f 6f 6b 69 65 73 20 62 65 20 76 65 72 69 66 69  ookies be verifi
1ac30 65 64 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 72 65  ed and all.** re
1ac40 61 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ad transactions 
1ac50 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72  be started befor
1ac60 65 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  e anything else 
1ac70 68 61 70 70 65 6e 73 20 69 6e 0a 2a 2a 20 74 68  happens in.** th
1ac80 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20  e VDBE program. 
1ac90 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69 6e   But this routin
1aca0 65 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 20  e can be called 
1acb0 61 66 74 65 72 20 6d 75 63 68 20 6f 74 68 65 72  after much other
1acc0 0a 2a 2a 20 63 6f 64 65 20 68 61 73 20 62 65 65  .** code has bee
1acd0 6e 20 67 65 6e 65 72 61 74 65 64 2e 20 20 53 6f  n generated.  So
1ace0 20 68 65 72 65 20 69 73 20 77 68 61 74 20 77 65   here is what we
1acf0 20 64 6f 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66   do:.**.** The f
1ad00 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
1ad10 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1ad20 2c 20 77 65 20 63 6f 64 65 20 61 6e 20 4f 50 5f  , we code an OP_
1ad30 47 6f 74 6f 20 74 68 61 74 0a 2a 2a 20 77 69 6c  Goto that.** wil
1ad40 6c 20 6a 75 6d 70 20 74 6f 20 61 20 73 75 62 72  l jump to a subr
1ad50 6f 75 74 69 6e 65 20 61 74 20 74 68 65 20 65 6e  outine at the en
1ad60 64 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d  d of the program
1ad70 2e 20 20 54 68 65 6e 20 77 65 0a 2a 2a 20 72 65  .  Then we.** re
1ad80 63 6f 72 64 20 65 76 65 72 79 20 64 61 74 61 62  cord every datab
1ad90 61 73 65 20 74 68 61 74 20 6e 65 65 64 73 20 69  ase that needs i
1ada0 74 73 20 73 63 68 65 6d 61 20 76 65 72 69 66 69  ts schema verifi
1adb0 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 70 50 61  ed in the.** pPa
1adc0 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1add0 66 69 65 6c 64 2e 20 20 4c 61 74 65 72 2c 20 61  field.  Later, a
1ade0 66 74 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 63  fter all other c
1adf0 6f 64 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ode has been.** 
1ae00 67 65 6e 65 72 61 74 65 64 2c 20 74 68 65 20 73  generated, the s
1ae10 75 62 72 6f 75 74 69 6e 65 20 74 68 61 74 20 64  ubroutine that d
1ae20 6f 65 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  oes the cookie v
1ae30 65 72 69 66 69 63 61 74 69 6f 6e 73 20 61 6e 64  erifications and
1ae40 0a 2a 2a 20 73 74 61 72 74 73 20 74 68 65 20 74  .** starts the t
1ae50 72 61 6e 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c  ransactions will
1ae60 20 62 65 20 63 6f 64 65 64 20 61 6e 64 20 74 68   be coded and th
1ae70 65 20 4f 50 5f 47 6f 74 6f 20 50 32 20 76 61 6c  e OP_Goto P2 val
1ae80 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 6d 61  ue.** will be ma
1ae90 64 65 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  de to point to t
1aea0 68 61 74 20 73 75 62 72 6f 75 74 69 6e 65 2e 20  hat subroutine. 
1aeb0 20 54 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   The generation 
1aec0 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65  of the.** cookie
1aed0 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 73 75   verification su
1aee0 62 72 6f 75 74 69 6e 65 20 63 6f 64 65 20 68 61  broutine code ha
1aef0 70 70 65 6e 73 20 69 6e 20 73 71 6c 69 74 65 33  ppens in sqlite3
1af00 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
1af10 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 3c 30 20 74  **.** If iDb<0 t
1af20 68 65 6e 20 63 6f 64 65 20 74 68 65 20 4f 50 5f  hen code the OP_
1af30 47 6f 74 6f 20 6f 6e 6c 79 20 2d 20 64 6f 6e 27  Goto only - don'
1af40 74 20 73 65 74 20 66 6c 61 67 20 74 6f 20 76 65  t set flag to ve
1af50 72 69 66 79 20 74 68 65 0a 2a 2a 20 73 63 68 65  rify the.** sche
1af60 6d 61 20 6f 6e 20 61 6e 79 20 64 61 74 61 62 61  ma on any databa
1af70 73 65 73 2e 20 20 54 68 69 73 20 63 61 6e 20 62  ses.  This can b
1af80 65 20 75 73 65 64 20 74 6f 20 70 6f 73 69 74 69  e used to positi
1af90 6f 6e 20 74 68 65 20 4f 50 5f 47 6f 74 6f 0a 2a  on the OP_Goto.*
1afa0 2a 20 65 61 72 6c 79 20 69 6e 20 74 68 65 20 63  * early in the c
1afb0 6f 64 65 2c 20 62 65 66 6f 72 65 20 77 65 20 6b  ode, before we k
1afc0 6e 6f 77 20 69 66 20 61 6e 79 20 64 61 74 61 62  now if any datab
1afd0 61 73 65 20 74 61 62 6c 65 73 20 77 69 6c 6c 20  ase tables will 
1afe0 62 65 20 75 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64  be used..*/.void
1aff0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1b000 66 79 53 63 68 65 6d 61 28 50 61 72 73 65 20 2a  fySchema(Parse *
1b010 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
1b020 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1b030 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
1b040 74 20 6d 61 73 6b 3b 0a 0a 20 20 76 20 3d 20 73  t mask;..  v = s
1b050 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1b060 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d 3d  arse);.  if( v==
1b070 30 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  0 ) return;  /* 
1b080 54 68 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e  This only happen
1b090 73 20 69 66 20 74 68 65 72 65 20 77 61 73 20 61  s if there was a
1b0a0 20 70 72 69 6f 72 20 65 72 72 6f 72 20 2a 2f 0a   prior error */.
1b0b0 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
1b0c0 62 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  b;.  if( pParse-
1b0d0 3e 63 6f 6f 6b 69 65 47 6f 74 6f 3d 3d 30 20 29  >cookieGoto==0 )
1b0e0 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f  {.    pParse->co
1b0f0 6f 6b 69 65 47 6f 74 6f 20 3d 20 73 71 6c 69 74  okieGoto = sqlit
1b100 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1b110 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 2b 31  OP_Goto, 0, 0)+1
1b120 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3e  ;.  }.  if( iDb>
1b130 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
1b140 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  ( iDb<db->nDb );
1b150 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1b160 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30  >aDb[iDb].pBt!=0
1b170 20 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20   || iDb==1 );.  
1b180 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 53 51    assert( iDb<SQ
1b190 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
1b1a0 44 2b 32 20 29 3b 0a 20 20 20 20 6d 61 73 6b 20  D+2 );.    mask 
1b1b0 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 20 20 69 66  = 1<<iDb;.    if
1b1c0 28 20 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ( (pParse->cooki
1b1d0 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  eMask & mask)==0
1b1e0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65   ){.      pParse
1b1f0 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 7c 3d 20  ->cookieMask |= 
1b200 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 50 61 72  mask;.      pPar
1b210 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
1b220 69 44 62 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69  iDb] = db->aDb[i
1b230 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68  Db].pSchema->sch
1b240 65 6d 61 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20  ema_cookie;.    
1b250 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
1b260 44 42 20 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a  DB && iDb==1 ){.
1b270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
1b280 70 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28  penTempDatabase(
1b290 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
1b2a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1b2b0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 56 44 42  .** Generate VDB
1b2c0 45 20 63 6f 64 65 20 74 68 61 74 20 70 72 65 70  E code that prep
1b2d0 61 72 65 73 20 66 6f 72 20 64 6f 69 6e 67 20 61  ares for doing a
1b2e0 6e 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74  n operation that
1b2f0 0a 2a 2a 20 6d 69 67 68 74 20 63 68 61 6e 67 65  .** might change
1b300 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1b310 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1b320 65 20 73 74 61 72 74 73 20 61 20 6e 65 77 20 74  e starts a new t
1b330 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 77 65  ransaction if we
1b340 20 61 72 65 20 6e 6f 74 20 61 6c 72 65 61 64 79   are not already
1b350 20 77 69 74 68 69 6e 0a 2a 2a 20 61 20 74 72 61   within.** a tra
1b360 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 77 65  nsaction.  If we
1b370 20 61 72 65 20 61 6c 72 65 61 64 79 20 77 69 74   are already wit
1b380 68 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hin a transactio
1b390 6e 2c 20 74 68 65 6e 20 61 20 63 68 65 63 6b 70  n, then a checkp
1b3a0 6f 69 6e 74 0a 2a 2a 20 69 73 20 73 65 74 20 69  oint.** is set i
1b3b0 66 20 74 68 65 20 73 65 74 53 74 61 74 65 6d 65  f the setStateme
1b3c0 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nt parameter is 
1b3d0 74 72 75 65 2e 20 20 41 20 63 68 65 63 6b 70 6f  true.  A checkpo
1b3e0 69 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  int should.** be
1b3f0 20 73 65 74 20 66 6f 72 20 6f 70 65 72 61 74 69   set for operati
1b400 6f 6e 73 20 74 68 61 74 20 6d 69 67 68 74 20 66  ons that might f
1b410 61 69 6c 20 28 64 75 65 20 74 6f 20 61 20 63 6f  ail (due to a co
1b420 6e 73 74 72 61 69 6e 74 29 20 70 61 72 74 20 6f  nstraint) part o
1b430 66 0a 2a 2a 20 74 68 65 20 77 61 79 20 74 68 72  f.** the way thr
1b440 6f 75 67 68 20 61 6e 64 20 77 68 69 63 68 20 77  ough and which w
1b450 69 6c 6c 20 6e 65 65 64 20 74 6f 20 75 6e 64 6f  ill need to undo
1b460 20 73 6f 6d 65 20 77 72 69 74 65 73 20 77 69 74   some writes wit
1b470 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 0a 2a  hout having to.*
1b480 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 77  * rollback the w
1b490 68 6f 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  hole transaction
1b4a0 2e 20 20 46 6f 72 20 6f 70 65 72 61 74 69 6f 6e  .  For operation
1b4b0 73 20 77 68 65 72 65 20 61 6c 6c 20 63 6f 6e 73  s where all cons
1b4c0 74 72 61 69 6e 74 73 0a 2a 2a 20 63 61 6e 20 62  traints.** can b
1b4d0 65 20 63 68 65 63 6b 65 64 20 62 65 66 6f 72 65  e checked before
1b4e0 20 61 6e 79 20 63 68 61 6e 67 65 73 20 61 72 65   any changes are
1b4f0 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1b500 61 62 61 73 65 2c 20 69 74 20 69 73 20 6e 65 76  abase, it is nev
1b510 65 72 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 20  er.** necessary 
1b520 74 6f 20 75 6e 64 6f 20 61 20 77 72 69 74 65 20  to undo a write 
1b530 61 6e 64 20 74 68 65 20 63 68 65 63 6b 70 6f 69  and the checkpoi
1b540 6e 74 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  nt should not be
1b550 20 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71   set..*/.void sq
1b560 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
1b570 70 65 72 61 74 69 6f 6e 28 50 61 72 73 65 20 2a  peration(Parse *
1b580 70 50 61 72 73 65 2c 20 69 6e 74 20 73 65 74 53  pParse, int setS
1b590 74 61 74 65 6d 65 6e 74 2c 20 69 6e 74 20 69 44  tatement, int iD
1b5a0 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
1b5b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
1b5c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 3d  Parse);.  if( v=
1b5d0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
1b5e0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
1b5f0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
1b600 44 62 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 77  Db);.  pParse->w
1b610 72 69 74 65 4d 61 73 6b 20 7c 3d 20 31 3c 3c 69  riteMask |= 1<<i
1b620 44 62 3b 0a 20 20 69 66 28 20 73 65 74 53 74 61  Db;.  if( setSta
1b630 74 65 6d 65 6e 74 20 26 26 20 70 50 61 72 73 65  tement && pParse
1b640 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20  ->nested==0 ){. 
1b650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b660 64 4f 70 31 28 76 2c 20 4f 50 5f 53 74 61 74 65  dOp1(v, OP_State
1b670 6d 65 6e 74 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  ment, iDb);.  }.
1b680 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
1b690 6f 20 73 65 65 20 69 66 20 70 49 6e 64 65 78 20  o see if pIndex 
1b6a0 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
1b6b0 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ng sequence pCol
1b6c0 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72  l.  Return.** tr
1b6d0 75 65 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  ue if it does an
1b6e0 64 20 66 61 6c 73 65 20 69 66 20 69 74 20 64 6f  d false if it do
1b6f0 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69 66 6e 64  es not..*/.#ifnd
1b700 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
1b710 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 69 6e  EINDEX.static in
1b720 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  t collationMatch
1b730 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f  (const char *zCo
1b740 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65  ll, Index *pInde
1b750 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  x){.  int i;.  f
1b760 6f 72 28 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78  or(i=0; i<pIndex
1b770 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
1b780 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1b790 2a 7a 20 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43  *z = pIndex->azC
1b7a0 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  oll[i];.    if( 
1b7b0 7a 3d 3d 7a 43 6f 6c 6c 20 7c 7c 20 28 7a 20 26  z==zColl || (z &
1b7c0 26 20 7a 43 6f 6c 6c 20 26 26 20 30 3d 3d 73 71  & zColl && 0==sq
1b7d0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
1b7e0 7a 43 6f 6c 6c 29 29 20 29 7b 0a 20 20 20 20 20  zColl)) ){.     
1b7f0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1b800 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1b810 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1b820 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69   Recompute all i
1b830 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 20 74  ndices of pTab t
1b840 68 61 74 20 75 73 65 20 74 68 65 20 63 6f 6c 6c  hat use the coll
1b850 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
1b860 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20 70 43 6f 6c  Coll..** If pCol
1b870 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f 6d 70  l==0 then recomp
1b880 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ute all indices 
1b890 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a 23 69 66 6e  of pTab..*/.#ifn
1b8a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b8b0 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1b8c0 6f 69 64 20 72 65 69 6e 64 65 78 54 61 62 6c 65  oid reindexTable
1b8d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b8e0 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 63 68 61  Table *pTab, cha
1b8f0 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b  r const *zColl){
1b900 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
1b910 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b920 2a 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63  * An index assoc
1b930 69 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20  iated with pTab 
1b940 2a 2f 0a 0a 20 20 66 6f 72 28 70 49 6e 64 65 78  */..  for(pIndex
1b950 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
1b960 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70 49  Index; pIndex=pI
1b970 6e 64 65 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ndex->pNext){.  
1b980 20 20 69 66 28 20 7a 43 6f 6c 6c 3d 3d 30 20 7c    if( zColl==0 |
1b990 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61 74 63 68  | collationMatch
1b9a0 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64 65 78 29 20  (zColl, pIndex) 
1b9b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  ){.      int iDb
1b9c0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
1b9d0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
1b9e0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
1b9f0 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  a);.      sqlite
1ba00 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61  3BeginWriteOpera
1ba10 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20  tion(pParse, 0, 
1ba20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  iDb);.      sqli
1ba30 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28 70  te3RefillIndex(p
1ba40 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20 2d  Parse, pIndex, -
1ba50 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  1);.    }.  }.}.
1ba60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1ba70 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
1ba80 63 65 73 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65  ces of all table
1ba90 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61 73  s in all databas
1baa0 65 73 20 77 68 65 72 65 20 74 68 65 0a 2a 2a 20  es where the.** 
1bab0 69 6e 64 69 63 65 73 20 75 73 65 20 74 68 65 20  indices use the 
1bac0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
1bad0 63 65 20 70 43 6f 6c 6c 2e 20 20 49 66 20 70 43  ce pColl.  If pC
1bae0 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65 63 6f  oll==0 then reco
1baf0 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c 20 69 6e 64  mpute.** all ind
1bb00 69 63 65 73 20 65 76 65 72 79 77 68 65 72 65 2e  ices everywhere.
1bb10 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1bb20 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1bb30 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1bb40 64 65 78 44 61 74 61 62 61 73 65 73 28 50 61 72  dexDatabases(Par
1bb50 73 65 20 2a 70 50 61 72 73 65 2c 20 63 68 61 72  se *pParse, char
1bb60 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 29 7b 0a   const *zColl){.
1bb70 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
1bb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bb90 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
1bba0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1bbd0 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
1bbe0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
1bbf0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
1bc00 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1bc10 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
1bc20 20 20 48 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20    HashElem *k;  
1bc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc40 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1bc50 72 20 74 61 62 6c 65 73 20 69 6e 20 70 44 62 20  r tables in pDb 
1bc60 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
1bc70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc80 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74   /* A table in t
1bc90 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a  he database */..
1bca0 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44 62    for(iDb=0, pDb
1bcb0 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64 62  =db->aDb; iDb<db
1bcc0 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70 44  ->nDb; iDb++, pD
1bcd0 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  b++){.    assert
1bce0 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20 20  ( pDb!=0 );.    
1bcf0 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68  for(k=sqliteHash
1bd00 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68  First(&pDb->pSch
1bd10 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20  ema->tblHash);  
1bd20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e  k; k=sqliteHashN
1bd30 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70  ext(k)){.      p
1bd40 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71  Tab = (Table*)sq
1bd50 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b  liteHashData(k);
1bd60 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54 61  .      reindexTa
1bd70 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
1bd80 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d 0a  , zColl);.    }.
1bd90 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
1bda0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
1bdb0 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44 45  e for the REINDE
1bdc0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
1bdd0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31 0a             -- 1.
1be00 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45  **        REINDE
1be10 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20 20  X  <collation>  
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
1be30 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e  2.**        REIN
1be40 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65 3e  DEX  ?<database>
1be50 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20 2d  .?<tablename>  -
1be60 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52 45  - 3.**        RE
1be70 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73  INDEX  ?<databas
1be80 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e 20  e>.?<indexname> 
1be90 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72 6d   -- 4.**.** Form
1bea0 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69 6e   1 causes all in
1beb0 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74 74  dices in all att
1bec0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
1bed0 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a 2a  to be rebuilt..*
1bee0 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c 64  * Form 2 rebuild
1bef0 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1bf00 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 74   all databases t
1bf10 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d 65  hat use the name
1bf20 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20 66  d.** collating f
1bf30 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73 20  unction.  Forms 
1bf40 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64 20  3 and 4 rebuild 
1bf50 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  the named index 
1bf60 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63 65  or all.** indice
1bf70 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1bf80 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  h the named tabl
1bf90 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
1bfa0 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1bfb0 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  X.void sqlite3Re
1bfc0 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  index(Parse *pPa
1bfd0 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  rse, Token *pNam
1bfe0 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  e1, Token *pName
1bff0 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  2){.  CollSeq *p
1c000 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
1c010 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73    /* Collating s
1c020 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72 65  equence to be re
1c030 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c 4c  indexed, or NULL
1c040 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20   */.  char *z;  
1c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c060 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 74    /* Name of a t
1c070 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a 2f  able or index */
1c080 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c090 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Db;            /
1c0a0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1c0b0 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62 6c  tabase */.  Tabl
1c0c0 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
1c0d0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61 62          /* A tab
1c0e0 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  le in the databa
1c0f0 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  se */.  Index *p
1c100 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20  Index;          
1c110 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20      /* An index 
1c120 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1c130 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 44  pTab */.  int iD
1c140 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1c150 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
1c160 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62  abase index numb
1c170 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  er */.  sqlite3 
1c180 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c190 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
1c1a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1c1b0 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a 4e  /.  Token *pObjN
1c1c0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1c1d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74  /* Name of the t
1c1e0 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 6f  able or index to
1c1f0 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a 2f   be reindexed */
1c200 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1c210 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
1c220 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1c230 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  urs, leave an er
1c240 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a  ror message.  **
1c250 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61   and code in pPa
1c260 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  rse and return N
1c270 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  ULL. */.  if( SQ
1c280 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1c290 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72 73  ReadSchema(pPars
1c2a0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
1c2b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 61  ;.  }..  if( pNa
1c2c0 6d 65 31 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 31  me1==0 || pName1
1c2d0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ->z==0 ){.    re
1c2e0 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28 70  indexDatabases(p
1c2f0 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20 72  Parse, 0);.    r
1c300 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
1c310 66 28 20 70 4e 61 6d 65 32 3d 3d 30 20 7c 7c 20  f( pName2==0 || 
1c320 70 4e 61 6d 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a  pName2->z==0 ){.
1c330 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
1c340 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61  .    assert( pNa
1c350 6d 65 31 2d 3e 7a 20 29 3b 0a 20 20 20 20 7a 43  me1->z );.    zC
1c360 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
1c370 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73  eFromToken(pPars
1c380 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  e->db, pName1);.
1c390 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29      if( !zColl )
1c3a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 43 6f   return;.    pCo
1c3b0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
1c3c0 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28  CollSeq(db, ENC(
1c3d0 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 2c 20  db), zColl, -1, 
1c3e0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  0);.    if( pCol
1c3f0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  l ){.      if( z
1c400 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
1c410 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
1c420 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b  (pParse, zColl);
1c430 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1c440 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c  DbFree(db, zColl
1c450 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c460 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1c470 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1c480 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, zColl);.  }
1c490 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
1c4a0 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72  TwoPartName(pPar
1c4b0 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d  se, pName1, pNam
1c4c0 65 32 2c 20 26 70 4f 62 6a 4e 61 6d 65 29 3b 0a  e2, &pObjName);.
1c4d0 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 72 65    if( iDb<0 ) re
1c4e0 74 75 72 6e 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  turn;.  z = sqli
1c4f0 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
1c500 28 64 62 2c 20 70 4f 62 6a 4e 61 6d 65 29 3b 0a  (db, pObjName);.
1c510 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74    if( z==0 ) ret
1c520 75 72 6e 3b 0a 20 20 7a 44 62 20 3d 20 64 62 2d  urn;.  zDb = db-
1c530 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
1c540 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
1c550 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
1c560 2c 20 7a 44 62 29 3b 0a 20 20 69 66 28 20 70 54  , zDb);.  if( pT
1c570 61 62 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65  ab ){.    reinde
1c580 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  xTable(pParse, p
1c590 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  Tab, 0);.    sql
1c5a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1c5b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c5c0 20 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71   }.  pIndex = sq
1c5d0 6c 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64  lite3FindIndex(d
1c5e0 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 73 71  b, z, zDb);.  sq
1c5f0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1c600 7a 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78  z);.  if( pIndex
1c610 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
1c620 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1c630 6f 6e 28 70 50 61 72 73 65 2c 20 30 2c 20 69 44  on(pParse, 0, iD
1c640 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  b);.    sqlite3R
1c650 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
1c660 65 2c 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a  e, pIndex, -1);.
1c670 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1c680 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c690 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62 6c  g(pParse, "unabl
1c6a0 65 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68  e to identify th
1c6b0 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 72  e object to be r
1c6c0 65 69 6e 64 65 78 65 64 22 29 3b 0a 7d 0a 23 65  eindexed");.}.#e
1c6d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
1c6e0 72 6e 20 61 20 64 79 6e 61 6d 69 63 6c 79 20 61  rn a dynamicly a
1c6f0 6c 6c 6f 63 61 74 65 64 20 4b 65 79 49 6e 66 6f  llocated KeyInfo
1c700 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1c710 63 61 6e 20 62 65 20 75 73 65 64 0a 2a 2a 20 77  can be used.** w
1c720 69 74 68 20 4f 50 5f 4f 70 65 6e 52 65 61 64 20  ith OP_OpenRead 
1c730 6f 72 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20  or OP_OpenWrite 
1c740 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 62 61  to access databa
1c750 73 65 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a  se index pIdx..*
1c760 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
1c770 75 6c 2c 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ul, a pointer to
1c780 20 74 68 65 20 6e 65 77 20 73 74 72 75 63 74 75   the new structu
1c790 72 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  re is returned. 
1c7a0 49 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a 20  In this case.** 
1c7b0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
1c7c0 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61  sponsible for ca
1c7d0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  lling sqlite3DbF
1c7e0 72 65 65 28 64 62 2c 20 29 20 6f 6e 20 74 68 65  ree(db, ) on the
1c7f0 20 72 65 74 75 72 6e 65 64 20 0a 2a 2a 20 70 6f   returned .** po
1c800 69 6e 74 65 72 2e 20 49 66 20 61 6e 20 65 72 72  inter. If an err
1c810 6f 72 20 6f 63 63 75 72 73 20 28 6f 75 74 20 6f  or occurs (out o
1c820 66 20 6d 65 6d 6f 72 79 20 6f 72 20 6d 69 73 73  f memory or miss
1c830 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 2a  ing collation .*
1c840 2a 20 73 65 71 75 65 6e 63 65 29 2c 20 4e 55 4c  * sequence), NUL
1c850 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
1c860 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 70  d the state of p
1c870 50 61 72 73 65 20 75 70 64 61 74 65 64 20 74 6f  Parse updated to
1c880 20 72 65 66 6c 65 63 74 0a 2a 2a 20 74 68 65 20   reflect.** the 
1c890 65 72 72 6f 72 2e 0a 2a 2f 0a 4b 65 79 49 6e 66  error..*/.KeyInf
1c8a0 6f 20 2a 73 71 6c 69 74 65 33 49 6e 64 65 78 4b  o *sqlite3IndexK
1c8b0 65 79 69 6e 66 6f 28 50 61 72 73 65 20 2a 70 50  eyinfo(Parse *pP
1c8c0 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64  arse, Index *pId
1c8d0 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  x){.  int i;.  i
1c8e0 6e 74 20 6e 43 6f 6c 20 3d 20 70 49 64 78 2d 3e  nt nCol = pIdx->
1c8f0 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69 6e 74 20 6e  nColumn;.  int n
1c900 42 79 74 65 73 20 3d 20 73 69 7a 65 6f 66 28 4b  Bytes = sizeof(K
1c910 65 79 49 6e 66 6f 29 20 2b 20 28 6e 43 6f 6c 2d  eyInfo) + (nCol-
1c920 31 29 2a 73 69 7a 65 6f 66 28 43 6f 6c 6c 53 65  1)*sizeof(CollSe
1c930 71 2a 29 20 2b 20 6e 43 6f 6c 3b 0a 20 20 73 71  q*) + nCol;.  sq
1c940 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1c950 73 65 2d 3e 64 62 3b 0a 20 20 4b 65 79 49 6e 66  se->db;.  KeyInf
1c960 6f 20 2a 70 4b 65 79 20 3d 20 28 4b 65 79 49 6e  o *pKey = (KeyIn
1c970 66 6f 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  fo *)sqlite3DbMa
1c980 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79  llocZero(db, nBy
1c990 74 65 73 29 3b 0a 0a 20 20 69 66 28 20 70 4b 65  tes);..  if( pKe
1c9a0 79 20 29 7b 0a 20 20 20 20 70 4b 65 79 2d 3e 64  y ){.    pKey->d
1c9b0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1c9c0 20 20 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f      pKey->aSortO
1c9d0 72 64 65 72 20 3d 20 28 75 38 20 2a 29 26 28 70  rder = (u8 *)&(p
1c9e0 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 6e 43 6f 6c 5d  Key->aColl[nCol]
1c9f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 26  );.    assert( &
1ca00 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1ca10 5b 6e 43 6f 6c 5d 3d 3d 26 28 28 28 75 38 20 2a  [nCol]==&(((u8 *
1ca20 29 70 4b 65 79 29 5b 6e 42 79 74 65 73 5d 29 20  )pKey)[nBytes]) 
1ca30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
1ca40 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
1ca50 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20      char *zColl 
1ca60 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69  = pIdx->azColl[i
1ca70 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
1ca80 20 7a 43 6f 6c 6c 20 29 3b 0a 20 20 20 20 20 20   zColl );.      
1ca90 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
1caa0 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f   sqlite3LocateCo
1cab0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43  llSeq(pParse, zC
1cac0 6f 6c 6c 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  oll, -1);.      
1cad0 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pKey->aSortOrder
1cae0 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72  [i] = pIdx->aSor
1caf0 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d  tOrder[i];.    }
1cb00 0a 20 20 20 20 70 4b 65 79 2d 3e 6e 46 69 65 6c  .    pKey->nFiel
1cb10 64 20 3d 20 28 75 31 36 29 6e 43 6f 6c 3b 0a 20  d = (u16)nCol;. 
1cb20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65   }..  if( pParse
1cb30 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71  ->nErr ){.    sq
1cb40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cb50 70 4b 65 79 29 3b 0a 20 20 20 20 70 4b 65 79 20  pKey);.    pKey 
1cb60 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1cb70 6e 20 70 4b 65 79 3b 0a 7d 0a                    n pKey;.}.