/ Hex Artifact Content
Login

Artifact 894dc1b8fba81acce54133fd69a40e609248eb38:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43 20 63  ile contains C c
0190: 6f 64 65 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ode routines tha
01a0: 74 20 61 72 65 20 63 61 6c 6c 65 64 20 62 79 20  t are called by 
01b0: 74 68 65 20 53 51 4c 69 74 65 20 70 61 72 73 65  the SQLite parse
01c0: 72 0a 2a 2a 20 77 68 65 6e 20 73 79 6e 74 61 78  r.** when syntax
01d0: 20 72 75 6c 65 73 20 61 72 65 20 72 65 64 75 63   rules are reduc
01e0: 65 64 2e 20 20 54 68 65 20 72 6f 75 74 69 6e 65  ed.  The routine
01f0: 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68  s in this file h
0200: 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 66 6f 6c  andle the.** fol
0210: 6c 6f 77 69 6e 67 20 6b 69 6e 64 73 20 6f 66 20  lowing kinds of 
0220: 53 51 4c 20 73 79 6e 74 61 78 3a 0a 2a 2a 0a 2a  SQL syntax:.**.*
0230: 2a 20 20 20 20 20 43 52 45 41 54 45 20 54 41 42  *     CREATE TAB
0240: 4c 45 0a 2a 2a 20 20 20 20 20 44 52 4f 50 20 54  LE.**     DROP T
0250: 41 42 4c 45 0a 2a 2a 20 20 20 20 20 43 52 45 41  ABLE.**     CREA
0260: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 20  TE INDEX.**     
0270: 44 52 4f 50 20 49 4e 44 45 58 0a 2a 2a 20 20 20  DROP INDEX.**   
0280: 20 20 63 72 65 61 74 69 6e 67 20 49 44 20 6c 69    creating ID li
0290: 73 74 73 0a 2a 2a 20 20 20 20 20 42 45 47 49 4e  sts.**     BEGIN
02a0: 20 54 52 41 4e 53 41 43 54 49 4f 4e 0a 2a 2a 20   TRANSACTION.** 
02b0: 20 20 20 20 43 4f 4d 4d 49 54 0a 2a 2a 20 20 20      COMMIT.**   
02c0: 20 20 52 4f 4c 4c 42 41 43 4b 0a 2a 2a 0a 2a 2a    ROLLBACK.**.**
02d0: 20 24 49 64 3a 20 62 75 69 6c 64 2e 63 2c 76 20   $Id: build.c,v 
02e0: 31 2e 35 33 35 20 32 30 30 39 2f 30 35 2f 30 33  1.535 2009/05/03
02f0: 20 32 30 3a 32 33 3a 35 33 20 64 72 68 20 45 78   20:23:53 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0320: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0330: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
0340: 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74 65   a new SQL state
0350: 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69 6e  ment is beginnin
0360: 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73 65  g to.** be parse
0370: 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  d.  Initialize t
0380: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
0390: 75 72 65 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ure as needed..*
03a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
03b0: 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20 2a  ginParse(Parse *
03c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70 6c  pParse, int expl
03d0: 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70 50 61 72  ainFlag){.  pPar
03e0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 28 75  se->explain = (u
03f0: 38 29 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20  8)explainFlag;. 
0400: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
0410: 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
0420: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0430: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0440: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0450: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0460: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0470: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0480: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0490: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
04a0: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
04b0: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
04d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
04e0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
04f0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0500: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
0510: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
0520: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0530: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0540: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0550: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0560: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0570: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0580: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
05a0: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
05b0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
05c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
05d0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
05e0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
05f0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
0600: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
0610: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0620: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0630: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0640: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0650: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0660: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0670: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0680: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0690: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
06a0: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
06b0: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
06c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
06d0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
06e0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
06f0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
0700: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
0710: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
0720: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0730: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0740: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0750: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0760: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0770: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0780: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0790: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
07a0: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
07b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
07c0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
07d0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
07e0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
07f0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
0800: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
0810: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
0820: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0830: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0840: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0850: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0860: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0870: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0880: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0890: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
08a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
08b0: 42 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f  Bytes;.  TableLo
08c0: 63 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 69 44  ck *p;..  if( iD
08d0: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
08e0: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
08f0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0900: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0910: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0920: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0930: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0940: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0950: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
0960: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
0970: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
0980: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
0990: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09a0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09b0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
09c0: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
09d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
09e0: 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
09f0: 6f 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c  ock = .      sql
0a00: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
0a10: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
0a20: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a30: 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69  ck, nBytes);.  i
0a40: 66 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  f( pParse->aTabl
0a50: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d  eLock ){.    p =
0a60: 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65   &pParse->aTable
0a70: 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61  Lock[pParse->nTa
0a80: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a90: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0aa0: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0ab0: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0ac0: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0ad0: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ck;.    p->zName
0ae0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73   = zName;.  }els
0af0: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e{.    pParse->n
0b00: 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  TableLock = 0;. 
0b10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
0b20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
0b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0b40: 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f  de an OP_TableLo
0b50: 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ck instruction f
0b60: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f  or each table lo
0b70: 63 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  cked by the.** s
0b80: 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67  tatement (config
0b90: 75 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ured by calls to
0ba0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0bb0: 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  k())..*/.static 
0bc0: 76 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f  void codeTableLo
0bd0: 63 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  cks(Parse *pPars
0be0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  e){.  int i;.  V
0bf0: 64 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20  dbe *pVdbe; ..  
0c00: 69 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20  if( 0==(pVdbe = 
0c10: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
0c20: 50 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72  Parse)) ){.    r
0c30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
0c40: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
0c50: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b  >nTableLock; i++
0c60: 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b  ){.    TableLock
0c70: 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
0c80: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0c90: 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44    int p1 = p->iD
0ca0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  b;.    sqlite3Vd
0cb0: 62 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20  beAddOp4(pVdbe, 
0cc0: 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31  OP_TableLock, p1
0cd0: 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73  , p->iTab, p->is
0ce0: 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  WriteLock,.     
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54   p->zName, P4_ST
0d10: 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ATIC);.  }.}.#el
0d20: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64  se.  #define cod
0d30: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23  eTableLocks(x).#
0d40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
0d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0d60: 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67  led after a sing
0d70: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
0d80: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72   has been.** par
0d90: 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70  sed and a VDBE p
0da0: 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
0db0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
0dc0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65   has been.** pre
0dd0: 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75  pared.  This rou
0de0: 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69  tine puts the fi
0df0: 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20  nishing touches 
0e00: 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  on the.** VDBE p
0e10: 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74  rogram and reset
0e20: 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  s the pParse str
0e30: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e  ucture for the n
0e40: 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a  ext.** parse..**
0e50: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0e60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0e70: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0e80: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0e90: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0ea0: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
0ec0: 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a  shCoding(Parse *
0ed0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0ee0: 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
0ef0: 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  v;..  db = pPars
0f00: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
0f10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
0f20: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f30: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0f40: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f50: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
0f60: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  rn;..  /* Begin 
0f70: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
0f80: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
0f90: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
0fa0: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
0fb0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 76  program.  */.  v
0fc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
0fd0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
0fe0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
0ff0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1000: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
1010: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
1020: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
1030: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1040: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1050: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1060: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1070: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1080: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1090: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
10a0: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
10b0: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
10c0: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
10d0: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
10e0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
10f0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1100: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
1110: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
1120: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
1130: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1140: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1150: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1160: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
1170: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
1180: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
1190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11a0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
11b0: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
11c0: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
11d0: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
11e0: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
11f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1200: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1210: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
1220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1240: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
1250: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1260: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f  VdbeAddOp2(v,OP_
1270: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
1280: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
1290: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
12a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
12b0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
12f0: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
1300: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
1310: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1320: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1330: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1340: 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BLE.      {.    
1350: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1360: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
1370: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b  arse->nVtabLock;
1380: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1390: 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63   char *vtab = (c
13a0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 61 70  har *)pParse->ap
13b0: 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d 3e 70 56 74  VtabLock[i]->pVt
13c0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ab;.          sq
13d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13e0: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
13f0: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1400: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 20 20 7d  VTAB);.        }
1410: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1420: 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a  >nVtabLock = 0;.
1430: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1440: 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c        /* Once al
1450: 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61  l the cookies ha
1460: 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  ve been verified
1470: 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   and transaction
1480: 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20  s opened, .     
1490: 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72   ** obtain the r
14a0: 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f  equired table-lo
14b0: 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e  cks. This is a n
14c0: 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20  o-op unless the 
14d0: 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64  .      ** shared
14e0: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
14f0: 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20  s enabled..     
1500: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61   */.      codeTa
1510: 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29  bleLocks(pParse)
1520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1530: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1540: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
1550: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20  >cookieGoto);.  
1560: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47    }.  }...  /* G
1570: 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  et the VDBE prog
1580: 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78  ram ready for ex
1590: 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69  ecution.  */.  i
15a0: 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e  f( v && pParse->
15b0: 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e  nErr==0 && !db->
15c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
15e0: 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72  BUG.    FILE *tr
15f0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
1600: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
1610: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
1620: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
1630: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
1640: 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ace);.#endif.   
1650: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1660: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20  >iCacheLevel==0 
1670: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1680: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1690: 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71 6c 69  atch */.    sqli
16a0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
16b0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
16c0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a  , pParse->nMem,.
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
16f0: 3e 6e 54 61 62 2c 20 70 50 61 72 73 65 2d 3e 65  >nTab, pParse->e
1700: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
1710: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1720: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
1730: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
1740: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1750: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
1760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
1770: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1780: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
1790: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
17a0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
17b0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
17c0: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
17d0: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50  ->nVar = 0;.  pP
17e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
17f0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1800: 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a  cookieGoto = 0;.
1810: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1820: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1830: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1840: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1850: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1860: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1870: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1880: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1890: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
18a0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
18b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18c0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
18d0: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
18e0: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
18f0: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1900: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1910: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1920: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1930: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1940: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1950: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1960: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1970: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1980: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1990: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
19a0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
19b0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
19c0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
19d0: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
19e0: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
19f0: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1a00: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1a10: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1a20: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1a30: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1a40: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1a50: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1a60: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1a70: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1a80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1a90: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1aa0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1ab0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ac0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1ad0: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
1ae0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1af0: 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  >db;.# define SA
1b00: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1b10: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1b20: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1b30: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1b40: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1b50: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1b60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1b70: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1b80: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1b90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1ba0: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1bb0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1bc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1bd0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1be0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
1bf0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1c00: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1c10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c20: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1c30: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c40: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1c50: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1c60: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1c70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1c80: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1c90: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1ca0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1cb0: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1cc0: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
1cd0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1ce0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1cf0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1d00: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
1d10: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1d20: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1d30: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1d40: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1d60: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1d70: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1d80: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1d90: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1da0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1db0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1dc0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1dd0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1de0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1df0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1e00: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1e10: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1e30: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1e40: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1e50: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1e60: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1e70: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1e80: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1e90: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1ea0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1eb0: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1ec0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1ed0: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1ee0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1ef0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1f00: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1f10: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1f20: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1f30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1f40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1f50: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
1f60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1f70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1f80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1fa0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
1fb0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1fc0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
1fd0: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1fe0: 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  0 );.  nName = s
1ff0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2000: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
2010: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2020: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
2030: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
2040: 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53   i^1 : i;   /* S
2050: 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72  earch TEMP befor
2060: 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66  e MAIN */.    if
2070: 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26  ( zDatabase!=0 &
2080: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2090: 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e  (zDatabase, db->
20a0: 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20  aDb[j].zName) ) 
20b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 20  continue;.    p 
20c0: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e  = sqlite3HashFin
20d0: 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53  d(&db->aDb[j].pS
20e0: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20  chema->tblHash, 
20f0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
2100: 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61 6b     if( p ) break
2110: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
2130: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2140: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64  structure that d
2150: 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74 69  escribes a parti
2160: 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a  cular database.*
2170: 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68  * table given th
2180: 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74  e name of that t
2190: 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e  able and (option
21a0: 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f  ally) the name o
21b0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
21c0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
21d0: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
21e0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
21f0: 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65 20 61  d.  Also leave a
2200: 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  n.** error messa
2210: 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ge in pParse->zE
2220: 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rrMsg..**.** The
2230: 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
2240: 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
2250: 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69 6e 64   and sqlite3Find
2260: 54 61 62 6c 65 28 29 20 69 73 20 74 68 61 74 20  Table() is that 
2270: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2280: 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20  leaves an error 
2290: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
22a0: 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65 72 65  e->zErrMsg where
22b0: 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e 64 54  .** sqlite3FindT
22c0: 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f 74 2e  able() does not.
22d0: 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c 69 74  .*/.Table *sqlit
22e0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 0a 20  e3LocateTable(. 
22f0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
2300: 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e 74 65          /* conte
2310: 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72  xt in which to r
2320: 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a 2f 0a  eport errors */.
2330: 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20    int isView,   
2340: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2350: 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20   if looking for 
2360: 61 20 56 49 45 57 20 72 61 74 68 65 72 20 74 68  a VIEW rather th
2370: 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a 20 20  an a TABLE */.  
2380: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2390: 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  e,     /* Name o
23a0: 66 20 74 68 65 20 74 61 62 6c 65 20 77 65 20 61  f the table we a
23b0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 2a  re looking for *
23c0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23d0: 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20 4e 61  zDbase     /* Na
23e0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
23f0: 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55  se.  Might be NU
2400: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  LL */.){.  Table
2410: 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20   *p;..  /* Read 
2420: 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68  the database sch
2430: 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ema. If an error
2440: 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61   occurs, leave a
2450: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
2460: 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e    ** and code in
2470: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
2480: 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66  rn NULL. */.  if
2490: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
24a0: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
24b0: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72 65  Parse) ){.    re
24c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  turn 0;.  }..  p
24d0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
24e0: 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
24f0: 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29 3b 0a  zName, zDbase);.
2500: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
2510: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d    const char *zM
2520: 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20 22 6e  sg = isView ? "n
2530: 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a 20 22  o such view" : "
2540: 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22 3b 0a  no such table";.
2550: 20 20 20 20 69 66 28 20 7a 44 62 61 73 65 20 29      if( zDbase )
2560: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2570: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2580: 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 4d 73  "%s: %s.%s", zMs
2590: 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61 6d 65  g, zDbase, zName
25a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25b0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
25c0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
25d0: 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e 61 6d   %s", zMsg, zNam
25e0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  e);.    }.    pP
25f0: 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d  arse->checkSchem
2600: 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 1;.  }.  ret
2610: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
2620: 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  Locate the in-me
2630: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 20 74  mory structure t
2640: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 0a 2a  hat describes .*
2650: 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  * a particular i
2660: 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65 20 6e  ndex given the n
2670: 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e 64 65  ame of that inde
2680: 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 61 6d  x.** and the nam
2690: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
26a0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
26b0: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 52 65  the index..** Re
26c0: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  turn NULL if not
26d0: 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   found..**.** If
26e0: 20 7a 44 61 74 61 62 61 73 65 20 69 73 20 30 2c   zDatabase is 0,
26f0: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 61   all databases a
2700: 72 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  re searched for 
2710: 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61 6e 64  the.** table and
2720: 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63 68   the first match
2730: 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72 65 74  ing index is ret
2740: 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68 65 63  urned.  (No chec
2750: 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75 70 6c  king.** for dupl
2760: 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61 6d 65  icate index name
2770: 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54 68 65  s is done.)  The
2780: 20 73 65 61 72 63 68 20 6f 72 64 65 72 20 69 73   search order is
2790: 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74 2c 20  .** TEMP first, 
27a0: 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65 6e 20  then MAIN, then 
27b0: 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20 64 61  any auxiliary da
27c0: 74 61 62 61 73 65 73 20 61 64 64 65 64 0a 2a 2a  tabases added.**
27d0: 20 75 73 69 6e 67 20 74 68 65 20 41 54 54 41 43   using the ATTAC
27e0: 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 49 6e  H command..*/.In
27f0: 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69 6e 64  dex *sqlite3Find
2800: 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20 2a 64  Index(sqlite3 *d
2810: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
2820: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
2830: 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65 78 20   *zDb){.  Index 
2840: 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  *p = 0;.  int i;
2850: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
2860: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2870: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 4f  Name);.  for(i=O
2880: 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62  MIT_TEMPDB; i<db
2890: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
28a0: 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f   int j = (i<2) ?
28b0: 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20 53 65   i^1 : i;  /* Se
28c0: 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65  arch TEMP before
28d0: 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53 63 68   MAIN */.    Sch
28e0: 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 64  ema *pSchema = d
28f0: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68 65 6d  b->aDb[j].pSchem
2900: 61 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 26  a;.    if( zDb &
2910: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
2920: 28 7a 44 62 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d  (zDb, db->aDb[j]
2930: 2e 7a 4e 61 6d 65 29 20 29 20 63 6f 6e 74 69 6e  .zName) ) contin
2940: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
2950: 70 53 63 68 65 6d 61 20 7c 7c 20 28 6a 3d 3d 31  pSchema || (j==1
2960: 20 26 26 20 21 64 62 2d 3e 61 44 62 5b 31 5d 2e   && !db->aDb[1].
2970: 70 42 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  pBt) );.    if( 
2980: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
2990: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
29a0: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
29b0: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 6e  dxHash, zName, n
29c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
29d0: 20 69 66 28 20 70 20 29 20 62 72 65 61 6b 3b 0a   if( p ) break;.
29e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
29f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c 61 69 6d  }../*.** Reclaim
2a00: 20 74 68 65 20 6d 65 6d 6f 72 79 20 75 73 65 64   the memory used
2a10: 20 62 79 20 61 6e 20 69 6e 64 65 78 0a 2a 2f 0a   by an index.*/.
2a20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
2a30: 49 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b  Index(Index *p){
2a40: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2a50: 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 64 62 4d 65   p->pTable->dbMe
2a60: 6d 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  m;.  sqlite3DbFr
2a70: 65 65 28 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66  ee(db, p->zColAf
2a80: 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  f);.  sqlite3DbF
2a90: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
2aa0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
2ab0: 67 69 76 65 6e 20 69 6e 64 65 78 20 66 72 6f 6d  given index from
2ac0: 20 74 68 65 20 69 6e 64 65 78 20 68 61 73 68 20   the index hash 
2ad0: 74 61 62 6c 65 2c 20 61 6e 64 20 66 72 65 65 0a  table, and free.
2ae0: 2a 2a 20 69 74 73 20 6d 65 6d 6f 72 79 20 73 74  ** its memory st
2af0: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  ructures..**.** 
2b00: 54 68 65 20 69 6e 64 65 78 20 69 73 20 72 65 6d  The index is rem
2b10: 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  oved from the da
2b20: 74 61 62 61 73 65 20 68 61 73 68 20 74 61 62 6c  tabase hash tabl
2b30: 65 73 20 62 75 74 0a 2a 2a 20 69 74 20 69 73 20  es but.** it is 
2b40: 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64 20 66 72 6f  not unlinked fro
2b50: 6d 20 74 68 65 20 54 61 62 6c 65 20 74 68 61 74  m the Table that
2b60: 20 69 74 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20   it indexes..** 
2b70: 55 6e 6c 69 6e 6b 69 6e 67 20 66 72 6f 6d 20 74  Unlinking from t
2b80: 68 65 20 54 61 62 6c 65 20 6d 75 73 74 20 62 65  he Table must be
2b90: 20 64 6f 6e 65 20 62 79 20 74 68 65 20 63 61 6c   done by the cal
2ba0: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
2bb0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
2bc0: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
2bd0: 28 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 49 6e  (Index *p){.  In
2be0: 64 65 78 20 2a 70 4f 6c 64 3b 0a 20 20 63 6f 6e  dex *pOld;.  con
2bf0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
2c00: 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 70 4f   p->zName;..  pO
2c10: 6c 64 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ld = sqlite3Hash
2c20: 49 6e 73 65 72 74 28 26 70 2d 3e 70 53 63 68 65  Insert(&p->pSche
2c30: 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61  ma->idxHash, zNa
2c40: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2c60: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
2c70: 4e 61 6d 65 29 2c 20 30 29 3b 0a 20 20 61 73 73  Name), 0);.  ass
2c80: 65 72 74 28 20 70 4f 6c 64 3d 3d 30 20 7c 7c 20  ert( pOld==0 || 
2c90: 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20 20 66 72 65  pOld==p );.  fre
2ca0: 65 49 6e 64 65 78 28 70 29 3b 0a 7d 0a 0a 2f 2a  eIndex(p);.}../*
2cb0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65  .** For the inde
2cc0: 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d  x called zIdxNam
2cd0: 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64  e which is found
2ce0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cf0: 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20   iDb,.** unlike 
2d00: 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20  that index from 
2d10: 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72  its Table then r
2d20: 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20  emove the index 
2d30: 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65  from.** the inde
2d40: 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64  x hash table and
2d50: 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   free all memory
2d60: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
2d70: 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
2d80: 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69  he index..*/.voi
2d90: 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41  d sqlite3UnlinkA
2da0: 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71  ndDeleteIndex(sq
2db0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69  lite3 *db, int i
2dc0: 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Db, const char *
2dd0: 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64  zIdxName){.  Ind
2de0: 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 69 6e  ex *pIndex;.  in
2df0: 74 20 6c 65 6e 3b 0a 20 20 48 61 73 68 20 2a 70  t len;.  Hash *p
2e00: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
2e10: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
2e20: 78 48 61 73 68 3b 0a 0a 20 20 6c 65 6e 20 3d 20  xHash;..  len = 
2e30: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2e40: 7a 49 64 78 4e 61 6d 65 29 3b 0a 20 20 70 49 6e  zIdxName);.  pIn
2e50: 64 65 78 20 3d 20 73 71 6c 69 74 65 33 48 61 73  dex = sqlite3Has
2e60: 68 49 6e 73 65 72 74 28 70 48 61 73 68 2c 20 7a  hInsert(pHash, z
2e70: 49 64 78 4e 61 6d 65 2c 20 6c 65 6e 2c 20 30 29  IdxName, len, 0)
2e80: 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29  ;.  if( pIndex )
2e90: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  {.    if( pIndex
2ea0: 2d 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78  ->pTable->pIndex
2eb0: 3d 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ==pIndex ){.    
2ec0: 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65    pIndex->pTable
2ed0: 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65  ->pIndex = pInde
2ee0: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  x->pNext;.    }e
2ef0: 6c 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78  lse{.      Index
2f00: 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70   *p;.      for(p
2f10: 3d 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d  =pIndex->pTable-
2f20: 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20 70 2d  >pIndex; p && p-
2f30: 3e 70 4e 65 78 74 21 3d 70 49 6e 64 65 78 3b 20  >pNext!=pIndex; 
2f40: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  p=p->pNext){}.  
2f50: 20 20 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e      if( p && p->
2f60: 70 4e 65 78 74 3d 3d 70 49 6e 64 65 78 20 29 7b  pNext==pIndex ){
2f70: 0a 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  .        p->pNex
2f80: 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78  t = pIndex->pNex
2f90: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2fa0: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 70  .    freeIndex(p
2fb0: 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62  Index);.  }.  db
2fc0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
2fd0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
2fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2ff0: 61 6c 6c 20 73 63 68 65 6d 61 20 69 6e 66 6f 72  all schema infor
3000: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
3010: 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
3020: 61 62 6c 65 73 20 6f 66 0a 2a 2a 20 61 20 73 69  ables of.** a si
3030: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 2e 20 20  ngle database.  
3040: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3050: 63 61 6c 6c 65 64 20 74 6f 20 72 65 63 6c 61 69  called to reclai
3060: 6d 20 6d 65 6d 6f 72 79 0a 2a 2a 20 62 65 66 6f  m memory.** befo
3070: 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
3080: 63 6c 6f 73 65 73 2e 20 20 49 74 20 69 73 20 61  closes.  It is a
3090: 6c 73 6f 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  lso called durin
30a0: 67 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20  g a rollback.** 
30b0: 69 66 20 74 68 65 72 65 20 77 65 72 65 20 73 63  if there were sc
30c0: 68 65 6d 61 20 63 68 61 6e 67 65 73 20 64 75 72  hema changes dur
30d0: 69 6e 67 20 74 68 65 20 74 72 61 6e 73 61 63 74  ing the transact
30e0: 69 6f 6e 20 6f 72 20 69 66 20 61 0a 2a 2a 20 73  ion or if a.** s
30f0: 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 6d 69 73  chema-cookie mis
3100: 6d 61 74 63 68 20 6f 63 63 75 72 73 2e 0a 2a 2a  match occurs..**
3110: 0a 2a 2a 20 49 66 20 69 44 62 3d 3d 30 20 74 68  .** If iDb==0 th
3120: 65 6e 20 72 65 73 65 74 20 74 68 65 20 69 6e 74  en reset the int
3130: 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 74 61 62  ernal schema tab
3140: 6c 65 73 20 66 6f 72 20 61 6c 6c 20 64 61 74 61  les for all data
3150: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 73 2e 20 20  base.** files.  
3160: 49 66 20 69 44 62 3e 3d 31 20 74 68 65 6e 20 72  If iDb>=1 then r
3170: 65 73 65 74 20 74 68 65 20 69 6e 74 65 72 6e 61  eset the interna
3180: 6c 20 73 63 68 65 6d 61 20 66 6f 72 20 6f 6e 6c  l schema for onl
3190: 79 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  y the.** single 
31a0: 66 69 6c 65 20 69 6e 64 69 63 61 74 65 64 2e 0a  file indicated..
31b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
31c0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
31d0: 6d 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ma(sqlite3 *db, 
31e0: 69 6e 74 20 69 44 62 29 7b 0a 20 20 69 6e 74 20  int iDb){.  int 
31f0: 69 2c 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  i, j;.  assert( 
3200: 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62  iDb>=0 && iDb<db
3210: 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 69 66 28 20  ->nDb );..  if( 
3220: 69 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  iDb==0 ){.    sq
3230: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
3240: 6c 6c 28 64 62 29 3b 0a 20 20 7d 0a 20 20 66 6f  ll(db);.  }.  fo
3250: 72 28 69 3d 69 44 62 3b 20 69 3c 64 62 2d 3e 6e  r(i=iDb; i<db->n
3260: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62  Db; i++){.    Db
3270: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3280: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3290: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
32a0: 20 20 20 61 73 73 65 72 74 28 69 3d 3d 31 20 7c     assert(i==1 |
32b0: 7c 20 28 70 44 62 2d 3e 70 42 74 20 26 26 20 73  | (pDb->pBt && s
32c0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
32d0: 4d 75 74 65 78 28 70 44 62 2d 3e 70 42 74 29 29  Mutex(pDb->pBt))
32e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32f0: 53 63 68 65 6d 61 46 72 65 65 28 70 44 62 2d 3e  SchemaFree(pDb->
3300: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
3310: 20 20 20 20 69 66 28 20 69 44 62 3e 30 20 29 20      if( iDb>0 ) 
3320: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
3330: 73 65 72 74 28 20 69 44 62 3d 3d 30 20 29 3b 0a  sert( iDb==0 );.
3340: 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
3350: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
3360: 6e 67 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 42  nges;.  sqlite3B
3370: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
3380: 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 6f  ;..  /* If one o
3390: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 61 75  r more of the au
33a0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
33b0: 20 66 69 6c 65 73 20 68 61 73 20 62 65 65 6e 20   files has been 
33c0: 63 6c 6f 73 65 64 2c 0a 20 20 2a 2a 20 74 68 65  closed,.  ** the
33d0: 6e 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  n remove them fr
33e0: 6f 6d 20 74 68 65 20 61 75 78 69 6c 69 61 72 79  om the auxiliary
33f0: 20 64 61 74 61 62 61 73 65 20 6c 69 73 74 2e 20   database list. 
3400: 20 57 65 20 74 61 6b 65 20 74 68 65 0a 20 20 2a   We take the.  *
3410: 2a 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  * opportunity to
3420: 20 64 6f 20 74 68 69 73 20 68 65 72 65 20 73 69   do this here si
3430: 6e 63 65 20 77 65 20 68 61 76 65 20 6a 75 73 74  nce we have just
3440: 20 64 65 6c 65 74 65 64 20 61 6c 6c 20 6f 66 20   deleted all of 
3450: 74 68 65 0a 20 20 2a 2a 20 73 63 68 65 6d 61 20  the.  ** schema 
3460: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3470: 74 68 65 72 65 66 6f 72 65 20 64 6f 20 6e 6f 74  therefore do not
3480: 20 68 61 76 65 20 74 6f 20 6d 61 6b 65 20 61 6e   have to make an
3490: 79 20 63 68 61 6e 67 65 73 0a 20 20 2a 2a 20 74  y changes.  ** t
34a0: 6f 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20 74  o any of those t
34b0: 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ables..  */.  fo
34c0: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
34d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
34e0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
34f0: 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
3500: 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b  ( pDb->pBt==0 ){
3510: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
3520: 70 41 75 78 20 26 26 20 70 44 62 2d 3e 78 46 72  pAux && pDb->xFr
3530: 65 65 41 75 78 20 29 20 70 44 62 2d 3e 78 46 72  eeAux ) pDb->xFr
3540: 65 65 41 75 78 28 70 44 62 2d 3e 70 41 75 78 29  eeAux(pDb->pAux)
3550: 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 41 75  ;.      pDb->pAu
3560: 78 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  x = 0;.    }.  }
3570: 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69 3c  .  for(i=j=2; i<
3580: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3590: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
35a0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b  b = &db->aDb[i];
35b0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
35c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  t==0 ){.      sq
35d0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
35e0: 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  pDb->zName);.   
35f0: 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d 20     pDb->zName = 
3600: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3610: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
3620: 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64 62   j<i ){.      db
3630: 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e 61  ->aDb[j] = db->a
3640: 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Db[i];.    }.   
3650: 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73   j++;.  }.  mems
3660: 65 74 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2c 20  et(&db->aDb[j], 
3670: 30 2c 20 28 64 62 2d 3e 6e 44 62 2d 6a 29 2a 73  0, (db->nDb-j)*s
3680: 69 7a 65 6f 66 28 64 62 2d 3e 61 44 62 5b 6a 5d  izeof(db->aDb[j]
3690: 29 29 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20  ));.  db->nDb = 
36a0: 6a 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6e 44 62  j;.  if( db->nDb
36b0: 3c 3d 32 20 26 26 20 64 62 2d 3e 61 44 62 21 3d  <=2 && db->aDb!=
36c0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 7b  db->aDbStatic ){
36d0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  .    memcpy(db->
36e0: 61 44 62 53 74 61 74 69 63 2c 20 64 62 2d 3e 61  aDbStatic, db->a
36f0: 44 62 2c 20 32 2a 73 69 7a 65 6f 66 28 64 62 2d  Db, 2*sizeof(db-
3700: 3e 61 44 62 5b 30 5d 29 29 3b 0a 20 20 20 20 73  >aDb[0]));.    s
3710: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3720: 20 64 62 2d 3e 61 44 62 29 3b 0a 20 20 20 20 64   db->aDb);.    d
3730: 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
3740: 53 74 61 74 69 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Static;.  }.}../
3750: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3760: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
3770: 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72 73   a commit occurs
3780: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3790: 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43  3CommitInternalC
37a0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
37b0: 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  db){.  db->flags
37c0: 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74 65   &= ~SQLITE_Inte
37d0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
37e0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 6f  .** Clear the co
37f0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f 6d 20  lumn names from 
3800: 61 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 2e  a table or view.
3810: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
3820: 73 71 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d  sqliteResetColum
3830: 6e 4e 61 6d 65 73 28 54 61 62 6c 65 20 2a 70 54  nNames(Table *pT
3840: 61 62 6c 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  able){.  int i;.
3850: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
3860: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3870: 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a 20  pTable->dbMem;. 
3880: 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 21   assert( pTable!
3890: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 43 6f  =0 );.  if( (pCo
38a0: 6c 20 3d 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  l = pTable->aCol
38b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )!=0 ){.    for(
38c0: 69 3d 30 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e  i=0; i<pTable->n
38d0: 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; i++, pCol++
38e0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
38f0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
3900: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  >zName);.      s
3910: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3920: 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74  (db, pCol->pDflt
3930: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3940: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
3950: 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73  >zType);.      s
3960: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3970: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20   pCol->zColl);. 
3980: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3990: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
39a0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 20 20  e->aCol);.  }.  
39b0: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 20 3d 20 30  pTable->aCol = 0
39c0: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ;.  pTable->nCol
39d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = 0;.}../*.** R
39e0: 65 6d 6f 76 65 20 74 68 65 20 6d 65 6d 6f 72 79  emove the memory
39f0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
3a00: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3a10: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 54 61   the given.** Ta
3a20: 62 6c 65 2e 20 20 4e 6f 20 63 68 61 6e 67 65 73  ble.  No changes
3a30: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 64 69 73   are made to dis
3a40: 6b 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  k by this routin
3a50: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
3a60: 75 74 69 6e 65 20 6a 75 73 74 20 64 65 6c 65 74  utine just delet
3a70: 65 73 20 74 68 65 20 64 61 74 61 20 73 74 72 75  es the data stru
3a80: 63 74 75 72 65 2e 20 20 49 74 20 64 6f 65 73 20  cture.  It does 
3a90: 6e 6f 74 20 75 6e 6c 69 6e 6b 0a 2a 2a 20 74 68  not unlink.** th
3aa0: 65 20 74 61 62 6c 65 20 64 61 74 61 20 73 74 72  e table data str
3ab0: 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
3ac0: 68 61 73 68 20 74 61 62 6c 65 2e 20 20 42 75 74  hash table.  But
3ad0: 20 69 74 20 64 6f 65 73 20 64 65 73 74 72 6f 79   it does destroy
3ae0: 0a 2a 2a 20 6d 65 6d 6f 72 79 20 73 74 72 75 63  .** memory struc
3af0: 74 75 72 65 73 20 6f 66 20 74 68 65 20 69 6e 64  tures of the ind
3b00: 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e  ices and foreign
3b10: 20 6b 65 79 73 20 61 73 73 6f 63 69 61 74 65 64   keys associated
3b20: 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 74 61   with .** the ta
3b30: 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ble..*/.void sql
3b40: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
3b50: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
3b60: 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c    Index *pIndex,
3b70: 20 2a 70 4e 65 78 74 3b 0a 20 20 46 4b 65 79 20   *pNext;.  FKey 
3b80: 2a 70 46 4b 65 79 2c 20 2a 70 4e 65 78 74 46 4b  *pFKey, *pNextFK
3b90: 65 79 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ey;.  sqlite3 *d
3ba0: 62 3b 0a 0a 20 20 69 66 28 20 70 54 61 62 6c 65  b;..  if( pTable
3bb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
3bc0: 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62 4d  db = pTable->dbM
3bd0: 65 6d 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74  em;..  /* Do not
3be0: 20 64 65 6c 65 74 65 20 74 68 65 20 74 61 62 6c   delete the tabl
3bf0: 65 20 75 6e 74 69 6c 20 74 68 65 20 72 65 66 65  e until the refe
3c00: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
3c10: 68 65 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70  hes zero. */.  p
3c20: 54 61 62 6c 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Table->nRef--;. 
3c30: 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 52 65   if( pTable->nRe
3c40: 66 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  f>0 ){.    retur
3c50: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
3c60: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30   pTable->nRef==0
3c70: 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65   );..  /* Delete
3c80: 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 61 73 73   all indices ass
3c90: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
3ca0: 73 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 66  s table.  */.  f
3cb0: 6f 72 28 70 49 6e 64 65 78 20 3d 20 70 54 61 62  or(pIndex = pTab
3cc0: 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64  le->pIndex; pInd
3cd0: 65 78 3b 20 70 49 6e 64 65 78 3d 70 4e 65 78 74  ex; pIndex=pNext
3ce0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
3cf0: 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  Index->pNext;.  
3d00: 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
3d10: 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 6c  ->pSchema==pTabl
3d20: 65 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  e->pSchema );.  
3d30: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49    sqlite3DeleteI
3d40: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
3d50: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
3d60: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
3d70: 45 59 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61  EY.  /* Delete a
3d80: 6c 6c 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  ll foreign keys 
3d90: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
3da0: 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  this table. */. 
3db0: 20 66 6f 72 28 70 46 4b 65 79 3d 70 54 61 62 6c   for(pFKey=pTabl
3dc0: 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79 3b  e->pFKey; pFKey;
3dd0: 20 70 46 4b 65 79 3d 70 4e 65 78 74 46 4b 65 79   pFKey=pNextFKey
3de0: 29 7b 0a 20 20 20 20 70 4e 65 78 74 46 4b 65 79  ){.    pNextFKey
3df0: 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46   = pFKey->pNextF
3e00: 72 6f 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  rom;.    sqlite3
3e10: 44 62 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79  DbFree(db, pFKey
3e20: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
3e30: 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 54   /* Delete the T
3e40: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  able structure i
3e50: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 73 71  tself..  */.  sq
3e60: 6c 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e  liteResetColumnN
3e70: 61 6d 65 73 28 70 54 61 62 6c 65 29 3b 0a 20 20  ames(pTable);.  
3e80: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
3e90: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
3ea0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
3eb0: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
3ec0: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
3ed0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
3ee0: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
3ef0: 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t);.#ifndef SQLI
3f00: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
3f10: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3f20: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 43  e(db, pTable->pC
3f30: 68 65 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 20 20  heck);.#endif.  
3f40: 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61 72  sqlite3VtabClear
3f50: 28 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69  (pTable);.  sqli
3f60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
3f70: 61 62 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  able);.}../*.** 
3f80: 55 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e  Unlink the given
3f90: 20 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20   table from the 
3fa0: 68 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20  hash tables and 
3fb0: 74 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a  the delete the.*
3fc0: 2a 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72  * table structur
3fd0: 65 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69  e with all its i
3fe0: 6e 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69  ndices and forei
3ff0: 67 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64  gn keys..*/.void
4000: 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e   sqlite3UnlinkAn
4010: 64 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c  dDeleteTable(sql
4020: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
4030: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
4040: 54 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c  TabName){.  Tabl
4050: 65 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b  e *p;.  Db *pDb;
4060: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d  ..  assert( db!=
4070: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
4080: 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d  Db>=0 && iDb<db-
4090: 3e 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74  >nDb );.  assert
40a0: 28 20 7a 54 61 62 4e 61 6d 65 20 26 26 20 7a 54  ( zTabName && zT
40b0: 61 62 4e 61 6d 65 5b 30 5d 20 29 3b 0a 20 20 70  abName[0] );.  p
40c0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
40d0: 62 5d 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  b];.  p = sqlite
40e0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 70 44 62  3HashInsert(&pDb
40f0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
4100: 73 68 2c 20 7a 54 61 62 4e 61 6d 65 2c 0a 20 20  sh, zTabName,.  
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
4130: 6c 65 6e 33 30 28 7a 54 61 62 4e 61 6d 65 29 2c  len30(zTabName),
4140: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 6c  0);.  sqlite3Del
4150: 65 74 65 54 61 62 6c 65 28 70 29 3b 0a 20 20 64  eteTable(p);.  d
4160: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4170: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
4190: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
41a0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
41b0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
41c0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
41d0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
41e0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
41f0: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
4200: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4210: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
4220: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
4230: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
4240: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
4250: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
4260: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
4270: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
4280: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
4290: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
42a0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
42b0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
42c0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
42d0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
42e0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
42f0: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
4300: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
4310: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
4320: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
4330: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
4340: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
4350: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
4360: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
4370: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
4380: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
4390: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
43a0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
43b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
43c0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
43d0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
43e0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
43f0: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
4400: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
4410: 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 71 75 6f    if( pName->quo
4420: 74 65 64 20 29 20 73 71 6c 69 74 65 33 44 65 71  ted ) sqlite3Deq
4430: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
4440: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
4450: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4460: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
4470: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
4480: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
4490: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
44a0: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
44b0: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
44c0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
44d0: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
44e0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
44f0: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4500: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
4510: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
4520: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
4530: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
4540: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
4550: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
4560: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
4570: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4580: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
4590: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
45a0: 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20 73  _ROOT, iDb);.  s
45b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
45c0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
45d0: 2a 29 35 2c 20 50 34 5f 49 4e 54 33 32 29 3b 20  *)5, P4_INT32); 
45e0: 20 2f 2a 20 35 20 63 6f 6c 75 6d 6e 20 74 61 62   /* 5 column tab
45f0: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  le */.  if( p->n
4600: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Tab==0 ){.    p-
4610: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d  >nTab = 1;.  }.}
4620: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
4630: 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74  r zName points t
4640: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
4650: 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ed buffer contai
4660: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  ning the name.**
4670: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
4680: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f  "main", "temp" o
4690: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
46a0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
46b0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
46c0: 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65  returns the inde
46d0: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
46e0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
46f0: 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69  Db[], or.** -1 i
4700: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63  f the named db c
4710: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
4720: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
4730: 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33  ndDbName(sqlite3
4740: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
4750: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
4760: 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  i = -1;         
4770: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4780: 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d  er */.  if( zNam
4790: 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  e ){.    Db *pDb
47a0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71  ;.    int n = sq
47b0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
47c0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
47d0: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
47e0: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
47f0: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
4800: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4810: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4820: 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33   ) && n==sqlite3
4830: 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e  Strlen30(pDb->zN
4840: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
4850: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
4860: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
4870: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
4880: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4890: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
48a0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
48b0: 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d   The token *pNam
48c0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
48d0: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
48e0: 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22  e (either "main"
48f0: 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72   or.** "temp" or
4900: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
4910: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
4920: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
4930: 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  ns the.** index 
4940: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
4950: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
4960: 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65  [], or -1 if the
4970: 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f   named db .** do
4980: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  es not exist..*/
4990: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
49a0: 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  Db(sqlite3 *db, 
49b0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
49c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
49e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
49f0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
4a00: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
4a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a20: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
4a30: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
4a40: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
4a50: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4a60: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
4a70: 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  i = sqlite3FindD
4a80: 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bName(db, zName)
4a90: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4aa0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
4ab0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
4ac0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
4ad0: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
4ae0: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
4af0: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4b00: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
4b10: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4b20: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4b30: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4b40: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4b50: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4b60: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4b70: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
4b80: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4b90: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
4ba0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
4bb0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
4bc0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
4bd0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
4be0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
4bf0: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4c00: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
4c10: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4c20: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4c30: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4c40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4c50: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
4c60: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
4c70: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
4c80: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
4c90: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
4ca0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
4cb0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
4cc0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
4cd0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
4ce0: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
4cf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
4d00: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
4d10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
4d20: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
4d30: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
4d40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
4d50: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
4d60: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
4d70: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
4d80: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
4d90: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
4da0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
4db0: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
4dc0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
4dd0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
4de0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
4df0: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
4e00: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
4e10: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
4e40: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
4e50: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
4e60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
4e70: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
4e80: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
4e90: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
4ea0: 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73  busy ) {.      s
4eb0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4ec0: 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
4ed0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
4ee0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
4ef0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
4f00: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55  1;.    }.    *pU
4f10: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
4f20: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
4f30: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
4f40: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
4f50: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
4f60: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
4f70: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
4f80: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
4f90: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
4fa0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
4fb0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
4fc0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
4fd0: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
4fe0: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
4ff0: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
5000: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
5010: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
5020: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
5030: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
5040: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5050: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
5060: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
5070: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
5080: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
5090: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
50a0: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
50b0: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
50c0: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
50d0: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
50e0: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
50f0: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
5100: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
5110: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
5120: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
5130: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
5140: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
5150: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
5160: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
5170: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
5180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
5190: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
51a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
51b0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
51c0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
51d0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
51e0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
51f0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
5200: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
5210: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
5220: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
5230: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
5240: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
5250: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
5260: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5270: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5280: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
5290: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
52a0: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
52b0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
52c0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
52d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
52e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
52f0: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
5300: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
5310: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
5320: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
5330: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
5340: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
5350: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
5360: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
5370: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
5380: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
5390: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
53a0: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
53b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
53c0: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
53d0: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
53e0: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
53f0: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5400: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
5410: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
5420: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
5430: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
5440: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
5450: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
5460: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
5470: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
5480: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
5490: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
54a0: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
54b0: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
54c0: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
54d0: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
54e0: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
54f0: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
5500: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
5510: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
5520: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5530: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
5540: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
5550: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
5560: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
5570: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
5580: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
5590: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
55a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
55b0: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
55c0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
55d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
55e0: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
55f0: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
5600: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
5610: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
5620: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
5630: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
5640: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
5650: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
5660: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
5670: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
5680: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
5690: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
56a0: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
56b0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
56c0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
56d0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
56e0: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
56f0: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
5700: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
5710: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
5720: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
5730: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
5740: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
5750: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
5760: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5770: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69  is a VIEW */.  i
5780: 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20  nt isVirtual,   
5790: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
57a0: 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62  is a VIRTUAL tab
57b0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  le */.  int noEr
57c0: 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  r        /* Do n
57d0: 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20  othing if table 
57e0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
57f0: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
5800: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  able;.  char *zN
5810: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  ame = 0; /* The 
5820: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  name of the new 
5830: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
5840: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5850: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
5860: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
5870: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5880: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
5890: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
58a0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
58b0: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
58c0: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
58d0: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
58e0: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ..  /* The table
58f0: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f   or view name to
5900: 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65   create is passe
5910: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5920: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a  e via tokens.  *
5930: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5940: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5950: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5960: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5970: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
5980: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5990: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20  xxx.yyy (...);. 
59a0: 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70   ** .  ** Then p
59b0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
59c0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
59d0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
59e0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a  ther hand if.  *
59f0: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5a00: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
5a10: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20  alified, i.e.:. 
5a20: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5a30: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
5a40: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70    **.  ** Then p
5a50: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5a60: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5a70: 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a   is ""..  **.  *
5a80: 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77  * The call below
5a90: 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20   sets the pName 
5aa0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
5ab0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
5ac0: 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e  Name1 or.  ** pN
5ad0: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
5ae0: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
5af0: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  d table name. Th
5b00: 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69  e variable iDb i
5b10: 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68  s.  ** set to th
5b20: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
5b30: 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65  atabase that the
5b40: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
5b50: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65  s to be.  ** cre
5b60: 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ated in..  */.  
5b70: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
5b80: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
5b90: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
5ba0: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
5bb0: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
5bc0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5bd0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
5be0: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  iDb>1 ){.    /* 
5bf0: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
5c00: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
5c10: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
5c20: 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73  alified */.    s
5c30: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5c40: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
5c50: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
5c60: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
5c70: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
5c80: 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f    }.  if( !OMIT_
5c90: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
5ca0: 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70   ) iDb = 1;..  p
5cb0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
5cc0: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e  n = *pName;.  zN
5cd0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5ce0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
5cf0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
5d00: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
5d10: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
5d20: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
5d30: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
5d40: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
5d50: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
5d60: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
5d70: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
5d80: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
5d90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5da0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
5db0: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
5dc0: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
5dd0: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
5de0: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
5df0: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
5e00: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
5e10: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5e20: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
5e30: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
5e40: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
5e50: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
5e60: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
5e70: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
5e80: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
5e90: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
5ea0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
5eb0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
5ec0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
5ed0: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
5ee0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5ef0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5f00: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
5f10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5f20: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
5f30: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
5f40: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
5f50: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
5f60: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
5f70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5f80: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
5f90: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
5fa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
5fb0: 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20  ( !isVirtual && 
5fc0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
5fd0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
5fe0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
5ff0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6000: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6010: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6020: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6030: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
6040: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
6050: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
6060: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
6070: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
6080: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
6090: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
60a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
60b0: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65   ** it does. The
60c0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
60d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62   the statement b
60e0: 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20  eing parsed was 
60f0: 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61  passed.  ** to a
6100: 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
6110: 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49  e_vtab() call. I
6120: 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
6130: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6140: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73  s.  ** and types
6150: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73   will be used, s
6160: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
6170: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e  ed to test for n
6180: 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f  amespace.  ** co
6190: 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  llisions..  */. 
61a0: 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45   if( !IN_DECLARE
61b0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28  _VTAB ){.    if(
61c0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
61d0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
61e0: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
61f0: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6200: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6210: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
6220: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
6230: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
6240: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b].zName);.    i
6250: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
6260: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
6270: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6280: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6290: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
62a0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
62b0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
62c0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
62d0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
62e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
62f0: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
6300: 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44  me, 0)!=0 && (iD
6310: 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69  b==0 || !db->ini
6320: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
6330: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6340: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
6350: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
6360: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
6370: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
6380: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
6390: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
63a0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
63b0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
63c0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
63d0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
63e0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
63f0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
6400: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
6410: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6420: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6430: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
6440: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6450: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
6460: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
6470: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
6480: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
6490: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
64a0: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
64b0: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
64c0: 20 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 20    pTable->dbMem 
64d0: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
64e0: 62 45 6e 61 62 6c 65 64 20 3f 20 64 62 20 3a 20  bEnabled ? db : 
64f0: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
6500: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
6510: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
6520: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6530: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
6540: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
6550: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
6560: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
6570: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
6580: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
6590: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
65a0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
65b0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
65c0: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
65d0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
65e0: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
65f0: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
6600: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
6610: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
6620: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
6630: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
6640: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
6650: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
6660: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
6670: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
6680: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
6690: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
66a0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
66b0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
66c0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
66d0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
66e0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
66f0: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
6700: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
6710: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
6720: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
6730: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
6740: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
6750: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6760: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
6770: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
6780: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
6790: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
67a0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
67b0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
67c0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
67d0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
67e0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
67f0: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
6800: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
6810: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
6820: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
6830: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6840: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
6850: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
6860: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
6870: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
6880: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
6890: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
68a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
68b0: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
68c0: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
68d0: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
68e0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
68f0: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
6900: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
6910: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6920: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6930: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
6940: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
6950: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
6960: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
6970: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
6980: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
6990: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
69a0: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
69b0: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
69c0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
69d0: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
69e0: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
69f0: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
6a00: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
6a10: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
6a20: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
6a30: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6a40: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
6a50: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
6a60: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6a70: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
6a80: 69 44 62 2c 20 72 65 67 33 2c 20 31 29 3b 20 20  iDb, reg3, 1);  
6a90: 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20   /* file_format 
6aa0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
6ab0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
6ac0: 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  Db);.    j1 = sq
6ad0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6ae0: 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b  v, OP_If, reg3);
6af0: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
6b00: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
6b10: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
6b20: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
6b40: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
6b50: 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69  FORMAT;.    sqli
6b60: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6b70: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
6b80: 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a  eFormat, reg3);.
6b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6ba0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
6bb0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72  ookie, iDb, 1, r
6bc0: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6bd0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6be0: 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64  P_Integer, ENC(d
6bf0: 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  b), reg3);.    s
6c00: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6c10: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
6c20: 2c 20 69 44 62 2c 20 34 2c 20 72 65 67 33 29 3b  , iDb, 4, reg3);
6c30: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6c40: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
6c50: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6c60: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6c70: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6c80: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6c90: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6ca0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6cb0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6cc0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6cd0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6ce0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
6cf0: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
6d00: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
6d10: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
6d20: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
6d30: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
6d40: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
6d50: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
6d60: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
6d70: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
6d80: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
6d90: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
6da0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
6db0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
6dc0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
6dd0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
6de0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
6df0: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
6e00: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
6e10: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
6e20: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
6e30: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
6e40: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
6e50: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
6e60: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6e70: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
6e80: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
6e90: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
6ea0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6eb0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
6ec0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
6ed0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
6ee0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
6ef0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6f00: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
6f10: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
6f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6f30: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
6f40: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
6f50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f60: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
6f70: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
6f80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f90: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
6fa0: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
6fb0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6fc0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
6fd0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
6fe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6ff0: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7000: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7010: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7020: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
7030: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
7040: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
7050: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
7060: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
7070: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
7080: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
7090: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
70a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
70b0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
70c0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
70d0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
70e0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
70f0: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
7100: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
7110: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
7120: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
7130: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
7140: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
7150: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
7160: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
7170: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
7180: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
7190: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
71a0: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
71b0: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
71c0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
71d0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
71e0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
71f0: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
7200: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
7210: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
7220: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
7230: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
7240: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
7250: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
7260: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
7270: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
7280: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
7290: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
72a0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
72b0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
72c0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
72d0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
72e0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
72f0: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7300: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
7310: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
7320: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
7330: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7340: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
7350: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
7360: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
7370: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
7380: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
7390: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
73a0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
73b0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
73c0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
73d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
73e0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
73f0: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7400: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
7410: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
7420: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7430: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
7440: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7450: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7460: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
7470: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
7480: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
7490: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
74a0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
74b0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
74c0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
74d0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
74e0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
74f0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7500: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
7510: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7520: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7530: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7540: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7550: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7560: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7570: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7580: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
7590: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
75a0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
75b0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
75c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
75d0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
75e0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
75f0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
7600: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
7610: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
7620: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
7630: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
7640: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
7650: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
7660: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
7670: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
7680: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
7690: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
76a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
76b0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
76c0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
76d0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
76e0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
76f0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
7700: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
7710: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
7720: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7730: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
7740: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
7750: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
7760: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
7770: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
7780: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
7790: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
77a0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
77b0: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
77c0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
77d0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
77e0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
77f0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
7800: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
7810: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a    p->nCol++;.}..
7820: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7830: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7840: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7850: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7860: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7870: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7880: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
7890: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
78a0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
78b0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
78c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
78d0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
78e0: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
78f0: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
7900: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
7910: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7920: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
7930: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
7940: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
7950: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
7960: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
7970: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
7980: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
7990: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
79a0: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
79b0: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  .notNull = (u8)o
79c0: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
79d0: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
79e0: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
79f0: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
7a00: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
7a10: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
7a20: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
7a30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
7a40: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
7a50: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
7a60: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
7a70: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
7a80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
7a90: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
7aa0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7ab0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
7ac0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
7ad0: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
7ae0: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
7af0: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
7b00: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
7b10: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
7b20: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
7b30: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
7b40: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
7b50: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
7b60: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
7b70: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
7b80: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
7b90: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
7ba0: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
7bb0: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
7be0: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
7bf0: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7c00: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
7c10: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7c20: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
7c30: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7c40: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
7c50: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7c60: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
7c70: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7c80: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
7c90: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
7ca0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7cb0: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
7cc0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7cd0: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
7ce0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
7cf0: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
7d00: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
7d10: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
7d20: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
7d30: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
7d40: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
7d50: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
7d60: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
7d70: 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  ype(const Token 
7d80: 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68  *pType){.  u32 h
7d90: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
7da0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
7db0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75  MERIC;.  const u
7dc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
7dd0: 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20  n = pType->z;.  
7de0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
7df0: 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79  har *zEnd = &pTy
7e00: 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b  pe->z[pType->n];
7e10: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d  ..  while( zIn!=
7e20: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20  zEnd ){.    h = 
7e30: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
7e40: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49  UpperToLower[*zI
7e50: 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  n];.    zIn++;. 
7e60: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
7e70: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
7e80: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
7e90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
7ea0: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
7eb0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
7ec0: 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69  XT; .    }else i
7ed0: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
7ee0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
7ef0: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
7f00: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
7f10: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
7f20: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
7f30: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
7f40: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
7f50: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
7f60: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
7f70: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
7f80: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
7f90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
7fa0: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
7fb0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
7fc0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
7fd0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
7fe0: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
7ff0: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
8000: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
8010: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
8020: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
8030: 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  NE;.#ifndef SQLI
8040: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
8050: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
8060: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
8070: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
8080: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
8090: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
80a0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
80b0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
80c0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
80d0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
80e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
80f0: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
8100: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8110: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
8120: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
8130: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8140: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8150: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8160: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
8170: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8180: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
8190: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
81a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
81b0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
81c0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
81d0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
81e0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
81f0: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
8200: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
8210: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
8220: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
8230: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
8240: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
8250: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
8260: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
8270: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
8280: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
8290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
82a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
82b0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
82c0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
82d0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
82e0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
82f0: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
8300: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
8310: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
8320: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
8330: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
8340: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
8350: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
8360: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8370: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
8380: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
8390: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
83a0: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
83b0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
83c0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
83d0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
83e0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
83f0: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
8400: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
8410: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
8420: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
8430: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
8440: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
8450: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
8460: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
8470: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
8480: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
8490: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  3 *db;..  if( (p
84a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
84b0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
84c0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
84d0: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
84e0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
84f0: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
8500: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8510: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8520: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
8530: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
8540: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
8550: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 79 70  omToken(db, pTyp
8560: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69  e);.  pCol->affi
8570: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8580: 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70 65  finityType(pType
8590: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
85a0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
85b0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
85c0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
85d0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
85e0: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
85f0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8600: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8610: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
8620: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
8630: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
8640: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
8650: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
8660: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
8670: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8680: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8690: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
86a0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
86b0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
86c0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
86d0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
86e0: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
86f0: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
8700: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
8710: 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  xpr){.  Table *p
8720: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
8730: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8740: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8750: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
8760: 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29  >pNewTable)!=0 )
8770: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
8780: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8790: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
87a0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
87b0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78  ntOrFunction(pEx
87c0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
87d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
87e0: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
87f0: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
8800: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
8810: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
8820: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
8830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8840: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
8850: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
8860: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
8870: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
8880: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
8890: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
88a0: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
88b0: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
88c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
88d0: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
88e0: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
88f0: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
8900: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8910: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8920: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
8930: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8940: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8950: 28 64 62 2c 20 70 45 78 70 72 2c 20 45 58 50 52  (db, pExpr, EXPR
8960: 44 55 50 5f 52 45 44 55 43 45 7c 45 58 50 52 44  DUP_REDUCE|EXPRD
8970: 55 50 5f 53 50 41 4e 29 3b 0a 20 20 20 20 7d 0a  UP_SPAN);.    }.
8980: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
8990: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
89a0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
89b0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
89c0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
89d0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
89e0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
89f0: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
8a00: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
8a10: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
8a20: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
8a30: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
8a40: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8a50: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
8a60: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
8a70: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
8a80: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
8a90: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
8aa0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
8ab0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
8ac0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
8ad0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
8ae0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
8af0: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
8b00: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
8b10: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
8b20: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
8b30: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
8b40: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
8b50: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
8b60: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
8b70: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
8b80: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
8b90: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
8ba0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
8bb0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
8bc0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
8bd0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
8be0: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
8bf0: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
8c00: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
8c10: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
8c20: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
8c30: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8c40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
8c50: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
8c60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8c70: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8c80: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
8c90: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
8ca0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
8cb0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
8cc0: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
8cd0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
8ce0: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
8cf0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
8d00: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8d10: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
8d20: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
8d30: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
8d40: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
8d50: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
8d60: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
8d70: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
8d80: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
8d90: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
8da0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8db0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
8dc0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
8dd0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
8de0: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
8df0: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
8e00: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
8e10: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
8e20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
8e30: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
8e40: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
8e50: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
8e60: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
8e70: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
8e80: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
8e90: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
8ea0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
8eb0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
8ec0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
8ed0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
8ee0: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
8ef0: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
8f00: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
8f10: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
8f20: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
8f30: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
8f40: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
8f50: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
8f60: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
8f70: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
8f80: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
8f90: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
8fa0: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
8fb0: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
8fc0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
8fd0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
8fe0: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
8ff0: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
9000: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
9010: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9020: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
9030: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
9040: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9050: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
9060: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9080: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
9090: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
90a0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
90b0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
90c0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
90d0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
90e0: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
90f0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
9100: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
9110: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
9120: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
9130: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
9140: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
9150: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
9160: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
9170: 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  GER")==0.       
9180: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53   && sortOrder==S
9190: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
91a0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
91b0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
91c0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
91d0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
91e0: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
91f0: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
9200: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
9210: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
9220: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
9230: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
9240: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
9250: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
9260: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
9270: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9280: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
9290: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
92a0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
92b0: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
92c0: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
92d0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
92e0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
92f0: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
9300: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
9310: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
9320: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
9330: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
9340: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
9350: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9360: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
9370: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
9380: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
9390: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
93a0: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
93b0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
93c0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
93d0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
93e0: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
93f0: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
9400: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
9410: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9420: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
9430: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
9440: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
9450: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9460: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
9470: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9480: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
9490: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
94a0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
94b0: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
94c0: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
94d0: 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65    /* The CHECK e
94e0: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
94f0: 65 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20  e duplicated so 
9500: 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65  that tokens refe
9510: 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c  r.    ** to mall
9520: 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e  oced space and n
9530: 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65 72 61  ot the (ephemera
9540: 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  l) text of the C
9550: 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20  REATE TABLE.    
9560: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ** statement */.
9570: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
9580: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
9590: 64 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65  d(db, pTab->pChe
95a0: 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
95d0: 70 72 44 75 70 28 64 62 2c 20 70 43 68 65 63 6b  prDup(db, pCheck
95e0: 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 7d 0a 23  Expr, 0));.  }.#
95f0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45  endif.  sqlite3E
9600: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
9610: 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  heckExpr);.}../*
9620: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
9630: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
9640: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9650: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
9660: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
9670: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
9680: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9690: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
96a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
96b0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
96c0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
96d0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
96e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
96f0: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
9700: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
9710: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
9720: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
9730: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9740: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
9750: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
9760: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
9770: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
9780: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
9790: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
97a0: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
97b0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
97c0: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
97d0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
97e0: 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Coll, -1) ){.   
97f0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9800: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
9810: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
9820: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
9830: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
9840: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
9850: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
9860: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
9870: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
9880: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
9890: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
98a0: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
98b0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
98c0: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
98d0: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
98e0: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
98f0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
9900: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9910: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9920: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9930: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
9940: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
9950: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
9960: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
9970: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
9980: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
9990: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
99a0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
99b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
99c0: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
99d0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
99e0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
99f0: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
9a00: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
9a10: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
9a20: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
9a30: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
9a40: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
9a50: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
9a60: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9a70: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9a80: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
9a90: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
9aa0: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
9ab0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
9ac0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
9ad0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
9ae0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
9af0: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
9b00: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9b10: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
9b20: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
9b30: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
9b40: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
9b50: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
9b60: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
9b70: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
9b80: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
9b90: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
9ba0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
9bb0: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
9bc0: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
9bd0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
9be0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
9bf0: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
9c00: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
9c10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
9c20: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
9c30: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
9c40: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
9c50: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
9c60: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9c70: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
9c80: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
9c90: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9ca0: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
9cb0: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
9cc0: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
9cd0: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
9ce0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43  or message..*/.C
9cf0: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
9d00: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
9d10: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
9d20: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
9d30: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c  nt nName){.  sql
9d40: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
9d50: 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20  e->db;.  u8 enc 
9d60: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20  = ENC(db);.  u8 
9d70: 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69  initbusy = db->i
9d80: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
9d90: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70  Seq *pColl;..  p
9da0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
9db0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  ndCollSeq(db, en
9dc0: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
9dd0: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
9de0: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
9df0: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
9e00: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
9e10: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
9e20: 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f  tCollSeq(db, pCo
9e30: 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ll, zName, nName
9e40: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
9e50: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  l ){.      if( n
9e60: 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Name<0 ){.      
9e70: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
9e80: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
9e90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9ea0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9eb0: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
9ec0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
9ed0: 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e 61 6d  nce: %.*s", nNam
9ee0: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, zName);.     
9ef0: 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20   pColl = 0;.    
9f00: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
9f10: 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pColl;.}.../*.**
9f20: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
9f30: 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65 6d 65  hat will increme
9f40: 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  nt the schema co
9f50: 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  okie..**.** The 
9f60: 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 69 73  schema cookie is
9f70: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
9f80: 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63 68 65  ne when the sche
9f90: 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20 64 61  ma for the.** da
9fa0: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
9fb0: 20 41 66 74 65 72 20 65 61 63 68 20 73 63 68 65   After each sche
9fc0: 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65 20 63  ma change, the c
9fd0: 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a 20 63  ookie value.** c
9fe0: 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20 61 20  hanges.  When a 
9ff0: 70 72 6f 63 65 73 73 20 66 69 72 73 74 20 72 65  process first re
a000: 61 64 73 20 74 68 65 20 73 63 68 65 6d 61 20 69  ads the schema i
a010: 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a 2a 2a  t records the.**
a020: 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72 65 61   cookie.  Therea
a030: 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72 20 69  fter, whenever i
a040: 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65 73 73  t goes to access
a050: 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 0a 2a   the database,.*
a060: 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68 65 20  * it checks the 
a070: 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65 20 73  cookie to make s
a080: 75 72 65 20 74 68 65 20 73 63 68 65 6d 61 20 68  ure the schema h
a090: 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64 0a 2a  as not changed.*
a0a0: 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 6c  * since it was l
a0b0: 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  ast read..**.** 
a0c0: 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e 6f 74  This plan is not
a0d0: 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75 6c 6c   completely bull
a0e0: 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20 69 73  et-proof.  It is
a0f0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a 2a 2a   possible for.**
a100: 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f 20 63   the schema to c
a110: 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65 20 74  hange multiple t
a120: 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74 68 65  imes and for the
a130: 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a 2a 2a   cookie to be.**
a140: 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70 72 69   set back to pri
a150: 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74 20 73  or value.  But s
a160: 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20 61 72  chema changes ar
a170: 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a 2a 20  e infrequent.** 
a180: 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62 69 6c  and the probabil
a190: 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67 20 74  ity of hitting t
a1a0: 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65 20 76  he same cookie v
a1b0: 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20  alue is only.** 
a1c0: 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e 33 32  1 chance in 2^32
a1d0: 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61 66 65  .  So we're safe
a1e0: 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f 69 64   enough..*/.void
a1f0: 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
a200: 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50 61 72  okie(Parse *pPar
a210: 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  se, int iDb){.  
a220: 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33  int r1 = sqlite3
a230: 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73  GetTempReg(pPars
a240: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e);.  sqlite3 *d
a250: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
a260: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
a270: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73 71 6c  se->pVdbe;.  sql
a280: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
a290: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 64 62  , OP_Integer, db
a2a0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
a2b0: 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b 69  ma->schema_cooki
a2c0: 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71 6c 69  e+1, r1);.  sqli
a2d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
a2e0: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
a2f0: 44 62 2c 20 30 2c 20 72 31 29 3b 0a 20 20 73 71  Db, 0, r1);.  sq
a300: 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
a310: 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b  Reg(pParse, r1);
a320: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73 75 72  .}../*.** Measur
a330: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a340: 63 68 61 72 61 63 74 65 72 73 20 6e 65 65 64 65  characters neede
a350: 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68 65 20  d to output the 
a360: 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74 69 66  given.** identif
a370: 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ier.  The number
a380: 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c 75 64   returned includ
a390: 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20 75 73  es any quotes us
a3a0: 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73 20 6e  ed.** but does n
a3b0: 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e  ot include the n
a3c0: 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a  ull terminator..
a3d0: 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69 6d 61  **.** The estima
a3e0: 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61 74 69  te is conservati
a3f0: 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20 62 65  ve.  It might be
a400: 20 6c 61 72 67 65 72 20 74 68 61 74 20 77 68 61   larger that wha
a410: 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79 20 6e  t is.** really n
a420: 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eeded..*/.static
a430: 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67 74 68   int identLength
a440: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a450: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28  .  int n;.  for(
a460: 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20 7a 2b  n=0; *z; n++, z+
a470: 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  +){.    if( *z==
a480: 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20  '"' ){ n++; }.  
a490: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 32  }.  return n + 2
a4a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
a4b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 77 72  function is a wr
a4c0: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
a4d0: 69 74 65 33 47 65 74 54 6f 6b 65 6e 28 29 20 75  ite3GetToken() u
a4e0: 73 65 64 20 62 79 20 0a 2a 2a 20 69 73 56 61 6c  sed by .** isVal
a4f0: 69 64 44 69 6d 65 6e 73 69 6f 6e 28 29 2e 20 54  idDimension(). T
a500: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 69 66  his function dif
a510: 66 65 72 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  fers from sqlite
a520: 33 47 65 74 54 6f 6b 65 6e 28 29 20 69 6e 0a 2a  3GetToken() in.*
a530: 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  * that:.**.**   
a540: 2a 20 57 68 69 74 65 73 70 61 63 65 20 69 73 20  * Whitespace is 
a550: 69 67 6e 6f 72 65 64 2c 20 61 6e 64 0a 2a 2a 20  ignored, and.** 
a560: 20 20 2a 20 54 68 65 20 6f 75 74 70 75 74 20 76    * The output v
a570: 61 72 69 61 62 6c 65 20 2a 70 65 54 6f 6b 65 6e  ariable *peToken
a580: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 20   is set to 0 if 
a590: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
a5a0: 2a 20 20 20 20 20 6e 75 6c 2d 74 65 72 6d 69 6e  *     nul-termin
a5b0: 61 74 65 64 20 69 6e 70 75 74 20 73 74 72 69 6e  ated input strin
a5c0: 67 20 69 73 20 72 65 61 63 68 65 64 2e 0a 2a 2f  g is reached..*/
a5d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 54  .static int getT
a5e0: 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 75 6e 73 69  okenNoSpace(unsi
a5f0: 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e  gned char *z, in
a600: 74 20 2a 70 65 54 6f 6b 65 6e 29 7b 0a 20 20 69  t *peToken){.  i
a610: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt n = 0;.  whil
a620: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
a630: 65 28 7a 5b 6e 5d 29 20 29 20 6e 2b 2b 3b 0a 20  e(z[n]) ) n++;. 
a640: 20 69 66 28 20 21 7a 5b 6e 5d 20 29 7b 0a 20 20   if( !z[n] ){.  
a650: 20 20 2a 70 65 54 6f 6b 65 6e 20 3d 20 30 3b 0a    *peToken = 0;.
a660: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
a670: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b 20 73  }.  return n + s
a680: 71 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e 28 26  qlite3GetToken(&
a690: 7a 5b 6e 5d 2c 20 70 65 54 6f 6b 65 6e 29 3b 0a  z[n], peToken);.
a6a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
a6b0: 65 72 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61  er z points to a
a6c0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
a6d0: 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 74  string. Return t
a6e0: 72 75 65 20 69 66 2c 20 77 68 65 6e 0a 2a 2a 20  rue if, when.** 
a6f0: 77 68 69 74 65 73 70 61 63 65 20 69 73 20 69 67  whitespace is ig
a700: 6e 6f 72 65 64 2c 20 74 68 65 20 63 6f 6e 74 65  nored, the conte
a710: 6e 74 73 20 6f 66 20 74 68 69 73 20 73 74 72 69  nts of this stri
a720: 6e 67 20 6d 61 74 63 68 65 73 20 6f 6e 65 20 6f  ng matches one o
a730: 66 20 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  f .** the follow
a740: 69 6e 67 20 70 61 74 74 65 72 6e 73 3a 0a 2a 2a  ing patterns:.**
a750: 0a 2a 2a 20 20 20 20 20 22 22 0a 2a 2a 20 20 20  .**     "".**   
a760: 20 20 22 28 6e 75 6d 62 65 72 29 22 0a 2a 2a 20    "(number)".** 
a770: 20 20 20 20 22 28 6e 75 6d 62 65 72 2c 6e 75 6d      "(number,num
a780: 62 65 72 29 22 0a 2a 2f 0a 73 74 61 74 69 63 20  ber)".*/.static 
a790: 69 6e 74 20 69 73 56 61 6c 69 64 44 69 6d 65 6e  int isValidDimen
a7a0: 73 69 6f 6e 28 75 6e 73 69 67 6e 65 64 20 63 68  sion(unsigned ch
a7b0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 65 54  ar *z){.  int eT
a7c0: 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  oken;.  int n = 
a7d0: 30 3b 0a 20 20 6e 20 2b 3d 20 67 65 74 54 6f 6b  0;.  n += getTok
a7e0: 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d 2c  enNoSpace(&z[n],
a7f0: 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28   &eToken);.  if(
a800: 20 65 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69   eToken ){.    i
a810: 66 28 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f 4c 50  f( eToken!=TK_LP
a820: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
a830: 20 6e 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f   n += getTokenNo
a840: 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54  Space(&z[n], &eT
a850: 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 65  oken);.    if( e
a860: 54 6f 6b 65 6e 3d 3d 54 4b 5f 50 4c 55 53 20 7c  Token==TK_PLUS |
a870: 7c 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 4d 49 4e  | eToken==TK_MIN
a880: 55 53 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d  US ){.      n +=
a890: 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61 63 65   getTokenNoSpace
a8a0: 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65 6e 29  (&z[n], &eToken)
a8b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
a8c0: 65 54 6f 6b 65 6e 21 3d 54 4b 5f 49 4e 54 45 47  eToken!=TK_INTEG
a8d0: 45 52 20 26 26 20 65 54 6f 6b 65 6e 21 3d 54 4b  ER && eToken!=TK
a8e0: 5f 46 4c 4f 41 54 20 29 20 72 65 74 75 72 6e 20  _FLOAT ) return 
a8f0: 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74 54  0;.    n += getT
a900: 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e  okenNoSpace(&z[n
a910: 5d 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 20  ], &eToken);.   
a920: 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f   if( eToken==TK_
a930: 43 4f 4d 4d 41 20 29 7b 0a 20 20 20 20 20 20 6e  COMMA ){.      n
a940: 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70   += getTokenNoSp
a950: 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b  ace(&z[n], &eTok
a960: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  en);.      if( e
a970: 54 6f 6b 65 6e 3d 3d 54 4b 5f 50 4c 55 53 20 7c  Token==TK_PLUS |
a980: 7c 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 4d 49 4e  | eToken==TK_MIN
a990: 55 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20  US ){.        n 
a9a0: 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61  += getTokenNoSpa
a9b0: 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65  ce(&z[n], &eToke
a9c0: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
a9d0: 20 20 69 66 28 20 65 54 6f 6b 65 6e 21 3d 54 4b    if( eToken!=TK
a9e0: 5f 49 4e 54 45 47 45 52 20 26 26 20 65 54 6f 6b  _INTEGER && eTok
a9f0: 65 6e 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72  en!=TK_FLOAT ) r
aa00: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 6e  eturn 0;.      n
aa10: 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70   += getTokenNoSp
aa20: 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b  ace(&z[n], &eTok
aa30: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  en);.    }.    i
aa40: 66 28 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f 52 50  f( eToken!=TK_RP
aa50: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
aa60: 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61 63 65   getTokenNoSpace
aa70: 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65 6e 29  (&z[n], &eToken)
aa80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 54 6f 6b  ;.  }.  if( eTok
aa90: 65 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  en ) return 0;. 
aaa0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
aab0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61  .** The first pa
aac0: 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69  rameter is a poi
aad0: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75  nter to an outpu
aae0: 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73 65  t buffer. The se
aaf0: 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74  cond .** paramet
ab00: 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  er is a pointer 
ab10: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68  to an integer th
ab20: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
ab30: 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69  offset at.** whi
ab40: 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f  ch to write into
ab50: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
ab60: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
ab70: 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20  n copies the.** 
ab80: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
ab90: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
aba0: 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70 61   by the third pa
abb0: 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64  rameter, zSigned
abc0: 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65  Ident,.** to the
abd0: 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73 65   specified offse
abe0: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
abf0: 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49 64  and updates *pId
ac00: 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f  x to refer.** to
ac10: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
ac20: 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20 62  after the last b
ac30: 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f  yte written befo
ac40: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
ac50: 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69   .** If the stri
ac60: 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20  ng zSignedIdent 
ac70: 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c  consists entirel
ac80: 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72  y of alpha-numer
ac90: 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  ic.** characters
aca0: 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e  , does not begin
acb0: 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61 6e   with a digit an
acc0: 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20  d is not an SQL 
acd0: 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e  keyword,.** then
ace0: 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f   it is copied to
acf0: 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
ad00: 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69 74  er exactly as it
ad10: 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a   is. Otherwise,.
ad20: 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64 20  ** it is quoted 
ad30: 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f  using double-quo
ad40: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tes..*/.static v
ad50: 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68 61  oid identPut(cha
ad60: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c  r *z, int *pIdx,
ad70: 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64   char *zSignedId
ad80: 65 6e 74 2c 20 69 6e 74 20 69 73 54 79 70 65 6e  ent, int isTypen
ad90: 61 6d 65 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  ame){.  unsigned
ada0: 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20   char *zIdent = 
adb0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
adc0: 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20  zSignedIdent;.  
add0: 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75  int i, j, needQu
ade0: 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78  ote;.  i = *pIdx
adf0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49  ;..  for(j=0; zI
ae00: 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20  dent[j]; j++){. 
ae10: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 49     if( !sqlite3I
ae20: 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d  salnum(zIdent[j]
ae30: 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d  ) && zIdent[j]!=
ae40: 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  '_' ) break;.  }
ae50: 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73  .  needQuote = s
ae60: 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a 49  qlite3Isdigit(zI
ae70: 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73 71 6c 69  dent[0]) || sqli
ae80: 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a  te3KeywordCode(z
ae90: 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44  Ident, j)!=TK_ID
aea0: 3b 0a 20 20 69 66 28 20 21 6e 65 65 64 51 75 6f  ;.  if( !needQuo
aeb0: 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 73  te ){.    if( is
aec0: 54 79 70 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Typename ){.    
aed0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
aee0: 61 20 74 79 70 65 2d 6e 61 6d 65 2c 20 61 6c 6c  a type-name, all
aef0: 6f 77 20 61 20 6c 69 74 74 6c 65 20 6d 6f 72 65  ow a little more
af00: 20 66 6c 65 78 69 62 69 6c 69 74 79 2e 20 49 6e   flexibility. In
af10: 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a   SQLite,.      *
af20: 2a 20 61 20 74 79 70 65 2d 6e 61 6d 65 20 69 73  * a type-name is
af30: 20 73 70 65 63 69 66 69 65 64 20 61 73 3a 0a 20   specified as:. 
af40: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
af50: 20 20 20 69 64 73 20 5b 69 64 73 5d 20 5b 28 6e     ids [ids] [(n
af60: 75 6d 62 65 72 20 5b 2c 20 6e 75 6d 62 65 72 5d  umber [, number]
af70: 29 5d 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  )].      **.    
af80: 20 20 2a 2a 20 77 68 65 72 65 20 22 69 64 73 22    ** where "ids"
af90: 20 69 73 20 65 69 74 68 65 72 20 61 20 71 75 6f   is either a quo
afa0: 74 65 64 20 73 74 72 69 6e 67 20 6f 72 20 61 20  ted string or a 
afb0: 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66 69 65  simple identifie
afc0: 72 20 28 69 6e 20 74 68 65 0a 20 20 20 20 20 20  r (in the.      
afd0: 2a 2a 20 61 62 6f 76 65 20 6e 6f 74 61 74 69 6f  ** above notatio
afe0: 6e 2c 20 5b 5d 20 6d 65 61 6e 73 20 6f 70 74 69  n, [] means opti
aff0: 6f 6e 61 6c 29 2e 20 49 74 20 69 73 20 61 20 62  onal). It is a b
b000: 69 74 20 74 72 69 63 6b 79 20 74 6f 20 63 68 65  it tricky to che
b010: 63 6b 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ck.      ** for 
b020: 61 6c 6c 20 63 61 73 65 73 2c 20 62 75 74 20 69  all cases, but i
b030: 74 20 69 73 20 67 6f 6f 64 20 74 6f 20 61 76 6f  t is good to avo
b040: 69 64 20 75 6e 6e 65 63 65 73 73 61 72 69 6c 79  id unnecessarily
b050: 20 71 75 6f 74 69 6e 67 20 63 6f 6d 6d 6f 6e 0a   quoting common.
b060: 20 20 20 20 20 20 2a 2a 20 74 79 70 65 6e 61 6d        ** typenam
b070: 65 73 20 6c 69 6b 65 20 56 41 52 43 48 41 52 28  es like VARCHAR(
b080: 31 30 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  10)..      */.  
b090: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20      needQuote = 
b0a0: 21 69 73 56 61 6c 69 64 44 69 6d 65 6e 73 69 6f  !isValidDimensio
b0b0: 6e 28 26 7a 49 64 65 6e 74 5b 6a 5d 29 3b 0a 20  n(&zIdent[j]);. 
b0c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b0d0: 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49 64 65  needQuote = zIde
b0e0: 6e 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  nt[j];.    }.  }
b0f0: 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74  ..  if( needQuot
b100: 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27  e ) z[i++] = '"'
b110: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64  ;.  for(j=0; zId
b120: 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20  ent[j]; j++){.  
b130: 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e    z[i++] = zIden
b140: 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49  t[j];.    if( zI
b150: 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a  dent[j]=='"' ) z
b160: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d  [i++] = '"';.  }
b170: 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65  .  if( needQuote
b180: 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b   ) z[i++] = '"';
b190: 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a  .  z[i] = 0;.  *
b1a0: 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a  pIdx = i;.}../*.
b1b0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 43 52  ** Generate a CR
b1c0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
b1d0: 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65  ment appropriate
b1e0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
b1f0: 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79  * table.  Memory
b200: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78   to hold the tex
b210: 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  t of the stateme
b220: 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a  nt is obtained.*
b230: 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  * from sqliteMal
b240: 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62  loc() and must b
b250: 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
b260: 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  alling function.
b270: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
b280: 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74  *createTableStmt
b290: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
b2a0: 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ble *p){.  int i
b2b0: 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , k, n;.  char *
b2c0: 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a  zStmt;.  char *z
b2d0: 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45  Sep, *zSep2, *zE
b2e0: 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e  nd, *z;.  Column
b2f0: 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20 30 3b   *pCol;.  n = 0;
b300: 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20 70 2d  .  for(pCol = p-
b310: 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c 70 2d  >aCol, i=0; i<p-
b320: 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43 6f 6c  >nCol; i++, pCol
b330: 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 69 64  ++){.    n += id
b340: 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c 2d 3e  entLength(pCol->
b350: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20 3d 20  zName);.    z = 
b360: 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20  pCol->zType;.   
b370: 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20   if( z ){.      
b380: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
b390: 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (z);.    }.  }. 
b3a0: 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74   n += identLengt
b3b0: 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 69  h(p->zName);.  i
b3c0: 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20 20 7a  f( n<50 ){.    z
b3d0: 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 7a 53  Sep = "";.    zS
b3e0: 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20 20 7a  ep2 = ",";.    z
b3f0: 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d 65 6c  End = ")";.  }el
b400: 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  se{.    zSep = "
b410: 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65 70 32  \n  ";.    zSep2
b420: 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20 20 20   = ",\n  ";.    
b430: 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a 20 20  zEnd = "\n)";.  
b440: 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20 36 2a  }.  n += 35 + 6*
b450: 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74  p->nCol;.  zStmt
b460: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
b470: 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a 53 74  ( n );.  if( zSt
b480: 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  mt==0 ){.    db-
b490: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
b4a0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
b4b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
b4c0: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74  nprintf(n, zStmt
b4d0: 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  , "CREATE TABLE 
b4e0: 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65  ");.  k = sqlite
b4f0: 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29  3Strlen30(zStmt)
b500: 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74  ;.  identPut(zSt
b510: 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65  mt, &k, p->zName
b520: 2c 20 30 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b  , 0);.  zStmt[k+
b530: 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28  +] = '(';.  for(
b540: 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d  pCol=p->aCol, i=
b550: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
b560: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
b570: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
b580: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
b590: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
b5a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b5b0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
b5c0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
b5d0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
b5e0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
b5f0: 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  me, 0);.    if( 
b600: 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (z = pCol->zType
b610: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 53  )!=0 ){.      zS
b620: 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27 3b 0a  tmt[k++] = ' ';.
b630: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
b640: 6e 74 29 28 73 71 6c 69 74 65 33 53 74 72 6c 65  nt)(sqlite3Strle
b650: 6e 33 30 28 7a 29 2b 6b 2b 31 29 3c 3d 6e 20 29  n30(z)+k+1)<=n )
b660: 3b 0a 20 20 20 20 20 20 69 64 65 6e 74 50 75 74  ;.      identPut
b670: 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 7a 2c 20 31  (zStmt, &k, z, 1
b680: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
b690: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
b6a0: 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20  n-k, &zStmt[k], 
b6b0: 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20 20 72  "%s", zEnd);.  r
b6c0: 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d 0a 0a  eturn zStmt;.}..
b6d0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
b6e0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
b6f0: 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c  report the final
b700: 20 22 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e   ")" that termin
b710: 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45  ates.** a CREATE
b720: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b730: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c  ..**.** The tabl
b740: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
b750: 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f   other action ro
b760: 75 74 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e  utines have been
b770: 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20   building.** is 
b780: 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74  added to the int
b790: 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65  ernal hash table
b7a0: 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65  s, assuming no e
b7b0: 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63  rrors have.** oc
b7c0: 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e  curred..**.** An
b7d0: 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74   entry for the t
b7e0: 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20  able is made in 
b7f0: 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
b800: 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73   on disk, unless
b810: 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20 74 65  .** this is a te
b820: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72  mporary table or
b830: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
b840: 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69  1.  When db->ini
b850: 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20  t.busy==1.** it 
b860: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
b870: 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f  ding the sqlite_
b880: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62 65 63  master table bec
b890: 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20  ause we just.** 
b8a0: 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65  connected to the
b8b0: 20 64 61 74 61 62 61 73 65 20 6f 72 20 62 65 63   database or bec
b8c0: 61 75 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f  ause the sqlite_
b8d0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68 61 73  master table has
b8e0: 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61  .** recently cha
b8f0: 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74  nged, so the ent
b900: 72 79 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c  ry for this tabl
b910: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
b920: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74   in.** the sqlit
b930: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20  e_master table. 
b940: 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20   We do not want 
b950: 74 6f 20 63 72 65 61 74 65 20 69 74 20 61 67 61  to create it aga
b960: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  in..**.** If the
b970: 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e   pSelect argumen
b980: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69  t is not NULL, i
b990: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69  t means that thi
b9a0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73  s routine.** was
b9b0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
b9c0: 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61  e a table genera
b9d0: 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22  ted from a .** "
b9e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e  CREATE TABLE ...
b9f0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20   AS SELECT ..." 
ba00: 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
ba10: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a  column names of.
ba20: 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  ** the new table
ba30: 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20   will match the 
ba40: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
ba50: 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69  e SELECT..*/.voi
ba60: 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c  d sqlite3EndTabl
ba70: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
ba80: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
ba90: 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f  Parse context */
baa0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c  .  Token *pCons,
bab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
bac0: 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65  e ',' token afte
bad0: 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d  r the last colum
bae0: 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b  n defn. */.  Tok
baf0: 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
bb00: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6e 61       /* The fina
bb10: 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e 20 74  l ')' token in t
bb20: 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  he CREATE TABLE 
bb30: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
bb40: 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20  lect         /* 
bb50: 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43  Select from a "C
bb60: 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c  REATE ... AS SEL
bb70: 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  ECT" */.){.  Tab
bb80: 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  le *p;.  sqlite3
bb90: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
bba0: 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
bbb0: 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20 26 26   if( (pEnd==0 &&
bbc0: 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c 7c 20   pSelect==0) || 
bbd0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
bbe0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bbf0: 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b   ) {.    return;
bc00: 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61 72 73  .  }.  p = pPars
bc10: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20  e->pNewTable;.  
bc20: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
bc30: 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 64  n;..  assert( !d
bc40: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c 20  b->init.busy || 
bc50: 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20 69  !pSelect );..  i
bc60: 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
bc70: 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 2d  maToIndex(db, p-
bc80: 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69 66 6e  >pSchema);..#ifn
bc90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bca0: 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73 6f 6c  CHECK.  /* Resol
bcb0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
bcc0: 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74  CHECK constraint
bcd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
bce0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43 68 65  */.  if( p->pChe
bcf0: 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  ck ){.    SrcLis
bd00: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
bd10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
bd20: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
bd30: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
bd40: 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65  */.    NameConte
bd50: 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20  xt sNC;         
bd60: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
bd70: 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72 73  ontext for pPars
bd80: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a  e->pNewTable */.
bd90: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 4e 43  .    memset(&sNC
bda0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29  , 0, sizeof(sNC)
bdb0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  );.    memset(&s
bdc0: 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Src, 0, sizeof(s
bdd0: 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72 63 2e  Src));.    sSrc.
bde0: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
bdf0: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
be00: 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 73 53  p->zName;.    sS
be10: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
be20: 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e  ;.    sSrc.a[0].
be30: 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  iCursor = -1;.  
be40: 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70    sNC.pParse = p
be50: 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70  Parse;.    sNC.p
be60: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
be70: 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65 63 6b  .    sNC.isCheck
be80: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 73 71   = 1;.    if( sq
be90: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
bea0: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
beb0: 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  Check) ){.      
bec0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
bed0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
bee0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bef0: 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20 2f 2a  _CHECK) */..  /*
bf00: 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69 74   If the db->init
bf10: 2e 62 75 73 79 20 69 73 20 31 20 69 74 20 6d 65  .busy is 1 it me
bf20: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
bf30: 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66 20 74  ng the SQL off t
bf40: 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74 65 5f  he.  ** "sqlite_
bf50: 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71 6c 69  master" or "sqli
bf60: 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 20  te_temp_master" 
bf70: 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64 69 73  table on the dis
bf80: 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20 6e 6f  k..  ** So do no
bf90: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  t write to the d
bfa0: 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78 74 72  isk again.  Extr
bfb0: 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67  act the root pag
bfc0: 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 66 6f  e number.  ** fo
bfd0: 72 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  r the table from
bfe0: 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e 6e 65   the db->init.ne
bff0: 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20 28 54  wTnum field.  (T
c000: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20  he page number. 
c010: 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76 65 20   ** should have 
c020: 62 65 65 6e 20 70 75 74 20 74 68 65 72 65 20 62  been put there b
c030: 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70 65 6e  y the sqliteOpen
c040: 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20 20 2a  Cb routine.).  *
c050: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  /.  if( db->init
c060: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70 2d 3e  .busy ){.    p->
c070: 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
c080: 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a 20 20  newTnum;.  }..  
c090: 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61  /* If not initia
c0a0: 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65  lizing, then cre
c0b0: 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72  ate a record for
c0c0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20   the new table. 
c0d0: 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54   ** in the SQLIT
c0e0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f  E_MASTER table o
c0f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
c100: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    **.  ** If thi
c110: 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59  s is a TEMPORARY
c120: 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68   table, write th
c130: 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  e entry into the
c140: 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
c150: 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
c160: 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
c170: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a  tabase file..  *
c180: 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69  /.  if( !db->ini
c190: 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e  t.busy ){.    in
c1a0: 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  t n;.    Vdbe *v
c1b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70  ;.    char *zTyp
c1c0: 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20  e;    /* "view" 
c1d0: 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20  or "table" */.  
c1e0: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20    char *zType2; 
c1f0: 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22    /* "VIEW" or "
c200: 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68  TABLE" */.    ch
c210: 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a  ar *zStmt;    /*
c220: 20 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45   Text of the CRE
c230: 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45  ATE TABLE or CRE
c240: 41 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65  ATE VIEW stateme
c250: 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73  nt */..    v = s
c260: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
c270: 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 76  arse);.    if( v
c280: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
c290: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c2a0: 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65  dOp1(v, OP_Close
c2b0: 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 0a 20  , 0);..    /* . 
c2c0: 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65     ** Initialize
c2d0: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 6e   zType for the n
c2e0: 65 77 20 76 69 65 77 20 6f 72 20 74 61 62 6c 65  ew view or table
c2f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c300: 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29   p->pSelect==0 )
c310: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72 65 67  {.      /* A reg
c320: 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ular table */.  
c330: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74 61 62      zType = "tab
c340: 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65  le";.      zType
c350: 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23 69 66  2 = "TABLE";.#if
c360: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
c370: 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73 65 7b  _VIEW.    }else{
c380: 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69 65 77  .      /* A view
c390: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
c3a0: 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20 20 20  = "view";.      
c3b0: 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57 22 3b  zType2 = "VIEW";
c3c0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
c3d0: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
c3e0: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
c3f0: 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  xx AS SELECT ...
c400: 2c 20 65 78 65 63 75 74 65 20 74 68 65 20 53 45  , execute the SE
c410: 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74 61 74  LECT.    ** stat
c420: 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c 61 74  ement to populat
c430: 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e  e the new table.
c440: 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6e   The root-page n
c450: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a 20 20  umber for the.  
c460: 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65 20 69    ** new table i
c470: 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 70 50  s in register pP
c480: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e 0a 20  arse->regRoot.. 
c490: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 6e 63     **.    ** Onc
c4a0: 65 20 74 68 65 20 53 45 4c 45 43 54 20 68 61 73  e the SELECT has
c4b0: 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79 20 73   been coded by s
c4c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29 2c 20  qlite3Select(), 
c4d0: 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20 20 2a  it is in a.    *
c4e0: 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61 74 65  * suitable state
c4f0: 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 74 68   to query for th
c500: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
c510: 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65 20 75  nd types to be u
c520: 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  sed.    ** by th
c530: 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20 20 20  e new table..   
c540: 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73 68 61   **.    ** A sha
c550: 72 65 64 2d 63 61 63 68 65 20 77 72 69 74 65 2d  red-cache write-
c560: 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
c570: 69 72 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f  ired to write to
c580: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2c 0a   the new table,.
c590: 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63 68 65      ** as a sche
c5a0: 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68 61 76  ma-lock must hav
c5b0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f  e already been o
c5c0: 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65 61 74  btained to creat
c5d0: 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20 20 20  e it. Since.    
c5e0: 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  ** a schema-lock
c5f0: 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20 6f 74   excludes all ot
c600: 68 65 72 20 64 61 74 61 62 61 73 65 20 75 73 65  her database use
c610: 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d 6c 6f  rs, the write-lo
c620: 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ck would.    ** 
c630: 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20  be redundant..  
c640: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65    */.    if( pSe
c650: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 53 65  lect ){.      Se
c660: 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 0a 20  lectDest dest;. 
c670: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c       Table *pSel
c680: 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  Tab;..      asse
c690: 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61 62 3d  rt(pParse->nTab=
c6a0: 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  =1);.      sqlit
c6b0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
c6c0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 31 2c  OP_OpenWrite, 1,
c6d0: 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74   pParse->regRoot
c6e0: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
c6f0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
c700: 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  5(v, 1);.      p
c710: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
c720: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
c730: 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26 64 65  lectDestInit(&de
c740: 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c 20 31  st, SRT_Table, 1
c750: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c760: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
c770: 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a  Select, &dest);.
c780: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c790: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
c7a0: 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  ose, 1);.      i
c7b0: 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d  f( pParse->nErr=
c7c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53  =0 ){.        pS
c7d0: 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
c7e0: 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
c7f0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74  (pParse, pSelect
c800: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
c810: 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65 74 75  SelTab==0 ) retu
c820: 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  rn;.        asse
c830: 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30 20 29  rt( p->aCol==0 )
c840: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 6f  ;.        p->nCo
c850: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f  l = pSelTab->nCo
c860: 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 43  l;.        p->aC
c870: 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43  ol = pSelTab->aC
c880: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c  ol;.        pSel
c890: 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20  Tab->nCol = 0;. 
c8a0: 20 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e         pSelTab->
c8b0: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
c8c0: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
c8d0: 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b 0a 20  able(pSelTab);. 
c8e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
c8f0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
c900: 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
c910: 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
c920: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
c930: 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
c940: 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
c950: 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
c960: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c970: 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28 70 45      n = (int)(pE
c980: 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65 2d 3e  nd->z - pParse->
c990: 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20 2b 20  sNameToken.z) + 
c9a0: 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20 3d  1;.      zStmt =
c9b0: 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
c9c0: 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  db, .          "
c9d0: 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22 2c  CREATE %s %.*s",
c9e0: 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61 72   zType2, n, pPar
c9f0: 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a  se->sNameToken.z
ca00: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
ca10: 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20 66  .    /* A slot f
ca20: 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68 61  or the record ha
ca30: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
ca40: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65 20  llocated in the 
ca50: 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4d  .    ** SQLITE_M
ca60: 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57 65  ASTER table.  We
ca70: 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75 70   just need to up
ca80: 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20 77  date that slot w
ca90: 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  ith all.    ** t
caa0: 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  he information w
cab0: 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e 0a  e've collected..
cac0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
cad0: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
cae0: 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50 44  arse,.      "UPD
caf0: 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20 20  ATE %Q.%s ".    
cb00: 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d 27       "SET type='
cb10: 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74 62  %s', name=%Q, tb
cb20: 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74 70  l_name=%Q, rootp
cb30: 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51 20  age=#%d, sql=%Q 
cb40: 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45 20  ".       "WHERE 
cb50: 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20 20  rowid=#%d",.    
cb60: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a    db->aDb[iDb].z
cb70: 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
cb80: 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 7a  LE(iDb),.      z
cb90: 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Type,.      p->z
cba0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e 7a  Name,.      p->z
cbb0: 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61 72  Name,.      pPar
cbc0: 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20 20  se->regRoot,.   
cbd0: 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20 20     zStmt,.      
cbe0: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69 64  pParse->regRowid
cbf0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69  .    );.    sqli
cc00: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 53  te3DbFree(db, zS
cc10: 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tmt);.    sqlite
cc20: 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
cc30: 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69 66  arse, iDb);..#if
cc40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
cc50: 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
cc60: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
cc70: 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ee if we need to
cc80: 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69 74   create an sqlit
cc90: 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
cca0: 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65 70   for.    ** keep
ccb0: 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75 74  ing track of aut
ccc0: 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73 2e  oincrement keys.
ccd0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
cce0: 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  p->tabFlags & TF
ccf0: 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 29  _Autoincrement )
cd00: 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62 20  {.      Db *pDb 
cd10: 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b  = &db->aDb[iDb];
cd20: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
cd30: 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54 61 62  pSchema->pSeqTab
cd40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
cd50: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
cd60: 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
cd70: 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
cd80: 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65 71 75  E %Q.sqlite_sequ
cd90: 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29 22 2c  ence(name,seq)",
cda0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e  .          pDb->
cdb0: 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 29 3b  zName.        );
cdc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
cdd0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 52 65  endif..    /* Re
cde0: 70 61 72 73 65 20 65 76 65 72 79 74 68 69 6e 67  parse everything
cdf0: 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72 20 69   to update our i
ce00: 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73 74 72  nternal data str
ce10: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 73  uctures */.    s
ce20: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ce30: 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65  (v, OP_ParseSche
ce40: 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20  ma, iDb, 0, 0,. 
ce50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
ce60: 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e  rintf(db, "tbl_n
ce70: 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a 4e 61  ame='%q'",p->zNa
ce80: 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  me), P4_DYNAMIC)
ce90: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 64 64  ;.  }...  /* Add
cea0: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 74 68   the table to th
ceb0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72  e in-memory repr
cec0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
ced0: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  e database..  */
cee0: 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
cef0: 62 75 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e  busy && pParse->
cf00: 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 54  nErr==0 ){.    T
cf10: 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20 20 20  able *pOld;.    
cf20: 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20  Schema *pSchema 
cf30: 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  = p->pSchema;.  
cf40: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
cf50: 48 61 73 68 49 6e 73 65 72 74 28 26 70 53 63 68  HashInsert(&pSch
cf60: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 70 2d  ema->tblHash, p-
cf70: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  >zName,.        
cf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf90: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c       sqlite3Strl
cfa0: 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d 65 29 2c 70  en30(p->zName),p
cfb0: 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
cfc0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
cfd0: 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
cfe0: 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
cff0: 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
d000: 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
d010: 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
d020: 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
d030: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
d040: 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
d050: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
d060: 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20 20 20  ->nTable++;.    
d070: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
d080: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
d090: 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s;..#ifndef SQLI
d0a0: 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42  TE_OMIT_ALTERTAB
d0b0: 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70  LE.    if( !p->p
d0c0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
d0d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
d0e0: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
d0f0: 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54  *)pParse->sNameT
d100: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
d110: 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61  t nName;.      a
d120: 73 73 65 72 74 28 20 21 70 53 65 6c 65 63 74 20  ssert( !pSelect 
d130: 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64  && pCons && pEnd
d140: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43   );.      if( pC
d150: 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ons->z==0 ){.   
d160: 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e       pCons = pEn
d170: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
d180: 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28   nName = (int)((
d190: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f  const char *)pCo
d1a0: 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a  ns->z - zName);.
d1b0: 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f        p->addColO
d1c0: 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c  ffset = 13 + sql
d1d0: 69 74 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28  ite3Utf8CharLen(
d1e0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
d1f0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
d200: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d210: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a  E_OMIT_VIEW./*.*
d220: 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61 6c  * The parser cal
d230: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
d240: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
d250: 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f  te a new VIEW.*/
d260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65  .void sqlite3Cre
d270: 61 74 65 56 69 65 77 28 0a 20 20 50 61 72 73 65  ateView(.  Parse
d280: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
d290: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
d2a0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
d2b0: 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20  *pBegin,     /* 
d2c0: 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e  The CREATE token
d2d0: 20 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 65   that begins the
d2e0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
d2f0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
d300: 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
d310: 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
d320: 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
d330: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
d340: 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74  e2,     /* The t
d350: 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20  oken that holds 
d360: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
d370: 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65 63 74  view */.  Select
d380: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
d390: 41 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  A SELECT stateme
d3a0: 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63  nt that will bec
d3b0: 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69 65 77  ome the new view
d3c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65 6d 70   */.  int isTemp
d3d0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45  ,        /* TRUE
d3e0: 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41 52 59   for a TEMPORARY
d3f0: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 6e   view */.  int n
d400: 6f 45 72 72 20 20 20 20 20 20 20 20 20 20 2f 2a  oErr          /*
d410: 20 53 75 70 70 72 65 73 73 20 65 72 72 6f 72 20   Suppress error 
d420: 6d 65 73 73 61 67 65 73 20 69 66 20 56 49 45 57  messages if VIEW
d430: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
d440: 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  */.){.  Table *p
d450: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  ;.  int n;.  con
d460: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
d470: 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
d480: 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
d490: 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
d4a0: 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20  e;.  int iDb;.  
d4b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
d4c0: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  arse->db;..  if(
d4d0: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e 30 20   pParse->nVar>0 
d4e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
d4f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
d500: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 6e  parameters are n
d510: 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20 76 69  ot allowed in vi
d520: 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  ews");.    sqlit
d530: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
d540: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
d550: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
d560: 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
d570: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
d580: 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c   pName2, isTemp,
d590: 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20   1, 0, noErr);. 
d5a0: 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
d5b0: 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
d5c0: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
d5d0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
d5e0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
d5f0: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
d600: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71  return;.  }.  sq
d610: 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
d620: 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
d630: 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
d640: 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
d650: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
d660: 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
d670: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 78    if( sqlite3Fix
d680: 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61 72  Init(&sFix, pPar
d690: 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77 22 2c  se, iDb, "view",
d6a0: 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26 20 73   pName).    && s
d6b0: 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63 74 28  qlite3FixSelect(
d6c0: 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74 29 0a  &sFix, pSelect).
d6d0: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
d6e0: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d6f0: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 72   pSelect);.    r
d700: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
d710: 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
d720: 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c 45 43  the entire SELEC
d730: 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
d740: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
d750: 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77 69 6c  w..  ** This wil
d760: 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68 65 20  l force all the 
d770: 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76 61 6c  Expr.token.z val
d780: 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61 6d 69  ues to be dynami
d790: 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  cally.  ** alloc
d7a0: 61 74 65 64 20 72 61 74 68 65 72 20 74 68 61 6e  ated rather than
d7b0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69 6e   point to the in
d7c0: 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77 68 69  put string - whi
d7d0: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  ch means that.  
d7e0: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70 65 72  ** they will per
d7f0: 73 69 73 74 20 61 66 74 65 72 20 74 68 65 20 63  sist after the c
d800: 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
d810: 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74 75 72  xec() call retur
d820: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 53  ns..  */.  p->pS
d830: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
d840: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 53 65  electDup(db, pSe
d850: 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f 52 45  lect, EXPRDUP_RE
d860: 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74 65 33  DUCE);.  sqlite3
d870: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
d880: 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28   pSelect);.  if(
d890: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
d8a0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  d ){.    return;
d8b0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62 2d 3e  .  }.  if( !db->
d8c0: 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
d8d0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
d8e0: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
d8f0: 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  e, p);.  }..  /*
d900: 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e 64 20   Locate the end 
d910: 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 56 49  of the CREATE VI
d920: 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 4d  EW statement.  M
d930: 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74 20 74  ake sEnd point t
d940: 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64 2e 0a  o.  ** the end..
d950: 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20 70 50    */.  sEnd = pP
d960: 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
d970: 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30  ;.  if( sEnd.z[0
d980: 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a 5b 30  ]!=0 && sEnd.z[0
d990: 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45  ]!=';' ){.    sE
d9a0: 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a  nd.z += sEnd.n;.
d9b0: 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30    }.  sEnd.n = 0
d9c0: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45  ;.  n = (int)(sE
d9d0: 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a  nd.z - pBegin->z
d9e0: 29 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  );.  z = (const 
d9f0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70  unsigned char*)p
da00: 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68 69 6c  Begin->z;.  whil
da10: 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e 2d 31  e( n>0 && (z[n-1
da20: 5d 3d 3d 27 3b 27 20 7c 7c 20 73 71 6c 69 74 65  ]==';' || sqlite
da30: 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29  3Isspace(z[n-1])
da40: 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45  ) ){ n--; }.  sE
da50: 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a  nd.z = &z[n-1];.
da60: 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20    sEnd.n = 1;.. 
da70: 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45   /* Use sqlite3E
da80: 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64  ndTable() to add
da90: 20 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65   the view to the
daa0: 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74   SQLITE_MASTER t
dab0: 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  able */.  sqlite
dac0: 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65  3EndTable(pParse
dad0: 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29 3b 0a  , 0, &sEnd, 0);.
dae0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64    return;.}.#end
daf0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
db00: 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21  T_VIEW */..#if !
db10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
db20: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
db30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
db40: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
db50: 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20  /*.** The Table 
db60: 73 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65  structure pTable
db70: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45   is really a VIE
db80: 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20  W.  Fill in the 
db90: 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20  names of.** the 
dba0: 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76  columns of the v
dbb0: 69 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c  iew in the pTabl
dbc0: 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65  e structure.  Re
dbd0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a  turn the number.
dbe0: 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49  ** of errors.  I
dbf0: 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65  f an error is se
dc00: 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  en leave an erro
dc10: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
dc20: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f  rse->zErrMsg..*/
dc30: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77  .int sqlite3View
dc40: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50  GetColumnNames(P
dc50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
dc60: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
dc70: 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20  Table *pSelTab; 
dc80: 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c    /* A fake tabl
dc90: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20  e from which we 
dca0: 67 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73  get the result s
dcb0: 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  et */.  Select *
dcc0: 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70  pSel;     /* Cop
dcd0: 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  y of the SELECT 
dce0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
dcf0: 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e  the view */.  in
dd00: 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20  t nErr = 0;     
dd10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
dd20: 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  ors encountered 
dd30: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
dd40: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
dd50: 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20  arily holds the 
dd60: 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
dd70: 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20  s assigned */.  
dd80: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
dd90: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61  arse->db;  /* Da
dda0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ddb0: 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72  n for malloc err
ddc0: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78  ors */.  int (*x
ddd0: 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  Auth)(void*,int,
dde0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
ddf0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
de00: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
de10: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
de20: 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ble );..#ifndef 
de30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
de40: 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 73  UALTABLE.  if( s
de50: 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43 6f  qlite3VtabCallCo
de60: 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70 54  nnect(pParse, pT
de70: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  able) ){.    ret
de80: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
de90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56 69  ;.  }.  if( IsVi
dea0: 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29 20  rtual(pTable) ) 
deb0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
dec0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ded0: 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a 20  _OMIT_VIEW.  /* 
dee0: 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c 20  A positive nCol 
def0: 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d 6e  means the column
df00: 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69 73  s names for this
df10: 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20 61   view are.  ** a
df20: 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20 20  lready known..  
df30: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65 2d  */.  if( pTable-
df40: 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72 6e  >nCol>0 ) return
df50: 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67 61   0;..  /* A nega
df60: 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20 73  tive nCol is a s
df70: 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d 65  pecial marker me
df80: 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61 72  aning that we ar
df90: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
dfa0: 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70 75   trying to compu
dfb0: 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  te the column na
dfc0: 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74 65  mes.  If we ente
dfd0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
dfe0: 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61 74  ith.  ** a negat
dff0: 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65 61  ive nCol, it mea
e000: 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 76  ns two or more v
e010: 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f 70  iews form a loop
e020: 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 2a  , like this:.  *
e030: 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  *.  **     CREAT
e040: 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53 45  E VIEW one AS SE
e050: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f 3b  LECT * FROM two;
e060: 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45  .  **     CREATE
e070: 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45 4c   VIEW two AS SEL
e080: 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b 0a  ECT * FROM one;.
e090: 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c    **.  ** Actual
e0a0: 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72 20 69  ly, this error i
e0b0: 73 20 63 61 75 67 68 74 20 70 72 65 76 69 6f 75  s caught previou
e0c0: 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65 20 66  sly and so the f
e0d0: 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a 20 20  ollowing test.  
e0e0: 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  ** should always
e0f0: 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65 20 77   fail.  But we w
e100: 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69 6e 20  ill leave it in 
e110: 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20 62 65  place just to be
e120: 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   safe..  */.  if
e130: 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c 30  ( pTable->nCol<0
e140: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
e150: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
e160: 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72 63  "view %s is circ
e170: 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22 2c  ularly defined",
e180: 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b   pTable->zName);
e190: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
e1a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
e1b0: 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b 0a  ble->nCol>=0 );.
e1c0: 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20  .  /* If we get 
e1d0: 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
e1e0: 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 6f  ns we need to co
e1f0: 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65 20  mpute the table 
e200: 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74 65  names..  ** Note
e210: 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20 74   that the call t
e220: 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53  o sqlite3ResultS
e230: 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69 6c  etOfSelect() wil
e240: 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20 2a  l expand any.  *
e250: 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20 69  * "*" elements i
e260: 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73 65  n the results se
e270: 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61 6e  t of the view an
e280: 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63 75  d will assign cu
e290: 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74 68  rsors.  ** to th
e2a0: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68  e elements of th
e2b0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
e2c0: 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77 61  But we do not wa
e2d0: 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65 73  nt these changes
e2e0: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72 6d  .  ** to be perm
e2f0: 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20 63  anent.  So the c
e300: 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64 6f  omputation is do
e310: 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66 20  ne on a copy of 
e320: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a 20  the SELECT.  ** 
e330: 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 64  statement that d
e340: 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77 2e  efines the view.
e350: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
e360: 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 20  pTable->pSelect 
e370: 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71 6c 69  );.  pSel = sqli
e380: 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c  te3SelectDup(db,
e390: 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
e3a0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 65 6c  , 0);.  if( pSel
e3b0: 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61 62 6c   ){.    u8 enabl
e3c0: 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64 62 2d  eLookaside = db-
e3d0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e3e0: 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70 50 61  led;.    n = pPa
e3f0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 73  rse->nTab;.    s
e400: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
e410: 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61 72 73  ignCursors(pPars
e420: 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29 3b 0a  e, pSel->pSrc);.
e430: 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c      pTable->nCol
e440: 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d 3e 6c   = -1;.    db->l
e450: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
e460: 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  d = 0;.#ifndef S
e470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
e480: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78 41 75  RIZATION.    xAu
e490: 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a  th = db->xAuth;.
e4a0: 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20      db->xAuth = 
e4b0: 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62 20 3d  0;.    pSelTab =
e4c0: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
e4d0: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
e4e0: 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64 62 2d  , pSel);.    db-
e4f0: 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68 3b 0a  >xAuth = xAuth;.
e500: 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c 54 61  #else.    pSelTa
e510: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
e520: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
e530: 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65 6e 64  rse, pSel);.#end
e540: 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  if.    db->looka
e550: 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
e560: 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 3b  enableLookaside;
e570: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 54 61  .    pParse->nTa
e580: 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 70  b = n;.    if( p
e590: 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20 20 20  SelTab ){.      
e5a0: 61 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e  assert( pTable->
e5b0: 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20  aCol==0 );.     
e5c0: 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20   pTable->nCol = 
e5d0: 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20  pSelTab->nCol;. 
e5e0: 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
e5f0: 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
e600: 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62  l;.      pSelTab
e610: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
e620: 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f 6c 20    pSelTab->aCol 
e630: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
e640: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 53  e3DeleteTable(pS
e650: 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54  elTab);.      pT
e660: 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 66  able->pSchema->f
e670: 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73  lags |= DB_Unres
e680: 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d 65 6c  etViews;.    }el
e690: 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62 6c 65  se{.      pTable
e6a0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->nCol = 0;.    
e6b0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a    nErr++;.    }.
e6c0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
e6d0: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53 65 6c  tDelete(db, pSel
e6e0: 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  );.  } else {.  
e6f0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 23 65    nErr++;.  }.#e
e700: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e710: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20 72 65  MIT_VIEW */.  re
e720: 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d 0a 23  turn nErr;  .}.#
e730: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
e740: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
e750: 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  EW) || !defined(
e760: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
e770: 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a 23 69  UALTABLE) */..#i
e780: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e790: 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65  T_VIEW./*.** Cle
e7a0: 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ar the column na
e7b0: 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79 20 56  mes from every V
e7c0: 49 45 57 20 69 6e 20 64 61 74 61 62 61 73 65 20  IEW in database 
e7d0: 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  idx..*/.static v
e7e0: 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77 52 65  oid sqliteViewRe
e7f0: 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a  setAll(sqlite3 *
e800: 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20 20  db, int idx){.  
e810: 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69  HashElem *i;.  i
e820: 66 28 20 21 44 62 48 61 73 50 72 6f 70 65 72 74  f( !DbHasPropert
e830: 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e  y(db, idx, DB_Un
e840: 72 65 73 65 74 56 69 65 77 73 29 20 29 20 72 65  resetViews) ) re
e850: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 73 71  turn;.  for(i=sq
e860: 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64  liteHashFirst(&d
e870: 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53 63 68  b->aDb[idx].pSch
e880: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 69  ema->tblHash); i
e890: 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  ;i=sqliteHashNex
e8a0: 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62 6c 65  t(i)){.    Table
e8b0: 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65 48   *pTab = sqliteH
e8c0: 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20  ashData(i);.    
e8d0: 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65 63  if( pTab->pSelec
e8e0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
e8f0: 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  eResetColumnName
e900: 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20  s(pTab);.    }. 
e910: 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70   }.  DbClearProp
e920: 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42  erty(db, idx, DB
e930: 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a  _UnresetViews);.
e940: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
e950: 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74   sqliteViewReset
e960: 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20  All(A,B).#endif 
e970: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
e980: 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  IEW */../*.** Th
e990: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
e9a0: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56 44 42  alled by the VDB
e9b0: 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  E to adjust the 
e9c0: 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a  internal schema.
e9d0: 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c 69 74  ** used by SQLit
e9e0: 65 20 77 68 65 6e 20 74 68 65 20 62 74 72 65 65  e when the btree
e9f0: 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74   layer moves a t
ea00: 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20  able root page. 
ea10: 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65  The.** root-page
ea20: 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69   of a table or i
ea30: 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61 73 65  ndex in database
ea40: 20 69 44 62 20 68 61 73 20 63 68 61 6e 67 65 64   iDb has changed
ea50: 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74   from iFrom.** t
ea60: 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63  o iTo..**.** Tic
ea70: 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68 65 20  ket #1728:  The 
ea80: 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67  symbol table mig
ea90: 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  ht still contain
eaa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
eab0: 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72  on tables and/or
eac0: 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 61 72   indices that ar
ead0: 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66  e the process of
eae0: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a   being deleted..
eaf0: 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e  ** If you are un
eb00: 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68  lucky, one of th
eb10: 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69  ose deleted indi
eb20: 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69  ces or tables mi
eb30: 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ght.** have the 
eb40: 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75  same rootpage nu
eb50: 6d 62 65 72 20 61 73 20 74 68 65 20 72 65 61 6c  mber as the real
eb60: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
eb70: 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67  that is.** being
eb80: 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63   moved.  So we c
eb90: 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63  annot stop searc
eba0: 68 69 6e 67 20 61 66 74 65 72 20 74 68 65 20 66  hing after the f
ebb0: 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62  irst match .** b
ebc0: 65 63 61 75 73 65 20 74 68 65 20 66 69 72 73 74  ecause the first
ebd0: 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62 65 20   match might be 
ebe0: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64  for one of the d
ebf0: 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a  eleted indices.*
ec00: 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20  * or tables and 
ec10: 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e  not the table/in
ec20: 64 65 78 20 74 68 61 74 20 69 73 20 61 63 74 75  dex that is actu
ec30: 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64  ally being moved
ec40: 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e  ..** We must con
ec50: 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e  tinue looping un
ec60: 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61  til all tables a
ec70: 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a  nd indices with.
ec80: 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72  ** rootpage==iFr
ec90: 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e  om have been con
eca0: 76 65 72 74 65 64 20 74 6f 20 68 61 76 65 20 61  verted to have a
ecb0: 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f   rootpage of iTo
ecc0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
ecd0: 62 65 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  be certain that 
ece0: 77 65 20 67 6f 74 20 74 68 65 20 72 69 67 68 74  we got the right
ecf0: 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66   one..*/.#ifndef
ed00: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
ed10: 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c  OVACUUM.void sql
ed20: 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65  ite3RootPageMove
ed30: 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74 20 69  d(Db *pDb, int i
ed40: 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b 0a  From, int iTo){.
ed50: 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45 6c 65    HashElem *pEle
ed60: 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61 73 68  m;.  Hash *pHash
ed70: 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44  ;..  pHash = &pD
ed80: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
ed90: 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
eda0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
edb0: 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
edc0: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
edd0: 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
ede0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
edf0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
ee00: 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
ee10: 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Tab->tnum==iFrom
ee20: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d 3e   ){.      pTab->
ee30: 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
ee40: 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20 3d 20  }.  }.  pHash = 
ee50: 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69  &pDb->pSchema->i
ee60: 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45  dxHash;.  for(pE
ee70: 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69  lem=sqliteHashFi
ee80: 72 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65  rst(pHash); pEle
ee90: 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48  m; pElem=sqliteH
eea0: 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b  ashNext(pElem)){
eeb0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
eec0: 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74   = sqliteHashDat
eed0: 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66  a(pElem);.    if
eee0: 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46  ( pIdx->tnum==iF
eef0: 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 49 64  rom ){.      pId
ef00: 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20  x->tnum = iTo;. 
ef10: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
ef20: 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63  f../*.** Write c
ef30: 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 68 65  ode to erase the
ef40: 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74   table with root
ef50: 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66 72 6f  -page iTable fro
ef60: 6d 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 0a  m database iDb..
ef70: 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20 63 6f  ** Also write co
ef80: 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  de to modify the
ef90: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
efa0: 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72 6e 61  able and interna
efb0: 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61  l schema.** if a
efc0: 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e   root-page of an
efd0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
efe0: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
eff0: 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74 0a 2a  e-layer whilst.*
f000: 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62 6c 65  * erasing iTable
f010: 20 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65   (this can happe
f020: 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76  n with an auto-v
f030: 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e  acuum database).
f040: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
f050: 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65   destroyRootPage
f060: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
f070: 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20  int iTable, int 
f080: 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  iDb){.  Vdbe *v 
f090: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
f0a0: 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e 74 20  (pParse);.  int 
f0b0: 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
f0c0: 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
f0d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
f0e0: 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
f0f0: 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
f100: 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  Db);.#ifndef SQL
f110: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
f120: 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74  UUM.  /* OP_Dest
f130: 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e  roy stores an in
f140: 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20   integer r1. If 
f150: 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a  this integer.  *
f160: 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  * is non-zero, t
f170: 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f  hen it is the ro
f180: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
f190: 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20  f a table moved 
f1a0: 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e  to.  ** location
f1b0: 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c   iTable. The fol
f1c0: 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69  lowing code modi
f1d0: 66 69 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f  fies the sqlite_
f1e0: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a  master table to.
f1f0: 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69    ** reflect thi
f200: 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  s..  **.  ** The
f210: 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53   "#NNN" in the S
f220: 51 4c 20 69 73 20 61 20 73 70 65 63 69 61 6c 20  QL is a special 
f230: 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65  constant that me
f240: 61 6e 73 20 77 68 61 74 65 76 65 72 20 76 61 6c  ans whatever val
f250: 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65  ue.  ** is in re
f260: 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65  gister NNN.  See
f270: 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72   sqlite3Register
f280: 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  Expr()..  */.  s
f290: 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
f2a0: 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  e(pParse, .     
f2b0: 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 53 45  "UPDATE %Q.%s SE
f2c0: 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20 57 48  T rootpage=%d WH
f2d0: 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f 6f 74  ERE #%d AND root
f2e0: 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20 20 20  page=#%d",.     
f2f0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b  pParse->db->aDb[
f300: 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45  iDb].zName, SCHE
f310: 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 69  MA_TABLE(iDb), i
f320: 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29 3b 0a  Table, r1, r1);.
f330: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
f340: 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
f350: 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f  Parse, r1);.}../
f360: 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42 45 20  *.** Write VDBE 
f370: 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74 61  code to erase ta
f380: 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61 6c 6c  ble pTab and all
f390: 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e 64 69   associated indi
f3a0: 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20  ces on disk..** 
f3b0: 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65 20 74  Code to update t
f3c0: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f3d0: 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e 74 65   tables and inte
f3e0: 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65 66 69  rnal schema defi
f3f0: 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61  nitions.** in ca
f400: 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 62  se a root-page b
f410: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e 6f 74  elonging to anot
f420: 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76  her table is mov
f430: 65 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20  ed by the btree 
f440: 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c 73 6f  layer.** is also
f450: 20 61 64 64 65 64 20 28 74 68 69 73 20 63 61 6e   added (this can
f460: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 6e 20   happen with an 
f470: 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
f480: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
f490: 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54 61 62   void destroyTab
f4a0: 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
f4b0: 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
f4c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
f4d0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
f4e0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69  Index *pIdx;.  i
f4f0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
f500: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
f510: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
f520: 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65 73 74  pSchema);.  dest
f530: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
f540: 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  se, pTab->tnum, 
f550: 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49 64 78  iDb);.  for(pIdx
f560: 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70  =pTab->pIndex; p
f570: 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e  Idx; pIdx=pIdx->
f580: 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65 73 74  pNext){.    dest
f590: 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50 61 72  royRootPage(pPar
f5a0: 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  se, pIdx->tnum, 
f5b0: 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  iDb);.  }.#else.
f5c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
f5d0: 62 61 73 65 20 6d 61 79 20 62 65 20 61 75 74 6f  base may be auto
f5e0: 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c 65 20  -vacuum capable 
f5f0: 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  (if SQLITE_OMIT_
f600: 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a 2a 20  AUTOVACUUM.  ** 
f610: 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 29 2c  is not defined),
f620: 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d 70 6f   then it is impo
f630: 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20 4f 50  rtant to call OP
f640: 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68 65 0a  _Destroy on the.
f650: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 69    ** table and i
f660: 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65 73 20  ndex root-pages 
f670: 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72 74 69  in order, starti
f680: 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75 6d 65  ng with the nume
f690: 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61  rically .  ** la
f6a0: 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20  rgest root-page 
f6b0: 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67 75 61  number. This gua
f6c0: 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e 6f 6e  rantees that non
f6d0: 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d 70 61  e of the root-pa
f6e0: 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 64  ges.  ** to be d
f6f0: 65 73 74 72 6f 79 65 64 20 69 73 20 72 65 6c 6f  estroyed is relo
f700: 63 61 74 65 64 20 62 79 20 61 6e 20 65 61 72 6c  cated by an earl
f710: 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79 2e 20  ier OP_Destroy. 
f720: 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20 2a 2a  i.e. if the.  **
f730: 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72 65 20   following were 
f740: 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  coded:.  **.  **
f750: 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 0a   OP_Destroy 4 0.
f760: 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50    ** ....  ** OP
f770: 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20 20 2a  _Destroy 5 0.  *
f780: 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f 74 20  *.  ** and root 
f790: 70 61 67 65 20 35 20 68 61 70 70 65 6e 65 64 20  page 5 happened 
f7a0: 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67 65 73  to be the larges
f7b0: 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
f7c0: 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  er in the.  ** d
f7d0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 72 6f  atabase, then ro
f7e0: 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c 64 20  ot page 5 would 
f7f0: 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61 67 65  be moved to page
f800: 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a 2a 20   4 by the .  ** 
f810: 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20 30 22  "OP_Destroy 4 0"
f820: 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73 75 62   opcode. The sub
f830: 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65 73 74  sequent "OP_Dest
f840: 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64 20 68  roy 5 0" would h
f850: 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65 2d 6c  it.  ** a free-l
f860: 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  ist page..  */. 
f870: 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54 61 62   int iTab = pTab
f880: 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20 69 44  ->tnum;.  int iD
f890: 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a 0a 20  estroyed = 0;.. 
f8a0: 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
f8b0: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
f8c0: 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74 20 3d    int iLargest =
f8d0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69 44 65   0;..    if( iDe
f8e0: 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20 69 54  stroyed==0 || iT
f8f0: 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20 29 7b  ab<iDestroyed ){
f900: 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73 74 20  .      iLargest 
f910: 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a 20 20  = iTab;.    }.  
f920: 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d    for(pIdx=pTab-
f930: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
f940: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
f950: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78  {.      int iIdx
f960: 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20   = pIdx->tnum;. 
f970: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
f980: 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62  x->pSchema==pTab
f990: 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20  ->pSchema );.   
f9a0: 20 20 20 69 66 28 20 28 69 44 65 73 74 72 6f 79     if( (iDestroy
f9b0: 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78 3c 69  ed==0 || (iIdx<i
f9c0: 44 65 73 74 72 6f 79 65 64 29 29 20 26 26 20 69  Destroyed)) && i
f9d0: 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29 7b 0a  Idx>iLargest ){.
f9e0: 20 20 20 20 20 20 20 20 69 4c 61 72 67 65 73 74          iLargest
f9f0: 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20 20 7d   = iIdx;.      }
fa00: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
fa10: 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a 20 20  Largest==0 ){.  
fa20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
fa30: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
fa40: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
fa50: 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
fa60: 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
fa70: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 64 65  chema);.      de
fa80: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
fa90: 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74 2c 20  arse, iLargest, 
faa0: 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44 65 73  iDb);.      iDes
fab0: 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67 65 73  troyed = iLarges
fac0: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  t;.    }.  }.#en
fad0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dif.}../*.** Thi
fae0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
faf0: 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f  led to do the wo
fb00: 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42  rk of a DROP TAB
fb10: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  LE statement..**
fb20: 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61   pName is the na
fb30: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
fb40: 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a  to be dropped..*
fb50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
fb60: 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70  opTable(Parse *p
fb70: 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
fb80: 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65  pName, int isVie
fb90: 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20  w, int noErr){. 
fba0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20   Table *pTab;.  
fbb0: 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74  Vdbe *v;.  sqlit
fbc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
fbd0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
fbe0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
fbf0: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
fc00: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
fc10: 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
fc20: 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ble;.  }.  asser
fc30: 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d  t( pName->nSrc==
fc40: 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20 73 71  1 );.  pTab = sq
fc50: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
fc60: 28 70 50 61 72 73 65 2c 20 69 73 56 69 65 77 2c  (pParse, isView,
fc70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e                pN
fc90: 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
fca0: 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61   pName->a[0].zDa
fcb0: 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66 28 20  tabase);..  if( 
fcc0: 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
fcd0: 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  f( noErr ){.    
fce0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 43 6c    sqlite3ErrorCl
fcf0: 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20  ear(pParse);.   
fd00: 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74   }.    goto exit
fd10: 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d  _drop_table;.  }
fd20: 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  .  iDb = sqlite3
fd30: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62  SchemaToIndex(db
fd40: 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29  , pTab->pSchema)
fd50: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e  ;.  assert( iDb>
fd60: 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44  =0 && iDb<db->nD
fd70: 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 54  b );..  /* If pT
fd80: 61 62 20 69 73 20 61 20 76 69 72 74 75 61 6c 20  ab is a virtual 
fd90: 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69 65 77  table, call View
fda0: 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29  GetColumnNames()
fdb0: 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a 2a 20   to ensure.  ** 
fdc0: 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  it is initialize
fdd0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 73  d..  */.  if( Is
fde0: 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 26 26  Virtual(pTab) &&
fdf0: 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
fe00: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61 72 73  olumnNames(pPars
fe10: 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20 20 20  e, pTab) ){.    
fe20: 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
fe30: 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  able;.  }.#ifnde
fe40: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
fe50: 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a  THORIZATION.  {.
fe60: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
fe70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
fe80: 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c  ab = SCHEMA_TABL
fe90: 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f 6e 73  E(iDb);.    cons
fea0: 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62  t char *zDb = db
feb0: 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
fec0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
fed0: 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20 20 20   *zArg2 = 0;.   
fee0: 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
fef0: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
ff00: 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61  LITE_DELETE, zTa
ff10: 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20 20 20  b, 0, zDb)){.   
ff20: 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
ff30: 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
ff40: 20 20 20 69 66 28 20 69 73 56 69 65 77 20 29 7b     if( isView ){
ff50: 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54  .      if( !OMIT
ff60: 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d  _TEMPDB && iDb==
ff70: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64  1 ){.        cod
ff80: 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  e = SQLITE_DROP_
ff90: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
ffa0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ffb0: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52  code = SQLITE_DR
ffc0: 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20 20 7d  OP_VIEW;.      }
ffd0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ffe0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fff0: 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  E.    }else if( 
10000 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10010 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20 3d 20  ){.      code = 
10020 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54 41 42  SQLITE_DROP_VTAB
10030 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67 32 20  LE;.      zArg2 
10040 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e 7a 4e  = pTab->pMod->zN
10050 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ame;.#endif.    
10060 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28  }else{.      if(
10070 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
10080 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
10090 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45     code = SQLITE
100a0 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45  _DROP_TEMP_TABLE
100b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
100c0 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51         code = SQ
100d0 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 3b  LITE_DROP_TABLE;
100e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
100f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
10100 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
10110 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  code, pTab->zNam
10120 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29 20 29  e, zArg2, zDb) )
10130 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
10140 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
10150 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
10160 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
10170 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45  rse, SQLITE_DELE
10180 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c  TE, pTab->zName,
10190 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
101a0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
101b0 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20  _table;.    }.  
101c0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  }.#endif.  if( s
101d0 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70  qlite3StrNICmp(p
101e0 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c  Tab->zName, "sql
101f0 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ite_", 7)==0 ){.
10200 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10210 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
10220 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65  le %s may not be
10230 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61 62 2d   dropped", pTab-
10240 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74  >zName);.    got
10250 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
10260 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  e;.  }..#ifndef 
10270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
10280 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44 52 4f  .  /* Ensure DRO
10290 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74 20 75  P TABLE is not u
102a0 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c 20 61  sed on a view, a
102b0 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69 73 20  nd DROP VIEW is 
102c0 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20 6f 6e  not used.  ** on
102d0 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20   a table..  */. 
102e0 20 69 66 28 20 69 73 56 69 65 77 20 26 26 20 70   if( isView && p
102f0 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20  Tab->pSelect==0 
10300 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
10310 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
10320 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45 20 74  use DROP TABLE t
10330 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65 20 25  o delete table %
10340 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
10350 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
10360 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
10370 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
10380 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
10390 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
103a0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
103b0 73 65 20 44 52 4f 50 20 56 49 45 57 20 74 6f 20  se DROP VIEW to 
103c0 64 65 6c 65 74 65 20 76 69 65 77 20 25 73 22 2c  delete view %s",
103d0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
103e0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
103f0 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 65 6e  p_table;.  }.#en
10400 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  dif..  /* Genera
10410 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76  te code to remov
10420 65 20 74 68 65 20 74 61 62 6c 65 20 66 72 6f 6d  e the table from
10430 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
10440 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b 2e 0a  e.  ** on disk..
10450 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74    */.  v = sqlit
10460 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
10470 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
10480 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
10490 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70 44 62  ger;.    Db *pDb
104a0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
104b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
104c0 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
104d0 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
104e0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
104f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10500 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73 56 69  BLE.    if( IsVi
10510 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a 20  rtual(pTab) ){. 
10520 20 20 20 20 20 69 66 28 20 76 20 29 7b 0a 20 20       if( v ){.  
10530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10540 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42  eAddOp0(v, OP_VB
10550 65 67 69 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  egin);.      }. 
10560 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
10570 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74 72 69   /* Drop all tri
10580 67 67 65 72 73 20 61 73 73 6f 63 69 61 74 65 64  ggers associated
10590 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
105a0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e 20 43  being dropped. C
105b0 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20 67 65  ode.    ** is ge
105c0 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d 6f 76  nerated to remov
105d0 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d 20 73  e entries from s
105e0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61 6e 64  qlite_master and
105f0 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  /or.    ** sqlit
10600 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20 69 66  e_temp_master if
10610 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
10620 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72 20 3d  /.    pTrigger =
10630 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72 4c   sqlite3TriggerL
10640 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61 62  ist(pParse, pTab
10650 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 54  );.    while( pT
10660 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20 20 20  rigger ){.      
10670 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
10680 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
10690 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
106a0 20 20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d         pTrigger-
106b0 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44  >pSchema==db->aD
106c0 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a  b[1].pSchema );.
106d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 72 6f        sqlite3Dro
106e0 70 54 72 69 67 67 65 72 50 74 72 28 70 50 61 72  pTriggerPtr(pPar
106f0 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b 0a 20  se, pTrigger);. 
10700 20 20 20 20 20 70 54 72 69 67 67 65 72 20 3d 20       pTrigger = 
10710 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78 74 3b  pTrigger->pNext;
10720 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
10730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
10740 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 2f 2a  INCREMENT.    /*
10750 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e 74 72   Remove any entr
10760 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ies of the sqlit
10770 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c 65  e_sequence table
10780 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
10790 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
107a0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
107b0 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62 65   This is done be
107c0 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20 69  fore the table i
107d0 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20 2a 2a  s dropped.    **
107e0 20 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65   at the btree le
107f0 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65  vel, in case the
10800 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
10810 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a   table needs to.
10820 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61      ** move as a
10830 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
10840 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
10850 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
10860 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ode)..    */.   
10870 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c   if( pTab->tabFl
10880 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
10890 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  rement ){.      
108a0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
108b0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
108c0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
108d0 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  %s.sqlite_sequen
108e0 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51  ce WHERE name=%Q
108f0 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ",.        pDb->
10900 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61  zName, pTab->zNa
10910 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  me.      );.    
10920 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
10930 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
10940 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
10950 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
10960 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
10970 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20  e.    ** table. 
10980 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65  The program name
10990 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74   loops through t
109a0 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
109b0 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20 20 20  and deletes.    
109c0 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74 68 61  ** every row tha
109d0 74 20 72 65 66 65 72 73 20 74 6f 20 61 20 74 61  t refers to a ta
109e0 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ble of the same 
109f0 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e 65 20  name as the one 
10a00 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64 72 6f  being.    ** dro
10a10 70 70 65 64 2e 20 54 72 69 67 67 65 72 73 20 61  pped. Triggers a
10a20 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70 65 72  re handled seper
10a30 61 74 65 6c 79 20 62 65 63 61 75 73 65 20 61 20  ately because a 
10a40 74 72 69 67 67 65 72 20 63 61 6e 20 62 65 0a 20  trigger can be. 
10a50 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 69 6e     ** created in
10a60 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
10a70 73 65 20 74 68 61 74 20 72 65 66 65 72 73 20 74  se that refers t
10a80 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61 6e 6f  o a table in ano
10a90 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61 74 61  ther.    ** data
10aa0 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
10ab0 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
10ac0 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
10ad0 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
10ae0 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
10af0 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
10b00 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
10b10 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61          pDb->zNa
10b20 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  me, SCHEMA_TABLE
10b30 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61  (iDb), pTab->zNa
10b40 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 72 6f  me);..    /* Dro
10b50 70 20 61 6e 79 20 73 74 61 74 69 73 74 69 63 73  p any statistics
10b60 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65   from the sqlite
10b70 5f 73 74 61 74 31 20 74 61 62 6c 65 2c 20 69 66  _stat1 table, if
10b80 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20   it exists */.  
10b90 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
10ba0 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71 6c 69  dTable(db, "sqli
10bb0 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d 3e 61  te_stat1", db->a
10bc0 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29 20 29  Db[iDb].zName) )
10bd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e  {.      sqlite3N
10be0 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
10bf0 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  e,.        "DELE
10c00 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
10c10 65 5f 73 74 61 74 31 20 57 48 45 52 45 20 74 62  e_stat1 WHERE tb
10c20 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a 4e 61 6d  l=%Q", pDb->zNam
10c30 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 0a 20  e, pTab->zName. 
10c40 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20       );.    }.. 
10c50 20 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26     if( !isView &
10c60 26 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61  & !IsVirtual(pTa
10c70 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65 73 74  b) ){.      dest
10c80 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
10c90 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 0a 20   pTab);.    }.. 
10ca0 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
10cb0 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66 72 6f   table entry fro
10cc0 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74 65 72  m SQLite's inter
10cd0 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64 20 6d  nal schema and m
10ce0 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74 68 65  odify.    ** the
10cf0 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a   schema cookie..
10d00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 49      */.    if( I
10d10 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
10d20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
10d30 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
10d40 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20 30  VDestroy, iDb, 0
10d50 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  , 0, pTab->zName
10d60 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
10d70 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10d80 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
10d90 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
10da0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
10db0 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65     sqlite3Change
10dc0 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69  Cookie(pParse, i
10dd0 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Db);.  }.  sqlit
10de0 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 64 62  eViewResetAll(db
10df0 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f 64 72  , iDb);..exit_dr
10e00 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69  op_table:.  sqli
10e10 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65  te3SrcListDelete
10e20 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a  (db, pName);.}..
10e30 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
10e40 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
10e50 63 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72  create a new for
10e60 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20  eign key on the 
10e70 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74  table.** current
10e80 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
10e90 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c  ction.  pFromCol
10ea0 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
10eb0 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20  h columns.** in 
10ec0 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
10ed0 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66  e point to the f
10ee0 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20  oreign key.  If 
10ef0 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e  pFromCol==0 then
10f00 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20  .** connect the 
10f10 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20  key to the last 
10f20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e  column inserted.
10f30 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d    pTo is the nam
10f40 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  e of.** the tabl
10f50 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e 20 20  e referred to.  
10f60 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69 73 74  pToCol is a list
10f70 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
10f80 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f 20 74  e other.** pTo t
10f90 61 62 6c 65 20 74 68 61 74 20 74 68 65 20 66 6f  able that the fo
10fa0 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e 74 73  reign key points
10fb0 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f 6e 74   to.  flags cont
10fc0 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f  ains all.** info
10fd0 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
10fe0 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c  e conflict resol
10ff0 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73  ution algorithms
11000 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 69 6e   specified.** in
11010 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45 2c 20   the ON DELETE, 
11020 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20 4f 4e  ON UPDATE and ON
11030 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65 73 2e   INSERT clauses.
11040 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79 20 73  .**.** An FKey s
11050 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
11060 74 65 64 20 61 6e 64 20 61 64 64 65 64 20 74 6f  ted and added to
11070 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72 65   the table curre
11080 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20 63 6f  ntly.** under co
11090 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68  nstruction in th
110a0 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  e pParse->pNewTa
110b0 62 6c 65 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  ble field..**.**
110c0 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   The foreign key
110d0 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d 45   is set for IMME
110e0 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e 67  DIATE processing
110f0 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74 20  .  A subsequent 
11100 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  call.** to sqlit
11110 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65  e3DeferForeignKe
11120 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67 65  y() might change
11130 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52 45   this to DEFERRE
11140 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  D..*/.void sqlit
11150 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e 4b  e3CreateForeignK
11160 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ey(.  Parse *pPa
11170 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50 61  rse,       /* Pa
11180 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
11190 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46 72  .  ExprList *pFr
111a0 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d  omCol,  /* Colum
111b0 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  ns in this table
111c0 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f   that point to o
111d0 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20  ther table */.  
111e0 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20 20  Token *pTo,     
111f0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
11200 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65 20  the other table 
11210 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
11220 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c  ToCol,    /* Col
11230 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68 65  umns in the othe
11240 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  r table */.  int
11250 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
11260 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72 65    /* Conflict re
11270 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74  solution algorit
11280 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  hms. */.){.  sql
11290 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
112a0 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  e->db;.#ifndef S
112b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
112c0 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a 70  GN_KEY.  FKey *p
112d0 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62 6c  FKey = 0;.  Tabl
112e0 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *p = pParse->p
112f0 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20  NewTable;.  int 
11300 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  nByte;.  int i;.
11310 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68    int nCol;.  ch
11320 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74  ar *z;..  assert
11330 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66  ( pTo!=0 );.  if
11340 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65  ( p==0 || pParse
11350 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45 43  ->nErr || IN_DEC
11360 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74 6f  LARE_VTAB ) goto
11370 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70   fk_end;.  if( p
11380 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
11390 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e    int iCol = p->
113a0 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  nCol-1;.    if( 
113b0 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66 6b  iCol<0 ) goto fk
113c0 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70 54  _end;.    if( pT
113d0 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d 3e  oCol && pToCol->
113e0 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20 20  nExpr!=1 ){.    
113f0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
11400 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65 69  g(pParse, "forei
11410 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20 20  gn key on %s".  
11420 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64 20         " should 
11430 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20 6f  reference only o
11440 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  ne column of tab
11450 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20 20  le %T",.        
11460 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a   p->aCol[iCol].z
11470 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20 20  Name, pTo);.    
11480 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20    goto fk_end;. 
11490 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
114a0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  1;.  }else if( p
114b0 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
114c0 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f 6c  >nExpr!=pFromCol
114d0 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 73  ->nExpr ){.    s
114e0 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
114f0 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
11500 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
11510 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79  s in foreign key
11520 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
11530 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22 0a  the number of ".
11540 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 73          "columns
11550 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63   in the referenc
11560 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  ed table");.    
11570 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 7d  goto fk_end;.  }
11580 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20 3d  else{.    nCol =
11590 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70 72   pFromCol->nExpr
115a0 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
115b0 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20 2b  sizeof(*pFKey) +
115c0 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f 66   (nCol-1)*sizeof
115d0 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29  (pFKey->aCol[0])
115e0 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20   + pTo->n + 1;. 
115f0 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20   if( pToCol ){. 
11600 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
11610 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  oCol->nExpr; i++
11620 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  ){.      nByte +
11630 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11640 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  0(pToCol->a[i].z
11650 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d  Name) + 1;.    }
11660 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73  .  }.  pFKey = s
11670 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
11680 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a  ro(db, nByte );.
11690 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20 29    if( pFKey==0 )
116a0 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e  {.    goto fk_en
116b0 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e  d;.  }.  pFKey->
116c0 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b  pFrom = p;.  pFK
116d0 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20  ey->pNextFrom = 
116e0 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20  p->pFKey;.  z = 
116f0 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e 61  (char*)&pFKey->a
11700 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46 4b  Col[nCol];.  pFK
11710 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d  ey->zTo = z;.  m
11720 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c  emcpy(z, pTo->z,
11730 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54   pTo->n);.  z[pT
11740 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71 6c  o->n] = 0;.  sql
11750 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b 0a  ite3Dequote(z);.
11760 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b    z += pTo->n+1;
11770 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20 3d  .  pFKey->nCol =
11780 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46 72   nCol;.  if( pFr
11790 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  omCol==0 ){.    
117a0 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e 69  pFKey->aCol[0].i
117b0 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  From = p->nCol-1
117c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
117d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
117e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
117f0 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  j;.      for(j=0
11800 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  ; j<p->nCol; j++
11810 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
11820 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 2d  qlite3StrICmp(p-
11830 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
11840 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a  pFromCol->a[i].z
11850 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
11860 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
11870 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b 0a  l[i].iFrom = j;.
11880 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11890 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
118a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d   }.      if( j>=
118b0 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  p->nCol ){.     
118c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
118d0 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
118e0 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20 63        "unknown c
118f0 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e 20  olumn \"%s\" in 
11900 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66 69  foreign key defi
11910 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20 20  nition", .      
11920 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b      pFromCol->a[
11930 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
11940 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
11950 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11960 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29  }.  if( pToCol )
11970 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
11980 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
11990 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
119a0 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43 6f  e3Strlen30(pToCo
119b0 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  l->a[i].zName);.
119c0 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f        pFKey->aCo
119d0 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a 20  l[i].zCol = z;. 
119e0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70       memcpy(z, p
119f0 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
11a00 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b 6e  e, n);.      z[n
11a10 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20 2b  ] = 0;.      z +
11a20 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = n+1;.    }.  }
11a30 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66 65  .  pFKey->isDefe
11a40 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b 65  rred = 0;.  pFKe
11a50 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20 3d 20  y->deleteConf = 
11a60 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78 66  (u8)(flags & 0xf
11a70 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 75 70 64  f);.  pFKey->upd
11a80 61 74 65 43 6f 6e 66 20 3d 20 28 75 38 29 28 28  ateConf = (u8)((
11a90 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26 20 30  flags >> 8 ) & 0
11aa0 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69  xff);.  pFKey->i
11ab0 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 75 38 29  nsertConf = (u8)
11ac0 28 28 66 6c 61 67 73 20 3e 3e 20 31 36 20 29 20  ((flags >> 16 ) 
11ad0 26 20 30 78 66 66 29 3b 0a 0a 20 20 2f 2a 20 4c  & 0xff);..  /* L
11ae0 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
11af0 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
11b00 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
11b10 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
11b20 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
11b30 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
11b40 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
11b50 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
11b60 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
11b70 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
11b80 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
11b90 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
11ba0 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
11bb0 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
11bc0 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
11bd0 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
11be0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11bf0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
11c00 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
11c10 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
11c20 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
11c30 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
11c40 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
11c50 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
11c60 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
11c70 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
11c80 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
11c90 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
11ca0 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
11cb0 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
11cc0 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
11cd0 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
11ce0 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
11cf0 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
11d00 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
11d10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
11d20 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
11d30 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
11d40 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
11d50 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
11d60 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
11d70 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
11d80 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
11d90 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
11da0 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
11db0 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
11dc0 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
11dd0 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
11de0 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
11df0 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
11e00 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  ;.  pFKey->isDef
11e10 65 72 72 65 64 20 3d 20 28 75 38 29 69 73 44 65  erred = (u8)isDe
11e20 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66 0a 7d  ferred;.#endif.}
11e30 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
11e40 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
11e50 65 72 61 73 65 20 61 6e 64 20 72 65 66 69 6c 6c  erase and refill
11e60 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20 20 54   index *pIdx.  T
11e70 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  his is.** used t
11e80 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e  o initialize a n
11e90 65 77 6c 79 20 63 72 65 61 74 65 64 20 69 6e 64  ewly created ind
11ea0 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d 70 75  ex or to recompu
11eb0 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  te the.** conten
11ec0 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 69 6e  t of an index in
11ed0 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61 20 52   response to a R
11ee0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
11ef0 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f 6f 74  **.** if memRoot
11f00 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 67 61  Page is not nega
11f10 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73 20 74  tive, it means t
11f20 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73  hat the index is
11f30 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61 74 65   newly.** create
11f40 64 2e 20 20 54 68 65 20 72 65 67 69 73 74 65 72  d.  The register
11f50 20 73 70 65 63 69 66 69 65 64 20 62 79 20 6d 65   specified by me
11f60 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74 61 69  mRootPage contai
11f70 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  ns the.** root p
11f80 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
11f90 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d 65 6d  e index.  If mem
11fa0 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65 67 61  RootPage is nega
11fb0 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  tive, then.** th
11fc0 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20  e index already 
11fd0 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73 74 20  exists and must 
11fe0 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
11ff0 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c 65 64  e being refilled
12000 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f 6f 74   and.** the root
12010 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
12020 74 68 65 20 69 6e 64 65 78 20 69 73 20 74 61 6b  the index is tak
12030 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78 2d 3e  en from pIndex->
12040 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tnum..*/.static 
12050 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 66 69  void sqlite3Refi
12060 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  llIndex(Parse *p
12070 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49  Parse, Index *pI
12080 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52 6f 6f  ndex, int memRoo
12090 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c 65 20  tPage){.  Table 
120a0 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e  *pTab = pIndex->
120b0 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68 65 20  pTable;  /* The 
120c0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 69 6e  table that is in
120d0 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69  dexed */.  int i
120e0 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  Tab = pParse->nT
120f0 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72  ab++;     /* Btr
12100 65 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 66  ee cursor used f
12110 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74  or pTab */.  int
12120 20 69 49 64 78 20 3d 20 70 50 61 72 73 65 2d 3e   iIdx = pParse->
12130 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
12140 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
12150 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f 0a 20   for pIndex */. 
12160 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20 20 20   int addr1;     
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 6f  /* Address of to
12190 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  p of loop */.  i
121a0 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  nt tnum;        
121b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121c0 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 69 6e   Root page of in
121d0 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  dex */.  Vdbe *v
121e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
121f0 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72          /* Gener
12200 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
12210 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
12220 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  ne */.  KeyInfo 
12230 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20  *pKey;          
12240 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66         /* KeyInf
12250 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20  o for index */. 
12260 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79 3b 20   int regIdxKey; 
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63 6f 6e  /* Registers con
12290 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65  taining the inde
122a0 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 72  x key */.  int r
122b0 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20 20 20  egRecord;       
122c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
122d0 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61 73  ister holding as
122e0 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78 20 72  semblied index r
122f0 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74  ecord */.  sqlit
12300 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
12310 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  >db;      /* The
12320 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12330 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44  tion */.  int iD
12340 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  b = sqlite3Schem
12350 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e  aToIndex(db, pIn
12360 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a  dex->pSchema);..
12370 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12380 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
12390 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  N.  if( sqlite3A
123a0 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
123b0 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58 2c   SQLITE_REINDEX,
123c0 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20   pIndex->zName, 
123d0 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62  0,.      db->aDb
123e0 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29 7b  [iDb].zName ) ){
123f0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
12400 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
12410 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
12420 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  ck on the table 
12430 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73 20  to perform this 
12440 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 73  operation */.  s
12450 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28  qlite3TableLock(
12460 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61  pParse, iDb, pTa
12470 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61 62  b->tnum, 1, pTab
12480 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20 3d  ->zName);..  v =
12490 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
124a0 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
124b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
124c0 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3e  if( memRootPage>
124d0 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20 3d  =0 ){.    tnum =
124e0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20 20   memRootPage;.  
124f0 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d 20  }else{.    tnum 
12500 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b 0a  = pIndex->tnum;.
12510 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12520 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c 65 61  ddOp2(v, OP_Clea
12530 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  r, tnum, iDb);. 
12540 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71 6c 69   }.  pKey = sqli
12550 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28  te3IndexKeyinfo(
12560 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 29 3b  pParse, pIndex);
12570 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
12580 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e 57  dOp4(v, OP_OpenW
12590 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e 75 6d  rite, iIdx, tnum
125a0 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20 20 20  , iDb, .        
125b0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
125c0 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45 59  r *)pKey, P4_KEY
125d0 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
125e0 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
125f0 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  >=0 ){.    sqlit
12600 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
12610 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 1);.  }.  sqli
12620 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
12630 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
12640 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
12650 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
12660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
12670 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
12680 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52 65 63  ab, 0);.  regRec
12690 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74  ord = sqlite3Get
126a0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
126b0 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d 20 73  .  regIdxKey = s
126c0 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
126d0 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
126e0 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72 65 67  Index, iTab, reg
126f0 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20 69 66  Record, 1);.  if
12700 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  ( pIndex->onErro
12710 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20 20  r!=OE_None ){.  
12720 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a 20 20    int j1, j2;.  
12730 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 0a    int regRowid;.
12740 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20  .    regRowid = 
12750 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49 6e 64  regIdxKey + pInd
12760 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ex->nColumn;.   
12770 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62   j1 = sqlite3Vdb
12780 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 73  eAddOp3(v, OP_Is
12790 4e 75 6c 6c 2c 20 72 65 67 49 64 78 4b 65 79 2c  Null, regIdxKey,
127a0 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c   0, pIndex->nCol
127b0 75 6d 6e 29 3b 0a 20 20 20 20 6a 32 20 3d 20 73  umn);.    j2 = s
127c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
127d0 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75 65 2c  (v, OP_IsUnique,
127e0 20 69 49 64 78 2c 0a 20 20 20 20 20 20 20 20 20   iIdx,.         
127f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12800 20 20 30 2c 20 72 65 67 52 6f 77 69 64 2c 20 53    0, regRowid, S
12810 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
12820 28 72 65 67 52 65 63 6f 72 64 29 2c 20 50 34 5f  (regRecord), P4_
12830 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71 6c 69  INT32);.    sqli
12840 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
12850 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
12860 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f 45 5f  _CONSTRAINT, OE_
12870 41 62 6f 72 74 2c 20 30 2c 0a 20 20 20 20 20 20  Abort, 0,.      
12880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 69                "i
12890 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73 20 61  ndexed columns a
128a0 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22 2c 20  re not unique", 
128b0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
128c0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
128d0 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
128e0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
128f0 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20 7d 0a  ere(v, j2);.  }.
12900 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12910 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73  Op2(v, OP_IdxIns
12920 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67 52 65  ert, iIdx, regRe
12930 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
12940 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
12950 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72 64  Parse, regRecord
12960 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
12980 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
12990 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
129a0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
129b0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
129c0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
129d0 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71  ose, iTab);.  sq
129e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
129f0 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64  v, OP_Close, iId
12a00 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  x);.}../*.** Cre
12a10 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65 78 20  ate a new index 
12a20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  for an SQL table
12a30 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d 65 32  .  pName1.pName2
12a40 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
12a50 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20 61 6e  the index .** an
12a60 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20 74 68  d pTblList is th
12a70 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
12a80 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f 20 62  ble that is to b
12a90 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f 74 68  e indexed.  Both
12aa0 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e 55 4c   will .** be NUL
12ab0 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72 79 20  L for a primary 
12ac0 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65 78 20  key or an index 
12ad0 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
12ae0 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a 2a 20  to satisfy a.** 
12af0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
12b00 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20 61 6e  t.  If pTable an
12b10 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e 55 4c  d pIndex are NUL
12b20 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d 3e 70  L, use pParse->p
12b30 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73 20 74  NewTable.** as t
12b40 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 69  he table to be i
12b50 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73 65 2d  ndexed.  pParse-
12b60 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20 61 20  >pNewTable is a 
12b70 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a 2a 2a  table that is.**
12b80 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
12b90 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62 79 20   constructed by 
12ba0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
12bb0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  tatement..**.** 
12bc0 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
12bd0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65  of columns to be
12be0 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69 73 74   indexed.  pList
12bf0 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 69 66   will be NULL if
12c00 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20 70 72   this.** is a pr
12c10 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75 6e 69  imary key or uni
12c20 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74 20 6f  que-constraint o
12c30 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
12c40 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 0a 2a  t column added.*
12c50 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63  * to the table c
12c60 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63  urrently under c
12c70 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 0a 2a  onstruction.  .*
12c80 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
12c90 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50 61 72  eateIndex(.  Par
12ca0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
12cb0 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  /* All informati
12cc0 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20 70 61  on about this pa
12cd0 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  rse */.  Token *
12ce0 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a 20 46  pName1,     /* F
12cf0 69 72 73 74 20 70 61 72 74 20 6f 66 20 69 6e 64  irst part of ind
12d00 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62 65 20  ex name. May be 
12d10 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  NULL */.  Token 
12d20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20  *pName2,     /* 
12d30 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 20 69  Second part of i
12d40 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
12d50 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72 63 4c  e NULL */.  SrcL
12d60 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c 20 2f  ist *pTblName, /
12d70 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64 65 78  * Table to index
12d80 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e 70 4e  . Use pParse->pN
12d90 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a 2f 0a  ewTable if 0 */.
12da0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
12db0 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f  t,   /* A list o
12dc0 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62 65 20  f columns to be 
12dd0 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
12de0 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 20   onError,       
12df0 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f 45 5f  /* OE_Abort, OE_
12e00 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70 6c 61  Ignore, OE_Repla
12e10 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65 20 2a  ce, or OE_None *
12e20 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74 61 72  /.  Token *pStar
12e30 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43 52  t,     /* The CR
12e40 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74 20  EATE token that 
12e50 62 65 67 69 6e 73 20 74 68 69 73 20 73 74 61 74  begins this stat
12e60 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
12e70 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 2f 2a   *pEnd,       /*
12e80 20 54 68 65 20 22 29 22 20 74 68 61 74 20 63 6c   The ")" that cl
12e90 6f 73 65 73 20 74 68 65 20 43 52 45 41 54 45 20  oses the CREATE 
12ea0 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 20  INDEX statement 
12eb0 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64  */.  int sortOrd
12ec0 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72 74 20  er,     /* Sort 
12ed0 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61 72 79  order of primary
12ee0 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73 74 3d   key when pList=
12ef0 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 69  =NULL */.  int i
12f00 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20 2f 2a  fNotExist     /*
12f10 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66 20 69   Omit error if i
12f20 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
12f30 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
12f40 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20 20 20  e *pTab = 0;    
12f50 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62 65 20   /* Table to be 
12f60 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49 6e 64  indexed */.  Ind
12f70 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30 3b 20  ex *pIndex = 0; 
12f80 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74    /* The index t
12f90 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a  o be created */.
12fa0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20    char *zName = 
12fb0 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0;     /* Name o
12fc0 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  f the index */. 
12fd0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
12fe0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
12ff0 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
13000 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20   zName */.  int 
13010 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20 6e 75  i, j;.  Token nu
13020 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  llId;        /* 
13030 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72 20 61  Fake token for a
13040 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73 74 20  n empty ID list 
13050 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  */.  DbFixer sFi
13060 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  x;        /* For
13070 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74 61 62   assigning datab
13080 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70 54 61  ase names to pTa
13090 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ble */.  int sor
130a0 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20 2f 2a  tOrderMask;   /*
130b0 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45 53 43   1 to honor DESC
130c0 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20 74 6f   in index.  0 to
130d0 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20 73 71   ignore. */.  sq
130e0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
130f0 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a 70 44  se->db;.  Db *pD
13100 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
13110 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20 74  * The specific t
13120 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
13130 74 68 65 20 69 6e 64 65 78 65 64 20 64 61 74 61  the indexed data
13140 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  base */.  int iD
13150 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  b;             /
13160 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 64  * Index of the d
13170 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20  atabase that is 
13180 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
13190 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 20  .  Token *pName 
131a0 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  = 0;    /* Unqua
131b0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
131c0 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72 65 61  he index to crea
131d0 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  te */.  struct E
131e0 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c  xprList_item *pL
131f0 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f 72 20  istItem; /* For 
13200 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 4c 69  looping over pLi
13210 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  st */.  int nCol
13220 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 20 3d  ;.  int nExtra =
13230 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74   0;.  char *zExt
13240 72 61 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73  ra;..  if( pPars
13250 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
13260 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49  allocFailed || I
13270 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
13280 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
13290 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
132a0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  }..  /*.  ** Fin
132b0 64 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  d the table that
132c0 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65   is to be indexe
132d0 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72 6c 79  d.  Return early
132e0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20   if not found.. 
132f0 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c 4e 61   */.  if( pTblNa
13300 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a  me!=0 ){..    /*
13310 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70 61 72   Use the two-par
13320 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20  t index name to 
13330 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 64 61  determine the da
13340 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 74  tabase .    ** t
13350 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65  o search for the
13360 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20 74 68   table. 'Fix' th
13370 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20  e table name to 
13380 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a 20 62  this db.    ** b
13390 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70  efore looking up
133a0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
133b0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
133c0 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65 32 20  Name1 && pName2 
133d0 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  );.    iDb = sql
133e0 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28  ite3TwoPartName(
133f0 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20  pParse, pName1, 
13400 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b  pName2, &pName);
13410 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29  .    if( iDb<0 )
13420 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
13430 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e 64 65  e_index;..#ifnde
13440 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
13450 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74  MPDB.    /* If t
13460 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61  he index name wa
13470 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63  s unqualified, c
13480 68 65 63 6b 20 69 66 20 74 68 65 20 74 68 65 20  heck if the the 
13490 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  table.    ** is 
134a0 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20 49 66  a temp table. If
134b0 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64 61 74   so, set the dat
134c0 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f 20 6e  abase to 1. Do n
134d0 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20 20 2a  ot do this.    *
134e0 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73 69 6e  * if initialisin
134f0 67 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  g a database sch
13500 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ema..    */.    
13510 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
13520 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  sy ){.      pTab
13530 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
13540 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65 2c 20  tLookup(pParse, 
13550 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  pTblName);.     
13560 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20 70   if( pName2 && p
13570 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
13580 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
13590 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
135a0 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
135b0 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
135c0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
135d0 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  f..    if( sqlit
135e0 65 33 46 69 78 49 6e 69 74 28 26 73 46 69 78 2c  e3FixInit(&sFix,
135f0 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69   pParse, iDb, "i
13600 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20 26 26  ndex", pName) &&
13610 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13620 46 69 78 53 72 63 4c 69 73 74 28 26 73 46 69 78  FixSrcList(&sFix
13630 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20 20 20  , pTblName).    
13640 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65 63 61  ){.      /* Beca
13650 75 73 65 20 74 68 65 20 70 61 72 73 65 72 20 63  use the parser c
13660 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c 4e 61  onstructs pTblNa
13670 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  me from a single
13680 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20 20 20   identifier,.   
13690 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46 69 78     ** sqlite3Fix
136a0 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65 76 65  SrcList can neve
136b0 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20 20 20  r fail. */.     
136c0 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
136d0 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c  }.    pTab = sql
136e0 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
136f0 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62 6c 4e  pParse, 0, pTblN
13700 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c  ame->a[0].zName,
13710 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c 4e 61   .        pTblNa
13720 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
13730 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 54  se);.    if( !pT
13740 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ab || db->malloc
13750 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 65 78  Failed ) goto ex
13760 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
13770 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
13780 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d  >aDb[iDb].pSchem
13790 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
137a0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
137b0 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
137c0 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  0 );.    pTab = 
137d0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
137e0 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54 61 62  e;.    if( !pTab
137f0 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13800 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 69  ate_index;.    i
13810 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
13820 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54  maToIndex(db, pT
13830 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
13840 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61  }.  pDb = &db->a
13850 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66 28 20  Db[iDb];..  if( 
13860 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61 72 73  pTab==0 || pPars
13870 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65  e->nErr ) goto e
13880 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13890 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
138a0 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
138b0 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
138c0 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  7)==0 .       &&
138d0 20 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d 3e 7a   memcmp(&pTab->z
138e0 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72 74 61  Name[7],"alterta
138f0 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20 20 20  b_",9)!=0 ){.   
13900 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13910 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c 65 20  (pParse, "table 
13920 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e  %s may not be in
13930 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e 7a 4e  dexed", pTab->zN
13940 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ame);.    goto e
13950 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13960 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
13970 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
13980 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c 65   if( pTab->pSele
13990 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
139a0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
139b0 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e 6f 74  , "views may not
139c0 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20   be indexed");. 
139d0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
139e0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
139f0 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
13a00 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
13a10 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49 73 56  LTABLE.  if( IsV
13a20 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b 0a  irtual(pTab) ){.
13a30 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
13a40 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 72  Msg(pParse, "vir
13a50 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61 79 20  tual tables may 
13a60 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29  not be indexed")
13a70 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
13a80 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
13a90 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20  }.#endif..  /*. 
13aa0 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 61 6d   ** Find the nam
13ab0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  e of the index. 
13ac0 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 72 65   Make sure there
13ad0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
13ae0 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 64  another.  ** ind
13af0 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69 74 68  ex or table with
13b00 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
13b10 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78 63 65   .  **.  ** Exce
13b20 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20 61 72  ption:  If we ar
13b30 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6e 61  e reading the na
13b40 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65 6e 74  mes of permanent
13b50 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20 74 68   indices from th
13b60 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  e.  ** sqlite_ma
13b70 73 74 65 72 20 74 61 62 6c 65 20 28 62 65 63 61  ster table (beca
13b80 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  use some other p
13b90 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64 20 74  rocess changed t
13ba0 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64 0a 20  he schema) and. 
13bb0 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20 69   ** one of the i
13bc0 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c 6c 69  ndex names colli
13bd0 64 65 73 20 77 69 74 68 20 74 68 65 20 6e 61 6d  des with the nam
13be0 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61 72 79  e of a temporary
13bf0 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a 20 69   table or.  ** i
13c00 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20 77 69  ndex, then we wi
13c10 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f 20 70  ll continue to p
13c20 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e 64 65  rocess this inde
13c30 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  x..  **.  ** If 
13c40 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e  pName==0 it mean
13c50 73 20 74 68 61 74 20 77 65 20 61 72 65 0a 20 20  s that we are.  
13c60 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  ** dealing with 
13c70 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72  a primary key or
13c80 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
13c90 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20  nt.  We have to 
13ca0 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a 2a 20  invent our.  ** 
13cb0 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  own name..  */. 
13cc0 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20   if( pName ){.  
13cd0 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
13ce0 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
13cf0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b, pName);.    i
13d00 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
13d10 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
13d20 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
13d30 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13d40 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d  ;.    if( zName=
13d50 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  =0 ) goto exit_c
13d60 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
13d70 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
13d80 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
13d90 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
13da0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
13db0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
13dc0 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
13dd0 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
13de0 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
13df0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
13e00 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
13e10 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65 78 69  arse) ) goto exi
13e20 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13e30 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
13e40 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
13e50 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b 0a 20  Name, 0)!=0 ){. 
13e60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
13e70 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
13e80 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
13e90 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 25   a table named %
13ea0 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
13eb0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72      goto exit_cr
13ec0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
13ed0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13ee0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
13ef0 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 44  ex(db, zName, pD
13f00 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a  b->zName)!=0 ){.
13f10 20 20 20 20 20 20 69 66 28 20 21 69 66 4e 6f 74        if( !ifNot
13f20 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  Exist ){.       
13f30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
13f40 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65 78 20  (pParse, "index 
13f50 25 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  %s already exist
13f60 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
13f70 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
13f80 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
13f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
13fa0 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
13fb0 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20 20  Index *pLoop;.  
13fc0 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61 62    for(pLoop=pTab
13fd0 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20 70  ->pIndex, n=1; p
13fe0 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f 6f  Loop; pLoop=pLoo
13ff0 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b 7d  p->pNext, n++){}
14000 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
14010 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
14020 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65  "sqlite_autoinde
14030 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d 3e  x_%s_%d", pTab->
14040 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 69  zName, n);.    i
14050 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
14060 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14070 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14080 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65   }.  }..  /* Che
14090 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a 61  ck for authoriza
140a0 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20 61  tion to create a
140b0 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23 69  n index..  */.#i
140c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
140d0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
140e0 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68    {.    const ch
140f0 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e 7a  ar *zDb = pDb->z
14100 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71  Name;.    if( sq
14110 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14120 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e  Parse, SQLITE_IN
14130 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42  SERT, SCHEMA_TAB
14140 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62 29  LE(iDb), 0, zDb)
14150 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14160 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  ;.    }.    i = 
14180 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e  SQLITE_CREATE_IN
14190 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f 4d  DEX;.    if( !OM
141a0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
141b0 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54 45  ==1 ) i = SQLITE
141c0 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  _CREATE_TEMP_IND
141d0 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  EX;.    if( sqli
141e0 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
141f0 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20 70  rse, i, zName, p
14200 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
14210 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14220 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14230 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14240 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69 73  if..  /* If pLis
14250 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74  t==0, it means t
14260 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
14270 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20 61  called to make a
14280 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b 65   primary.  ** ke
14290 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61 73  y out of the las
142a0 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20 74  t column added t
142b0 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64 65  o the table unde
142c0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  r construction..
142d0 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20 61    ** So create a
142e0 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73 69   fake list to si
142f0 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20 2a  mulate this..  *
14300 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  /.  if( pList==0
14310 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64 2e 7a   ){.    nullId.z
14320 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e 61 43   = (u8*)pTab->aC
14330 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
14340 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75 6c 6c  .zName;.    null
14350 49 64 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  Id.n = sqlite3St
14360 72 6c 65 6e 33 30 28 28 63 68 61 72 2a 29 6e 75  rlen30((char*)nu
14370 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70 4c 69  llId.z);.    pLi
14380 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
14390 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72 73  ListAppend(pPars
143a0 65 2c 20 30 2c 20 30 2c 20 26 6e 75 6c 6c 49 64  e, 0, 0, &nullId
143b0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
143c0 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f  ==0 ) goto exit_
143d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
143e0 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f    pList->a[0].so
143f0 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29 73 6f  rtOrder = (u8)so
14400 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20  rtOrder;.  }..  
14410 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
14420 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  w many bytes of 
14430 73 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72  space are requir
14440 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c  ed to store expl
14450 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63  icitly.  ** spec
14460 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  ified collation 
14470 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a  sequence names..
14480 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
14490 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
144a0 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
144b0 70 45 78 70 72 3b 0a 20 20 20 20 43 6f 6c 6c 53  pExpr;.    CollS
144c0 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 69  eq *pColl;.    i
144d0 66 28 20 28 70 45 78 70 72 20 3d 20 70 4c 69 73  f( (pExpr = pLis
144e0 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 21 3d  t->a[i].pExpr)!=
144f0 30 20 26 26 20 28 70 43 6f 6c 6c 20 3d 20 70 45  0 && (pColl = pE
14500 78 70 72 2d 3e 70 43 6f 6c 6c 29 21 3d 30 20 29  xpr->pColl)!=0 )
14510 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2b  {.      nExtra +
14520 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53 74  = (1 + sqlite3St
14530 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e  rlen30(pColl->zN
14540 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ame));.    }.  }
14550 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41 6c 6c  ..  /* .  ** All
14560 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
14570 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20 2a 2f  structure. .  */
14580 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
14590 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
145a0 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c 69 73  );.  nCol = pLis
145b0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
145c0 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  ex = sqlite3DbMa
145d0 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20  llocZero(db, .  
145e0 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64 65 78      sizeof(Index
145f0 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
14600 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
14610 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20 73 69  ure  */.      si
14620 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c 20 2b  zeof(int)*nCol +
14630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14640 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20 20 2a  dex.aiColumn   *
14650 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 69  /.      sizeof(i
14660 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b 20 20  nt)*(nCol+1) +  
14670 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
14680 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20 20 20  RowEst   */.    
14690 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29    sizeof(char *)
146a0 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 2f  *nCol +        /
146b0 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
146c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65     */.      size
146d0 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20 20 20  of(u8)*nCol +   
146e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
146f0 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a  x.aSortOrder */.
14700 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 31 20        nName + 1 
14710 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
14720 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e 61 6d     /* Index.zNam
14730 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  e      */.      
14740 6e 45 78 74 72 61 20 20 20 20 20 20 20 20 20 20  nExtra          
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14760 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
14770 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 29 3b  ce names */.  );
14780 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
14790 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
147a0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
147b0 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e  index;.  }.  pIn
147c0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63  dex->azColl = (c
147d0 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78 5b 31  har**)(&pIndex[1
147e0 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61 69  ]);.  pIndex->ai
147f0 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20 2a 29  Column = (int *)
14800 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  (&pIndex->azColl
14810 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65  [nCol]);.  pInde
14820 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20 28 75  x->aiRowEst = (u
14830 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49 6e 64  nsigned *)(&pInd
14840 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43 6f  ex->aiColumn[nCo
14850 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 61  l]);.  pIndex->a
14860 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 20  SortOrder = (u8 
14870 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69 52 6f  *)(&pIndex->aiRo
14880 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b 0a 20  wEst[nCol+1]);. 
14890 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d   pIndex->zName =
148a0 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65   (char *)(&pInde
148b0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43  x->aSortOrder[nC
148c0 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61 20 3d  ol]);.  zExtra =
148d0 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e 64 65   (char *)(&pInde
148e0 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2b 31  x->zName[nName+1
148f0 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 49 6e  ]);.  memcpy(pIn
14900 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  dex->zName, zNam
14910 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20 20 70  e, nName+1);.  p
14920 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20 3d 20  Index->pTable = 
14930 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  pTab;.  pIndex->
14940 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73 74 2d  nColumn = pList-
14950 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64 65 78  >nExpr;.  pIndex
14960 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75 38 29  ->onError = (u8)
14970 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e 64 65  onError;.  pInde
14980 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d 20 28  x->autoIndex = (
14990 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b 0a 20  u8)(pName==0);. 
149a0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
149b0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
149c0 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a 20 43  pSchema;..  /* C
149d0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
149e0 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44  e should honor D
149f0 45 53 43 20 72 65 71 75 65 73 74 73 20 6f 6e 20  ESC requests on 
14a00 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20  index columns.  
14a10 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e 70 53  */.  if( pDb->pS
14a20 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d  chema->file_form
14a30 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72  at>=4 ){.    sor
14a40 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b  tOrderMask = -1;
14a50 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43     /* Honor DESC
14a60 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
14a70 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d   sortOrderMask =
14a80 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65   0;    /* Ignore
14a90 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20   DESC */.  }..  
14aa0 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61 6d 65  /* Scan the name
14ab0 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 73  s of the columns
14ac0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
14ad0 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e 64 0a   be indexed and.
14ae0 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20 63 6f    ** load the co
14af0 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69 6e 74  lumn indices int
14b00 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74 72 75  o the Index stru
14b10 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74 20 61  cture.  Report a
14b20 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69 66 20  n error.  ** if 
14b30 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  any column is no
14b40 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
14b50 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74 49 74  for(i=0, pListIt
14b60 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70  em=pList->a; i<p
14b70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
14b80 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29 7b 0a  , pListItem++){.
14b90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14ba0 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69 73 74  zColName = pList
14bb0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
14bc0 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c   Column *pTabCol
14bd0 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75 65 73  ;.    int reques
14be0 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  tedSortOrder;.  
14bf0 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20    char *zColl;  
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c10 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65   /* Collation se
14c20 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a  quence name */..
14c30 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 54 61      for(j=0, pTa
14c40 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
14c50 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
14c60 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29 7b 0a  ++, pTabCol++){.
14c70 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
14c80 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e 61 6d  3StrICmp(zColNam
14c90 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e 61 6d  e, pTabCol->zNam
14ca0 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
14cb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 3e 3d     }.    if( j>=
14cc0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
14cd0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14ce0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62  Msg(pParse, "tab
14cf0 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63 6f 6c  le %s has no col
14d00 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c 0a 20  umn named %s",. 
14d10 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61         pTab->zNa
14d20 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20  me, zColName);. 
14d30 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
14d40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
14d50 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20   }.    /* TODO: 
14d60 20 41 64 64 20 61 20 74 65 73 74 20 74 6f 20 6d   Add a test to m
14d70 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
14d80 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20 69 73  e same column is
14d90 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20 20 2a   not named.    *
14da0 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  * more than once
14db0 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
14dc0 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20 74 68   index.  Only th
14dd0 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e 63 65  e first instance
14de0 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63   of.    ** the c
14df0 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65 72 20  olumn will ever 
14e00 62 65 20 75 73 65 64 20 62 79 20 74 68 65 20 6f  be used by the o
14e10 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74 65 20  ptimizer.  Note 
14e20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65 0a 20  that using the. 
14e30 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c 75 6d     ** same colum
14e40 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  n more than once
14e50 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 65 72   cannot be an er
14e60 72 6f 72 20 62 65 63 61 75 73 65 20 74 68 61 74  ror because that
14e70 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a 20 62   would .    ** b
14e80 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73 20 63  reak backwards c
14e90 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d 20 69  ompatibility - i
14ea0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 20  t needs to be a 
14eb0 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  warning..    */.
14ec0 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f      pIndex->aiCo
14ed0 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20 20 20  lumn[i] = j;.   
14ee0 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e   if( pListItem->
14ef0 70 45 78 70 72 20 26 26 20 70 4c 69 73 74 49 74  pExpr && pListIt
14f00 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  em->pExpr->pColl
14f10 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14f20 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  ( pListItem->pEx
14f30 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20 20 20  pr->pColl );.   
14f40 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78 74 72     zColl = zExtr
14f50 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
14f60 5f 73 6e 70 72 69 6e 74 66 28 6e 45 78 74 72 61  _snprintf(nExtra
14f70 2c 20 7a 45 78 74 72 61 2c 20 22 25 73 22 2c 20  , zExtra, "%s", 
14f80 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72  pListItem->pExpr
14f90 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  ->pColl->zName);
14fa0 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20 2b 3d  .      zExtra +=
14fb0 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33   (sqlite3Strlen3
14fc0 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b 0a 20  0(zColl) + 1);. 
14fd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14fe0 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  zColl = pTab->aC
14ff0 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20 20 20  ol[j].zColl;.   
15000 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20 29 7b     if( !zColl ){
15010 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  .        zColl =
15020 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e   db->pDfltColl->
15030 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  zName;.      }. 
15040 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 64 62     }.    if( !db
15050 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21  ->init.busy && !
15060 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c  sqlite3LocateCol
15070 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f  lSeq(pParse, zCo
15080 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20 20 20  ll, -1) ){.     
15090 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
150a0 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
150b0 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c     pIndex->azCol
150c0 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20  l[i] = zColl;.  
150d0 20 20 72 65 71 75 65 73 74 65 64 53 6f 72 74 4f    requestedSortO
150e0 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74 65 6d  rder = pListItem
150f0 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20 73 6f  ->sortOrder & so
15100 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20 20 20  rtOrderMask;.   
15110 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74 4f 72   pIndex->aSortOr
15120 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72 65 71  der[i] = (u8)req
15130 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b  uestedSortOrder;
15140 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
15150 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49 6e 64  faultRowEst(pInd
15160 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
15170 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
15180 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
15190 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
151a0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
151b0 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
151c0 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
151d0 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
151e0 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
151f0 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
15200 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
15210 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
15220 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
15230 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
15240 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
15250 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
15260 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
15270 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
15280 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
15290 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
152a0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
152b0 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
152c0 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
152d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
152e0 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
152f0 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
15300 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
15310 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
15320 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
15330 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
15340 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
15350 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
15360 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
15370 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
15380 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
15390 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
153a0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
153b0 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
153c0 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20     */.    Index 
153d0 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72 28 70  *pIdx;.    for(p
153e0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
153f0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
15400 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
15410 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 61 73   int k;.      as
15420 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e 45 72  sert( pIdx->onEr
15430 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a  ror!=OE_None );.
15440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
15450 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 29 3b  dx->autoIndex );
15460 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15470 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d  Index->onError!=
15480 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20 20 20  OE_None );..    
15490 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c    if( pIdx->nCol
154a0 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f  umn!=pIndex->nCo
154b0 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lumn ) continue;
154c0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
154d0 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
154e0 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   k++){.        c
154f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20 3d 20  onst char *z1 = 
15500 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b  pIdx->azColl[k];
15510 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
15520 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64 65 78  har *z2 = pIndex
15530 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20  ->azColl[k];.   
15540 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
15550 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49 6e 64  iColumn[k]!=pInd
15560 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 20  ex->aiColumn[k] 
15570 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
15580 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74   if( pIdx->aSort
15590 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64 65 78  Order[k]!=pIndex
155a0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b 5d 20  ->aSortOrder[k] 
155b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
155c0 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26 20 73   if( z1!=z2 && s
155d0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 31  qlite3StrICmp(z1
155e0 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b 0a 20  , z2) ) break;. 
155f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15600 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d   k==pIdx->nColum
15610 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n ){.        if(
15620 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
15630 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
15640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
15650 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  This constraint 
15660 63 72 65 61 74 65 73 20 74 68 65 20 73 61 6d 65  creates the same
15670 20 69 6e 64 65 78 20 61 73 20 61 20 70 72 65 76   index as a prev
15680 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20 20 2a  ious.          *
15690 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73 70 65  * constraint spe
156a0 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65 72 65  cified somewhere
156b0 20 69 6e 20 74 68 65 20 43 52 45 41 54 45 20 54   in the CREATE T
156c0 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
156d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48 6f 77            ** How
156e0 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f 4e 46  ever the ON CONF
156f0 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61 72 65  LICT clauses are
15700 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66 20 62   different. If b
15710 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20 20 20  oth this .      
15720 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
15730 74 20 61 6e 64 20 74 68 65 20 70 72 65 76 69 6f  t and the previo
15740 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20 63 6f  us equivalent co
15750 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20 65 78  nstraint have ex
15760 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20 20 20  plicit.         
15770 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20   ** ON CONFLICT 
15780 63 6c 61 75 73 65 73 20 74 68 69 73 20 69 73 20  clauses this is 
15790 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65 72 77  an error. Otherw
157a0 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20 20 20  ise, use the.   
157b0 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c 69 63         ** explic
157c0 69 74 6c 79 20 73 70 65 63 69 66 69 65 64 20 62  itly specified b
157d0 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74 68 65  ehaviour for the
157e0 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20 20   index..        
157f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
15800 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72 72  f( !(pIdx->onErr
15810 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 7c  or==OE_Default |
15820 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  | pIndex->onErro
15830 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20 29  r==OE_Default) )
15840 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
15850 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
15860 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
15870 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63 74         "conflict
15880 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54 20  ing ON CONFLICT 
15890 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69 65  clauses specifie
158a0 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  d", 0);.        
158b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
158c0 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 3d  ( pIdx->onError=
158d0 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a 20  =OE_Default ){. 
158e0 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d             pIdx-
158f0 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64 65  >onError = pInde
15900 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20  x->onError;.    
15910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15920 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  }.        goto e
15930 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
15940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15950 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b 20 74    }..  /* Link t
15960 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73 74 72  he new Index str
15970 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 74 61  ucture to its ta
15980 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65 20 6f  ble and to the o
15990 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d  ther.  ** in-mem
159a0 6f 72 79 20 64 61 74 61 62 61 73 65 20 73 74 72  ory database str
159b0 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f 0a 20  uctures. .  */. 
159c0 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
159d0 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20  sy ){.    Index 
159e0 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69  *p;.    p = sqli
159f0 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26 70  te3HashInsert(&p
15a00 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e  Index->pSchema->
15a10 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20 20  idxHash, .      
15a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a30 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d      pIndex->zNam
15a40 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
15a50 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  30(pIndex->zName
15a60 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
15a70 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49 6e               pIn
15a80 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 20  dex);.    if( p 
15a90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
15aa0 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20 20 2f   p==pIndex );  /
15ab0 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61  * Malloc must ha
15ac0 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 20  ve failed */.   
15ad0 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69     db->mallocFai
15ae0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 67  led = 1;.      g
15af0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
15b00 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
15b10 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
15b20 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67  LITE_InternChang
15b30 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54 62 6c  es;.    if( pTbl
15b40 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
15b50 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20 3d 20   pIndex->tnum = 
15b60 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
15b70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
15b80 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e 69  * If the db->ini
15b90 74 2e 62 75 73 79 20 69 73 20 30 20 74 68 65 6e  t.busy is 0 then
15ba0 20 63 72 65 61 74 65 20 74 68 65 20 69 6e 64 65   create the inde
15bb0 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68 69 73  x on disk.  This
15bc0 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73 20 77  .  ** involves w
15bd0 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64 65 78  riting the index
15be0 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74 65 72   into the master
15bf0 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c 6c 69   table and filli
15c00 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ng in the.  ** i
15c10 6e 64 65 78 20 77 69 74 68 20 74 68 65 20 63 75  ndex with the cu
15c20 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f 6e 74  rrent table cont
15c30 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents..  **.  ** 
15c40 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  The db->init.bus
15c50 79 20 69 73 20 30 20 77 68 65 6e 20 74 68 65 20  y is 0 when the 
15c60 75 73 65 72 20 66 69 72 73 74 20 65 6e 74 65 72  user first enter
15c70 73 20 61 20 43 52 45 41 54 45 20 49 4e 44 45 58  s a CREATE INDEX
15c80 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20   .  ** command. 
15c90 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 69   db->init.busy i
15ca0 73 20 31 20 77 68 65 6e 20 61 20 64 61 74 61 62  s 1 when a datab
15cb0 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 61 6e  ase is opened an
15cc0 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45 20 49  d .  ** CREATE I
15cd0 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 73 20  NDEX statements 
15ce0 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f 66 20  are read out of 
15cf0 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65  the master table
15d00 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65 20 6c  .  In.  ** the l
15d10 61 74 74 65 72 20 63 61 73 65 20 74 68 65 20 69  atter case the i
15d20 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65 78 69  ndex already exi
15d30 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77 68 69  sts on disk, whi
15d40 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a 20 77  ch is why.  ** w
15d50 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20  e don't want to 
15d60 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20 20 2a  recreate it..  *
15d70 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c 4e 61  *.  ** If pTblNa
15d80 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  me==0 it means t
15d90 68 69 73 20 69 6e 64 65 78 20 69 73 20 67 65 6e  his index is gen
15da0 65 72 61 74 65 64 20 61 73 20 61 20 70 72 69 6d  erated as a prim
15db0 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f 72 20  ary key.  ** or 
15dc0 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e  UNIQUE constrain
15dd0 74 20 6f 66 20 61 20 43 52 45 41 54 45 20 54 41  t of a CREATE TA
15de0 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
15df0 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a  Since the table.
15e00 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65    ** has just be
15e10 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74 20 63  en created, it c
15e20 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20  ontains no data 
15e30 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e  and the index in
15e40 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
15e50 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b  * step can be sk
15e60 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ipped..  */.  el
15e70 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  se if( db->init.
15e80 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 56  busy==0 ){.    V
15e90 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68 61 72  dbe *v;.    char
15ea0 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *zStmt;.    int
15eb0 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65   iMem = ++pParse
15ec0 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76 20 3d  ->nMem;..    v =
15ed0 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
15ee0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
15ef0 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69   v==0 ) goto exi
15f00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
15f10 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
15f20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 6f 72  the rootpage for
15f30 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 2a   the index.    *
15f40 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  /.    sqlite3Beg
15f50 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
15f60 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29  (pParse, 1, iDb)
15f70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
15f80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 72  eAddOp2(v, OP_Cr
15f90 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62 2c 20  eateIndex, iDb, 
15fa0 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  iMem);..    /* G
15fb0 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70 6c 65  ather the comple
15fc0 74 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  te text of the C
15fd0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
15fe0 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20 20 2a  ement into.    *
15ff0 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61 72 69  * the zStmt vari
16000 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  able.    */.    
16010 69 66 28 20 70 53 74 61 72 74 20 26 26 20 70 45  if( pStart && pE
16020 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  nd ){.      /* A
16030 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
16040 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
16050 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
16060 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
16070 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
16080 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
16090 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
160a0 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
160b0 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
160c0 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 20  " UNIQUE",.     
160d0 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70 4e 61     pEnd->z - pNa
160e0 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20 20 20  me->z + 1,.     
160f0 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a 20 20     pName->z);.  
16100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
16110 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63 20 69  * An automatic i
16120 6e 64 65 78 20 63 72 65 61 74 65 64 20 62 79 20  ndex created by 
16130 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
16140 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69   UNIQUE constrai
16150 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 7a  nt */.      /* z
16160 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50  Stmt = sqlite3MP
16170 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a 20 20  rintf(""); */.  
16180 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b 0a 20      zStmt = 0;. 
16190 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
161a0 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73 71 6c   an entry in sql
161b0 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72 20 74  ite_master for t
161c0 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20 2a 2f  his index.    */
161d0 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
161e0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 20  edParse(pParse, 
161f0 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54  .        "INSERT
16200 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41 4c 55   INTO %Q.%s VALU
16210 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c 25 51  ES('index',%Q,%Q
16220 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20 20 20  ,#%d,%Q);",.    
16230 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
16240 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
16250 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
16260 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65     pIndex->zName
16270 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e  ,.        pTab->
16280 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 69  zName,.        i
16290 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a 53 74  Mem,.        zSt
162a0 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  mt.    );.    sq
162b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
162c0 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f 2a 20  zStmt);..    /* 
162d0 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78 20 77  Fill the index w
162e0 69 74 68 20 64 61 74 61 20 61 6e 64 20 72 65 70  ith data and rep
162f0 61 72 73 65 20 74 68 65 20 73 63 68 65 6d 61 2e  arse the schema.
16300 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78 70 69   Code an OP_Expi
16310 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69 6e 76  re.    ** to inv
16320 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72 65 2d  alidate all pre-
16330 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
16340 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
16350 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29 7b 0a  if( pTblName ){.
16360 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
16370 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
16380 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29 3b 0a   pIndex, iMem);.
16390 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 61        sqlite3Cha
163a0 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65  ngeCookie(pParse
163b0 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 73 71  , iDb);.      sq
163c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
163d0 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d  v, OP_ParseSchem
163e0 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a 20 20  a, iDb, 0, 0,.  
163f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50         sqlite3MP
16400 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d  rintf(db, "name=
16410 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  '%q'", pIndex->z
16420 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49  Name), P4_DYNAMI
16430 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
16440 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
16450 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20 20  P_Expire, 0);.  
16460 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68    }.  }..  /* Wh
16470 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64  en adding an ind
16480 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  ex to the list o
16490 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20  f indices for a 
164a0 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a  table, make.  **
164b0 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65   sure all indice
164c0 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70  s labeled OE_Rep
164d0 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20  lace come after 
164e0 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65  all those labele
164f0 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65  d.  ** OE_Ignore
16500 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
16510 73 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72  sary for the cor
16520 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
16530 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20 61 6e  f UPDATE.  ** an
16540 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f 0a 20  d INSERT..  */. 
16550 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
16560 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d  sy || pTblName==
16570 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45  0 ){.    if( onE
16580 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65  rror!=OE_Replace
16590 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78   || pTab->pIndex
165a0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  ==0.         || 
165b0 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e  pTab->pIndex->on
165c0 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63  Error==OE_Replac
165d0 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  e){.      pIndex
165e0 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e  ->pNext = pTab->
165f0 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54  pIndex;.      pT
16600 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e  ab->pIndex = pIn
16610 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  dex;.    }else{.
16620 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74        Index *pOt
16630 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64  her = pTab->pInd
16640 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ex;.      while(
16650 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26   pOther->pNext &
16660 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d  & pOther->pNext-
16670 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70  >onError!=OE_Rep
16680 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lace ){.        
16690 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d  pOther = pOther-
166a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
166b0 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e        pIndex->pN
166c0 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e  ext = pOther->pN
166d0 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65  ext;.      pOthe
166e0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65  r->pNext = pInde
166f0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
16700 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  dex = 0;.  }..  
16710 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65 66 6f  /* Clean up befo
16720 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 65 78  re exiting */.ex
16730 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3a  it_create_index:
16740 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20 29 7b  .  if( pIndex ){
16750 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16760 65 28 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c 41 66  e(pIndex->zColAf
16770 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  f);.    sqlite3D
16780 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64 65 78  bFree(db, pIndex
16790 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
167a0 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
167b0 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  b, pList);.  sql
167c0 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74  ite3SrcListDelet
167d0 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65 29 3b  e(db, pTblName);
167e0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
167f0 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72  (db, zName);.  r
16800 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
16810 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
16820 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 66   make sure the f
16830 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d 62 65  ile format numbe
16840 72 20 69 73 20 61 74 20 6c 65 61 73 74 20 6d 69  r is at least mi
16850 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68 65 20  nFormat..** The 
16860 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 20 77  generated code w
16870 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74 68 65  ill increase the
16880 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d   file format num
16890 62 65 72 20 69 66 20 6e 65 63 65 73 73 61 72 79  ber if necessary
168a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
168b0 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f 72 6d  3MinimumFileForm
168c0 61 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  at(Parse *pParse
168d0 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 6d  , int iDb, int m
168e0 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56 64 62  inFormat){.  Vdb
168f0 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71 6c 69  e *v;.  v = sqli
16900 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
16910 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
16920 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69     int r1 = sqli
16930 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
16940 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74 20 72  arse);.    int r
16950 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  2 = sqlite3GetTe
16960 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
16970 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20 20 73     int j1;.    s
16980 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
16990 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69  (v, OP_ReadCooki
169a0 65 2c 20 69 44 62 2c 20 72 31 2c 20 31 29 3b 0a  e, iDb, r1, 1);.
169b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55      sqlite3VdbeU
169c0 73 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29  sesBtree(v, iDb)
169d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
169e0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
169f0 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d 61 74  teger, minFormat
16a00 2c 20 72 32 29 3b 0a 20 20 20 20 6a 31 20 3d 20  , r2);.    j1 = 
16a10 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16a20 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 32 2c 20  3(v, OP_Ge, r2, 
16a30 30 2c 20 72 31 29 3b 0a 20 20 20 20 73 71 6c 69  0, r1);.    sqli
16a40 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
16a50 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
16a60 44 62 2c 20 31 2c 20 72 32 29 3b 0a 20 20 20 20  Db, 1, r2);.    
16a70 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
16a80 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20 20 20  ere(v, j1);.    
16a90 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
16aa0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
16ab0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
16ac0 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
16ad0 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a 7d 0a  rse, r2);.  }.}.
16ae0 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20  ./*.** Fill the 
16af0 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74 5b 5d  Index.aiRowEst[]
16b00 20 61 72 72 61 79 20 77 69 74 68 20 64 65 66 61   array with defa
16b10 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ult information 
16b20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  - information.**
16b30 20 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e   to be used when
16b40 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 75 6e   we have not run
16b50 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   the ANALYZE com
16b60 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69 52 6f  mand..**.** aiRo
16b70 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70 70 6f  wEst[0] is suppo
16b80 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  se to contain th
16b90 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
16ba0 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ents in the inde
16bb0 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65 20 64  x..** Since we d
16bc0 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75 65 73  o not know, gues
16bd0 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20 61 69  s 1 million.  ai
16be0 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61 6e 20  RowEst[1] is an 
16bf0 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 0a  estimate of the.
16c00 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
16c10 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 74  s in the table t
16c20 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61  hat match any pa
16c30 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65 20 6f  rticular value o
16c40 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63  f the.** first c
16c50 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
16c60 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b 32 5d  ex.  aiRowEst[2]
16c70 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
16c80 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  of the number.**
16c90 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 6d 61   of rows that ma
16ca0 74 63 68 20 61 6e 79 20 70 61 72 74 69 63 75 6c  tch any particul
16cb0 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f 6e 20  ar combiniation 
16cc0 6f 66 20 74 68 65 20 66 69 72 73 74 20 32 20 63  of the first 2 c
16cd0 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74 68 65  olumns.** of the
16ce0 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73 6f 20   index.  And so 
16cf0 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73 74 20  forth.  It must 
16d00 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 63 61  always be the ca
16d10 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20 20 20  se that.*.**    
16d20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b         aiRowEst[
16d30 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e 2d 31  N]<=aiRowEst[N-1
16d40 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61  ].**           a
16d50 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a 2a 2a  iRowEst[N]>=1.**
16d60 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d 20 74  .** Apart from t
16d70 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c 69 74  hat, we have lit
16d80 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62 65 73  tle to go on bes
16d90 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e 20 61  ides intuition a
16da0 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69 52 6f  s to.** how aiRo
16db0 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20 62 65  wEst[] should be
16dc0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 54   initialized.  T
16dd0 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e 65 72  he numbers gener
16de0 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61 72 65  ated here.** are
16df0 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69 63 61   based on typica
16e00 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64 20 69  l values found i
16e10 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63 65 73  n actual indices
16e20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16e30 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 49  3DefaultRowEst(I
16e40 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75  ndex *pIdx){.  u
16e50 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70 49 64  nsigned *a = pId
16e60 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20 20 69  x->aiRowEst;.  i
16e70 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
16e80 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d 20 3d  a!=0 );.  a[0] =
16e90 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f 72 28   1000000;.  for(
16ea0 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  i=pIdx->nColumn;
16eb0 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=5; i--){.   
16ec0 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d 0a 20   a[i] = 5;.  }. 
16ed0 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29 7b 0a   while( i>=1 ){.
16ee0 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20 2d 20      a[i] = 11 - 
16ef0 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20 7d 0a  i;.    i--;.  }.
16f00 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
16f10 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
16f20 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43 6f 6c      a[pIdx->nCol
16f30 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  umn] = 1;.  }.}.
16f40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
16f50 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20 61 6e  ine will drop an
16f60 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65 64 20   existing named 
16f70 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72 6f 75  index.  This rou
16f80 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tine.** implemen
16f90 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e 44 45  ts the DROP INDE
16fa0 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  X statement..*/.
16fb0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
16fc0 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50 61  Index(Parse *pPa
16fd0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
16fe0 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69 73 74  ame, int ifExist
16ff0 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  s){.  Index *pIn
17000 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  dex;.  Vdbe *v;.
17010 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
17020 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e  pParse->db;.  in
17030 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20 70 50  t iDb;..  if( pP
17040 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
17050 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17060 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
17070 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a  drop_index;.  }.
17080 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 2d    assert( pName-
17090 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69 66  >nSrc==1 );.  if
170a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
170b0 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
170c0 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 67 6f  Parse) ){.    go
170d0 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
170e0 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  ex;.  }.  pIndex
170f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
17100 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d 3e 61  dex(db, pName->a
17110 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65  [0].zName, pName
17120 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65  ->a[0].zDatabase
17130 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65 78 3d  );.  if( pIndex=
17140 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21 69  =0 ){.    if( !i
17150 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20 20 20  fExists ){.     
17160 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
17170 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
17180 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20 70 4e  h index: %S", pN
17190 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
171a0 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
171b0 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
171c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
171d0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ndex;.  }.  if( 
171e0 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65  pIndex->autoInde
171f0 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  x ){.    sqlite3
17200 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
17210 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74   "index associat
17220 65 64 20 77 69 74 68 20 55 4e 49 51 55 45 20 22  ed with UNIQUE "
17230 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49 4d 41  .      "or PRIMA
17240 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
17250 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70  t cannot be drop
17260 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f  ped", 0);.    go
17270 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64  to exit_drop_ind
17280 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20  ex;.  }.  iDb = 
17290 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
172a0 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 2d  ndex(db, pIndex-
172b0 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64  >pSchema);.#ifnd
172c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
172d0 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b  UTHORIZATION.  {
172e0 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20  .    int code = 
172f0 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45  SQLITE_DROP_INDE
17300 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  X;.    Table *pT
17310 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61  ab = pIndex->pTa
17320 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ble;.    const c
17330 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61  har *zDb = db->a
17340 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20  Db[iDb].zName;. 
17350 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
17360 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41 42  Tab = SCHEMA_TAB
17370 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69 66 28  LE(iDb);.    if(
17380 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17390 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
173a0 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30  _DELETE, zTab, 0
173b0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
173c0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
173d0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
173e0 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42  if( !OMIT_TEMPDB
173f0 20 26 26 20 69 44 62 20 29 20 63 6f 64 65 20 3d   && iDb ) code =
17400 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
17410 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  P_INDEX;.    if(
17420 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
17430 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20  k(pParse, code, 
17440 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70  pIndex->zName, p
17450 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29  Tab->zName, zDb)
17460 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
17470 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
17480 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
17490 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
174a0 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65 20 74  code to remove t
174b0 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66 72 6f  he index and fro
174c0 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  m the master tab
174d0 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69  le */.  v = sqli
174e0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
174f0 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20  e);.  if( v ){. 
17500 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
17510 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
17520 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20  arse, 1, iDb);. 
17530 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
17540 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20  Parse(pParse,.  
17550 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
17560 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 6e 61  M %Q.%s WHERE na
17570 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 64  me=%Q",.       d
17580 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
17590 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
175a0 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70 49 6e  iDb),.       pIn
175b0 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  dex->zName.    )
175c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
175d0 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22  3FindTable(db, "
175e0 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64  sqlite_stat1", d
175f0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
17600 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  e) ){.      sqli
17610 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
17620 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22  Parse,.        "
17630 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73  DELETE FROM %Q.s
17640 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48 45 52  qlite_stat1 WHER
17650 45 20 69 64 78 3d 25 51 22 2c 0a 20 20 20 20 20  E idx=%Q",.     
17660 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
17670 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d 3e 7a  zName, pIndex->z
17680 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
17690 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43    }.    sqlite3C
176a0 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
176b0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64 65  se, iDb);.    de
176c0 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
176d0 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74 6e  arse, pIndex->tn
176e0 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71  um, iDb);.    sq
176f0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
17700 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78 2c  v, OP_DropIndex,
17710 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e 64   iDb, 0, 0, pInd
17720 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ex->zName, 0);. 
17730 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69 6e   }..exit_drop_in
17740 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53 72  dex:.  sqlite3Sr
17750 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
17760 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pName);.}../*.**
17770 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f 69   pArray is a poi
17780 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61 79  nter to an array
17790 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 45 61   of objects.  Ea
177a0 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
177b0 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
177c0 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
177d0 7a 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ze.  This routin
177e0 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 6e 65  e allocates a ne
177f0 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e 20 74  w.** object on t
17800 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 72  he end of the ar
17810 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 45 6e  ray..**.** *pnEn
17820 74 72 79 20 69 73 20 74 68 65 20 6e 75 6d 62 65  try is the numbe
17830 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61 6c 72  r of entries alr
17840 65 61 64 79 20 69 6e 20 75 73 65 2e 20 20 2a 70  eady in use.  *p
17850 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74 68 65  nAlloc is.** the
17860 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f   previously allo
17870 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 74 68  cated size of th
17880 65 20 61 72 72 61 79 2e 20 20 69 6e 69 74 53 69  e array.  initSi
17890 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20 73 75 67  ze is the.** sug
178a0 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c 20 61  gested initial a
178b0 72 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f 63 61  rray size alloca
178c0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
178d0 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 65 77  index of the new
178e0 20 65 6e 74 72 79 20 69 73 20 72 65 74 75 72 6e   entry is return
178f0 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a 2a 0a  ed in *pIdx..**.
17900 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17910 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
17920 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
17930 66 20 6f 62 6a 65 63 74 73 2e 20 20 54 68 69 73  f objects.  This
17940 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74 68 65  .** might be the
17950 20 73 61 6d 65 20 61 73 20 74 68 65 20 70 41 72   same as the pAr
17960 72 61 79 20 70 61 72 61 6d 65 74 65 72 20 6f 72  ray parameter or
17970 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 64   it might be a d
17980 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f 69 6e  ifferent.** poin
17990 74 65 72 20 69 66 20 74 68 65 20 61 72 72 61 79  ter if the array
179a0 20 77 61 73 20 72 65 73 69 7a 65 64 2e 0a 2a 2f   was resized..*/
179b0 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72  .void *sqlite3Ar
179c0 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73  rayAllocate(.  s
179d0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
179e0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
179f0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
17a00 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
17a10 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20   void *pArray,  
17a20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f     /* Array of o
17a30 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62  bjects.  Might b
17a40 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f  e reallocated */
17a50 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20  .  int szEntry, 
17a60 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
17a70 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  each object in t
17a80 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  he array */.  in
17a90 74 20 69 6e 69 74 53 69 7a 65 2c 20 20 20 20 20  t initSize,     
17aa0 2f 2a 20 53 75 67 67 65 73 74 65 64 20 69 6e 69  /* Suggested ini
17ab0 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c  tial allocation,
17ac0 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a 2f 0a   in elements */.
17ad0 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79 2c 20    int *pnEntry, 
17ae0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17af0 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65 6e 74   objects current
17b00 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69  ly in use */.  i
17b10 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20 20 20  nt *pnAlloc,    
17b20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a 65   /* Current size
17b30 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69   of the allocati
17b40 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  on, in elements 
17b50 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20 20  */.  int *pIdx  
17b60 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
17b70 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 6e  the index of a n
17b80 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f 0a  ew slot here */.
17b90 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ){.  char *z;.  
17ba0 69 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e 3d 20  if( *pnEntry >= 
17bb0 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  *pnAlloc ){.    
17bc0 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20 20 20  void *pNew;.    
17bd0 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20  int newSize;.   
17be0 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70 6e 41   newSize = (*pnA
17bf0 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74 53 69  lloc)*2 + initSi
17c00 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 73  ze;.    pNew = s
17c10 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
17c20 64 62 2c 20 70 41 72 72 61 79 2c 20 6e 65 77 53  db, pArray, newS
17c30 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a 20 20  ize*szEntry);.  
17c40 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
17c50 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 2d  .      *pIdx = -
17c60 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
17c70 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a 20 20  pArray;.    }.  
17c80 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 73 71 6c    *pnAlloc = sql
17c90 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65  ite3DbMallocSize
17ca0 28 64 62 2c 20 70 4e 65 77 29 2f 73 7a 45 6e 74  (db, pNew)/szEnt
17cb0 72 79 3b 0a 20 20 20 20 70 41 72 72 61 79 20 3d  ry;.    pArray =
17cc0 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20 3d   pNew;.  }.  z =
17cd0 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b 0a   (char*)pArray;.
17ce0 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70 6e 45    memset(&z[*pnE
17cf0 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79 5d 2c  ntry * szEntry],
17d00 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20   0, szEntry);.  
17d10 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74 72 79  *pIdx = *pnEntry
17d20 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79 3b 0a  ;.  ++*pnEntry;.
17d30 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b    return pArray;
17d40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
17d50 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
17d60 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64 4c 69  o the given IdLi
17d70 73 74 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65  st.  Create a ne
17d80 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a 20 6e  w IdList if.** n
17d90 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  eed be..**.** A 
17da0 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20 72 65  new IdList is re
17db0 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c 4c 20  turned, or NULL 
17dc0 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  if malloc() fail
17dd0 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a 73 71  s..*/.IdList *sq
17de0 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70 65 6e  lite3IdListAppen
17df0 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49  d(sqlite3 *db, I
17e00 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  dList *pList, To
17e10 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
17e20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
17e30 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
17e40 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  st = sqlite3DbMa
17e50 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a  llocZero(db, siz
17e60 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b 0a 20  eof(IdList) );. 
17e70 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
17e80 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
17e90 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
17ea0 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e  0;.  }.  pList->
17eb0 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79  a = sqlite3Array
17ec0 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20  Allocate(.      
17ed0 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d  db,.      pList-
17ee0 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66  >a,.      sizeof
17ef0 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20  (pList->a[0]),. 
17f00 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20 26 70       5,.      &p
17f10 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20 20 20  List->nId,.     
17f20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2c   &pList->nAlloc,
17f30 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
17f40 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
17f50 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
17f60 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
17f70 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17f80 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
17f90 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
17fa0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
17fb0 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
17fc0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
17fd0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
17fe0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
17ff0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
18000 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
18010 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
18020 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
18030 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
18040 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
18050 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
18060 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
18070 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
18080 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
18090 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
180a0 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
180b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
180c0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
180d0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
180e0 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
180f0 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
18100 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
18110 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
18120 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
18130 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
18140 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
18150 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
18160 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
18170 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
18180 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
18190 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
181a0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
181b0 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
181c0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
181d0 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
181e0 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
181f0 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n -1;.}../*.** E
18200 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
18210 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
18220 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
18230 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
18240 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
18250 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
18260 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
18270 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
18280 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
18290 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
182a0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
182b0 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
182c0 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
182d0 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
182e0 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
182f0 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
18300 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
18310 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
18320 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
18330 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
18340 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
18350 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
18360 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
18370 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
18380 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
18390 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
183a0 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
183b0 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
183c0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
183d0 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
183e0 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
183f0 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
18400 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
18410 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
18420 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
18430 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
18440 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
18450 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
18460 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
18470 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
18480 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65  cation fails the
18490 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68   SrcList is unch
184a0 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64  anged.  The.** d
184b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
184c0 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74  flag will be set
184d0 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63   to true..*/.Src
184e0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
184f0 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73  ListEnlarge(.  s
18500 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
18510 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
18520 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
18530 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73  fy of OOM errors
18540 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
18550 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Src,     /* The 
18560 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e  SrcList to be en
18570 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  larged */.  int 
18580 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f  nExtra,        /
18590 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20  * Number of new 
185a0 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20  slots to add to 
185b0 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69  pSrc->a[] */.  i
185c0 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20  nt iStart       
185d0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53    /* Index in pS
185e0 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74  rc->a[] of first
185f0 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a   new slot */.){.
18600 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53    int i;..  /* S
18610 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
18620 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65  n calling parame
18630 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ters */.  assert
18640 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20  ( iStart>=0 );. 
18650 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
18660 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 53 72 63  =1 );.  if( pSrc
18670 3d 3d 30 20 7c 7c 20 69 53 74 61 72 74 3e 70 53  ==0 || iStart>pS
18680 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20  rc->nSrc ){.    
18690 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
186a0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
186b0 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 7d  return pSrc;.  }
186c0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
186d0 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61 63 65  additional space
186e0 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20   if needed */.  
186f0 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 2b 6e  if( pSrc->nSrc+n
18700 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c  Extra>pSrc->nAll
18710 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  oc ){.    SrcLis
18720 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74  t *pNew;.    int
18730 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e   nAlloc = pSrc->
18740 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20  nSrc+nExtra;.   
18750 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70   int nGot;.    p
18760 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
18770 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c  ealloc(db, pSrc,
18780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18790 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20  sizeof(*pSrc) + 
187a0 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f  (nAlloc-1)*sizeo
187b0 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b  f(pSrc->a[0]) );
187c0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  .    if( pNew==0
187d0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
187e0 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
187f0 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ed );.      retu
18800 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20  rn pSrc;.    }. 
18810 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a     pSrc = pNew;.
18820 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69      nGot = (sqli
18830 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
18840 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65  db, pNew) - size
18850 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f  of(*pSrc))/sizeo
18860 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b  f(pSrc->a[0])+1;
18870 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f  .    pSrc->nAllo
18880 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b 0a 20  c = (u16)nGot;. 
18890 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 65 78   }..  /* Move ex
188a0 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74 68 61  isting slots tha
188b0 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74 68 65  t come after the
188c0 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20   newly inserted 
188d0 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74 20 6f  slots.  ** out o
188e0 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20 20 66  f the way */.  f
188f0 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72 63 2d  or(i=pSrc->nSrc-
18900 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20 69 2d  1; i>=iStart; i-
18910 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  -){.    pSrc->a[
18920 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53 72 63  i+nExtra] = pSrc
18930 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 70 53  ->a[i];.  }.  pS
18940 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69 31 36  rc->nSrc += (i16
18950 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a 20 5a  )nExtra;..  /* Z
18960 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20 61 6c  ero the newly al
18970 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20 2a 2f  located slots */
18980 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72 63 2d  .  memset(&pSrc-
18990 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 73  >a[iStart], 0, s
189a0 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d  izeof(pSrc->a[0]
189b0 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66 6f 72  )*nExtra);.  for
189c0 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69 53 74  (i=iStart; i<iSt
189d0 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b 2b 29  art+nExtra; i++)
189e0 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b 69 5d  {.    pSrc->a[i]
189f0 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
18a00 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20   }..  /* Return 
18a10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
18a20 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c 69 73   enlarged SrcLis
18a30 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 53  t */.  return pS
18a40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 70  rc;.}.../*.** Ap
18a50 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62 6c 65  pend a new table
18a60 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67 69 76   name to the giv
18a70 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43 72 65  en SrcList.  Cre
18a80 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c 69 73  ate a new SrcLis
18a90 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e  t if.** need be.
18aa0 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20 69 73    A new entry is
18ab0 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
18ac0 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69 66 20  SrcList even if 
18ad0 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 2e 0a  pToken is NULL..
18ae0 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73 74 20  **.** A SrcList 
18af0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20  is returned, or 
18b00 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20 69 73  NULL if there is
18b10 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20   an OOM error.  
18b20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  The returned.** 
18b30 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 62 65  SrcList might be
18b40 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
18b50 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 77 61   SrcList that wa
18b60 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20 6d 69  s input or it mi
18b70 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65 77 20  ght be.** a new 
18b80 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f 4d 20  one.  If an OOM 
18b90 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
18ba0 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6f  s, then the prio
18bb0 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69 73 74  r value of pList
18bc0 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e 70 75  .** that is inpu
18bd0 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  t to this routin
18be0 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  e is automatical
18bf0 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  ly freed..**.** 
18c00 49 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20  If pDatabase is 
18c10 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d 65 61  not null, it mea
18c20 6e 73 20 74 68 61 74 20 74 68 65 20 74 61 62 6c  ns that the tabl
18c30 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f 6e 61  e has an optiona
18c40 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61  l.** database na
18c50 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69 6b 65  me prefix.  Like
18c60 20 74 68 69 73 3a 20 20 22 64 61 74 61 62 61 73   this:  "databas
18c70 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65 20 70  e.table".  The p
18c80 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f 69 6e  Database.** poin
18c90 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ts to the table 
18ca0 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70 54 61  name and the pTa
18cb0 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ble points to th
18cc0 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  e database name.
18cd0 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73 74 2e  .** The SrcList.
18ce0 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c 64 20  a[].zName field 
18cf0 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 74  is filled with t
18d00 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77 68  he table name wh
18d10 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63 6f 6d  ich might.** com
18d20 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20 28 69  e from pTable (i
18d30 66 20 70 44 61 74 61 62 61 73 65 20 69 73 20 4e  f pDatabase is N
18d40 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70 44 61  ULL) or from pDa
18d50 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53 72 63  tabase.  .** Src
18d60 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61 62 61  List.a[].zDataba
18d70 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74  se is filled wit
18d80 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  h the database n
18d90 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 2c  ame from pTable,
18da0 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55 4c 4c  .** or with NULL
18db0 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73 65 20   if no database 
18dc0 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a  is specified..**
18dd0 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  .** In other wor
18de0 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69 6b 65  ds, if call like
18df0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
18e00 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
18e10 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c  istAppend(D,A,B,
18e20 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 42  0);.**.** Then B
18e30 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   is a table name
18e40 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
18e50 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70 65 63  e name is unspec
18e60 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c 6c 65  ified.  If calle
18e70 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73 3a 0a  d.** like this:.
18e80 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 71  **.**         sq
18e90 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70 65  lite3SrcListAppe
18ea0 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a 2a 0a  nd(D,A,B,C);.**.
18eb0 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74 68 65  ** Then C is the
18ec0 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
18ed0 42 20 69 73 20 74 68 65 20 64 61 74 61 62 61 73  B is the databas
18ee0 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63 4c 69  e name..*/.SrcLi
18ef0 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
18f00 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c 69  stAppend(.  sqli
18f10 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
18f20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  /* Connection to
18f30 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f   notify of mallo
18f40 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  c failures */.  
18f50 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  SrcList *pList, 
18f60 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
18f70 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20 4e   this SrcList. N
18f80 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e 65  ULL creates a ne
18f90 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20 54  w SrcList */.  T
18fa0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
18fb0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 61     /* Table to a
18fc0 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ppend */.  Token
18fd0 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20 2f   *pDatabase    /
18fe0 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74 68  * Database of th
18ff0 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  e table */.){.  
19000 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
19010 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66  tem *pItem;.  if
19020 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
19030 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
19040 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
19050 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69 73 74  , sizeof(SrcList
19060 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
19070 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
19080 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  ;.    pList->nAl
19090 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 70  loc = 1;.  }.  p
190a0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 53 72  List = sqlite3Sr
190b0 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64 62 2c  cListEnlarge(db,
190c0 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69 73 74   pList, 1, pList
190d0 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28 20 64  ->nSrc);.  if( d
190e0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
190f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 72  ){.    sqlite3Sr
19100 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  cListDelete(db, 
19110 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65 74 75  pList);.    retu
19120 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49 74 65  rn 0;.  }.  pIte
19130 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c  m = &pList->a[pL
19140 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  ist->nSrc-1];.  
19150 69 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26  if( pDatabase &&
19160 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d 3d 30   pDatabase->z==0
19170 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62 61 73   ){.    pDatabas
19180 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
19190 20 70 44 61 74 61 62 61 73 65 20 26 26 20 70 54   pDatabase && pT
191a0 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  able ){.    Toke
191b0 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
191c0 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
191d0 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
191e0 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
191f0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
19200 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
19210 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
19220 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d  pTable);.  pItem
19230 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
19240 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
19250 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
19260 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
19270 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
19280 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
19290 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
192a0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
192b0 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
192c0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
192d0 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
192e0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
192f0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
19300 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
19310 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
19320 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
19330 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
19340 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
19350 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
19360 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
19370 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
19380 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
19390 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
193a0 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
193b0 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
193c0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
193d0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
193e0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
193f0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
19400 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19410 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
19420 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
19430 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
19440 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
19450 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
19460 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
19470 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
19480 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
19490 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
194a0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
194b0 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
194c0 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
194d0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
194e0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
194f0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
19500 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
19510 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
19520 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
19530 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
19540 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
19550 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19560 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
19570 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
19580 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
19590 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
195a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
195b0 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
195c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
195d0 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 49  ee(db, pItem->zI
195e0 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c 69 74  ndex);.    sqlit
195f0 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 70 49  e3DeleteTable(pI
19600 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20 20  tem->pTab);.    
19610 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
19620 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70  ete(db, pItem->p
19630 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
19640 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
19650 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  b, pItem->pOn);.
19660 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73      sqlite3IdLis
19670 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
19680 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
19690 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
196a0 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f  db, pList);.}../
196b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
196c0 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
196d0 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64 64  he parser to add
196e0 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74   a new term to t
196f0 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20 67  he.** end of a g
19700 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61 75  rowing FROM clau
19710 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61 72  se.  The "p" par
19720 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70 61  ameter is the pa
19730 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52 4f  rt of.** the FRO
19740 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68 61  M clause that ha
19750 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
19760 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70 22  onstructed.  "p"
19770 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 74   is NULL.** if t
19780 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
19790 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
197a0 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62 6c  M clause.  pTabl
197b0 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65 0a  e and pDatabase.
197c0 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65 20  ** are the name 
197d0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e 64  of the table and
197e0 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20   database named 
197f0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
19800 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61 74  se term..** pDat
19810 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69 66  abase is NULL if
19820 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
19830 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73 20  me qualifier is 
19840 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a 2a  missing - the.**
19850 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49 66   usual case.  If
19860 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61 20   the term has a 
19870 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41 6c 69  alias, then pAli
19880 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  as points to the
19890 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65 6e 2e  .** alias token.
198a0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 69 73    If the term is
198b0 20 61 20 73 75 62 71 75 65 72 79 2c 20 74 68 65   a subquery, the
198c0 6e 20 70 53 75 62 71 75 65 72 79 20 69 73 20 74  n pSubquery is t
198d0 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61  he.** SELECT sta
198e0 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68 65 20  tement that the 
198f0 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64 65 73  subquery encodes
19900 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20 61 6e  .  The pTable an
19910 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65 20 70  d.** pDatabase p
19920 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 4e 55  arameters are NU
19930 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  LL for subquerie
19940 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e 64 20  s.  The pOn and 
19950 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61 6d 65  pUsing.** parame
19960 74 65 72 73 20 61 72 65 20 74 68 65 20 63 6f 6e  ters are the con
19970 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e 20 61  tent of the ON a
19980 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  nd USING clauses
19990 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
199a0 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77 68 69   new SrcList whi
199b0 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20 74 68  ch encodes is th
199c0 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68 65 20  e FROM with the 
199d0 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64 64 65  new.** term adde
199e0 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20 2a 73  d..*/.SrcList *s
199f0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70 70  qlite3SrcListApp
19a00 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20 20 50  endFromTerm(.  P
19a10 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
19a20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
19a30 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  g context */.  S
19a40 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20 20 20  rcList *p,      
19a50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65         /* The le
19a60 66 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 46  ft part of the F
19a70 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72 65 61  ROM clause alrea
19a80 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54 6f 6b  dy seen */.  Tok
19a90 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20 20 20  en *pTable,     
19aa0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
19ab0 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61 64 64  the table to add
19ac0 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   to the FROM cla
19ad0 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  use */.  Token *
19ae0 70 44 61 74 61 62 61 73 65 2c 20 20 20 20 20 20  pDatabase,      
19af0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
19b00 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
19b10 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20  ing pTable */.  
19b20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c 20 20  Token *pAlias,  
19b30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
19b40 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
19b50 66 20 74 68 65 20 41 53 20 73 75 62 65 78 70 72  f the AS subexpr
19b60 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65 6c 65  ession */.  Sele
19b70 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c 20 20  ct *pSubquery,  
19b80 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75 65 72      /* A subquer
19b90 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63 65 20  y used in place 
19ba0 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 20  of a table name 
19bb0 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e 2c 20  */.  Expr *pOn, 
19bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19bd0 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f 66  The ON clause of
19be0 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49 64 4c   a join */.  IdL
19bf0 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20 20 20  ist *pUsing     
19c00 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53 49 4e       /* The USIN
19c10 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20 6a 6f  G clause of a jo
19c20 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  in */.){.  struc
19c30 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
19c40 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  pItem;.  sqlite3
19c50 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
19c60 62 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  b;.  p = sqlite3
19c70 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 64 62  SrcListAppend(db
19c80 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70 44 61  , p, pTable, pDa
19c90 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70  tabase);.  if( p
19ca0 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72 63 3d 3d  ==0 || p->nSrc==
19cb0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
19cc0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
19cd0 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  On);.    sqlite3
19ce0 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  IdListDelete(db,
19cf0 20 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 73 71   pUsing);.    sq
19d00 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
19d10 65 28 64 62 2c 20 70 53 75 62 71 75 65 72 79 29  e(db, pSubquery)
19d20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a  ;.    return p;.
19d30 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
19d40 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  ->a[p->nSrc-1];.
19d50 20 20 69 66 28 20 70 41 6c 69 61 73 20 26 26 20    if( pAlias && 
19d60 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20  pAlias->n ){.   
19d70 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d   pItem->zAlias =
19d80 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
19d90 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73  Token(db, pAlias
19da0 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e  );.  }.  pItem->
19db0 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75  pSelect = pSubqu
19dc0 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f  ery;.  pItem->pO
19dd0 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d  n = pOn;.  pItem
19de0 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e  ->pUsing = pUsin
19df0 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  g;.  return p;.}
19e00 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 49  ../*.** Add an I
19e10 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54  NDEXED BY or NOT
19e20 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20   INDEXED clause 
19e30 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  to the most rece
19e40 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a 20 65  ntly added .** e
19e50 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 73 6f  lement of the so
19e60 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73 65 64  urce-list passed
19e70 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
19e80 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  rgument..*/.void
19e90 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 49   sqlite3SrcListI
19ea0 6e 64 65 78 65 64 42 79 28 50 61 72 73 65 20 2a  ndexedBy(Parse *
19eb0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
19ec0 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e 64 65  *p, Token *pInde
19ed0 78 65 64 42 79 29 7b 0a 20 20 69 66 28 20 70 49  xedBy){.  if( pI
19ee0 6e 64 65 78 65 64 42 79 20 26 26 20 70 20 26 26  ndexedBy && p &&
19ef0 20 70 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20   p->nSrc>0 ){.  
19f00 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19f10 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
19f20 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
19f30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
19f40 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  em->notIndexed==
19f50 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49 6e 64  0 && pItem->zInd
19f60 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ex==0 );.    if(
19f70 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d   pIndexedBy->n==
19f80 31 20 26 26 20 21 70 49 6e 64 65 78 65 64 42 79  1 && !pIndexedBy
19f90 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ->z ){.      /* 
19fa0 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44 22 20  A "NOT INDEXED" 
19fb0 63 6c 61 75 73 65 20 77 61 73 20 73 75 70 70 6c  clause was suppl
19fc0 69 65 64 2e 20 53 65 65 20 70 61 72 73 65 2e 79  ied. See parse.y
19fd0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74   .      ** const
19fe0 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f 6f 70  ruct "indexed_op
19ff0 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  t" for details. 
1a000 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  */.      pItem->
1a010 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
1a020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a030 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78 20 3d   pItem->zIndex =
1a040 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
1a050 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
1a060 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b 0a 20  , pIndexedBy);. 
1a070 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1a080 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e 67 20  * When building 
1a090 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  up a FROM clause
1a0a0 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   in the parser, 
1a0b0 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f  the join operato
1a0c0 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c 6c  r.** is initiall
1a0d0 79 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  y attached to th
1a0e0 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 2e 20  e left operand. 
1a0f0 20 42 75 74 20 74 68 65 20 63 6f 64 65 20 67 65   But the code ge
1a100 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70 65 63  nerator.** expec
1a110 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72  ts the join oper
1a120 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20 74 68  ator to be on th
1a130 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e  e right operand.
1a140 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1a150 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a 6f 69  * Shifts all joi
1a160 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72 6f 6d  n operators from
1a170 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 20 66   left to right f
1a180 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46 52 4f  or an entire FRO
1a190 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a  M.** clause..**.
1a1a0 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75 70 70  ** Example: Supp
1a1b0 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69 73 20  ose the join is 
1a1c0 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
1a1d0 20 20 20 20 20 20 20 20 20 20 20 41 20 6e 61 74             A nat
1a1e0 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 20  ural cross join 
1a1f0 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70 65 72  B.**.** The oper
1a200 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72 61 6c  ator is "natural
1a210 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20 20 54   cross join".  T
1a220 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65 72 61  he A and B opera
1a230 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64 0a 2a  nds are stored.*
1a240 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61 6e 64  * in p->a[0] and
1a250 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70 65 63   p->a[1], respec
1a260 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70 61 72  tively.  The par
1a270 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20 73 74  ser initially st
1a280 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70 65 72  ores the.** oper
1a290 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20 54 68  ator with A.  Th
1a2a0 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69 66 74  is routine shift
1a2b0 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f 72 20  s that operator 
1a2c0 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a 76 6f  over to B..*/.vo
1a2d0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1a2e0 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65 28 53  tShiftJoinType(S
1a2f0 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 69 66  rcList *p){.  if
1a300 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b 0a 20  ( p && p->a ){. 
1a310 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1a320 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
1a330 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
1a340 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79 70 65  p->a[i].jointype
1a350 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69   = p->a[i-1].joi
1a360 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 20  ntype;.    }.   
1a370 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74 79 70   p->a[0].jointyp
1a380 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  e = 0;.  }.}../*
1a390 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72 61 6e  .** Begin a tran
1a3a0 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69 64 20  saction.*/.void 
1a3b0 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72 61 6e  sqlite3BeginTran
1a3c0 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20 2a 70  saction(Parse *p
1a3d0 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70 65 29  Parse, int type)
1a3e0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a3f0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 6e  .  Vdbe *v;.  in
1a400 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50 61 72  t i;..  if( pPar
1a410 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70 50 61  se==0 || (db=pPa
1a420 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c 20 64  rse->db)==0 || d
1a430 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d 3d 30  b->aDb[0].pBt==0
1a440 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1a450 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c   pParse->nErr ||
1a460 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1a470 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  d ) return;.  if
1a480 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
1a490 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
1a4a0 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
1a4b0 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20 29 20  BEGIN", 0, 0) ) 
1a4c0 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d 20 73  return;..  v = s
1a4d0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1a4e0 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20  arse);.  if( !v 
1a4f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1a500 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45  type!=TK_DEFERRE
1a510 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  D ){.    for(i=0
1a520 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1a530 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1a540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a550 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c  _Transaction, i,
1a560 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55   (type==TK_EXCLU
1a570 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20  SIVE)+1);.      
1a580 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
1a590 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20  tree(v, i);.    
1a5a0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  }.  }.  sqlite3V
1a5b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1a5c0 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30  AutoCommit, 0, 0
1a5d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1a5e0 69 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  it a transaction
1a5f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1a600 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f  CommitTransactio
1a610 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1a620 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1a630 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
1a640 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
1a650 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
1a660 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
1a670 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1a680 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1a690 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1a6a0 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1a6b0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( 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 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1a6e0 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22 2c 20  TION, "COMMIT", 
1a6f0 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
1a700 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1a710 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1a720 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1a730 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a740 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1a750 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 0);.  }.}..
1a760 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
1a770 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
1a780 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
1a790 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e 28  backTransaction(
1a7a0 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
1a7b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1a7c0 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69 66 28   Vdbe *v;..  if(
1a7d0 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64   pParse==0 || (d
1a7e0 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30  b=pParse->db)==0
1a7f0 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   || db->aDb[0].p
1a800 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  Bt==0 ) return;.
1a810 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
1a820 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
1a830 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b  Failed ) return;
1a840 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75  .  if( sqlite3Au
1a850 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
1a860 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49  SQLITE_TRANSACTI
1a870 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20  ON, "ROLLBACK", 
1a880 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e 3b 0a  0, 0) ) return;.
1a890 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1a8a0 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1a8b0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71   if( v ){.    sq
1a8c0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1a8d0 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74  v, OP_AutoCommit
1a8e0 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 0a  , 1, 1);.  }.}..
1a8f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1a900 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
1a910 20 74 68 65 20 70 61 72 73 65 72 20 77 68 65 6e   the parser when
1a920 20 69 74 20 70 61 72 73 65 73 20 61 20 63 6f 6d   it parses a com
1a930 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65 2c 0a  mand to create,.
1a940 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f  ** release or ro
1a950 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20 73 61  llback an SQL sa
1a960 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76 6f 69  vepoint. .*/.voi
1a970 64 20 73 71 6c 69 74 65 33 53 61 76 65 70 6f 69  d sqlite3Savepoi
1a980 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  nt(Parse *pParse
1a990 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65 6e 20  , int op, Token 
1a9a0 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  *pName){.  char 
1a9b0 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  *zName = sqlite3
1a9c0 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50  NameFromToken(pP
1a9d0 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d 65 29  arse->db, pName)
1a9e0 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
1a9f0 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73  .    Vdbe *v = s
1aa00 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
1aa10 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66 20 53  arse);.#ifndef S
1aa20 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
1aa30 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73 74 61  RIZATION.    sta
1aa40 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
1aa50 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22  az[] = { "BEGIN"
1aa60 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f  , "RELEASE", "RO
1aa70 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61  LLBACK" };.    a
1aa80 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e  ssert( !SAVEPOIN
1aa90 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50  T_BEGIN && SAVEP
1aaa0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20  OINT_RELEASE==1 
1aab0 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  && SAVEPOINT_ROL
1aac0 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64  LBACK==2 );.#end
1aad0 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c  if.    if( !v ||
1aae0 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
1aaf0 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
1ab00 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f  _SAVEPOINT, az[o
1ab10 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b  p], zName, 0) ){
1ab20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
1ab30 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
1ab40 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
1ab50 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
1ab60 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1ab70 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69  p4(v, OP_Savepoi
1ab80 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e  nt, op, 0, 0, zN
1ab90 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ame, P4_DYNAMIC)
1aba0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
1abb0 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
1abc0 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
1abd0 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
1abe0 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
1abf0 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
1ac00 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
1ac10 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
1ac20 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
1ac30 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
1ac40 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e  .int sqlite3Open
1ac50 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72  TempDatabase(Par
1ac60 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
1ac70 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
1ac80 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
1ac90 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
1aca0 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
1acb0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
1acc0 72 63 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  rc;.    static c
1acd0 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
1ace0 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
1acf0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1ad00 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
1ad10 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1ad20 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
1ad30 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1ad40 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  VE |.          S
1ad50 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
1ad60 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
1ad70 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1ad80 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72  _TEMP_DB;..    r
1ad90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1ada0 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c 20 30  Factory(db, 0, 0
1adb0 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  , SQLITE_DEFAULT
1adc0 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 66 6c 61  _CACHE_SIZE, fla
1add0 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gs,.            
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1adf0 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b 31 5d       &db->aDb[1]
1ae00 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 72  .pBt);.    if( r
1ae10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ae20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
1ae30 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
1ae40 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
1ae50 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
1ae60 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
1ae70 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
1ae80 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
1ae90 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
1aea0 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
1aeb0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1aec0 20 20 20 20 61 73 73 65 72 74 28 20 28 64 62 2d      assert( (db-
1aed0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
1aee0 49 6e 54 72 61 6e 73 29 3d 3d 30 20 7c 7c 20 64  InTrans)==0 || d
1aef0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 3b  b->autoCommit );
1af00 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
1af10 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
1af20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1af30 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 73  gerJournalMode(s
1af40 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1af50 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 29  (db->aDb[1].pBt)
1af60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1af70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62                db
1af80 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d 6f 64  ->dfltJournalMod
1af90 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
1afa0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
1afb0 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20  erate VDBE code 
1afc0 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69 66 79  that will verify
1afd0 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b   the schema cook
1afe0 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a 2a 20  ie and start.** 
1aff0 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
1b000 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d 65 64  on for all named
1b010 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
1b020 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6d 70  .**.** It is imp
1b030 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c 6c 20  ortant that all 
1b040 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73 20 62  schema cookies b
1b050 65 20 76 65 72 69 66 69 65 64 20 61 6e 64 20 61  e verified and a
1b060 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61 6e 73  ll.** read trans
1b070 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61 72 74  actions be start
1b080 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74 68 69  ed before anythi
1b090 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e 73 20  ng else happens 
1b0a0 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 70  in.** the VDBE p
1b0b0 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74 68 69  rogram.  But thi
1b0c0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1b0d0 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 6d 75   called after mu
1b0e0 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f 64 65  ch other.** code
1b0f0 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65 72 61   has been genera
1b100 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20 69 73  ted.  So here is
1b110 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a 2a 0a   what we do:.**.
1b120 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
1b130 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1b140 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63 6f 64  s called, we cod
1b150 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74 68 61  e an OP_Goto tha
1b160 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70 20 74  t.** will jump t
1b170 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61  o a subroutine a
1b180 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
1b190 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65 6e 20   program.  Then 
1b1a0 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65 76 65  we.** record eve
1b1b0 72 79 20 64 61 74 61 62 61 73 65 20 74 68 61 74  ry database that
1b1c0 20 6e 65 65 64 73 20 69 74 73 20 73 63 68 65 6d   needs its schem
1b1d0 61 20 76 65 72 69 66 69 65 64 20 69 6e 20 74 68  a verified in th
1b1e0 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e.** pParse->coo
1b1f0 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e 20 20  kieMask field.  
1b200 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61 6c 6c  Later, after all
1b210 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61 73 20   other code has 
1b220 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61 74 65  been.** generate
1b230 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74 69 6e  d, the subroutin
1b240 65 20 74 68 61 74 20 64 6f 65 73 20 74 68 65 20  e that does the 
1b250 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63 61 74  cookie verificat
1b260 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74 61 72  ions and.** star
1b270 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
1b280 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 64 65  ons will be code
1b290 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47 6f 74  d and the OP_Got
1b2a0 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20 77 69  o P2 value.** wi
1b2b0 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 70 6f  ll be made to po
1b2c0 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75 62 72  int to that subr
1b2d0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67 65 6e  outine.  The gen
1b2e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a  eration of the.*
1b2f0 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  * cookie verific
1b300 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69 6e 65  ation subroutine
1b310 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20 69 6e   code happens in
1b320 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43 6f   sqlite3FinishCo
1b330 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ding()..**.** If
1b340 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f 64 65   iDb<0 then code
1b350 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f 6e 6c   the OP_Goto onl
1b360 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20 66 6c  y - don't set fl
1b370 61 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 65  ag to verify the
1b380 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20 61 6e  .** schema on an
1b390 79 20 64 61 74 61 62 61 73 65 73 2e 20 20 54 68  y databases.  Th
1b3a0 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
1b3b0 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 4f  o position the O
1b3c0 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c 79 20  P_Goto.** early 
1b3d0 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62 65 66  in the code, bef
1b3e0 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66 20 61  ore we know if a
1b3f0 6e 79 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  ny database tabl
1b400 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2e  es will be used.
1b410 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b420 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1b430 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b440 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71 6c 69  int iDb){.  sqli
1b450 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20  te3 *db;.  Vdbe 
1b460 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  *v;.  int mask;.
1b470 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
1b480 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
1b490 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
1b4a0 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f 6e 6c  rn;  /* This onl
1b4b0 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
1b4c0 72 65 20 77 61 73 20 61 20 70 72 69 6f 72 20 65  re was a prior e
1b4d0 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d 20 70  rror */.  db = p
1b4e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1b4f0 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1b500 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  oto==0 ){.    pP
1b510 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f 74 6f  arse->cookieGoto
1b520 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1b530 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
1b540 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a 20 20   0, 0)+1;.  }.  
1b550 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a 20 20  if( iDb>=0 ){.  
1b560 20 20 61 73 73 65 72 74 28 20 69 44 62 3c 64 62    assert( iDb<db
1b570 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61 73 73  ->nDb );.    ass
1b580 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 44 62  ert( db->aDb[iDb
1b590 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44 62 3d  ].pBt!=0 || iDb=
1b5a0 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =1 );.    assert
1b5b0 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d 41 58  ( iDb<SQLITE_MAX
1b5c0 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b 0a 20  _ATTACHED+2 );. 
1b5d0 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69 44 62     mask = 1<<iDb
1b5e0 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61 72 73  ;.    if( (pPars
1b5f0 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20 26 20  e->cookieMask & 
1b600 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1b610 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65    pParse->cookie
1b620 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1b630 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
1b640 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d 20 64  ieValue[iDb] = d
1b650 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
1b660 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f 6b  ema->schema_cook
1b670 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20 21 4f  ie;.      if( !O
1b680 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
1b690 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  b==1 ){.        
1b6a0 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44  sqlite3OpenTempD
1b6b0 61 74 61 62 61 73 65 28 70 50 61 72 73 65 29 3b  atabase(pParse);
1b6c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b6d0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
1b6e0 72 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74  rate VDBE code t
1b6f0 68 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72  hat prepares for
1b700 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74   doing an operat
1b710 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68  ion that.** migh
1b720 74 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74  t change the dat
1b730 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abase..**.** Thi
1b740 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73  s routine starts
1b750 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
1b760 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74  on if we are not
1b770 20 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a   already within.
1b780 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
1b790 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72  .  If we are alr
1b7a0 65 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72  eady within a tr
1b7b0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1b7c0 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  a checkpoint.** 
1b7d0 69 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65  is set if the se
1b7e0 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d  tStatement param
1b7f0 65 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41  eter is true.  A
1b800 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75   checkpoint shou
1b810 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72  ld.** be set for
1b820 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74   operations that
1b830 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65   might fail (due
1b840 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   to a constraint
1b850 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  ) part of.** the
1b860 20 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64   way through and
1b870 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64   which will need
1b880 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72   to undo some wr
1b890 69 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76  ites without hav
1b8a0 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61  ing to.** rollba
1b8b0 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61  ck the whole tra
1b8c0 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f  nsaction.  For o
1b8d0 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20  perations where 
1b8e0 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
1b8f0 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65  ** can be checke
1b900 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  d before any cha
1b910 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f  nges are made to
1b920 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69   the database, i
1b930 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65  t is never.** ne
1b940 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20  cessary to undo 
1b950 61 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20  a write and the 
1b960 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
1b970 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f  d not be set..*/
1b980 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
1b990 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e  inWriteOperation
1b9a0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1b9b0 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74  int setStatement
1b9c0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64  , int iDb){.  Vd
1b9d0 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
1b9e0 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
1b9f0 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
1ba00 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f  urn;.  sqlite3Co
1ba10 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
1ba20 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 70  Parse, iDb);.  p
1ba30 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61 73 6b  Parse->writeMask
1ba40 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20 69 66   |= 1<<iDb;.  if
1ba50 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74 20 26  ( setStatement &
1ba60 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  & pParse->nested
1ba70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1ba80 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1ba90 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20 69 44  OP_Statement, iD
1baa0 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  b);.  }.}../*.**
1bab0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1bac0 20 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65   pIndex uses the
1bad0 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1bae0 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75  nce pColl.  Retu
1baf0 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74  rn.** true if it
1bb00 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20   does and false 
1bb10 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
1bb20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1bb30 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73  E_OMIT_REINDEX.s
1bb40 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74  tatic int collat
1bb50 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63  ionMatch(const c
1bb60 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65  har *zColl, Inde
1bb70 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e  x *pIndex){.  in
1bb80 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1bb90 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d  i<pIndex->nColum
1bba0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e  n; i++){.    con
1bbb0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49 6e  st char *z = pIn
1bbc0 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  dex->azColl[i];.
1bbd0 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f 6c 6c      if( z==zColl
1bbe0 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c 6c 20   || (z && zColl 
1bbf0 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  && 0==sqlite3Str
1bc00 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 29 20  ICmp(z, zColl)) 
1bc10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1bc20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1bc30 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1bc40 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
1bc50 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
1bc60 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
1bc70 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
1bc80 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
1bc90 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
1bca0 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
1bcb0 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
1bcc0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
1bcd0 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
1bce0 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
1bcf0 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
1bd00 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
1bd10 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
1bd20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
1bd30 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
1bd40 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1bd50 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
1bd60 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
1bd70 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
1bd80 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
1bd90 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
1bda0 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
1bdb0 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
1bdc0 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
1bdd0 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
1bde0 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
1bdf0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
1be00 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
1be10 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
1be20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1be30 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1be40 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
1be50 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
1be60 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
1be70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
1be80 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
1be90 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
1bea0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
1beb0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
1bec0 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
1bed0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
1bee0 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
1bef0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
1bf00 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
1bf10 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
1bf20 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
1bf30 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
1bf40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bf50 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
1bf60 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
1bf70 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
1bf80 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
1bf90 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
1bfa0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1bfb0 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
1bfc0 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1bfd0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
1bfe0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bff0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
1c000 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
1c010 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1c020 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
1c030 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1c040 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
1c050 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
1c060 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1c070 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
1c080 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
1c090 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
1c0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
1c0b0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
1c0c0 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44  ase */..  for(iD
1c0d0 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62  b=0, pDb=db->aDb
1c0e0 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
1c0f0 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20  Db++, pDb++){.  
1c100 20 20 61 73 73 65 72 74 28 20 70 44 62 21 3d 30    assert( pDb!=0
1c110 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71   );.    for(k=sq
1c120 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70  liteHashFirst(&p
1c130 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c  Db->pSchema->tbl
1c140 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c  Hash);  k; k=sql
1c150 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b  iteHashNext(k)){
1c160 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54  .      pTab = (T
1c170 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68  able*)sqliteHash
1c180 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 72  Data(k);.      r
1c190 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
1c1a0 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29  se, pTab, zColl)
1c1b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
1c1c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
1c1d0 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
1c1e0 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e  e REINDEX comman
1c1f0 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  d..**.**        
1c200 52 45 49 4e 44 45 58 20 20 20 20 20 20 20 20 20  REINDEX         
1c210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c220 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20     -- 1.**      
1c230 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c    REINDEX  <coll
1c240 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20 20 20  ation>          
1c250 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20       -- 2.**    
1c260 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64      REINDEX  ?<d
1c270 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65  atabase>.?<table
1c280 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20  name>  -- 3.**  
1c290 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1c2a0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64  <database>.?<ind
1c2b0 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a  exname>  -- 4.**
1c2c0 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75 73 65  .** Form 1 cause
1c2d0 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e  s all indices in
1c2e0 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
1c2f0 74 61 62 61 73 65 73 20 74 6f 20 62 65 20 72 65  tabases to be re
1c300 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32  built..** Form 2
1c310 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e   rebuilds all in
1c320 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  dices in all dat
1c330 61 62 61 73 65 73 20 74 68 61 74 20 75 73 65 20  abases that use 
1c340 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c  the named.** col
1c350 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e  lating function.
1c360 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20 34 20    Forms 3 and 4 
1c370 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61 6d 65  rebuild the name
1c380 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a  d index or all.*
1c390 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69  * indices associ
1c3a0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
1c3b0 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69  med table..*/.#i
1c3c0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c3d0 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64 20 73  T_REINDEX.void s
1c3e0 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28 50 61  qlite3Reindex(Pa
1c3f0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
1c400 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65  en *pName1, Toke
1c410 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f  n *pName2){.  Co
1c420 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
1c430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
1c440 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
1c450 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 2c  to be reindexed,
1c460 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68   or NULL */.  ch
1c470 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
1c480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1c490 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  e of a table or 
1c4a0 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74  index */.  const
1c4b0 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20   char *zDb;     
1c4c0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1c4d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  f the database *
1c4e0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b  /.  Table *pTab;
1c4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c500 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68  /* A table in th
1c510 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
1c520 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20  Index *pIndex;  
1c530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1c540 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74  n index associat
1c550 65 64 20 77 69 74 68 20 70 54 61 62 20 2a 2f 0a  ed with pTab */.
1c560 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c580 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1c590 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1c5a0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1c5b0 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1c5c0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1c5d0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ection */.  Toke
1c5e0 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20  n *pObjName;    
1c5f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1c600 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1c610 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65 69 6e  index to be rein
1c620 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52  dexed */..  /* R
1c630 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1c640 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65   schema. If an e
1c650 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
1c660 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
1c670 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64  age.  ** and cod
1c680 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  e in pParse and 
1c690 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a  return NULL. */.
1c6a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
1c6b0 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65  =sqlite3ReadSche
1c6c0 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20  ma(pParse) ){.  
1c6d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
1c6e0 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30 20 7c   if( pName1==0 |
1c6f0 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30 20 29  | pName1->z==0 )
1c700 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44 61 74  {.    reindexDat
1c710 61 62 61 73 65 73 28 70 50 61 72 73 65 2c 20 30  abases(pParse, 0
1c720 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1c730 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61 6d 65   }else if( pName
1c740 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  2==0 || pName2->
1c750 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
1c760 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
1c770 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
1c780 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
1c790 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1c7a0 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
1c7b0 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
1c7c0 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
1c7d0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
1c7e0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
1c7f0 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
1c800 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  ll, -1, 0);.    
1c810 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1c820 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29 7b 0a     if( zColl ){.
1c830 20 20 20 20 20 20 20 20 72 65 69 6e 64 65 78 44          reindexD
1c840 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1c850 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20   zColl);.       
1c860 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1c870 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  b, zColl);.     
1c880 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b   }.      return;
1c890 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1c8a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f  e3DbFree(db, zCo
1c8b0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d  ll);.  }.  iDb =
1c8c0 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e   sqlite3TwoPartN
1c8d0 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d  ame(pParse, pNam
1c8e0 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62  e1, pName2, &pOb
1c8f0 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69 44  jName);.  if( iD
1c900 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
1c910 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
1c920 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62  romToken(db, pOb
1c930 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  jName);.  if( z=
1c940 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a  =0 ) return;.  z
1c950 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
1c960 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20  ].zName;.  pTab 
1c970 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  = sqlite3FindTab
1c980 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a  le(db, z, zDb);.
1c990 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
1c9a0 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70    reindexTable(p
1c9b0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29 3b  Parse, pTab, 0);
1c9c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1c9d0 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72  ee(db, z);.    r
1c9e0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e  eturn;.  }.  pIn
1c9f0 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  dex = sqlite3Fin
1ca00 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44  dIndex(db, z, zD
1ca10 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  b);.  sqlite3DbF
1ca20 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66  ree(db, z);.  if
1ca30 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20  ( pIndex ){.    
1ca40 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1ca50 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1ca60 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 0, iDb);.    
1ca70 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
1ca80 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
1ca90 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  x, -1);.    retu
1caa0 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  rn;.  }.  sqlite
1cab0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1cac0 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64 65  , "unable to ide
1cad0 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63 74  ntify the object
1cae0 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64   to be reindexed
1caf0 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ");.}.#endif../*
1cb00 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64 79 6e  .** Return a dyn
1cb10 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74 65 64  amicly allocated
1cb20 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1cb30 72 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  re that can be u
1cb40 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50 5f 4f  sed.** with OP_O
1cb50 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f 4f 70  penRead or OP_Op
1cb60 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63 65 73  enWrite to acces
1cb70 73 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  s database index
1cb80 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pIdx..**.** If 
1cb90 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20 70 6f  successful, a po
1cba0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
1cbb0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
1cbc0 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
1cbd0 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61 6c 6c  case.** the call
1cbe0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1cbf0 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20 73 71  e for calling sq
1cc00 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1cc10 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65  ) on the returne
1cc20 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 20 49  d .** pointer. I
1cc30 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1cc40 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  s (out of memory
1cc50 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f 6c 6c   or missing coll
1cc60 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75 65 6e  ation .** sequen
1cc70 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74  ce), NULL is ret
1cc80 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 73 74  urned and the st
1cc90 61 74 65 20 6f 66 20 70 50 61 72 73 65 20 75 70  ate of pParse up
1cca0 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65 63 74  dated to reflect
1ccb0 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 0a 2a  .** the error..*
1ccc0 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74  /.KeyInfo *sqlit
1ccd0 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 50  e3IndexKeyinfo(P
1cce0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
1ccf0 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e  dex *pIdx){.  in
1cd00 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  t i;.  int nCol 
1cd10 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
1cd20 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20 3d 20  .  int nBytes = 
1cd30 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f 29 20  sizeof(KeyInfo) 
1cd40 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
1cd50 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20 6e 43  f(CollSeq*) + nC
1cd60 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ol;.  sqlite3 *d
1cd70 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
1cd80 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20    KeyInfo *pKey 
1cd90 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73 71 6c  = (KeyInfo *)sql
1cda0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
1cdb0 28 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a 0a 20  (db, nBytes);.. 
1cdc0 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1cdd0 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50 61 72   pKey->db = pPar
1cde0 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b 65 79  se->db;.    pKey
1cdf0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28  ->aSortOrder = (
1ce00 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61 43 6f  u8 *)&(pKey->aCo
1ce10 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20 20 61  ll[nCol]);.    a
1ce20 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e 61 53  ssert( &pKey->aS
1ce30 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d 3d 3d  ortOrder[nCol]==
1ce40 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29 5b 6e  &(((u8 *)pKey)[n
1ce50 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20 20 66  Bytes]) );.    f
1ce60 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
1ce70 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
1ce80 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e   *zColl = pIdx->
1ce90 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20  azColl[i];.     
1cea0 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 20 29   assert( zColl )
1ceb0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 43  ;.      pKey->aC
1cec0 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1ced0 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
1cee0 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d 31 29  arse, zColl, -1)
1cef0 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e 61 53  ;.      pKey->aS
1cf00 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20 70 49  ortOrder[i] = pI
1cf10 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
1cf20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65  ];.    }.    pKe
1cf30 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75 31 36  y->nField = (u16
1cf40 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66  )nCol;.  }..  if
1cf50 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29  ( pParse->nErr )
1cf60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
1cf70 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b 0a 20  ree(db, pKey);. 
1cf80 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     pKey = 0;.  }
1cf90 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b 0a  .  return pKey;.
1cfa0 7d 0a                                            }.