/ Hex Artifact Content
Login

Artifact a079f965feea2d0b469b293e09cd0ac41be1272f:


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 33 20 32 30 30 39 2f 30 35 2f 30 31  1.533 2009/05/01
02f0: 20 32 31 3a 31 33 3a 33 37 20 64 72 68 20 45 78   21:13:37 drh Ex
0300: 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  p $.*/.#include 
0310: 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f  "sqliteInt.h"../
0320: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0330: 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
0340: 20 61 20 6e 65 77 20 53 51 4c 20 73 74 61 74 65   a new SQL state
0350: 6d 65 6e 74 20 69 73 20 62 65 67 69 6e 6e 69 6e  ment is beginnin
0360: 67 20 74 6f 0a 2a 2a 20 62 65 20 70 61 72 73 65  g to.** be parse
0370: 64 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  d.  Initialize t
0380: 68 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74  he pParse struct
0390: 75 72 65 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ure as needed..*
03a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65  /.void sqlite3Be
03b0: 67 69 6e 50 61 72 73 65 28 50 61 72 73 65 20 2a  ginParse(Parse *
03c0: 70 50 61 72 73 65 2c 20 69 6e 74 20 65 78 70 6c  pParse, int expl
03d0: 61 69 6e 46 6c 61 67 29 7b 0a 20 20 70 50 61 72  ainFlag){.  pPar
03e0: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 28 75  se->explain = (u
03f0: 38 29 65 78 70 6c 61 69 6e 46 6c 61 67 3b 0a 20  8)explainFlag;. 
0400: 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 3d 20   pParse->nVar = 
0410: 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  0;.}..#ifndef SQ
0420: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0430: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0440: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0450: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0460: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0470: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0480: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0490: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
04a0: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
04b0: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
04d0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
04e0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
04f0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
0500: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
0510: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
0520: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0530: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0540: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0550: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0560: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0570: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0580: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0590: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
05a0: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
05b0: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
05c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
05d0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
05e0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
05f0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
0600: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
0610: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
0620: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0630: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0640: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0650: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0660: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0670: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0680: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0690: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
06a0: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
06b0: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
06c0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
06d0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
06e0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
06f0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
0700: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
0710: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
0720: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0730: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0740: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0750: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0760: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0770: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0780: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0790: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
07a0: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
07b0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
07c0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
07d0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
07e0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
07f0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
0800: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
0810: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
0820: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0830: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0840: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0850: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0860: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0870: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0880: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0890: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
08a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
08b0: 42 79 74 65 73 3b 0a 20 20 54 61 62 6c 65 4c 6f  Bytes;.  TableLo
08c0: 63 6b 20 2a 70 3b 0a 0a 20 20 69 66 28 20 69 44  ck *p;..  if( iD
08d0: 62 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  b<0 ){.    retur
08e0: 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  n;.  }..  for(i=
08f0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61  0; i<pParse->nTa
0900: 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20  bleLock; i++){. 
0910: 20 20 20 70 20 3d 20 26 70 50 61 72 73 65 2d 3e     p = &pParse->
0920: 61 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20  aTableLock[i];. 
0930: 20 20 20 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69     if( p->iDb==i
0940: 44 62 20 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69  Db && p->iTab==i
0950: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Tab ){.      p->
0960: 69 73 57 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70  isWriteLock = (p
0970: 2d 3e 69 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c  ->isWriteLock ||
0980: 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20   isWriteLock);. 
0990: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
09a0: 20 7d 0a 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73   }.  }..  nBytes
09b0: 20 3d 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c   = sizeof(TableL
09c0: 6f 63 6b 29 20 2a 20 28 70 50 61 72 73 65 2d 3e  ock) * (pParse->
09d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
09e0: 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c   pParse->aTableL
09f0: 6f 63 6b 20 3d 20 0a 20 20 20 20 20 20 73 71 6c  ock = .      sql
0a00: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46  ite3DbReallocOrF
0a10: 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
0a20: 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65 4c 6f  pParse->aTableLo
0a30: 63 6b 2c 20 6e 42 79 74 65 73 29 3b 0a 20 20 69  ck, nBytes);.  i
0a40: 66 28 20 70 50 61 72 73 65 2d 3e 61 54 61 62 6c  f( pParse->aTabl
0a50: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 20 3d  eLock ){.    p =
0a60: 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65   &pParse->aTable
0a70: 4c 6f 63 6b 5b 70 50 61 72 73 65 2d 3e 6e 54 61  Lock[pParse->nTa
0a80: 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20 20  bleLock++];.    
0a90: 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20 20  p->iDb = iDb;.  
0aa0: 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61 62    p->iTab = iTab
0ab0: 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74 65  ;.    p->isWrite
0ac0: 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c 6f  Lock = isWriteLo
0ad0: 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65  ck;.    p->zName
0ae0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73   = zName;.  }els
0af0: 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e{.    pParse->n
0b00: 54 61 62 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  TableLock = 0;. 
0b10: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
0b20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
0b30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
0b40: 64 65 20 61 6e 20 4f 50 5f 54 61 62 6c 65 4c 6f  de an OP_TableLo
0b50: 63 6b 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 66  ck instruction f
0b60: 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 6c 6f  or each table lo
0b70: 63 6b 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  cked by the.** s
0b80: 74 61 74 65 6d 65 6e 74 20 28 63 6f 6e 66 69 67  tatement (config
0b90: 75 72 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  ured by calls to
0ba0: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0bb0: 6b 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  k())..*/.static 
0bc0: 76 6f 69 64 20 63 6f 64 65 54 61 62 6c 65 4c 6f  void codeTableLo
0bd0: 63 6b 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  cks(Parse *pPars
0be0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56  e){.  int i;.  V
0bf0: 64 62 65 20 2a 70 56 64 62 65 3b 20 0a 0a 20 20  dbe *pVdbe; ..  
0c00: 69 66 28 20 30 3d 3d 28 70 56 64 62 65 20 3d 20  if( 0==(pVdbe = 
0c10: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
0c20: 50 61 72 73 65 29 29 20 29 7b 0a 20 20 20 20 72  Parse)) ){.    r
0c30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
0c40: 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d  r(i=0; i<pParse-
0c50: 3e 6e 54 61 62 6c 65 4c 6f 63 6b 3b 20 69 2b 2b  >nTableLock; i++
0c60: 29 7b 0a 20 20 20 20 54 61 62 6c 65 4c 6f 63 6b  ){.    TableLock
0c70: 20 2a 70 20 3d 20 26 70 50 61 72 73 65 2d 3e 61   *p = &pParse->a
0c80: 54 61 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20  TableLock[i];.  
0c90: 20 20 69 6e 74 20 70 31 20 3d 20 70 2d 3e 69 44    int p1 = p->iD
0ca0: 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  b;.    sqlite3Vd
0cb0: 62 65 41 64 64 4f 70 34 28 70 56 64 62 65 2c 20  beAddOp4(pVdbe, 
0cc0: 4f 50 5f 54 61 62 6c 65 4c 6f 63 6b 2c 20 70 31  OP_TableLock, p1
0cd0: 2c 20 70 2d 3e 69 54 61 62 2c 20 70 2d 3e 69 73  , p->iTab, p->is
0ce0: 57 72 69 74 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  WriteLock,.     
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 70 2d 3e 7a 4e 61 6d 65 2c 20 50 34 5f 53 54   p->zName, P4_ST
0d10: 41 54 49 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ATIC);.  }.}.#el
0d20: 73 65 0a 20 20 23 64 65 66 69 6e 65 20 63 6f 64  se.  #define cod
0d30: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 78 29 0a 23  eTableLocks(x).#
0d40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
0d50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
0d60: 6c 65 64 20 61 66 74 65 72 20 61 20 73 69 6e 67  led after a sing
0d70: 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
0d80: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 61 72   has been.** par
0d90: 73 65 64 20 61 6e 64 20 61 20 56 44 42 45 20 70  sed and a VDBE p
0da0: 72 6f 67 72 61 6d 20 74 6f 20 65 78 65 63 75 74  rogram to execut
0db0: 65 20 74 68 61 74 20 73 74 61 74 65 6d 65 6e 74  e that statement
0dc0: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 70 72 65   has been.** pre
0dd0: 70 61 72 65 64 2e 20 20 54 68 69 73 20 72 6f 75  pared.  This rou
0de0: 74 69 6e 65 20 70 75 74 73 20 74 68 65 20 66 69  tine puts the fi
0df0: 6e 69 73 68 69 6e 67 20 74 6f 75 63 68 65 73 20  nishing touches 
0e00: 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 70  on the.** VDBE p
0e10: 72 6f 67 72 61 6d 20 61 6e 64 20 72 65 73 65 74  rogram and reset
0e20: 73 20 74 68 65 20 70 50 61 72 73 65 20 73 74 72  s the pParse str
0e30: 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20 6e  ucture for the n
0e40: 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e 0a 2a 2a  ext.** parse..**
0e50: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
0e60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
0e70: 65 64 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20  ed, it might be 
0e80: 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 2a  the case that.**
0e90: 20 6e 6f 20 56 44 42 45 20 63 6f 64 65 20 77 61   no VDBE code wa
0ea0: 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a  s generated..*/.
0eb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 46 69 6e 69  void sqlite3Fini
0ec0: 73 68 43 6f 64 69 6e 67 28 50 61 72 73 65 20 2a  shCoding(Parse *
0ed0: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74  pParse){.  sqlit
0ee0: 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a  e3 *db;.  Vdbe *
0ef0: 76 3b 0a 0a 20 20 64 62 20 3d 20 70 50 61 72 73  v;..  db = pPars
0f00: 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d  e->db;.  if( db-
0f10: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
0f20: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
0f30: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 29 20 72  arse->nested ) r
0f40: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 61  eturn;.  if( pPa
0f50: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
0f60: 72 6e 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20  rn;..  /* Begin 
0f70: 62 79 20 67 65 6e 65 72 61 74 69 6e 67 20 73 6f  by generating so
0f80: 6d 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63  me termination c
0f90: 6f 64 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ode at the end o
0fa0: 66 20 74 68 65 0a 20 20 2a 2a 20 76 64 62 65 20  f the.  ** vdbe 
0fb0: 70 72 6f 67 72 61 6d 0a 20 20 2a 2f 0a 20 20 76  program.  */.  v
0fc0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
0fd0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
0fe0: 20 76 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   v ){.    sqlite
0ff0: 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1000: 50 5f 48 61 6c 74 29 3b 0a 0a 20 20 20 20 2f 2a  P_Halt);..    /*
1010: 20 54 68 65 20 63 6f 6f 6b 69 65 20 6d 61 73 6b   The cookie mask
1020: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 62 69   contains one bi
1030: 74 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62  t for each datab
1040: 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 2e 0a 20  ase file open.. 
1050: 20 20 20 2a 2a 20 28 42 69 74 20 30 20 69 73 20     ** (Bit 0 is 
1060: 66 6f 72 20 6d 61 69 6e 2c 20 62 69 74 20 31 20  for main, bit 1 
1070: 69 73 20 66 6f 72 20 74 65 6d 70 2c 20 61 6e 64  is for temp, and
1080: 20 73 6f 20 66 6f 72 74 68 2e 29 20 20 42 69 74   so forth.)  Bit
1090: 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 73 65 74  s are.    ** set
10a0: 20 66 6f 72 20 65 61 63 68 20 64 61 74 61 62 61   for each databa
10b0: 73 65 20 74 68 61 74 20 69 73 20 75 73 65 64 2e  se that is used.
10c0: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
10d0: 74 6f 20 73 74 61 72 74 20 61 0a 20 20 20 20 2a  to start a.    *
10e0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  * transaction on
10f0: 20 65 61 63 68 20 75 73 65 64 20 64 61 74 61 62   each used datab
1100: 61 73 65 20 61 6e 64 20 74 6f 20 76 65 72 69 66  ase and to verif
1110: 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f  y the schema coo
1120: 6b 69 65 0a 20 20 20 20 2a 2a 20 6f 6e 20 65 61  kie.    ** on ea
1130: 63 68 20 75 73 65 64 20 64 61 74 61 62 61 73 65  ch used database
1140: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1150: 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47   pParse->cookieG
1160: 6f 74 6f 3e 30 20 29 7b 0a 20 20 20 20 20 20 75  oto>0 ){.      u
1170: 33 32 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 69  32 mask;.      i
1180: 6e 74 20 69 44 62 3b 0a 20 20 20 20 20 20 73 71  nt iDb;.      sq
1190: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
11a0: 65 28 76 2c 20 70 50 61 72 73 65 2d 3e 63 6f 6f  e(v, pParse->coo
11b0: 6b 69 65 47 6f 74 6f 2d 31 29 3b 0a 20 20 20 20  kieGoto-1);.    
11c0: 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 6d 61 73    for(iDb=0, mas
11d0: 6b 3d 31 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  k=1; iDb<db->nDb
11e0: 3b 20 6d 61 73 6b 3c 3c 3d 31 2c 20 69 44 62 2b  ; mask<<=1, iDb+
11f0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
1200: 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65 2d 3e  (mask & pParse->
1210: 63 6f 6f 6b 69 65 4d 61 73 6b 29 3d 3d 30 20 29  cookieMask)==0 )
1220: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1230: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73     sqlite3VdbeUs
1240: 65 73 42 74 72 65 65 28 76 2c 20 69 44 62 29 3b  esBtree(v, iDb);
1250: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1260: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 4f 50 5f  VdbeAddOp2(v,OP_
1270: 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 44 62  Transaction, iDb
1280: 2c 20 28 6d 61 73 6b 20 26 20 70 50 61 72 73 65  , (mask & pParse
1290: 2d 3e 77 72 69 74 65 4d 61 73 6b 29 21 3d 30 29  ->writeMask)!=0)
12a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  ;.        if( db
12b0: 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
12c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
12e0: 4f 50 5f 56 65 72 69 66 79 43 6f 6f 6b 69 65 2c  OP_VerifyCookie,
12f0: 20 69 44 62 2c 20 70 50 61 72 73 65 2d 3e 63 6f   iDb, pParse->co
1300: 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 29 3b  okieValue[iDb]);
1310: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1320: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1330: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1340: 42 4c 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BLE.      {.    
1350: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1360: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
1370: 61 72 73 65 2d 3e 6e 56 74 61 62 4c 6f 63 6b 3b  arse->nVtabLock;
1380: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
1390: 20 63 68 61 72 20 2a 76 74 61 62 20 3d 20 28 63   char *vtab = (c
13a0: 68 61 72 20 2a 29 70 50 61 72 73 65 2d 3e 61 70  har *)pParse->ap
13b0: 56 74 61 62 4c 6f 63 6b 5b 69 5d 2d 3e 70 56 74  VtabLock[i]->pVt
13c0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ab;.          sq
13d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
13e0: 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20 30 2c  v, OP_VBegin, 0,
13f0: 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50 34 5f   0, 0, vtab, P4_
1400: 56 54 41 42 29 3b 0a 20 20 20 20 20 20 20 20 7d  VTAB);.        }
1410: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
1420: 3e 6e 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a  >nVtabLock = 0;.
1430: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1440: 20 20 20 20 20 20 2f 2a 20 4f 6e 63 65 20 61 6c        /* Once al
1450: 6c 20 74 68 65 20 63 6f 6f 6b 69 65 73 20 68 61  l the cookies ha
1460: 76 65 20 62 65 65 6e 20 76 65 72 69 66 69 65 64  ve been verified
1470: 20 61 6e 64 20 74 72 61 6e 73 61 63 74 69 6f 6e   and transaction
1480: 73 20 6f 70 65 6e 65 64 2c 20 0a 20 20 20 20 20  s opened, .     
1490: 20 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 72   ** obtain the r
14a0: 65 71 75 69 72 65 64 20 74 61 62 6c 65 2d 6c 6f  equired table-lo
14b0: 63 6b 73 2e 20 54 68 69 73 20 69 73 20 61 20 6e  cks. This is a n
14c0: 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 74 68 65 20  o-op unless the 
14d0: 0a 20 20 20 20 20 20 2a 2a 20 73 68 61 72 65 64  .      ** shared
14e0: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 69  -cache feature i
14f0: 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20 20  s enabled..     
1500: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 54 61   */.      codeTa
1510: 62 6c 65 4c 6f 63 6b 73 28 70 50 61 72 73 65 29  bleLocks(pParse)
1520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1530: 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1540: 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d  Goto, 0, pParse-
1550: 3e 63 6f 6f 6b 69 65 47 6f 74 6f 29 3b 0a 20 20  >cookieGoto);.  
1560: 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 47    }.  }...  /* G
1570: 65 74 20 74 68 65 20 56 44 42 45 20 70 72 6f 67  et the VDBE prog
1580: 72 61 6d 20 72 65 61 64 79 20 66 6f 72 20 65 78  ram ready for ex
1590: 65 63 75 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 69  ecution.  */.  i
15a0: 66 28 20 76 20 26 26 20 70 50 61 72 73 65 2d 3e  f( v && pParse->
15b0: 6e 45 72 72 3d 3d 30 20 26 26 20 21 64 62 2d 3e  nErr==0 && !db->
15c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
15d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
15e0: 42 55 47 0a 20 20 20 20 46 49 4c 45 20 2a 74 72  BUG.    FILE *tr
15f0: 61 63 65 20 3d 20 28 64 62 2d 3e 66 6c 61 67 73  ace = (db->flags
1600: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 54 72   & SQLITE_VdbeTr
1610: 61 63 65 29 21 3d 30 20 3f 20 73 74 64 6f 75 74  ace)!=0 ? stdout
1620: 20 3a 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   : 0;.    sqlite
1630: 33 56 64 62 65 54 72 61 63 65 28 76 2c 20 74 72  3VdbeTrace(v, tr
1640: 61 63 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ace);.#endif.   
1650: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
1660: 3e 69 43 61 63 68 65 4c 65 76 65 6c 3d 3d 30 20  >iCacheLevel==0 
1670: 29 3b 20 20 2f 2a 20 44 69 73 61 62 6c 65 73 20  );  /* Disables 
1680: 61 6e 64 20 72 65 2d 65 6e 61 62 6c 65 73 20 6d  and re-enables m
1690: 61 74 63 68 20 2a 2f 0a 20 20 20 20 73 71 6c 69  atch */.    sqli
16a0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79  te3VdbeMakeReady
16b0: 28 76 2c 20 70 50 61 72 73 65 2d 3e 6e 56 61 72  (v, pParse->nVar
16c0: 2c 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2c 0a  , pParse->nMem,.
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
16f0: 3e 6e 54 61 62 2c 20 70 50 61 72 73 65 2d 3e 65  >nTab, pParse->e
1700: 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 70 50 61  xplain);.    pPa
1710: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1720: 5f 44 4f 4e 45 3b 0a 20 20 20 20 70 50 61 72 73  _DONE;.    pPars
1730: 65 2d 3e 63 6f 6c 4e 61 6d 65 73 53 65 74 20 3d  e->colNamesSet =
1740: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
1750: 70 50 61 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49  pParse->rc==SQLI
1760: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
1770: 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45  rse->rc = SQLITE
1780: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 50  _ERROR;.  }.  pP
1790: 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a  arse->nTab = 0;.
17a0: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d    pParse->nMem =
17b0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 53   0;.  pParse->nS
17c0: 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65  et = 0;.  pParse
17d0: 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20 70 50  ->nVar = 0;.  pP
17e0: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
17f0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1800: 63 6f 6f 6b 69 65 47 6f 74 6f 20 3d 20 30 3b 0a  cookieGoto = 0;.
1810: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 74 68 65  }../*.** Run the
1820: 20 70 61 72 73 65 72 20 61 6e 64 20 63 6f 64 65   parser and code
1830: 20 67 65 6e 65 72 61 74 6f 72 20 72 65 63 75 72   generator recur
1840: 73 69 76 65 6c 79 20 69 6e 20 6f 72 64 65 72 20  sively in order 
1850: 74 6f 20 67 65 6e 65 72 61 74 65 0a 2a 2a 20 63  to generate.** c
1860: 6f 64 65 20 66 6f 72 20 74 68 65 20 53 51 4c 20  ode for the SQL 
1870: 73 74 61 74 65 6d 65 6e 74 20 67 69 76 65 6e 20  statement given 
1880: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
1890: 74 68 65 20 70 50 61 72 73 65 20 63 6f 6e 74 65  the pParse conte
18a0: 78 74 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  xt.** currently 
18b0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
18c0: 6f 6e 2e 20 20 57 68 65 6e 20 74 68 65 20 70 61  on.  When the pa
18d0: 72 73 65 72 20 69 73 20 72 75 6e 20 72 65 63 75  rser is run recu
18e0: 72 73 69 76 65 6c 79 0a 2a 2a 20 74 68 69 73 20  rsively.** this 
18f0: 77 61 79 2c 20 74 68 65 20 66 69 6e 61 6c 20 4f  way, the final O
1900: 50 5f 48 61 6c 74 20 69 73 20 6e 6f 74 20 61 70  P_Halt is not ap
1910: 70 65 6e 64 65 64 20 61 6e 64 20 6f 74 68 65 72  pended and other
1920: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   initialization.
1930: 2a 2a 20 61 6e 64 20 66 69 6e 61 6c 69 7a 61 74  ** and finalizat
1940: 69 6f 6e 20 73 74 65 70 73 20 61 72 65 20 6f 6d  ion steps are om
1950: 69 74 74 65 64 20 62 65 63 61 75 73 65 20 74 68  itted because th
1960: 6f 73 65 20 61 72 65 20 68 61 6e 64 6c 69 6e 67  ose are handling
1970: 20 62 79 20 74 68 65 0a 2a 2a 20 6f 75 74 65 72   by the.** outer
1980: 6d 6f 73 74 20 70 61 72 73 65 72 2e 0a 2a 2a 0a  most parser..**.
1990: 2a 2a 20 4e 6f 74 20 65 76 65 72 79 74 68 69 6e  ** Not everythin
19a0: 67 20 69 73 20 6e 65 73 74 61 62 6c 65 2e 20 20  g is nestable.  
19b0: 54 68 69 73 20 66 61 63 69 6c 69 74 79 20 69 73  This facility is
19c0: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 70 65 72   designed to per
19d0: 6d 69 74 0a 2a 2a 20 49 4e 53 45 52 54 2c 20 55  mit.** INSERT, U
19e0: 50 44 41 54 45 2c 20 61 6e 64 20 44 45 4c 45 54  PDATE, and DELET
19f0: 45 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 67 61  E operations aga
1a00: 69 6e 73 74 20 53 51 4c 49 54 45 5f 4d 41 53 54  inst SQLITE_MAST
1a10: 45 52 2e 20 20 55 73 65 0a 2a 2a 20 63 61 72 65  ER.  Use.** care
1a20: 20 69 66 20 79 6f 75 20 64 65 63 69 64 65 20 74   if you decide t
1a30: 6f 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 69  o try to use thi
1a40: 73 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 6f  s routine for so
1a50: 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
1a60: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
1a70: 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 50 61  e3NestedParse(Pa
1a80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
1a90: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1aa0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1ab0: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1ac0: 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1ad0: 4d 73 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Msg = 0;.  sqlit
1ae0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1af0: 3e 64 62 3b 0a 23 20 64 65 66 69 6e 65 20 53 41  >db;.# define SA
1b00: 56 45 5f 53 5a 20 20 28 73 69 7a 65 6f 66 28 50  VE_SZ  (sizeof(P
1b10: 61 72 73 65 29 20 2d 20 6f 66 66 73 65 74 6f 66  arse) - offsetof
1b20: 28 50 61 72 73 65 2c 6e 56 61 72 29 29 0a 20 20  (Parse,nVar)).  
1b30: 63 68 61 72 20 73 61 76 65 42 75 66 5b 53 41 56  char saveBuf[SAV
1b40: 45 5f 53 5a 5d 3b 0a 0a 20 20 69 66 28 20 70 50  E_SZ];..  if( pP
1b50: 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74  arse->nErr ) ret
1b60: 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  urn;.  assert( p
1b70: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3c 31 30  Parse->nested<10
1b80: 20 29 3b 20 20 2f 2a 20 4e 65 73 74 69 6e 67 20   );  /* Nesting 
1b90: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 6f  should only be o
1ba0: 66 20 6c 69 6d 69 74 65 64 20 64 65 70 74 68 20  f limited depth 
1bb0: 2a 2f 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  */.  va_start(ap
1bc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53  , zFormat);.  zS
1bd0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  ql = sqlite3VMPr
1be0: 69 6e 74 66 28 64 62 2c 20 7a 46 6f 72 6d 61 74  intf(db, zFormat
1bf0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
1c00: 61 70 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  ap);.  if( zSql=
1c10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1c20: 3b 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 20  ;   /* A malloc 
1c30: 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1c40: 20 2a 2f 0a 20 20 7d 0a 20 20 70 50 61 72 73 65   */.  }.  pParse
1c50: 2d 3e 6e 65 73 74 65 64 2b 2b 3b 0a 20 20 6d 65  ->nested++;.  me
1c60: 6d 63 70 79 28 73 61 76 65 42 75 66 2c 20 26 70  mcpy(saveBuf, &p
1c70: 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 53 41 56  Parse->nVar, SAV
1c80: 45 5f 53 5a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  E_SZ);.  memset(
1c90: 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20 30  &pParse->nVar, 0
1ca0: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 73 71  , SAVE_SZ);.  sq
1cb0: 6c 69 74 65 33 52 75 6e 50 61 72 73 65 72 28 70  lite3RunParser(p
1cc0: 50 61 72 73 65 2c 20 7a 53 71 6c 2c 20 26 7a 45  Parse, zSql, &zE
1cd0: 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
1ce0: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
1cf0: 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  Msg);.  sqlite3D
1d00: 62 46 72 65 65 28 64 62 2c 20 7a 53 71 6c 29 3b  bFree(db, zSql);
1d10: 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 72 73  .  memcpy(&pPars
1d20: 65 2d 3e 6e 56 61 72 2c 20 73 61 76 65 42 75 66  e->nVar, saveBuf
1d30: 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20 70 50  , SAVE_SZ);.  pP
1d40: 61 72 73 65 2d 3e 6e 65 73 74 65 64 2d 2d 3b 0a  arse->nested--;.
1d50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
1d60: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
1d70: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
1d80: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
1d90: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
1da0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
1db0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
1dc0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
1dd0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
1de0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
1df0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
1e00: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
1e10: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1e20: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
1e30: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
1e40: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
1e50: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
1e60: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
1e70: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
1e80: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
1e90: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
1ea0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
1eb0: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
1ec0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
1ed0: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
1ee0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
1ef0: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
1f00: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
1f10: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
1f20: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
1f30: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1f40: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
1f50: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
1f60: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
1f70: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1f80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
1f90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
1fa0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
1fb0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
1fc0: 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20  ;.  int nName;. 
1fd0: 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d   assert( zName!=
1fe0: 30 20 29 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  0 );.  nName = s
1ff0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62 2c  qlite3Strlen(db,
2000: 20 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69   zName);.  for(i
2010: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
2020: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2030: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
2040: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a   ? i^1 : i;   /*
2050: 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66   Search TEMP bef
2060: 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20  ore MAIN */.    
2070: 69 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30  if( zDatabase!=0
2080: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2090: 6d 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62  mp(zDatabase, db
20a0: 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20  ->aDb[j].zName) 
20b0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
20c0: 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  p = sqlite3HashF
20d0: 69 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e  ind(&db->aDb[j].
20e0: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
20f0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
2100: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
2110: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
2120: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63   p;.}../*.** Loc
2130: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2140: 79 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  y structure that
2150: 20 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72   describes a par
2160: 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
2170: 0a 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20  .** table given 
2180: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74  the name of that
2190: 20 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69   table and (opti
21a0: 6f 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65  onally) the name
21b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
21c0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
21d0: 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
21e0: 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  n NULL if not fo
21f0: 75 6e 64 2e 20 20 41 6c 73 6f 20 6c 65 61 76 65  und.  Also leave
2200: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73   an.** error mes
2210: 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e  sage in pParse->
2220: 7a 45 72 72 4d 73 67 2e 0a 2a 2a 0a 2a 2a 20 54  zErrMsg..**.** T
2230: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
2240: 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
2250: 6e 65 20 61 6e 64 20 73 71 6c 69 74 65 33 46 69  ne and sqlite3Fi
2260: 6e 64 54 61 62 6c 65 28 29 20 69 73 20 74 68 61  ndTable() is tha
2270: 74 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  t this.** routin
2280: 65 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f  e leaves an erro
2290: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
22a0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 77 68 65  rse->zErrMsg whe
22b0: 72 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 6e  re.** sqlite3Fin
22c0: 64 54 61 62 6c 65 28 29 20 64 6f 65 73 20 6e 6f  dTable() does no
22d0: 74 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71 6c  t..*/.Table *sql
22e0: 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28  ite3LocateTable(
22f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
2300: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6e  ,         /* con
2310: 74 65 78 74 20 69 6e 20 77 68 69 63 68 20 74 6f  text in which to
2320: 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20 2a   report errors *
2330: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
2340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2350: 75 65 20 69 66 20 6c 6f 6f 6b 69 6e 67 20 66 6f  ue if looking fo
2360: 72 20 61 20 56 49 45 57 20 72 61 74 68 65 72 20  r a VIEW rather 
2370: 74 68 61 6e 20 61 20 54 41 42 4c 45 20 2a 2f 0a  than a TABLE */.
2380: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2390: 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
23a0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 77 65   of the table we
23b0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
23c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
23d0: 20 2a 7a 44 62 61 73 65 20 20 20 20 20 2f 2a 20   *zDbase     /* 
23e0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
23f0: 62 61 73 65 2e 20 20 4d 69 67 68 74 20 62 65 20  base.  Might be 
2400: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 54 61 62  NULL */.){.  Tab
2410: 6c 65 20 2a 70 3b 0a 0a 20 20 2f 2a 20 52 65 61  le *p;..  /* Rea
2420: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  d the database s
2430: 63 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72  chema. If an err
2440: 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65  or occurs, leave
2450: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2460: 65 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20  e.  ** and code 
2470: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
2480: 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20  turn NULL. */.  
2490: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
24a0: 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
24b0: 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
24c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
24d0: 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   p = sqlite3Find
24e0: 54 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62  Table(pParse->db
24f0: 2c 20 7a 4e 61 6d 65 2c 20 7a 44 62 61 73 65 29  , zName, zDbase)
2500: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2510: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2520: 7a 4d 73 67 20 3d 20 69 73 56 69 65 77 20 3f 20  zMsg = isView ? 
2530: 22 6e 6f 20 73 75 63 68 20 76 69 65 77 22 20 3a  "no such view" :
2540: 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 22   "no such table"
2550: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 61 73 65  ;.    if( zDbase
2560: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2570: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
2580: 2c 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a  , "%s: %s.%s", z
2590: 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20 7a 4e 61  Msg, zDbase, zNa
25a0: 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  me);.    }else{.
25b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
25c0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
25d0: 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 4e  s: %s", zMsg, zN
25e0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
25f0: 70 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68  pParse->checkSch
2600: 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  ema = 1;.  }.  r
2610: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2620: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2630: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
2640: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2650: 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c 61 72  .** a particular
2660: 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74 68 65   index given the
2670: 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 69 6e   name of that in
2680: 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  dex.** and the n
2690: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
26a0: 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ase that contain
26b0: 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20  s the index..** 
26c0: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
26d0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a 2a 20  ot found..**.** 
26e0: 49 66 20 7a 44 61 74 61 62 61 73 65 20 69 73 20  If zDatabase is 
26f0: 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  0, all databases
2700: 20 61 72 65 20 73 65 61 72 63 68 65 64 20 66 6f   are searched fo
2710: 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 61  r the.** table a
2720: 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  nd the first mat
2730: 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73 20 72  ching index is r
2740: 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20 63 68  eturned.  (No ch
2750: 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20 64 75  ecking.** for du
2760: 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20 6e 61  plicate index na
2770: 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20 20 54  mes is done.)  T
2780: 68 65 20 73 65 61 72 63 68 20 6f 72 64 65 72 20  he search order 
2790: 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72 73 74  is.** TEMP first
27a0: 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74 68 65  , then MAIN, the
27b0: 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72 79 20  n any auxiliary 
27c0: 64 61 74 61 62 61 73 65 73 20 61 64 64 65 64 0a  databases added.
27d0: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 54 54  ** using the ATT
27e0: 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ACH command..*/.
27f0: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 46 69  Index *sqlite3Fi
2800: 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65 33 20  ndIndex(sqlite3 
2810: 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
2820: 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  *zName, const ch
2830: 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e 64 65  ar *zDb){.  Inde
2840: 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20  x *p = 0;.  int 
2850: 69 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  i;.  int nName =
2860: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64   sqlite3Strlen(d
2870: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  b, zName);.  for
2880: 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20  (i=OMIT_TEMPDB; 
2890: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
28a0: 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c  .    int j = (i<
28b0: 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f  2) ? i^1 : i;  /
28c0: 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62 65  * Search TEMP be
28d0: 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20  fore MAIN */.   
28e0: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
28f0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53   = db->aDb[j].pS
2900: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 7a  chema;.    if( z
2910: 44 62 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  Db && sqlite3Str
2920: 49 43 6d 70 28 7a 44 62 2c 20 64 62 2d 3e 61 44  ICmp(zDb, db->aD
2930: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
2940: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
2950: 72 74 28 20 70 53 63 68 65 6d 61 20 7c 7c 20 28  rt( pSchema || (
2960: 6a 3d 3d 31 20 26 26 20 21 64 62 2d 3e 61 44 62  j==1 && !db->aDb
2970: 5b 31 5d 2e 70 42 74 29 20 29 3b 0a 20 20 20 20  [1].pBt) );.    
2980: 69 66 28 20 70 53 63 68 65 6d 61 20 29 7b 0a 20  if( pSchema ){. 
2990: 20 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33       p = sqlite3
29a0: 48 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d  HashFind(&pSchem
29b0: 61 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d  a->idxHash, zNam
29c0: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, nName);.    }
29d0: 0a 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65  .    if( p ) bre
29e0: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
29f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   p;.}../*.** Rec
2a00: 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  laim the memory 
2a10: 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78  used by an index
2a20: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2a30: 66 72 65 65 49 6e 64 65 78 28 49 6e 64 65 78 20  freeIndex(Index 
2a40: 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
2a50: 64 62 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e  db = p->pTable->
2a60: 64 62 4d 65 6d 3b 0a 20 20 73 71 6c 69 74 65 33  dbMem;.  sqlite3
2a70: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 43  DbFree(db, p->zC
2a80: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
2a90: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
2aa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
2ab0: 74 68 65 20 67 69 76 65 6e 20 69 6e 64 65 78 20  the given index 
2ac0: 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 68  from the index h
2ad0: 61 73 68 20 74 61 62 6c 65 2c 20 61 6e 64 20 66  ash table, and f
2ae0: 72 65 65 0a 2a 2a 20 69 74 73 20 6d 65 6d 6f 72  ree.** its memor
2af0: 79 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  y structures..**
2b00: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 69 73  .** The index is
2b10: 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
2b20: 65 20 64 61 74 61 62 61 73 65 20 68 61 73 68 20  e database hash 
2b30: 74 61 62 6c 65 73 20 62 75 74 0a 2a 2a 20 69 74  tables but.** it
2b40: 20 69 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b 65 64   is not unlinked
2b50: 20 66 72 6f 6d 20 74 68 65 20 54 61 62 6c 65 20   from the Table 
2b60: 74 68 61 74 20 69 74 20 69 6e 64 65 78 65 73 2e  that it indexes.
2b70: 0a 2a 2a 20 55 6e 6c 69 6e 6b 69 6e 67 20 66 72  .** Unlinking fr
2b80: 6f 6d 20 74 68 65 20 54 61 62 6c 65 20 6d 75 73  om the Table mus
2b90: 74 20 62 65 20 64 6f 6e 65 20 62 79 20 74 68 65  t be done by the
2ba0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2bb0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2bc0: 64 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49  d sqlite3DeleteI
2bd0: 6e 64 65 78 28 49 6e 64 65 78 20 2a 70 29 7b 0a  ndex(Index *p){.
2be0: 20 20 49 6e 64 65 78 20 2a 70 4f 6c 64 3b 0a 20    Index *pOld;. 
2bf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2c00: 6d 65 20 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 0a  me = p->zName;..
2c10: 20 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 33    pOld = sqlite3
2c20: 48 61 73 68 49 6e 73 65 72 74 28 26 70 2d 3e 70  HashInsert(&p->p
2c30: 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68 2c  Schema->idxHash,
2c40: 20 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20   zName,.        
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c60: 20 20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e     sqlite3Strlen
2c70: 33 30 28 7a 4e 61 6d 65 29 2c 20 30 29 3b 0a 20  30(zName), 0);. 
2c80: 20 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 30   assert( pOld==0
2c90: 20 7c 7c 20 70 4f 6c 64 3d 3d 70 20 29 3b 0a 20   || pOld==p );. 
2ca0: 20 66 72 65 65 49 6e 64 65 78 28 70 29 3b 0a 7d   freeIndex(p);.}
2cb0: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
2cc0: 69 6e 64 65 78 20 63 61 6c 6c 65 64 20 7a 49 64  index called zId
2cd0: 78 4e 61 6d 65 20 77 68 69 63 68 20 69 73 20 66  xName which is f
2ce0: 6f 75 6e 64 20 69 6e 20 74 68 65 20 64 61 74 61  ound in the data
2cf0: 62 61 73 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c  base iDb,.** unl
2d00: 69 6b 65 20 74 68 61 74 20 69 6e 64 65 78 20 66  ike that index f
2d10: 72 6f 6d 20 69 74 73 20 54 61 62 6c 65 20 74 68  rom its Table th
2d20: 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e  en remove the in
2d30: 64 65 78 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20  dex from.** the 
2d40: 69 6e 64 65 78 20 68 61 73 68 20 74 61 62 6c 65  index hash table
2d50: 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 6d 65   and free all me
2d60: 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73 20  mory structures 
2d70: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
2d80: 74 68 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  th the index..*/
2d90: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 6c  .void sqlite3Unl
2da0: 69 6e 6b 41 6e 64 44 65 6c 65 74 65 49 6e 64 65  inkAndDeleteInde
2db0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  x(sqlite3 *db, i
2dc0: 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63 68  nt iDb, const ch
2dd0: 61 72 20 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20  ar *zIdxName){. 
2de0: 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a   Index *pIndex;.
2df0: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 48 61 73    int len;.  Has
2e00: 68 20 2a 70 48 61 73 68 20 3d 20 26 64 62 2d 3e  h *pHash = &db->
2e10: 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65 6d 61  aDb[iDb].pSchema
2e20: 2d 3e 69 64 78 48 61 73 68 3b 0a 0a 20 20 6c 65  ->idxHash;..  le
2e30: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
2e40: 6e 28 64 62 2c 20 7a 49 64 78 4e 61 6d 65 29 3b  n(db, zIdxName);
2e50: 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69  .  pIndex = sqli
2e60: 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 70 48  te3HashInsert(pH
2e70: 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65 2c 20 6c  ash, zIdxName, l
2e80: 65 6e 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 49  en, 0);.  if( pI
2e90: 6e 64 65 78 20 29 7b 0a 20 20 20 20 69 66 28 20  ndex ){.    if( 
2ea0: 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e  pIndex->pTable->
2eb0: 70 49 6e 64 65 78 3d 3d 70 49 6e 64 65 78 20 29  pIndex==pIndex )
2ec0: 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
2ed0: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 20 3d  pTable->pIndex =
2ee0: 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 3b 0a   pIndex->pNext;.
2ef0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f00: 20 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 20   Index *p;.     
2f10: 20 66 6f 72 28 70 3d 70 49 6e 64 65 78 2d 3e 70   for(p=pIndex->p
2f20: 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20 70  Table->pIndex; p
2f30: 20 26 26 20 70 2d 3e 70 4e 65 78 74 21 3d 70 49   && p->pNext!=pI
2f40: 6e 64 65 78 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  ndex; p=p->pNext
2f50: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 70 20  ){}.      if( p 
2f60: 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  && p->pNext==pIn
2f70: 64 65 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70  dex ){.        p
2f80: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
2f90: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
2fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
2fb0: 6e 64 65 78 28 70 49 6e 64 65 78 29 3b 0a 20 20  ndex(pIndex);.  
2fc0: 7d 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  }.  db->flags |=
2fd0: 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68   SQLITE_InternCh
2fe0: 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  anges;.}../*.** 
2ff0: 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61  Erase all schema
3000: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
3010: 6d 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  m the in-memory 
3020: 68 61 73 68 20 74 61 62 6c 65 73 20 6f 66 0a 2a  hash tables of.*
3030: 2a 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62  * a single datab
3040: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
3050: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
3060: 72 65 63 6c 61 69 6d 20 6d 65 6d 6f 72 79 0a 2a  reclaim memory.*
3070: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 64 61 74  * before the dat
3080: 61 62 61 73 65 20 63 6c 6f 73 65 73 2e 20 20 49  abase closes.  I
3090: 74 20 69 73 20 61 6c 73 6f 20 63 61 6c 6c 65 64  t is also called
30a0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
30b0: 63 6b 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 77  ck.** if there w
30c0: 65 72 65 20 73 63 68 65 6d 61 20 63 68 61 6e 67  ere schema chang
30d0: 65 73 20 64 75 72 69 6e 67 20 74 68 65 20 74 72  es during the tr
30e0: 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 69 66 20  ansaction or if 
30f0: 61 0a 2a 2a 20 73 63 68 65 6d 61 2d 63 6f 6f 6b  a.** schema-cook
3100: 69 65 20 6d 69 73 6d 61 74 63 68 20 6f 63 63 75  ie mismatch occu
3110: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  rs..**.** If iDb
3120: 3d 3d 30 20 74 68 65 6e 20 72 65 73 65 74 20 74  ==0 then reset t
3130: 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  he internal sche
3140: 6d 61 20 74 61 62 6c 65 73 20 66 6f 72 20 61 6c  ma tables for al
3150: 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
3160: 6c 65 73 2e 20 20 49 66 20 69 44 62 3e 3d 31 20  les.  If iDb>=1 
3170: 74 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 69  then reset the i
3180: 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 66  nternal schema f
3190: 6f 72 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 73  or only the.** s
31a0: 69 6e 67 6c 65 20 66 69 6c 65 20 69 6e 64 69 63  ingle file indic
31b0: 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
31c0: 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e  lite3ResetIntern
31d0: 61 6c 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  alSchema(sqlite3
31e0: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a   *db, int iDb){.
31f0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 61 73    int i, j;.  as
3200: 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
3210: 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 0a  iDb<db->nDb );..
3220: 20 20 69 66 28 20 69 44 62 3d 3d 30 20 29 7b 0a    if( iDb==0 ){.
3230: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
3240: 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20  EnterAll(db);.  
3250: 7d 0a 20 20 66 6f 72 28 69 3d 69 44 62 3b 20 69  }.  for(i=iDb; i
3260: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3270: 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64      Db *pDb = &d
3280: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69  b->aDb[i];.    i
3290: 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20  f( pDb->pSchema 
32a0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
32b0: 69 3d 3d 31 20 7c 7c 20 28 70 44 62 2d 3e 70 42  i==1 || (pDb->pB
32c0: 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  t && sqlite3Btre
32d0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 44 62 2d  eHoldsMutex(pDb-
32e0: 3e 70 42 74 29 29 29 3b 0a 20 20 20 20 20 20 73  >pBt)));.      s
32f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 46 72 65 65  qlite3SchemaFree
3300: 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pDb->pSchema);.
3310: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 44      }.    if( iD
3320: 62 3e 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b>0 ) return;.  
3330: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3d  }.  assert( iDb=
3340: 3d 30 20 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  =0 );.  db->flag
3350: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
3360: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 73 71  ernChanges;.  sq
3370: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
3380: 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ll(db);..  /* If
3390: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
33a0: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  the auxiliary da
33b0: 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 73  tabase files has
33c0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 0a 20 20   been closed,.  
33d0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 74  ** then remove t
33e0: 68 65 6d 20 66 72 6f 6d 20 74 68 65 20 61 75 78  hem from the aux
33f0: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
3400: 6c 69 73 74 2e 20 20 57 65 20 74 61 6b 65 20 74  list.  We take t
3410: 68 65 0a 20 20 2a 2a 20 6f 70 70 6f 72 74 75 6e  he.  ** opportun
3420: 69 74 79 20 74 6f 20 64 6f 20 74 68 69 73 20 68  ity to do this h
3430: 65 72 65 20 73 69 6e 63 65 20 77 65 20 68 61 76  ere since we hav
3440: 65 20 6a 75 73 74 20 64 65 6c 65 74 65 64 20 61  e just deleted a
3450: 6c 6c 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73  ll of the.  ** s
3460: 63 68 65 6d 61 20 68 61 73 68 20 74 61 62 6c 65  chema hash table
3470: 73 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  s and therefore 
3480: 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6d  do not have to m
3490: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 0a  ake any changes.
34a0: 20 20 2a 2a 20 74 6f 20 61 6e 79 20 6f 66 20 74    ** to any of t
34b0: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
34c0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  /.  for(i=0; i<d
34d0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
34e0: 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44 62    struct Db *pDb
34f0: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
3500: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74      if( pDb->pBt
3510: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
3520: 20 70 44 62 2d 3e 70 41 75 78 20 26 26 20 70 44   pDb->pAux && pD
3530: 62 2d 3e 78 46 72 65 65 41 75 78 20 29 20 70 44  b->xFreeAux ) pD
3540: 62 2d 3e 78 46 72 65 65 41 75 78 28 70 44 62 2d  b->xFreeAux(pDb-
3550: 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 70 44  >pAux);.      pD
3560: 62 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20  b->pAux = 0;.   
3570: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6a   }.  }.  for(i=j
3580: 3d 32 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =2; i<db->nDb; i
3590: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
35a0: 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61  Db *pDb = &db->a
35b0: 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  Db[i];.    if( p
35c0: 44 62 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20  Db->pBt==0 ){.  
35d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
35e0: 65 28 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65  e(db, pDb->zName
35f0: 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e  );.      pDb->zN
3600: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ame = 0;.      c
3610: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
3620: 20 20 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20     if( j<i ){.  
3630: 20 20 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d      db->aDb[j] =
3640: 20 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20   db->aDb[i];.   
3650: 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a   }.    j++;.  }.
3660: 20 20 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44    memset(&db->aD
3670: 62 5b 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44  b[j], 0, (db->nD
3680: 62 2d 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e  b-j)*sizeof(db->
3690: 61 44 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e  aDb[j]));.  db->
36a0: 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64  nDb = j;.  if( d
36b0: 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d  b->nDb<=2 && db-
36c0: 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61  >aDb!=db->aDbSta
36d0: 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  tic ){.    memcp
36e0: 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c  y(db->aDbStatic,
36f0: 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65   db->aDb, 2*size
3700: 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b  of(db->aDb[0]));
3710: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
3720: 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b  ee(db, db->aDb);
3730: 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  .    db->aDb = d
3740: 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20  b->aDbStatic;.  
3750: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
3760: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3770: 64 20 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20  d when a commit 
3780: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  occurs..*/.void 
3790: 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
37a0: 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c  ernalChanges(sql
37b0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d  ite3 *db){.  db-
37c0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
37d0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
37e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  .}../*.** Clear 
37f0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
3800: 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 6f 72   from a table or
3810: 20 76 69 65 77 2e 0a 2a 2f 0a 73 74 61 74 69 63   view..*/.static
3820: 20 76 6f 69 64 20 73 71 6c 69 74 65 52 65 73 65   void sqliteRese
3830: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 54 61 62  tColumnNames(Tab
3840: 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 69  le *pTable){.  i
3850: 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  nt i;.  Column *
3860: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
3870: 2a 64 62 20 3d 20 70 54 61 62 6c 65 2d 3e 64 62  *db = pTable->db
3880: 4d 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Mem;.  assert( p
3890: 54 61 62 6c 65 21 3d 30 20 29 3b 0a 20 20 69 66  Table!=0 );.  if
38a0: 28 20 28 70 43 6f 6c 20 3d 20 70 54 61 62 6c 65  ( (pCol = pTable
38b0: 2d 3e 61 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20  ->aCol)!=0 ){.  
38c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
38d0: 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20  ble->nCol; i++, 
38e0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 73  pCol++){.      s
38f0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3900: 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pCol->zName);. 
3910: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
3920: 44 65 6c 65 74 65 28 64 62 2c 20 70 43 6f 6c 2d  Delete(db, pCol-
3930: 3e 70 44 66 6c 74 29 3b 0a 20 20 20 20 20 20 73  >pDflt);.      s
3940: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3950: 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20   pCol->zType);. 
3960: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
3970: 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f  ee(db, pCol->zCo
3980: 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ll);.    }.    s
3990: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
39a0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a   pTable->aCol);.
39b0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 61 43    }.  pTable->aC
39c0: 6f 6c 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65  ol = 0;.  pTable
39d0: 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 7d 0a 0a 2f  ->nCol = 0;.}../
39e0: 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
39f0: 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74 72 75  memory data stru
3a00: 63 74 75 72 65 73 20 61 73 73 6f 63 69 61 74 65  ctures associate
3a10: 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
3a20: 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f 20 63  .** Table.  No c
3a30: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
3a40: 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69 73 20  to disk by this 
3a50: 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
3a60: 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
3a70: 20 64 65 6c 65 74 65 73 20 74 68 65 20 64 61 74   deletes the dat
3a80: 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 74  a structure.  It
3a90: 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69 6e 6b   does not unlink
3aa0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 64 61  .** the table da
3ab0: 74 61 20 73 74 72 75 63 74 75 72 65 20 66 72 6f  ta structure fro
3ac0: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
3ad0: 2e 20 20 4e 6f 72 20 64 6f 65 73 20 69 74 20 72  .  Nor does it r
3ae0: 65 6d 6f 76 65 0a 2a 2a 20 66 6f 72 65 69 67 6e  emove.** foreign
3af0: 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 65 20 73   keys from the s
3b00: 71 6c 69 74 65 2e 61 46 4b 65 79 20 68 61 73 68  qlite.aFKey hash
3b10: 20 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20   table.  But it 
3b20: 64 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20  does destroy.** 
3b30: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
3b40: 73 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73  s of the indices
3b50: 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79   and foreign key
3b60: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
3b70: 68 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e  h .** the table.
3b80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3b90: 44 65 6c 65 74 65 54 61 62 6c 65 28 54 61 62 6c  DeleteTable(Tabl
3ba0: 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e  e *pTable){.  In
3bb0: 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e  dex *pIndex, *pN
3bc0: 65 78 74 3b 0a 20 20 46 4b 65 79 20 2a 70 46 4b  ext;.  FKey *pFK
3bd0: 65 79 2c 20 2a 70 4e 65 78 74 46 4b 65 79 3b 0a  ey, *pNextFKey;.
3be0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
3bf0: 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30 20    if( pTable==0 
3c00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
3c10: 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 3b 0a   pTable->dbMem;.
3c20: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
3c30: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
3c40: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
3c50: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
3c60: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 70 54 61 62 6c  zero. */.  pTabl
3c70: 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
3c80: 20 70 54 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20   pTable->nRef>0 
3c90: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
3ca0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54 61   }.  assert( pTa
3cb0: 62 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  ble->nRef==0 );.
3cc0: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c  .  /* Delete all
3cd0: 20 69 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61   indices associa
3ce0: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 74 61  ted with this ta
3cf0: 62 6c 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  ble.  */.  for(p
3d00: 49 6e 64 65 78 20 3d 20 70 54 61 62 6c 65 2d 3e  Index = pTable->
3d10: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20  pIndex; pIndex; 
3d20: 70 49 6e 64 65 78 3d 70 4e 65 78 74 29 7b 0a 20  pIndex=pNext){. 
3d30: 20 20 20 70 4e 65 78 74 20 3d 20 70 49 6e 64 65     pNext = pInde
3d40: 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 61 73  x->pNext;.    as
3d50: 73 65 72 74 28 20 70 49 6e 64 65 78 2d 3e 70 53  sert( pIndex->pS
3d60: 63 68 65 6d 61 3d 3d 70 54 61 62 6c 65 2d 3e 70  chema==pTable->p
3d70: 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73 71  Schema );.    sq
3d80: 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65 78  lite3DeleteIndex
3d90: 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 23  (pIndex);.  }..#
3da0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
3db0: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20  IT_FOREIGN_KEY. 
3dc0: 20 2f 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 66   /* Delete all f
3dd0: 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73 73 6f  oreign keys asso
3de0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
3df0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 6b 65 79   table.  The key
3e00: 73 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61  s.  ** should ha
3e10: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
3e20: 75 6e 6c 69 6e 6b 65 64 20 66 72 6f 6d 20 74 68  unlinked from th
3e30: 65 20 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  e pSchema->aFKey
3e40: 20 68 61 73 68 20 74 61 62 6c 65 20 0a 20 20 2a   hash table .  *
3e50: 2f 0a 20 20 66 6f 72 28 70 46 4b 65 79 3d 70 54  /.  for(pFKey=pT
3e60: 61 62 6c 65 2d 3e 70 46 4b 65 79 3b 20 70 46 4b  able->pFKey; pFK
3e70: 65 79 3b 20 70 46 4b 65 79 3d 70 4e 65 78 74 46  ey; pFKey=pNextF
3e80: 4b 65 79 29 7b 0a 20 20 20 20 70 4e 65 78 74 46  Key){.    pNextF
3e90: 4b 65 79 20 3d 20 70 46 4b 65 79 2d 3e 70 4e 65  Key = pFKey->pNe
3ea0: 78 74 46 72 6f 6d 3b 0a 20 20 20 20 61 73 73 65  xtFrom;.    asse
3eb0: 72 74 28 20 73 71 6c 69 74 65 33 48 61 73 68 46  rt( sqlite3HashF
3ec0: 69 6e 64 28 26 70 54 61 62 6c 65 2d 3e 70 53 63  ind(&pTable->pSc
3ed0: 68 65 6d 61 2d 3e 61 46 4b 65 79 2c 0a 20 20 20  hema->aFKey,.   
3ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ef0: 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 7a          pFKey->z
3f00: 54 6f 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  To, sqlite3Strle
3f10: 6e 33 30 28 70 46 4b 65 79 2d 3e 7a 54 6f 29 29  n30(pFKey->zTo))
3f20: 21 3d 70 46 4b 65 79 20 29 3b 0a 20 20 20 20 73  !=pFKey );.    s
3f30: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3f40: 20 70 46 4b 65 79 29 3b 0a 20 20 7d 0a 23 65 6e   pFKey);.  }.#en
3f50: 64 69 66 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65  dif..  /* Delete
3f60: 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75 63   the Table struc
3f70: 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  ture itself..  *
3f80: 2f 0a 20 20 73 71 6c 69 74 65 52 65 73 65 74 43  /.  sqliteResetC
3f90: 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 54 61 62 6c  olumnNames(pTabl
3fa0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
3fb0: 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ree(db, pTable->
3fc0: 7a 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  zName);.  sqlite
3fd0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62  3DbFree(db, pTab
3fe0: 6c 65 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20  le->zColAff);.  
3ff0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
4000: 65 74 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e  ete(db, pTable->
4010: 70 53 65 6c 65 63 74 29 3b 0a 23 69 66 6e 64 65  pSelect);.#ifnde
4020: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48  f SQLITE_OMIT_CH
4030: 45 43 4b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  ECK.  sqlite3Exp
4040: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  rDelete(db, pTab
4050: 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 65 6e  le->pCheck);.#en
4060: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 56 74 61  dif.  sqlite3Vta
4070: 62 43 6c 65 61 72 28 70 54 61 62 6c 65 29 3b 0a  bClear(pTable);.
4080: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4090: 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 7d 0a 0a  db, pTable);.}..
40a0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  /*.** Unlink the
40b0: 20 67 69 76 65 6e 20 74 61 62 6c 65 20 66 72 6f   given table fro
40c0: 6d 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  m the hash table
40d0: 73 20 61 6e 64 20 74 68 65 20 64 65 6c 65 74 65  s and the delete
40e0: 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 73 74   the.** table st
40f0: 72 75 63 74 75 72 65 20 77 69 74 68 20 61 6c 6c  ructure with all
4100: 20 69 74 73 20 69 6e 64 69 63 65 73 20 61 6e 64   its indices and
4110: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 2a   foreign keys..*
4120: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e  /.void sqlite3Un
4130: 6c 69 6e 6b 41 6e 64 44 65 6c 65 74 65 54 61 62  linkAndDeleteTab
4140: 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  le(sqlite3 *db, 
4150: 69 6e 74 20 69 44 62 2c 20 63 6f 6e 73 74 20 63  int iDb, const c
4160: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 29 7b 0a  har *zTabName){.
4170: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 46 4b    Table *p;.  FK
4180: 65 79 20 2a 70 46 31 2c 20 2a 70 46 32 3b 0a 20  ey *pF1, *pF2;. 
4190: 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73   Db *pDb;..  ass
41a0: 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20  ert( db!=0 );.  
41b0: 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26  assert( iDb>=0 &
41c0: 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b  & iDb<db->nDb );
41d0: 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 4e  .  assert( zTabN
41e0: 61 6d 65 20 26 26 20 7a 54 61 62 4e 61 6d 65 5b  ame && zTabName[
41f0: 30 5d 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0] );.  pDb = &d
4200: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
4210: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
4220: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4230: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
4240: 62 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  bName,.         
4250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
4260: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
4270: 54 61 62 4e 61 6d 65 29 2c 30 29 3b 0a 20 20 69  TabName),0);.  i
4280: 66 28 20 70 20 29 7b 0a 23 69 66 6e 64 65 66 20  f( p ){.#ifndef 
4290: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
42a0: 49 47 4e 5f 4b 45 59 0a 20 20 20 20 66 6f 72 28  IGN_KEY.    for(
42b0: 70 46 31 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46  pF1=p->pFKey; pF
42c0: 31 3b 20 70 46 31 3d 70 46 31 2d 3e 70 4e 65 78  1; pF1=pF1->pNex
42d0: 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20 20 69 6e  tFrom){.      in
42e0: 74 20 6e 54 6f 20 3d 20 73 71 6c 69 74 65 33 53  t nTo = sqlite3S
42f0: 74 72 6c 65 6e 33 30 28 70 46 31 2d 3e 7a 54 6f  trlen30(pF1->zTo
4300: 29 3b 0a 20 20 20 20 20 20 70 46 32 20 3d 20 73  );.      pF2 = s
4310: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
4320: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 61 46  pDb->pSchema->aF
4330: 4b 65 79 2c 20 70 46 31 2d 3e 7a 54 6f 2c 20 6e  Key, pF1->zTo, n
4340: 54 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  To);.      if( p
4350: 46 32 3d 3d 70 46 31 20 29 7b 0a 20 20 20 20 20  F2==pF1 ){.     
4360: 20 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e     sqlite3HashIn
4370: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
4380: 6d 61 2d 3e 61 46 4b 65 79 2c 20 70 46 31 2d 3e  ma->aFKey, pF1->
4390: 7a 54 6f 2c 20 6e 54 6f 2c 20 70 46 31 2d 3e 70  zTo, nTo, pF1->p
43a0: 4e 65 78 74 54 6f 29 3b 0a 20 20 20 20 20 20 7d  NextTo);.      }
43b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68  else{.        wh
43c0: 69 6c 65 28 20 70 46 32 20 26 26 20 70 46 32 2d  ile( pF2 && pF2-
43d0: 3e 70 4e 65 78 74 54 6f 21 3d 70 46 31 20 29 7b  >pNextTo!=pF1 ){
43e0: 20 70 46 32 3d 70 46 32 2d 3e 70 4e 65 78 74 54   pF2=pF2->pNextT
43f0: 6f 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  o; }.        if(
4400: 20 70 46 32 20 29 7b 0a 20 20 20 20 20 20 20 20   pF2 ){.        
4410: 20 20 70 46 32 2d 3e 70 4e 65 78 74 54 6f 20 3d    pF2->pNextTo =
4420: 20 70 46 31 2d 3e 70 4e 65 78 74 54 6f 3b 0a 20   pF1->pNextTo;. 
4430: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
4440: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
4450: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54    sqlite3DeleteT
4460: 61 62 6c 65 28 70 29 3b 0a 20 20 7d 0a 20 20 64  able(p);.  }.  d
4470: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
4480: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
4490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
44a0: 20 61 20 74 6f 6b 65 6e 2c 20 72 65 74 75 72 6e   a token, return
44b0: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 63   a string that c
44c0: 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20 74  onsists of the t
44d0: 65 78 74 20 6f 66 20 74 68 61 74 0a 2a 2a 20 74  ext of that.** t
44e0: 6f 6b 65 6e 2e 20 20 53 70 61 63 65 20 74 6f 20  oken.  Space to 
44f0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
4500: 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 6f  d string.** is o
4510: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
4520: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20  iteMalloc() and 
4530: 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
4540: 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
4550: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
4560: 41 6e 79 20 71 75 6f 74 61 74 69 6f 6e 20 6d 61  Any quotation ma
4570: 72 6b 73 20 28 65 78 3a 20 20 22 6e 61 6d 65 22  rks (ex:  "name"
4580: 2c 20 27 6e 61 6d 65 27 2c 20 5b 6e 61 6d 65 5d  , 'name', [name]
4590: 2c 20 6f 72 20 60 6e 61 6d 65 60 29 20 74 68 61  , or `name`) tha
45a0: 74 0a 2a 2a 20 73 75 72 72 6f 75 6e 64 20 74 68  t.** surround th
45b0: 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 74 6f  e body of the to
45c0: 6b 65 6e 20 61 72 65 20 72 65 6d 6f 76 65 64 2e  ken are removed.
45d0: 0a 2a 2a 0a 2a 2a 20 54 6f 6b 65 6e 73 20 61 72  .**.** Tokens ar
45e0: 65 20 6f 66 74 65 6e 20 6a 75 73 74 20 70 6f 69  e often just poi
45f0: 6e 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 6f  nters into the o
4600: 72 69 67 69 6e 61 6c 20 53 51 4c 20 74 65 78 74  riginal SQL text
4610: 20 61 6e 64 20 73 6f 0a 2a 2a 20 61 72 65 20 6e   and so.** are n
4620: 6f 74 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ot \000 terminat
4630: 65 64 20 61 6e 64 20 61 72 65 20 6e 6f 74 20 70  ed and are not p
4640: 65 72 73 69 73 74 65 6e 74 2e 20 20 54 68 65 20  ersistent.  The 
4650: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a  returned string.
4660: 2a 2a 20 69 73 20 5c 30 30 30 20 74 65 72 6d 69  ** is \000 termi
4670: 6e 61 74 65 64 20 61 6e 64 20 69 73 20 70 65 72  nated and is per
4680: 73 69 73 74 65 6e 74 2e 0a 2a 2f 0a 63 68 61 72  sistent..*/.char
4690: 20 2a 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f   *sqlite3NameFro
46a0: 6d 54 6f 6b 65 6e 28 73 71 6c 69 74 65 33 20 2a  mToken(sqlite3 *
46b0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
46c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  ){.  char *zName
46d0: 3b 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b  ;.  if( pName ){
46e0: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
46f0: 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 64 62  ite3DbStrNDup(db
4700: 2c 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2d 3e  , (char*)pName->
4710: 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 29 3b 0a 20 20  z, pName->n);.  
4720: 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e 71 75 6f    if( pName->quo
4730: 74 65 64 20 29 20 73 71 6c 69 74 65 33 44 65 71  ted ) sqlite3Deq
4740: 75 6f 74 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 7d  uote(zName);.  }
4750: 65 6c 73 65 7b 0a 20 20 20 20 7a 4e 61 6d 65 20  else{.    zName 
4760: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
4770: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zName;.}../*.*
4780: 2a 20 4f 70 65 6e 20 74 68 65 20 73 71 6c 69 74  * Open the sqlit
4790: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 73  e_master table s
47a0: 74 6f 72 65 64 20 69 6e 20 64 61 74 61 62 61 73  tored in databas
47b0: 65 20 6e 75 6d 62 65 72 20 69 44 62 20 66 6f 72  e number iDb for
47c0: 0a 2a 2a 20 77 72 69 74 69 6e 67 2e 20 54 68 65  .** writing. The
47d0: 20 74 61 62 6c 65 20 69 73 20 6f 70 65 6e 65 64   table is opened
47e0: 20 75 73 69 6e 67 20 63 75 72 73 6f 72 20 30 2e   using cursor 0.
47f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4800: 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65 28  OpenMasterTable(
4810: 50 61 72 73 65 20 2a 70 2c 20 69 6e 74 20 69 44  Parse *p, int iD
4820: 62 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  b){.  Vdbe *v = 
4830: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
4840: 29 3b 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c  );.  sqlite3Tabl
4850: 65 4c 6f 63 6b 28 70 2c 20 69 44 62 2c 20 4d 41  eLock(p, iDb, MA
4860: 53 54 45 52 5f 52 4f 4f 54 2c 20 31 2c 20 53 43  STER_ROOT, 1, SC
4870: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29  HEMA_TABLE(iDb))
4880: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4890: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp3(v, OP_Open
48a0: 57 72 69 74 65 2c 20 30 2c 20 4d 41 53 54 45 52  Write, 0, MASTER
48b0: 5f 52 4f 4f 54 2c 20 69 44 62 29 3b 0a 20 20 73  _ROOT, iDb);.  s
48c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
48d0: 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 20  P4(v, -1, (char 
48e0: 2a 29 35 2c 20 50 34 5f 49 4e 54 33 32 29 3b 20  *)5, P4_INT32); 
48f0: 20 2f 2a 20 35 20 63 6f 6c 75 6d 6e 20 74 61 62   /* 5 column tab
4900: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e  le */.  if( p->n
4910: 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  Tab==0 ){.    p-
4920: 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a 7d  >nTab = 1;.  }.}
4930: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
4940: 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20 74  r zName points t
4950: 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  o a nul-terminat
4960: 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  ed buffer contai
4970: 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  ning the name.**
4980: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 28   of a database (
4990: 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 6f  "main", "temp" o
49a0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
49b0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
49c0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
49d0: 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64 65  returns the inde
49e0: 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64  x of the named d
49f0: 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61  atabase in db->a
4a00: 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20 69  Db[], or.** -1 i
4a10: 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 63  f the named db c
4a20: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
4a30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  */.int sqlite3Fi
4a40: 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65 33  ndDbName(sqlite3
4a50: 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
4a60: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
4a70: 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  i = -1;         
4a80: 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d 62  /* Database numb
4a90: 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61 6d  er */.  if( zNam
4aa0: 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  e ){.    Db *pDb
4ab0: 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71  ;.    int n = sq
4ac0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e  lite3Strlen30(zN
4ad0: 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ame);.    for(i=
4ae0: 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44 62  (db->nDb-1), pDb
4af0: 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69 3e  =&db->aDb[i]; i>
4b00: 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29 7b  =0; i--, pDb--){
4b10: 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d 49  .      if( (!OMI
4b20: 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d 31  T_TEMPDB || i!=1
4b30: 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65 33   ) && n==sqlite3
4b40: 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a 4e  Strlen30(pDb->zN
4b50: 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20 20  ame) && .       
4b60: 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72     0==sqlite3Str
4b70: 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65 2c  ICmp(pDb->zName,
4b80: 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
4b90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4ba0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
4bb0: 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn i;.}../*.**
4bc0: 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61 6d   The token *pNam
4bd0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
4be0: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
4bf0: 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e 22  e (either "main"
4c00: 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f 72   or.** "temp" or
4c10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20   the name of an 
4c20: 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54 68  attached db). Th
4c30: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
4c40: 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20  ns the.** index 
4c50: 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61 74  of the named dat
4c60: 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44 62  abase in db->aDb
4c70: 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68 65  [], or -1 if the
4c80: 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64 6f   named db .** do
4c90: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  es not exist..*/
4ca0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e 64  .int sqlite3Find
4cb0: 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  Db(sqlite3 *db, 
4cc0: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
4cd0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
4d00: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68  e number */.  ch
4d10: 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20  ar *zName;      
4d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d30: 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61 72     /* Name we ar
4d40: 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  e searching for 
4d50: 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  */.  zName = sql
4d60: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4d70: 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  n(db, pName);.  
4d80: 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44  i = sqlite3FindD
4d90: 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bName(db, zName)
4da0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4db0: 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  e(db, zName);.  
4dc0: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 20  return i;.}../* 
4dd0: 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65  The table or vie
4de0: 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61 6d  w or trigger nam
4df0: 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  e is passed to t
4e00: 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61 20  his routine via 
4e10: 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65 31  tokens.** pName1
4e20: 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66 20   and pName2. If 
4e30: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 77  the table name w
4e40: 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  as fully qualifi
4e50: 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 3a  ed, for example:
4e60: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
4e70: 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e 2e  BLE xxx.yyy (...
4e80: 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20 70  );.** .** Then p
4e90: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
4ea0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
4eb0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
4ec0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a 20  ther hand if.** 
4ed0: 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 69  the table name i
4ee0: 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61 6c  s not fully qual
4ef0: 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a 0a  ified, i.e.:.**.
4f00: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
4f10: 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a 20  yyy(...);.**.** 
4f20: 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73  Then pName1 is s
4f30: 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64 20  et to "yyy" and 
4f40: 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a 2a  pName2 is ""..**
4f50: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
4f60: 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e 71   sets the *ppUnq
4f70: 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  ual pointer to p
4f80: 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b 65  oint at the toke
4f90: 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a 20  n (pName1 or.** 
4fa0: 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f  pName2) that sto
4fb0: 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66  res the unqualif
4fc0: 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20  ied table name. 
4fd0: 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   The index of th
4fe0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22 78  e.** database "x
4ff0: 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64 2e  xx" is returned.
5000: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
5010: 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50 61  woPartName(.  Pa
5020: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
5030: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64    /* Parsing and
5040: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
5050: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
5060: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
5070: 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20 69    /* The "xxx" i
5080: 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78 2e  n the name "xxx.
5090: 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a 2f  yyy" or "xxx" */
50a0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
50b0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 79  ,      /* The "y
50c0: 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  yy" in the name 
50d0: 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20 54  "xxx.yyy" */.  T
50e0: 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20 20  oken **pUnqual  
50f0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
5100: 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a 65  unqualified obje
5110: 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f 0a  ct name here */.
5120: 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  ){.  int iDb;   
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
5150: 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74 20  ding the object 
5160: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
5170: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
5180: 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26 20    if( pName2 && 
5190: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20  pName2->n>0 ){. 
51a0: 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e     if( db->init.
51b0: 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73  busy ) {.      s
51c0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
51d0: 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20  Parse, "corrupt 
51e0: 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20  database");.    
51f0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
5200: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
5210: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 55  1;.    }.    *pU
5220: 6e 71 75 61 6c 20 3d 20 70 4e 61 6d 65 32 3b 0a  nqual = pName2;.
5230: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
5240: 33 46 69 6e 64 44 62 28 64 62 2c 20 70 4e 61 6d  3FindDb(db, pNam
5250: 65 31 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62  e1);.    if( iDb
5260: 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
5270: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
5280: 73 65 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74  se, "unknown dat
5290: 61 62 61 73 65 20 25 54 22 2c 20 70 4e 61 6d 65  abase %T", pName
52a0: 31 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  1);.      pParse
52b0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
52c0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
52d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
52e0: 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 69  sert( db->init.i
52f0: 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69 6e 69  Db==0 || db->ini
5300: 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20 69 44  t.busy );.    iD
5310: 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62  b = db->init.iDb
5320: 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d  ;.    *pUnqual =
5330: 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20 20 72   pName1;.  }.  r
5340: 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a 2f 2a  eturn iDb;.}../*
5350: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5360: 20 69 73 20 75 73 65 64 20 74 6f 20 63 68 65 63   is used to chec
5370: 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38 20 73  k if the UTF-8 s
5380: 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73 20 61  tring zName is a
5390: 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75 61 6c   legal.** unqual
53a0: 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72 20 61  ified name for a
53b0: 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62 6a 65   new schema obje
53c0: 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64 65 78  ct (table, index
53d0: 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74 72 69  , view or.** tri
53e0: 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d 65 73  gger). All names
53f0: 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63 65 70   are legal excep
5400: 74 20 74 68 6f 73 65 20 74 68 61 74 20 62 65 67  t those that beg
5410: 69 6e 20 77 69 74 68 20 74 68 65 20 73 74 72 69  in with the stri
5420: 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f 22 20  ng.** "sqlite_" 
5430: 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77 65 72  (in upper, lower
5440: 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65 29 2e   or mixed case).
5450: 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20 6f 66   This portion of
5460: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 0a 2a   the namespace.*
5470: 2a 20 69 73 20 72 65 73 65 72 76 65 64 20 66 6f  * is reserved fo
5480: 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 2e 0a  r internal use..
5490: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68  */.int sqlite3Ch
54a0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 50 61  eckObjectName(Pa
54b0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e  rse *pParse, con
54c0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
54d0: 0a 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e  .  if( !pParse->
54e0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
54f0: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
5500: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  =0 .          &&
5510: 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
5520: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57 72 69  ags & SQLITE_Wri
5530: 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20 20 20  teSchema)==0.   
5540: 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73 71 6c         && 0==sql
5550: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 4e 61  ite3StrNICmp(zNa
5560: 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
5570: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
5580: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5590: 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20 72 65   "object name re
55a0: 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74 65 72  served for inter
55b0: 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20 7a 4e  nal use: %s", zN
55c0: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
55d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
55e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
55f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5600: 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63 74 69  Begin constructi
5610: 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 20 72  ng a new table r
5620: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 6e  epresentation in
5630: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
5640: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f  s.** the first o
5650: 66 20 73 65 76 65 72 61 6c 20 61 63 74 69 6f 6e  f several action
5660: 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 67   routines that g
5670: 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72 65 73  et called in res
5680: 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20 43 52  ponse.** to a CR
5690: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
56a0: 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74 69 63  ment.  In partic
56b0: 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75 74 69  ular, this routi
56c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  ne is called.** 
56d0: 61 66 74 65 72 20 73 65 65 69 6e 67 20 74 6f 6b  after seeing tok
56e0: 65 6e 73 20 22 43 52 45 41 54 45 22 20 61 6e 64  ens "CREATE" and
56f0: 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74 68 65   "TABLE" and the
5700: 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68 65   table name. The
5710: 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61 67 20   isTemp.** flag 
5720: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 74  is true if the t
5730: 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73  able should be s
5740: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61 75 78  tored in the aux
5750: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 0a  iliary database.
5760: 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  ** file instead 
5770: 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  of in the main d
5780: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
5790: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
57a0: 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65 6e  the case.** when
57b0: 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72 20 22   the "TEMP" or "
57c0: 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79 77 6f  TEMPORARY" keywo
57d0: 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74  rd occurs in bet
57e0: 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45 20 61  ween.** CREATE a
57f0: 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a 2a 20  nd TABLE..**.** 
5800: 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20 72 65  The new table re
5810: 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61 6c 69  cord is initiali
5820: 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e 20 70  zed and put in p
5830: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
5840: 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f 66 20  ..** As more of 
5850: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
5860: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 61   statement is pa
5870: 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e 61 6c  rsed, additional
5880: 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75 74 69   action.** routi
5890: 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  nes will be call
58a0: 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65 20 69  ed to add more i
58b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 74 68  nformation to th
58c0: 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 41 74  is record..** At
58d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
58e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
58f0: 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71 6c 69  tement, the sqli
5900: 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20 72 6f  te3EndTable() ro
5910: 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c  utine.** is call
5920: 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  ed to complete t
5930: 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  he construction 
5940: 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
5950: 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f 69 64   record..*/.void
5960: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
5970: 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  le(.  Parse *pPa
5980: 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 65 72  rse,   /* Parser
5990: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
59a0: 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 2f  ken *pName1,   /
59b0: 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20  * First part of 
59c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
59d0: 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 2a 2f  table or view */
59e0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
59f0: 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61  ,   /* Second pa
5a00: 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f  rt of the name o
5a10: 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76  f the table or v
5a20: 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  iew */.  int isT
5a30: 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  emp,      /* Tru
5a40: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 54  e if this is a T
5a50: 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69  EMP table */.  i
5a60: 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20 20 20  nt isView,      
5a70: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5a80: 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20 20 69  is a VIEW */.  i
5a90: 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20 20 20  nt isVirtual,   
5aa0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
5ab0: 69 73 20 61 20 56 49 52 54 55 41 4c 20 74 61 62  is a VIRTUAL tab
5ac0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72  le */.  int noEr
5ad0: 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  r        /* Do n
5ae0: 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c 65 20  othing if table 
5af0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
5b00: 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54  /.){.  Table *pT
5b10: 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  able;.  char *zN
5b20: 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68 65 20  ame = 0; /* The 
5b30: 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65 77 20  name of the new 
5b40: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
5b50: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
5b60: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  >db;.  Vdbe *v;.
5b70: 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
5b80: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e     /* Database n
5b90: 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74 65 20  umber to create 
5ba0: 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a 2f 0a  the table in */.
5bb0: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 3b 20    Token *pName; 
5bc0: 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65     /* Unqualifie
5bd0: 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  d name of the ta
5be0: 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 2a 2f  ble to create */
5bf0: 0a 0a 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ..  /* The table
5c00: 20 6f 72 20 76 69 65 77 20 6e 61 6d 65 20 74 6f   or view name to
5c10: 20 63 72 65 61 74 65 20 69 73 20 70 61 73 73 65   create is passe
5c20: 64 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  d to this routin
5c30: 65 20 76 69 61 20 74 6f 6b 65 6e 73 0a 20 20 2a  e via tokens.  *
5c40: 2a 20 70 4e 61 6d 65 31 20 61 6e 64 20 70 4e 61  * pName1 and pNa
5c50: 6d 65 32 2e 20 49 66 20 74 68 65 20 74 61 62 6c  me2. If the tabl
5c60: 65 20 6e 61 6d 65 20 77 61 73 20 66 75 6c 6c 79  e name was fully
5c70: 20 71 75 61 6c 69 66 69 65 64 2c 20 66 6f 72 20   qualified, for 
5c80: 65 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20  example:.  **.  
5c90: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
5ca0: 78 78 78 2e 79 79 79 20 28 2e 2e 2e 29 3b 0a 20  xxx.yyy (...);. 
5cb0: 20 2a 2a 20 0a 20 20 2a 2a 20 54 68 65 6e 20 70   ** .  ** Then p
5cc0: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5cd0: 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65 32  "xxx" and pName2
5ce0: 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20 6f   "yyy". On the o
5cf0: 74 68 65 72 20 68 61 6e 64 20 69 66 0a 20 20 2a  ther hand if.  *
5d00: 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  * the table name
5d10: 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75   is not fully qu
5d20: 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 20  alified, i.e.:. 
5d30: 20 2a 2a 0a 20 20 2a 2a 20 43 52 45 41 54 45 20   **.  ** CREATE 
5d40: 54 41 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a  TABLE yyy(...);.
5d50: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 70    **.  ** Then p
5d60: 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f 20  Name1 is set to 
5d70: 22 79 79 79 22 20 61 6e 64 20 70 4e 61 6d 65 32  "yyy" and pName2
5d80: 20 69 73 20 22 22 2e 0a 20 20 2a 2a 0a 20 20 2a   is ""..  **.  *
5d90: 2a 20 54 68 65 20 63 61 6c 6c 20 62 65 6c 6f 77  * The call below
5da0: 20 73 65 74 73 20 74 68 65 20 70 4e 61 6d 65 20   sets the pName 
5db0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  pointer to point
5dc0: 20 61 74 20 74 68 65 20 74 6f 6b 65 6e 20 28 70   at the token (p
5dd0: 4e 61 6d 65 31 20 6f 72 0a 20 20 2a 2a 20 70 4e  Name1 or.  ** pN
5de0: 61 6d 65 32 29 20 74 68 61 74 20 73 74 6f 72 65  ame2) that store
5df0: 73 20 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65  s the unqualifie
5e00: 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54 68  d table name. Th
5e10: 65 20 76 61 72 69 61 62 6c 65 20 69 44 62 20 69  e variable iDb i
5e20: 73 0a 20 20 2a 2a 20 73 65 74 20 74 6f 20 74 68  s.  ** set to th
5e30: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 64  e index of the d
5e40: 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68 65  atabase that the
5e50: 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20 69   table or view i
5e60: 73 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 72 65  s to be.  ** cre
5e70: 61 74 65 64 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  ated in..  */.  
5e80: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77 6f  iDb = sqlite3Two
5e90: 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  PartName(pParse,
5ea0: 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c   pName1, pName2,
5eb0: 20 26 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20   &pName);.  if( 
5ec0: 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
5ed0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
5ee0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
5ef0: 69 44 62 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  iDb>1 ){.    /* 
5f00: 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65  If creating a te
5f10: 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61  mp table, the na
5f20: 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75  me may not be qu
5f30: 61 6c 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 73  alified */.    s
5f40: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
5f50: 50 61 72 73 65 2c 20 22 74 65 6d 70 6f 72 61 72  Parse, "temporar
5f60: 79 20 74 61 62 6c 65 20 6e 61 6d 65 20 6d 75 73  y table name mus
5f70: 74 20 62 65 20 75 6e 71 75 61 6c 69 66 69 65 64  t be unqualified
5f80: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ");.    return;.
5f90: 20 20 7d 0a 20 20 69 66 28 20 21 4f 4d 49 54 5f    }.  if( !OMIT_
5fa0: 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70  TEMPDB && isTemp
5fb0: 20 29 20 69 44 62 20 3d 20 31 3b 0a 0a 20 20 70   ) iDb = 1;..  p
5fc0: 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65  Parse->sNameToke
5fd0: 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 7a 4e  n = *pName;.  zN
5fe0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
5ff0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
6000: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Name);.  if( zNa
6010: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
6020: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
6030: 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a  =sqlite3CheckObj
6040: 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  ectName(pParse, 
6050: 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 67 6f  zName) ){.    go
6060: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
6070: 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rror;.  }.  if( 
6080: 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d 3d 31 20  db->init.iDb==1 
6090: 29 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 69  ) isTemp = 1;.#i
60a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
60b0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
60c0: 20 20 61 73 73 65 72 74 28 20 28 69 73 54 65 6d    assert( (isTem
60d0: 70 20 26 20 31 29 3d 3d 69 73 54 65 6d 70 20 29  p & 1)==isTemp )
60e0: 3b 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  ;.  {.    int co
60f0: 64 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44  de;.    char *zD
6100: 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  b = db->aDb[iDb]
6110: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  .zName;.    if( 
6120: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
6130: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
6140: 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
6150: 41 42 4c 45 28 69 73 54 65 6d 70 29 2c 20 30 2c  ABLE(isTemp), 0,
6160: 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67   zDb) ){.      g
6170: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6180: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6190: 20 69 66 28 20 69 73 56 69 65 77 20 29 7b 0a 20   if( isView ){. 
61a0: 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
61b0: 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20  EMPDB && isTemp 
61c0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
61d0: 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
61e0: 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  TEMP_VIEW;.     
61f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6200: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
6210: 45 41 54 45 5f 56 49 45 57 3b 0a 20 20 20 20 20  EATE_VIEW;.     
6220: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
6230: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
6240: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
6250: 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d  {.        code =
6260: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
6270: 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20  EMP_TABLE;.     
6280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6290: 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 43 52  code = SQLITE_CR
62a0: 45 41 54 45 5f 54 41 42 4c 45 3b 0a 20 20 20 20  EATE_TABLE;.    
62b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
62c0: 28 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20  ( !isVirtual && 
62d0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
62e0: 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 7a  (pParse, code, z
62f0: 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b  Name, 0, zDb) ){
6300: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67 69  .      goto begi
6310: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6320: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
6330: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6340: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 6e 61  the new table na
6350: 6d 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c  me does not coll
6360: 69 64 65 20 77 69 74 68 20 61 6e 20 65 78 69 73  ide with an exis
6370: 74 69 6e 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20  ting.  ** index 
6380: 6f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e  or table name in
6390: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
63a0: 73 65 2e 20 20 49 73 73 75 65 20 61 6e 20 65 72  se.  Issue an er
63b0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 66 0a 20  ror message if. 
63c0: 20 2a 2a 20 69 74 20 64 6f 65 73 2e 20 54 68 65   ** it does. The
63d0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
63e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 62   the statement b
63f0: 65 69 6e 67 20 70 61 72 73 65 64 20 77 61 73 20  eing parsed was 
6400: 70 61 73 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61  passed.  ** to a
6410: 6e 20 73 71 6c 69 74 65 33 5f 64 65 63 6c 61 72  n sqlite3_declar
6420: 65 5f 76 74 61 62 28 29 20 63 61 6c 6c 2e 20 49  e_vtab() call. I
6430: 6e 20 74 68 61 74 20 63 61 73 65 20 6f 6e 6c 79  n that case only
6440: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6450: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 79 70 65 73  s.  ** and types
6460: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 73   will be used, s
6470: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  o there is no ne
6480: 65 64 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6e  ed to test for n
6490: 61 6d 65 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f  amespace.  ** co
64a0: 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  llisions..  */. 
64b0: 20 69 66 28 20 21 49 4e 5f 44 45 43 4c 41 52 45   if( !IN_DECLARE
64c0: 5f 56 54 41 42 20 29 7b 0a 20 20 20 20 69 66 28  _VTAB ){.    if(
64d0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
64e0: 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70 50  te3ReadSchema(pP
64f0: 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67  arse) ){.      g
6500: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
6510: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
6520: 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65   pTable = sqlite
6530: 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
6540: 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 44  Name, db->aDb[iD
6550: 62 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69  b].zName);.    i
6560: 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20  f( pTable ){.   
6570: 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b     if( !noErr ){
6580: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
6590: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
65a0: 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61   "table %T alrea
65b0: 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d  dy exists", pNam
65c0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
65d0: 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62    goto begin_tab
65e0: 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  le_error;.    }.
65f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
6600: 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61  indIndex(db, zNa
6610: 6d 65 2c 20 30 29 21 3d 30 20 26 26 20 28 69 44  me, 0)!=0 && (iD
6620: 62 3d 3d 30 20 7c 7c 20 21 64 62 2d 3e 69 6e 69  b==0 || !db->ini
6630: 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20  t.busy) ){.     
6640: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6650: 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65 20  (pParse, "there 
6660: 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  is already an in
6670: 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a  dex named %s", z
6680: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  Name);.      got
6690: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
66a0: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ror;.    }.  }..
66b0: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
66c0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
66d0: 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29  b, sizeof(Table)
66e0: 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d  );.  if( pTable=
66f0: 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  =0 ){.    db->ma
6700: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
6710: 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d      pParse->rc =
6720: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
6730: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
6740: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69  +;.    goto begi
6750: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20  n_table_error;. 
6760: 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61   }.  pTable->zNa
6770: 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54  me = zName;.  pT
6780: 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31  able->iPKey = -1
6790: 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68  ;.  pTable->pSch
67a0: 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  ema = db->aDb[iD
67b0: 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54  b].pSchema;.  pT
67c0: 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a  able->nRef = 1;.
67d0: 20 20 70 54 61 62 6c 65 2d 3e 64 62 4d 65 6d 20    pTable->dbMem 
67e0: 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  = db->lookaside.
67f0: 62 45 6e 61 62 6c 65 64 20 3f 20 64 62 20 3a 20  bEnabled ? db : 
6800: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
6810: 3e 70 4e 65 77 54 61 62 6c 65 20 29 20 73 71 6c  >pNewTable ) sql
6820: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
6830: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
6840: 65 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e  e);.  pParse->pN
6850: 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65  ewTable = pTable
6860: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
6870: 69 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c  is the magic sql
6880: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
6890: 6c 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69  le used by autoi
68a0: 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74  ncrement,.  ** t
68b0: 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69  hen record a poi
68c0: 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62  nter to this tab
68d0: 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64  le in the main d
68e0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
68f0: 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49  e.  ** so that I
6900: 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74  NSERT can find t
6910: 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e  he table easily.
6920: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
6930: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
6940: 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  CREMENT.  if( !p
6950: 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26  Parse->nested &&
6960: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22   strcmp(zName, "
6970: 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
6980: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 54 61 62  )==0 ){.    pTab
6990: 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65  le->pSchema->pSe
69a0: 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a 20  qTab = pTable;. 
69b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
69c0: 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e 67  Begin generating
69d0: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 77   the code that w
69e0: 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20 74  ill insert the t
69f0: 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  able record into
6a00: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  .  ** the SQLITE
6a10: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
6a20: 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75 6c  Note in particul
6a30: 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74 20  ar that we must 
6a40: 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61 6e  go ahead.  ** an
6a50: 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 72  d allocate the r
6a60: 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72  ecord number for
6a70: 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79   the table entry
6a80: 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61 6e   now.  Before an
6a90: 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b  y.  ** PRIMARY K
6aa0: 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65 79  EY or UNIQUE key
6ab0: 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65 64  words are parsed
6ac0: 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72 64  .  Those keyword
6ad0: 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20 2a  s will cause.  *
6ae0: 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65 20  * indices to be 
6af0: 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65 20  created and the 
6b00: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75 73  table record mus
6b10: 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74 68  t come before th
6b20: 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 2e  e .  ** indices.
6b30: 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65 63    Hence, the rec
6b40: 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  ord number for t
6b50: 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62 65  he table must be
6b60: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a 20   allocated.  ** 
6b70: 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
6b80: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26  !db->init.busy &
6b90: 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47 65  & (v = sqlite3Ge
6ba0: 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21 3d  tVdbe(pParse))!=
6bb0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 31 3b  0 ){.    int j1;
6bc0: 0a 20 20 20 20 69 6e 74 20 66 69 6c 65 46 6f 72  .    int fileFor
6bd0: 6d 61 74 3b 0a 20 20 20 20 69 6e 74 20 72 65 67  mat;.    int reg
6be0: 31 2c 20 72 65 67 32 2c 20 72 65 67 33 3b 0a 20  1, reg2, reg3;. 
6bf0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57     sqlite3BeginW
6c00: 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
6c10: 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 0a  arse, 0, iDb);..
6c20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6c30: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
6c40: 0a 20 20 20 20 69 66 28 20 69 73 56 69 72 74 75  .    if( isVirtu
6c50: 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  al ){.      sqli
6c60: 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c  te3VdbeAddOp0(v,
6c70: 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 20   OP_VBegin);.   
6c80: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
6c90: 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 66 6f  * If the file fo
6ca0: 72 6d 61 74 20 61 6e 64 20 65 6e 63 6f 64 69 6e  rmat and encodin
6cb0: 67 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  g in the databas
6cc0: 65 20 68 61 76 65 20 6e 6f 74 20 62 65 65 6e 20  e have not been 
6cd0: 73 65 74 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74  set, .    ** set
6ce0: 20 74 68 65 6d 20 6e 6f 77 2e 0a 20 20 20 20 2a   them now..    *
6cf0: 2f 0a 20 20 20 20 72 65 67 31 20 3d 20 70 50 61  /.    reg1 = pPa
6d00: 72 73 65 2d 3e 72 65 67 52 6f 77 69 64 20 3d 20  rse->regRowid = 
6d10: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
6d20: 20 20 20 20 72 65 67 32 20 3d 20 70 50 61 72 73      reg2 = pPars
6d30: 65 2d 3e 72 65 67 52 6f 6f 74 20 3d 20 2b 2b 70  e->regRoot = ++p
6d40: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
6d50: 20 72 65 67 33 20 3d 20 2b 2b 70 50 61 72 73 65   reg3 = ++pParse
6d60: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
6d70: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
6d80: 20 4f 50 5f 52 65 61 64 43 6f 6f 6b 69 65 2c 20   OP_ReadCookie, 
6d90: 69 44 62 2c 20 72 65 67 33 2c 20 31 29 3b 20 20  iDb, reg3, 1);  
6da0: 20 2f 2a 20 66 69 6c 65 5f 66 6f 72 6d 61 74 20   /* file_format 
6db0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
6dc0: 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69  beUsesBtree(v, i
6dd0: 44 62 29 3b 0a 20 20 20 20 6a 31 20 3d 20 73 71  Db);.    j1 = sq
6de0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
6df0: 76 2c 20 4f 50 5f 49 66 2c 20 72 65 67 33 29 3b  v, OP_If, reg3);
6e00: 0a 20 20 20 20 66 69 6c 65 46 6f 72 6d 61 74 20  .    fileFormat 
6e10: 3d 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  = (db->flags & S
6e20: 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
6e30: 46 6d 74 29 21 3d 30 20 3f 0a 20 20 20 20 20 20  Fmt)!=0 ?.      
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 31 20 3a 20              1 : 
6e50: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 49 4c 45 5f  SQLITE_MAX_FILE_
6e60: 46 4f 52 4d 41 54 3b 0a 20 20 20 20 73 71 6c 69  FORMAT;.    sqli
6e70: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
6e80: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 66 69 6c   OP_Integer, fil
6e90: 65 46 6f 72 6d 61 74 2c 20 72 65 67 33 29 3b 0a  eFormat, reg3);.
6ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
6eb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
6ec0: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 31 2c 20 72  ookie, iDb, 1, r
6ed0: 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg3);.    sqlite
6ee0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
6ef0: 50 5f 49 6e 74 65 67 65 72 2c 20 45 4e 43 28 64  P_Integer, ENC(d
6f00: 62 29 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  b), reg3);.    s
6f10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
6f20: 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65  (v, OP_SetCookie
6f30: 2c 20 69 44 62 2c 20 34 2c 20 72 65 67 33 29 3b  , iDb, 4, reg3);
6f40: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6f50: 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a 31 29 3b  JumpHere(v, j1);
6f60: 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 6a 75  ..    /* This ju
6f70: 73 74 20 63 72 65 61 74 65 73 20 61 20 70 6c 61  st creates a pla
6f80: 63 65 2d 68 6f 6c 64 65 72 20 72 65 63 6f 72 64  ce-holder record
6f90: 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   in the sqlite_m
6fa0: 61 73 74 65 72 20 74 61 62 6c 65 2e 0a 20 20 20  aster table..   
6fb0: 20 2a 2a 20 54 68 65 20 72 65 63 6f 72 64 20 63   ** The record c
6fc0: 72 65 61 74 65 64 20 64 6f 65 73 20 6e 6f 74 20  reated does not 
6fd0: 63 6f 6e 74 61 69 6e 20 61 6e 79 74 68 69 6e 67  contain anything
6fe0: 20 79 65 74 2e 20 20 49 74 20 77 69 6c 6c 20 62   yet.  It will b
6ff0: 65 20 72 65 70 6c 61 63 65 64 0a 20 20 20 20 2a  e replaced.    *
7000: 2a 20 62 79 20 74 68 65 20 72 65 61 6c 20 65 6e  * by the real en
7010: 74 72 79 20 69 6e 20 63 6f 64 65 20 67 65 6e 65  try in code gene
7020: 72 61 74 65 64 20 61 74 20 73 71 6c 69 74 65 33  rated at sqlite3
7030: 45 6e 64 54 61 62 6c 65 28 29 2e 0a 20 20 20 20  EndTable()..    
7040: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  **.    ** The ro
7050: 77 69 64 20 66 6f 72 20 74 68 65 20 6e 65 77 20  wid for the new 
7060: 65 6e 74 72 79 20 69 73 20 6c 65 66 74 20 69 6e  entry is left in
7070: 20 72 65 67 69 73 74 65 72 20 70 50 61 72 73 65   register pParse
7080: 2d 3e 72 65 67 52 6f 77 69 64 2e 0a 20 20 20 20  ->regRowid..    
7090: 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  ** The root page
70a0: 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
70b0: 65 77 20 74 61 62 6c 65 20 69 73 20 6c 65 66 74  ew table is left
70c0: 20 69 6e 20 72 65 67 20 70 50 61 72 73 65 2d 3e   in reg pParse->
70d0: 72 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20  regRoot..    ** 
70e0: 54 68 65 20 72 6f 77 69 64 20 61 6e 64 20 72 6f  The rowid and ro
70f0: 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 76  ot page number v
7100: 61 6c 75 65 73 20 61 72 65 20 6e 65 65 64 65 64  alues are needed
7110: 20 62 79 20 74 68 65 20 63 6f 64 65 20 74 68 61   by the code tha
7120: 74 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  t.    ** sqlite3
7130: 45 6e 64 54 61 62 6c 65 20 77 69 6c 6c 20 67 65  EndTable will ge
7140: 6e 65 72 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23  nerate..    */.#
7150: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7160: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c  TE_OMIT_VIEW) ||
7170: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7180: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
7190: 4c 45 29 0a 20 20 20 20 69 66 28 20 69 73 56 69  LE).    if( isVi
71a0: 65 77 20 7c 7c 20 69 73 56 69 72 74 75 61 6c 20  ew || isVirtual 
71b0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
71c0: 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
71d0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67  _Integer, 0, reg
71e0: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  2);.    }else.#e
71f0: 6e 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20  ndif.    {.     
7200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7210: 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54  p2(v, OP_CreateT
7220: 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29  able, iDb, reg2)
7230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
7240: 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62  te3OpenMasterTab
7250: 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  le(pParse, iDb);
7260: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7270: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77  AddOp2(v, OP_New
7280: 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b  Rowid, 0, reg1);
7290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
72a0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
72b0: 6c 2c 20 30 2c 20 72 65 67 33 29 3b 0a 20 20 20  l, 0, reg3);.   
72c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
72d0: 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 2c  p3(v, OP_Insert,
72e0: 20 30 2c 20 72 65 67 33 2c 20 72 65 67 31 29 3b   0, reg3, reg1);
72f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
7300: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
7310: 41 47 5f 41 50 50 45 4e 44 29 3b 0a 20 20 20 20  AG_APPEND);.    
7320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7330: 30 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 29 3b 0a  0(v, OP_Close);.
7340: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c    }..  /* Normal
7350: 20 28 6e 6f 6e 2d 65 72 72 6f 72 29 20 72 65 74   (non-error) ret
7360: 75 72 6e 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e  urn. */.  return
7370: 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
7380: 72 6f 72 20 6f 63 63 75 72 73 2c 20 77 65 20 6a  ror occurs, we j
7390: 75 6d 70 20 68 65 72 65 20 2a 2f 0a 62 65 67 69  ump here */.begi
73a0: 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3a 0a 20  n_table_error:. 
73b0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
73c0: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 72 65 74  b, zName);.  ret
73d0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
73e0: 69 73 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64  is macro is used
73f0: 20 74 6f 20 63 6f 6d 70 61 72 65 20 74 77 6f 20   to compare two 
7400: 73 74 72 69 6e 67 73 20 69 6e 20 61 20 63 61 73  strings in a cas
7410: 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 6d 61  e-insensitive ma
7420: 6e 6e 65 72 2e 0a 2a 2a 20 49 74 20 69 73 20 73  nner..** It is s
7430: 6c 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74  lightly faster t
7440: 68 61 6e 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69  han calling sqli
7450: 74 65 33 53 74 72 49 43 6d 70 28 29 20 64 69 72  te3StrICmp() dir
7460: 65 63 74 6c 79 2c 20 62 75 74 0a 2a 2a 20 70 72  ectly, but.** pr
7470: 6f 64 75 63 65 73 20 6c 61 72 67 65 72 20 63 6f  oduces larger co
7480: 64 65 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e  de..**.** WARNIN
7490: 47 3a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73  G: This macro is
74a0: 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c 65 20   not compatible 
74b0: 77 69 74 68 20 74 68 65 20 73 74 72 63 6d 70 28  with the strcmp(
74c0: 29 20 66 61 6d 69 6c 79 2e 20 49 74 0a 2a 2a 20  ) family. It.** 
74d0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
74e0: 74 68 65 20 74 77 6f 20 73 74 72 69 6e 67 73 20  the two strings 
74f0: 61 72 65 20 65 71 75 61 6c 2c 20 6f 74 68 65 72  are equal, other
7500: 77 69 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23  wise false..*/.#
7510: 64 65 66 69 6e 65 20 53 54 52 49 43 4d 50 28 78  define STRICMP(x
7520: 2c 20 79 29 20 28 5c 0a 73 71 6c 69 74 65 33 55  , y) (\.sqlite3U
7530: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75 6e  pperToLower[*(un
7540: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28 78  signed char *)(x
7550: 29 5d 3d 3d 20 20 20 5c 0a 73 71 6c 69 74 65 33  )]==   \.sqlite3
7560: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 28 75  UpperToLower[*(u
7570: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 28  nsigned char *)(
7580: 79 29 5d 20 20 20 20 20 5c 0a 26 26 20 73 71 6c  y)]     \.&& sql
7590: 69 74 65 33 53 74 72 49 43 6d 70 28 28 78 29 2b  ite3StrICmp((x)+
75a0: 31 2c 28 79 29 2b 31 29 3d 3d 30 20 29 0a 0a 2f  1,(y)+1)==0 )../
75b0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 63  *.** Add a new c
75c0: 6f 6c 75 6d 6e 20 74 6f 20 74 68 65 20 74 61 62  olumn to the tab
75d0: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  le currently bei
75e0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a  ng constructed..
75f0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72  **.** The parser
7600: 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
7610: 69 6e 65 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ine once for eac
7620: 68 20 63 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61  h column declara
7630: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45  tion.** in a CRE
7640: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
7650: 65 6e 74 2e 20 20 73 71 6c 69 74 65 33 53 74 61  ent.  sqlite3Sta
7660: 72 74 54 61 62 6c 65 28 29 20 67 65 74 73 20 63  rtTable() gets c
7670: 61 6c 6c 65 64 0a 2a 2a 20 66 69 72 73 74 20 74  alled.** first t
7680: 6f 20 67 65 74 20 74 68 69 6e 67 73 20 67 6f 69  o get things goi
7690: 6e 67 2e 20 20 54 68 65 6e 20 74 68 69 73 20 72  ng.  Then this r
76a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
76b0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c   for each.** col
76c0: 75 6d 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  umn..*/.void sql
76d0: 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61  ite3AddColumn(Pa
76e0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
76f0: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61  en *pName){.  Ta
7700: 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  ble *p;.  int i;
7710: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f  .  char *z;.  Co
7720: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
7730: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7740: 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 70  se->db;.  if( (p
7750: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
7760: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
7770: 6e 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  n;.#if SQLITE_MA
7780: 58 5f 43 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70  X_COLUMN.  if( p
7790: 2d 3e 6e 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69  ->nCol+1>db->aLi
77a0: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
77b0: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
77c0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
77d0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
77e0: 79 20 63 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22  y columns on %s"
77f0: 2c 20 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  , p->zName);.   
7800: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e   return;.  }.#en
7810: 64 69 66 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  dif.  z = sqlite
7820: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
7830: 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
7840: 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   z==0 ) return;.
7850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
7860: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
7870: 69 66 28 20 53 54 52 49 43 4d 50 28 7a 2c 20 70  if( STRICMP(z, p
7880: 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  ->aCol[i].zName)
7890: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
78a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
78b0: 2c 20 22 64 75 70 6c 69 63 61 74 65 20 63 6f 6c  , "duplicate col
78c0: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a  umn name: %s", z
78d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
78e0: 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20  DbFree(db, z);. 
78f0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
7900: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 2d   }.  }.  if( (p-
7910: 3e 6e 43 6f 6c 20 26 20 30 78 37 29 3d 3d 30 20  >nCol & 0x7)==0 
7920: 29 7b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 61  ){.    Column *a
7930: 4e 65 77 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  New;.    aNew = 
7940: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
7950: 28 64 62 2c 70 2d 3e 61 43 6f 6c 2c 28 70 2d 3e  (db,p->aCol,(p->
7960: 6e 43 6f 6c 2b 38 29 2a 73 69 7a 65 6f 66 28 70  nCol+8)*sizeof(p
7970: 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  ->aCol[0]));.   
7980: 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a   if( aNew==0 ){.
7990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
79a0: 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
79b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
79c0: 20 20 20 20 70 2d 3e 61 43 6f 6c 20 3d 20 61 4e      p->aCol = aN
79d0: 65 77 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 20 3d  ew;.  }.  pCol =
79e0: 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f   &p->aCol[p->nCo
79f0: 6c 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f  l];.  memset(pCo
7a00: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  l, 0, sizeof(p->
7a10: 61 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 70 43 6f  aCol[0]));.  pCo
7a20: 6c 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 3b 0a 20 0a  l->zName = z;. .
7a30: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
7a40: 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66 69   no type specifi
7a50: 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76 65  ed, columns have
7a60: 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66 66   the default aff
7a70: 69 6e 69 74 79 0a 20 20 2a 2a 20 27 4e 4f 4e 45  inity.  ** 'NONE
7a80: 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  '. If there is a
7a90: 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64 2c   type specified,
7aa0: 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64 64   then sqlite3Add
7ab0: 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69 6c  ColumnType() wil
7ac0: 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65 64  l.  ** be called
7ad0: 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43 6f   next to set pCo
7ae0: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72 72  l->affinity corr
7af0: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70 43  ectly..  */.  pC
7b00: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  ol->affinity = S
7b10: 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a  QLITE_AFF_NONE;.
7b20: 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b 0a 7d 0a 0a    p->nCol++;.}..
7b30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
7b40: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
7b50: 74 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65  the parser while
7b60: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
7b70: 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43  f.** parsing a C
7b80: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
7b90: 65 6d 65 6e 74 2e 20 20 41 20 22 4e 4f 54 20 4e  ement.  A "NOT N
7ba0: 55 4c 4c 22 20 63 6f 6e 73 74 72 61 69 6e 74 20  ULL" constraint 
7bb0: 68 61 73 0a 2a 2a 20 62 65 65 6e 20 73 65 65 6e  has.** been seen
7bc0: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 54   on a column.  T
7bd0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
7be0: 20 74 68 65 20 6e 6f 74 4e 75 6c 6c 20 66 6c 61   the notNull fla
7bf0: 67 20 6f 6e 0a 2a 2a 20 74 68 65 20 63 6f 6c 75  g on.** the colu
7c00: 6d 6e 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  mn currently und
7c10: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
7c20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
7c30: 41 64 64 4e 6f 74 4e 75 6c 6c 28 50 61 72 73 65  AddNotNull(Parse
7c40: 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 6e   *pParse, int on
7c50: 45 72 72 6f 72 29 7b 0a 20 20 54 61 62 6c 65 20  Error){.  Table 
7c60: 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  *p;.  int i;.  i
7c70: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
7c80: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
7c90: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
7ca0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 69 66 28 20 69  >nCol-1;.  if( i
7cb0: 3e 3d 30 20 29 20 70 2d 3e 61 43 6f 6c 5b 69 5d  >=0 ) p->aCol[i]
7cc0: 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f  .notNull = (u8)o
7cd0: 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nError;.}../*.**
7ce0: 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   Scan the column
7cf0: 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65   type name zType
7d00: 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20   (length nType) 
7d10: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a  and return the.*
7d20: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66 66  * associated aff
7d30: 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a  inity type..**.*
7d40: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
7d50: 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70  oes a case-indep
7d60: 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66  endent search of
7d70: 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a   zType for the .
7d80: 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e  ** substrings in
7d90: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   the following t
7da0: 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20  able. If one of 
7db0: 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20 69  the substrings i
7dc0: 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20  s.** found, the 
7dd0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66  corresponding af
7de0: 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e  finity is return
7df0: 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e  ed. If zType con
7e00: 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68  tains.** more th
7e10: 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75  an one of the su
7e20: 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65  bstrings, entrie
7e30: 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70  s toward the top
7e40: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c   of .** the tabl
7e50: 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e  e take priority.
7e60: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
7e70: 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49   zType is 'BLOBI
7e80: 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  NT', .** SQLITE_
7e90: 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72  AFF_INTEGER is r
7ea0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  eturned..**.** S
7eb0: 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41  ubstring     | A
7ec0: 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d  ffinity.** -----
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27  -----------.** '
7ef0: 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20 53  INT'         | S
7f00: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
7f10: 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20  R.** 'CHAR'     
7f20: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
7f30: 54 45 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20  TEXT.** 'CLOB'  
7f40: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
7f50: 46 46 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54  FF_TEXT.** 'TEXT
7f60: 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54  '        | SQLIT
7f70: 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42  E_AFF_TEXT.** 'B
7f80: 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53 51  LOB'        | SQ
7f90: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 2a 2a  LITE_AFF_NONE.**
7fa0: 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c   'REAL'        |
7fb0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
7fc0: 0a 2a 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20  .** 'FLOA'      
7fd0: 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52    | SQLITE_AFF_R
7fe0: 45 41 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20  EAL.** 'DOUB'   
7ff0: 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46       | SQLITE_AF
8000: 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20  F_REAL.**.** If 
8010: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73  none of the subs
8020: 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62  trings in the ab
8030: 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f  ove table are fo
8040: 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41  und,.** SQLITE_A
8050: 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65  FF_NUMERIC is re
8060: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20  turned..*/.char 
8070: 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54  sqlite3AffinityT
8080: 79 70 65 28 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  ype(const Token 
8090: 2a 70 54 79 70 65 29 7b 0a 20 20 75 33 32 20 68  *pType){.  u32 h
80a0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 61 66 66   = 0;.  char aff
80b0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
80c0: 4d 45 52 49 43 3b 0a 20 20 63 6f 6e 73 74 20 75  MERIC;.  const u
80d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 49  nsigned char *zI
80e0: 6e 20 3d 20 70 54 79 70 65 2d 3e 7a 3b 0a 20 20  n = pType->z;.  
80f0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8100: 68 61 72 20 2a 7a 45 6e 64 20 3d 20 26 70 54 79  har *zEnd = &pTy
8110: 70 65 2d 3e 7a 5b 70 54 79 70 65 2d 3e 6e 5d 3b  pe->z[pType->n];
8120: 0a 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 21 3d  ..  while( zIn!=
8130: 7a 45 6e 64 20 29 7b 0a 20 20 20 20 68 20 3d 20  zEnd ){.    h = 
8140: 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33  (h<<8) + sqlite3
8150: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 2a 7a 49  UpperToLower[*zI
8160: 6e 5d 3b 0a 20 20 20 20 7a 49 6e 2b 2b 3b 0a 20  n];.    zIn++;. 
8170: 20 20 20 69 66 28 20 68 3d 3d 28 28 27 63 27 3c     if( h==(('c'<
8180: 3c 32 34 29 2b 28 27 68 27 3c 3c 31 36 29 2b 28  <24)+('h'<<16)+(
8190: 27 61 27 3c 3c 38 29 2b 27 72 27 29 20 29 7b 20  'a'<<8)+'r') ){ 
81a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
81b0: 48 41 52 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  HAR */.      aff
81c0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
81d0: 58 54 3b 20 0a 20 20 20 20 7d 65 6c 73 65 20 69  XT; .    }else i
81e0: 66 28 20 68 3d 3d 28 28 27 63 27 3c 3c 32 34 29  f( h==(('c'<<24)
81f0: 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c  +('l'<<16)+('o'<
8200: 3c 38 29 2b 27 62 27 29 20 29 7b 20 20 20 20 20  <8)+'b') ){     
8210: 20 20 2f 2a 20 43 4c 4f 42 20 2a 2f 0a 20 20 20    /* CLOB */.   
8220: 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f     aff = SQLITE_
8230: 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65  AFF_TEXT;.    }e
8240: 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27 74 27  lse if( h==(('t'
8250: 3c 3c 32 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b  <<24)+('e'<<16)+
8260: 28 27 78 27 3c 3c 38 29 2b 27 74 27 29 20 29 7b  ('x'<<8)+'t') ){
8270: 20 20 20 20 20 20 20 2f 2a 20 54 45 58 54 20 2a         /* TEXT *
8280: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
8290: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
82a0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
82b0: 28 28 27 62 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('b'<<24)+('l'<
82c0: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
82d0: 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ')          /* B
82e0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26  LOB */.        &
82f0: 26 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  & (aff==SQLITE_A
8300: 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66  FF_NUMERIC || af
8310: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45  f==SQLITE_AFF_RE
8320: 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 61 66 66  AL) ){.      aff
8330: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
8340: 4e 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  NE;.#ifndef SQLI
8350: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
8360: 5f 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65  _POINT.    }else
8370: 20 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32   if( h==(('r'<<2
8380: 34 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61  4)+('e'<<16)+('a
8390: 27 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20  '<<8)+'l')      
83a0: 20 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20      /* REAL */. 
83b0: 20 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53         && aff==S
83c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
83d0: 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d  C ){.      aff =
83e0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c   SQLITE_AFF_REAL
83f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8400: 68 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27  h==(('f'<<24)+('
8410: 6c 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29  l'<<16)+('o'<<8)
8420: 2b 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f  +'a')          /
8430: 2a 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20  * FLOA */.      
8440: 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45    && aff==SQLITE
8450: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a  _AFF_NUMERIC ){.
8460: 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49        aff = SQLI
8470: 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20  TE_AFF_REAL;.   
8480: 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28   }else if( h==((
8490: 27 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31  'd'<<24)+('o'<<1
84a0: 36 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29  6)+('u'<<8)+'b')
84b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55            /* DOU
84c0: 42 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20  B */.        && 
84d0: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
84e0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
84f0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
8500: 46 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20  F_REAL;.#endif. 
8510: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26     }else if( (h&
8520: 30 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27  0x00FFFFFF)==(('
8530: 69 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29  i'<<16)+('n'<<8)
8540: 2b 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49  +'t') ){    /* I
8550: 4e 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20  NT */.      aff 
8560: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
8570: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
8580: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  k;.    }.  }..  
8590: 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f  return aff;.}../
85a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
85b0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
85c0: 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
85d0: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
85e0: 0a 2a 2a 20 70 61 72 73 69 6e 67 20 61 20 43 52  .** parsing a CR
85f0: 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65  EATE TABLE state
8600: 6d 65 6e 74 2e 20 20 54 68 65 20 70 46 69 72 73  ment.  The pFirs
8610: 74 20 74 6f 6b 65 6e 20 69 73 20 74 68 65 20 66  t token is the f
8620: 69 72 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e  irst.** token in
8630: 20 74 68 65 20 73 65 71 75 65 6e 63 65 20 6f 66   the sequence of
8640: 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 64 65 73   tokens that des
8650: 63 72 69 62 65 20 74 68 65 20 74 79 70 65 20 6f  cribe the type o
8660: 66 20 74 68 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20  f the.** column 
8670: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
8680: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 20  construction.   
8690: 70 4c 61 73 74 20 69 73 20 74 68 65 20 6c 61 73  pLast is the las
86a0: 74 20 74 6f 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68  t token.** in th
86b0: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 55 73 65  e sequence.  Use
86c0: 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
86d0: 6e 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20 61  n to construct a
86e0: 20 73 74 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20   string.** that 
86f0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 79 70  contains the typ
8700: 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c  ename of the col
8710: 75 6d 6e 20 61 6e 64 20 73 74 6f 72 65 20 74 68  umn and store th
8720: 61 74 20 73 74 72 69 6e 67 0a 2a 2a 20 69 6e 20  at string.** in 
8730: 7a 54 79 70 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20  zType..*/ .void 
8740: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 75 6d 6e  sqlite3AddColumn
8750: 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61 72  Type(Parse *pPar
8760: 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 79 70 65  se, Token *pType
8770: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
8780: 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d 6e   int i;.  Column
8790: 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65   *pCol;.  sqlite
87a0: 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28 70  3 *db;..  if( (p
87b0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54   = pParse->pNewT
87c0: 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75 72  able)==0 ) retur
87d0: 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f 6c  n;.  i = p->nCol
87e0: 2d 31 3b 0a 20 20 69 66 28 20 69 3c 30 20 29 20  -1;.  if( i<0 ) 
87f0: 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f 6c 20 3d  return;.  pCol =
8800: 20 26 70 2d 3e 61 43 6f 6c 5b 69 5d 3b 0a 20 20   &p->aCol[i];.  
8810: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
8820: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
8830: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  (db, pCol->zType
8840: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  );.  pCol->zType
8850: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
8860: 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 79 70  omToken(db, pTyp
8870: 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66 66 69  e);.  pCol->affi
8880: 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 41 66  nity = sqlite3Af
8890: 66 69 6e 69 74 79 54 79 70 65 28 70 54 79 70 65  finityType(pType
88a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
88b0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 68  expression is th
88c0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
88d0: 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63  for the most rec
88e0: 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c 75  ently added colu
88f0: 6d 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 74 61 62  mn.** of the tab
8900: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
8910: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
8920: 0a 2a 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 76  .**.** Default v
8930: 61 6c 75 65 20 65 78 70 72 65 73 73 69 6f 6e 73  alue expressions
8940: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
8950: 74 2e 20 20 52 61 69 73 65 20 61 6e 20 65 78 63  t.  Raise an exc
8960: 65 70 74 69 6f 6e 20 69 66 20 74 68 69 73 0a 2a  eption if this.*
8970: 2a 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61 73  * is not the cas
8980: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
8990: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
89a0: 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
89b0: 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  ile in the middl
89c0: 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67 20  e of.** parsing 
89d0: 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
89e0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69  tatement..*/.voi
89f0: 64 20 73 71 6c 69 74 65 33 41 64 64 44 65 66 61  d sqlite3AddDefa
8a00: 75 6c 74 56 61 6c 75 65 28 50 61 72 73 65 20 2a  ultValue(Parse *
8a10: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
8a20: 78 70 72 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  xpr){.  Table *p
8a30: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
8a40: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
8a50: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
8a60: 69 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d  if( (p = pParse-
8a70: 3e 70 4e 65 77 54 61 62 6c 65 29 21 3d 30 20 29  >pNewTable)!=0 )
8a80: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
8a90: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8aa0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
8ab0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
8ac0: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 45 78  ntOrFunction(pEx
8ad0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pr) ){.      sql
8ae0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8af0: 72 73 65 2c 20 22 64 65 66 61 75 6c 74 20 76 61  rse, "default va
8b00: 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e 20 5b 25  lue of column [%
8b10: 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 61  s] is not consta
8b20: 6e 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  nt",.          p
8b30: 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Col->zName);.   
8b40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
8b50: 20 41 20 63 6f 70 79 20 6f 66 20 70 45 78 70 72   A copy of pExpr
8b60: 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61 64   is used instead
8b70: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
8b80: 2c 20 61 73 20 70 45 78 70 72 20 63 6f 6e 74 61  , as pExpr conta
8b90: 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 6b  ins.      ** tok
8ba0: 65 6e 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  ens that point t
8bb0: 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65 6d 6f 72  o volatile memor
8bc0: 79 2e 20 54 68 65 20 27 73 70 61 6e 27 20 6f 66  y. The 'span' of
8bd0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
8be0: 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
8bf0: 69 72 65 64 20 62 79 20 70 72 61 67 6d 61 20 74  ired by pragma t
8c00: 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20 20 20 20  able_info..     
8c10: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
8c20: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
8c30: 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20  pCol->pDflt);.  
8c40: 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 20      pCol->pDflt 
8c50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
8c60: 28 64 62 2c 20 70 45 78 70 72 2c 20 45 58 50 52  (db, pExpr, EXPR
8c70: 44 55 50 5f 52 45 44 55 43 45 7c 45 58 50 52 44  DUP_REDUCE|EXPRD
8c80: 55 50 5f 53 50 41 4e 29 3b 0a 20 20 20 20 7d 0a  UP_SPAN);.    }.
8c90: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70    }.  sqlite3Exp
8ca0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
8cb0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73  r);.}../*.** Des
8cc0: 69 67 6e 61 74 65 20 74 68 65 20 50 52 49 4d 41  ignate the PRIMA
8cd0: 52 59 20 4b 45 59 20 66 6f 72 20 74 68 65 20 74  RY KEY for the t
8ce0: 61 62 6c 65 2e 20 20 70 4c 69 73 74 20 69 73 20  able.  pList is 
8cf0: 61 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 20  a list of names 
8d00: 0a 2a 2a 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  .** of columns t
8d10: 68 61 74 20 66 6f 72 6d 20 74 68 65 20 70 72 69  hat form the pri
8d20: 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 70 4c  mary key.  If pL
8d30: 69 73 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ist is NULL, the
8d40: 6e 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65  n the.** most re
8d50: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 63 6f 6c  cently added col
8d60: 75 6d 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  umn of the table
8d70: 20 69 73 20 74 68 65 20 70 72 69 6d 61 72 79 20   is the primary 
8d80: 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 61 62  key..**.** A tab
8d90: 6c 65 20 63 61 6e 20 68 61 76 65 20 61 74 20 6d  le can have at m
8da0: 6f 73 74 20 6f 6e 65 20 70 72 69 6d 61 72 79 20  ost one primary 
8db0: 6b 65 79 2e 20 20 49 66 20 74 68 65 20 74 61 62  key.  If the tab
8dc0: 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 0a 2a  le already has.*
8dd0: 2a 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  * a primary key 
8de0: 28 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65  (and this is the
8df0: 20 73 65 63 6f 6e 64 20 70 72 69 6d 61 72 79 20   second primary 
8e00: 6b 65 79 29 20 74 68 65 6e 20 63 72 65 61 74 65  key) then create
8e10: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a   an.** error..**
8e20: 0a 2a 2a 20 49 66 20 74 68 65 20 50 52 49 4d 41  .** If the PRIMA
8e30: 52 59 20 4b 45 59 20 69 73 20 6f 6e 20 61 20 73  RY KEY is on a s
8e40: 69 6e 67 6c 65 20 63 6f 6c 75 6d 6e 20 77 68 6f  ingle column who
8e50: 73 65 20 64 61 74 61 74 79 70 65 20 69 73 20 49  se datatype is I
8e60: 4e 54 45 47 45 52 2c 0a 2a 2a 20 74 68 65 6e 20  NTEGER,.** then 
8e70: 77 65 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 75  we will try to u
8e80: 73 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  se that column a
8e90: 73 20 74 68 65 20 72 6f 77 69 64 2e 20 20 53 65  s the rowid.  Se
8ea0: 74 20 74 68 65 20 54 61 62 6c 65 2e 69 50 4b 65  t the Table.iPKe
8eb0: 79 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68  y.** field of th
8ec0: 65 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f  e table under co
8ed0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
8ee0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
8ef0: 65 0a 2a 2a 20 49 4e 54 45 47 45 52 20 50 52 49  e.** INTEGER PRI
8f00: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 2e  MARY KEY column.
8f10: 20 20 54 61 62 6c 65 2e 69 50 4b 65 79 20 69 73    Table.iPKey is
8f20: 20 73 65 74 20 74 6f 20 2d 31 20 69 66 20 74 68   set to -1 if th
8f30: 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 49 4e 54  ere is.** no INT
8f40: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8f50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6b  ..**.** If the k
8f60: 65 79 20 69 73 20 6e 6f 74 20 61 6e 20 49 4e 54  ey is not an INT
8f70: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
8f80: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  , then create a 
8f90: 75 6e 69 71 75 65 0a 2a 2a 20 69 6e 64 65 78 20  unique.** index 
8fa0: 66 6f 72 20 74 68 65 20 6b 65 79 2e 20 20 4e 6f  for the key.  No
8fb0: 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74 65   index is create
8fc0: 64 20 66 6f 72 20 49 4e 54 45 47 45 52 20 50 52  d for INTEGER PR
8fd0: 49 4d 41 52 59 20 4b 45 59 73 2e 0a 2a 2f 0a 76  IMARY KEYs..*/.v
8fe0: 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64 50 72  oid sqlite3AddPr
8ff0: 69 6d 61 72 79 4b 65 79 28 0a 20 20 50 61 72 73  imaryKey(.  Pars
9000: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
9010: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9020: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9030: 70 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  pList,  /* List 
9040: 6f 66 20 66 69 65 6c 64 20 6e 61 6d 65 73 20 74  of field names t
9050: 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
9060: 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
9070: 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
9080: 6f 20 77 69 74 68 20 61 20 75 6e 69 71 75 65 6e  o with a uniquen
9090: 65 73 73 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ess conflict */.
90a0: 20 20 69 6e 74 20 61 75 74 6f 49 6e 63 2c 20 20    int autoInc,  
90b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
90c0: 68 65 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  he AUTOINCREMENT
90d0: 20 6b 65 79 77 6f 72 64 20 69 73 20 70 72 65 73   keyword is pres
90e0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ent */.  int sor
90f0: 74 4f 72 64 65 72 20 20 20 20 20 2f 2a 20 53 51  tOrder     /* SQ
9100: 4c 49 54 45 5f 53 4f 5f 41 53 43 20 6f 72 20 53  LITE_SO_ASC or S
9110: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 20 2a 2f  QLITE_SO_DESC */
9120: 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61  .){.  Table *pTa
9130: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  b = pParse->pNew
9140: 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Table;.  char *z
9150: 54 79 70 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Type = 0;.  int 
9160: 69 43 6f 6c 20 3d 20 2d 31 2c 20 69 3b 0a 20 20  iCol = -1, i;.  
9170: 69 66 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 49  if( pTab==0 || I
9180: 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20 29  N_DECLARE_VTAB )
9190: 20 67 6f 74 6f 20 70 72 69 6d 61 72 79 5f 6b 65   goto primary_ke
91a0: 79 5f 65 78 69 74 3b 0a 20 20 69 66 28 20 70 54  y_exit;.  if( pT
91b0: 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
91c0: 46 5f 48 61 73 50 72 69 6d 61 72 79 4b 65 79 20  F_HasPrimaryKey 
91d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
91e0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
91f0: 20 20 20 20 20 20 22 74 61 62 6c 65 20 5c 22 25        "table \"%
9200: 73 5c 22 20 68 61 73 20 6d 6f 72 65 20 74 68 61  s\" has more tha
9210: 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79 20 6b 65  n one primary ke
9220: 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  y", pTab->zName)
9230: 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72 69 6d 61  ;.    goto prima
9240: 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 7d  ry_key_exit;.  }
9250: 0a 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  .  pTab->tabFlag
9260: 73 20 7c 3d 20 54 46 5f 48 61 73 50 72 69 6d 61  s |= TF_HasPrima
9270: 72 79 4b 65 79 3b 0a 20 20 69 66 28 20 70 4c 69  ryKey;.  if( pLi
9280: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 43 6f  st==0 ){.    iCo
9290: 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 2d  l = pTab->nCol -
92a0: 20 31 3b 0a 20 20 20 20 70 54 61 62 2d 3e 61 43   1;.    pTab->aC
92b0: 6f 6c 5b 69 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b  ol[iCol].isPrimK
92c0: 65 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ey = 1;.  }else{
92d0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
92e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
92f0: 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 43  +){.      for(iC
9300: 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61 62 2d  ol=0; iCol<pTab-
9310: 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  >nCol; iCol++){.
9320: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
9330: 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74  te3StrICmp(pList
9340: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 70 54  ->a[i].zName, pT
9350: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a  ab->aCol[iCol].z
9360: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
9370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9380: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9390: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70 54       if( iCol<pT
93a0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
93b0: 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69      pTab->aCol[i
93c0: 43 6f 6c 5d 2e 69 73 50 72 69 6d 4b 65 79 20 3d  Col].isPrimKey =
93d0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
93e0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  }.    if( pList-
93f0: 3e 6e 45 78 70 72 3e 31 20 29 20 69 43 6f 6c 20  >nExpr>1 ) iCol 
9400: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  = -1;.  }.  if( 
9410: 69 43 6f 6c 3e 3d 30 20 26 26 20 69 43 6f 6c 3c  iCol>=0 && iCol<
9420: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
9430: 20 20 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e    zType = pTab->
9440: 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65  aCol[iCol].zType
9450: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 54 79 70  ;.  }.  if( zTyp
9460: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
9470: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
9480: 47 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  GER")==0.       
9490: 20 26 26 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53   && sortOrder==S
94a0: 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
94b0: 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20      pTab->iPKey 
94c0: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62  = iCol;.    pTab
94d0: 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29  ->keyConf = (u8)
94e0: 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73  onError;.    ass
94f0: 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20  ert( autoInc==0 
9500: 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b  || autoInc==1 );
9510: 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c  .    pTab->tabFl
9520: 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54  ags |= autoInc*T
9530: 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  F_Autoincrement;
9540: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74  .  }else if( aut
9550: 6f 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20  oInc ){.#ifndef 
9560: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
9570: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71  INCREMENT.    sq
9580: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
9590: 61 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45  arse, "AUTOINCRE
95a0: 4d 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c  MENT is only all
95b0: 6f 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20  owed on an ".   
95c0: 20 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49      "INTEGER PRI
95d0: 4d 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64  MARY KEY");.#end
95e0: 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
95f0: 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64  sqlite3CreateInd
9600: 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c  ex(pParse, 0, 0,
9610: 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72   0, pList, onErr
9620: 6f 72 2c 20 30 2c 20 30 2c 20 73 6f 72 74 4f 72  or, 0, 0, sortOr
9630: 64 65 72 2c 20 30 29 3b 0a 20 20 20 20 70 4c 69  der, 0);.    pLi
9640: 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69  st = 0;.  }..pri
9650: 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20  mary_key_exit:. 
9660: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
9670: 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64  Delete(pParse->d
9680: 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  b, pList);.  ret
9690: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  urn;.}../*.** Ad
96a0: 64 20 61 20 6e 65 77 20 43 48 45 43 4b 20 63 6f  d a new CHECK co
96b0: 6e 73 74 72 61 69 6e 74 20 74 6f 20 74 68 65 20  nstraint to the 
96c0: 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  table currently 
96d0: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
96e0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
96f0: 74 65 33 41 64 64 43 68 65 63 6b 43 6f 6e 73 74  te3AddCheckConst
9700: 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
9710: 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
9720: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9730: 0a 20 20 45 78 70 72 20 2a 70 43 68 65 63 6b 45  .  Expr *pCheckE
9740: 78 70 72 20 20 2f 2a 20 54 68 65 20 63 68 65 63  xpr  /* The chec
9750: 6b 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  k expression */.
9760: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
9770: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
9780: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
9790: 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65  IT_CHECK.  Table
97a0: 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d   *pTab = pParse-
97b0: 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66  >pNewTable;.  if
97c0: 28 20 70 54 61 62 20 26 26 20 21 49 4e 5f 44 45  ( pTab && !IN_DE
97d0: 43 4c 41 52 45 5f 56 54 41 42 20 29 7b 0a 20 20  CLARE_VTAB ){.  
97e0: 20 20 2f 2a 20 54 68 65 20 43 48 45 43 4b 20 65    /* The CHECK e
97f0: 78 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62  xpression must b
9800: 65 20 64 75 70 6c 69 63 61 74 65 64 20 73 6f 20  e duplicated so 
9810: 74 68 61 74 20 74 6f 6b 65 6e 73 20 72 65 66 65  that tokens refe
9820: 72 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6c 6c  r.    ** to mall
9830: 6f 63 65 64 20 73 70 61 63 65 20 61 6e 64 20 6e  oced space and n
9840: 6f 74 20 74 68 65 20 28 65 70 68 65 6d 65 72 61  ot the (ephemera
9850: 6c 29 20 74 65 78 74 20 6f 66 20 74 68 65 20 43  l) text of the C
9860: 52 45 41 54 45 20 54 41 42 4c 45 0a 20 20 20 20  REATE TABLE.    
9870: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ** statement */.
9880: 20 20 20 20 70 54 61 62 2d 3e 70 43 68 65 63 6b      pTab->pCheck
9890: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
98a0: 64 28 64 62 2c 20 70 54 61 62 2d 3e 70 43 68 65  d(db, pTab->pChe
98b0: 63 6b 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ck, .           
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
98e0: 70 72 44 75 70 28 64 62 2c 20 70 43 68 65 63 6b  prDup(db, pCheck
98f0: 45 78 70 72 2c 20 30 29 29 3b 0a 20 20 7d 0a 23  Expr, 0));.  }.#
9900: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 45  endif.  sqlite3E
9910: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 43  xprDelete(db, pC
9920: 68 65 63 6b 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a  heckExpr);.}../*
9930: 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 6c 6c  .** Set the coll
9940: 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 6f  ation function o
9950: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
9960: 74 6c 79 20 70 61 72 73 65 64 20 74 61 62 6c 65  tly parsed table
9970: 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74 6f 20 74 68   column.** to th
9980: 65 20 43 6f 6c 6c 53 65 71 20 67 69 76 65 6e 2e  e CollSeq given.
9990: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
99a0: 41 64 64 43 6f 6c 6c 61 74 65 54 79 70 65 28 50  AddCollateType(P
99b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
99c0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
99d0: 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74 20  Table *p;.  int 
99e0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  i;.  char *zColl
99f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
9a00: 2a 20 44 65 71 75 6f 74 65 64 20 6e 61 6d 65 20  * Dequoted name 
9a10: 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  of collation seq
9a20: 75 65 6e 63 65 20 2a 2f 0a 20 20 73 71 6c 69 74  uence */.  sqlit
9a30: 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 28  e3 *db;..  if( (
9a40: 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
9a50: 54 61 62 6c 65 29 3d 3d 30 20 29 20 72 65 74 75  Table)==0 ) retu
9a60: 72 6e 3b 0a 20 20 69 20 3d 20 70 2d 3e 6e 43 6f  rn;.  i = p->nCo
9a70: 6c 2d 31 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  l-1;.  db = pPar
9a80: 73 65 2d 3e 64 62 3b 0a 20 20 7a 43 6f 6c 6c 20  se->db;.  zColl 
9a90: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
9aa0: 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 6f 6b 65  mToken(db, pToke
9ab0: 6e 29 3b 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c  n);.  if( !zColl
9ac0: 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66   ) return;..  if
9ad0: 28 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43  ( sqlite3LocateC
9ae0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
9af0: 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Coll, -1) ){.   
9b00: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
9b10: 20 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f    p->aCol[i].zCo
9b20: 6c 6c 20 3d 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20  ll = zColl;.  . 
9b30: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
9b40: 75 6d 6e 20 69 73 20 64 65 63 6c 61 72 65 64 20  umn is declared 
9b50: 61 73 20 22 3c 6e 61 6d 65 3e 20 50 52 49 4d 41  as "<name> PRIMA
9b60: 52 59 20 4b 45 59 20 43 4f 4c 4c 41 54 45 20 3c  RY KEY COLLATE <
9b70: 74 79 70 65 3e 22 2c 0a 20 20 20 20 2a 2a 20 74  type>",.    ** t
9b80: 68 65 6e 20 61 6e 20 69 6e 64 65 78 20 6d 61 79  hen an index may
9b90: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
9ba0: 65 64 20 6f 6e 20 74 68 69 73 20 63 6f 6c 75 6d  ed on this colum
9bb0: 6e 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20  n before the.   
9bc0: 20 2a 2a 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79   ** collation ty
9bd0: 70 65 20 77 61 73 20 61 64 64 65 64 2e 20 43 6f  pe was added. Co
9be0: 72 72 65 63 74 20 74 68 69 73 20 69 66 20 69 74  rrect this if it
9bf0: 20 69 73 20 74 68 65 20 63 61 73 65 2e 0a 20 20   is the case..  
9c00: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 49 64    */.    for(pId
9c10: 78 3d 70 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64  x=p->pIndex; pId
9c20: 78 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e  x; pIdx=pIdx->pN
9c30: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
9c40: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
9c50: 6e 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66  n==1 );.      if
9c60: 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ( pIdx->aiColumn
9c70: 5b 30 5d 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20  [0]==i ){.      
9c80: 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30    pIdx->azColl[0
9c90: 5d 20 3d 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  ] = p->aCol[i].z
9ca0: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Coll;.      }.  
9cb0: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
9cc0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9cd0: 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d  b, zColl);.  }.}
9ce0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
9cf0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68  ction returns th
9d00: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
9d10: 65 6e 63 65 20 66 6f 72 20 64 61 74 61 62 61 73  ence for databas
9d20: 65 20 6e 61 74 69 76 65 20 74 65 78 74 0a 2a 2a  e native text.**
9d30: 20 65 6e 63 6f 64 69 6e 67 20 69 64 65 6e 74 69   encoding identi
9d40: 66 69 65 64 20 62 79 20 74 68 65 20 73 74 72 69  fied by the stri
9d50: 6e 67 20 7a 4e 61 6d 65 2c 20 6c 65 6e 67 74 68  ng zName, length
9d60: 20 6e 4e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   nName..**.** If
9d70: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
9d80: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
9d90: 65 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  e is not availab
9da0: 6c 65 2c 20 6f 72 20 6e 6f 74 20 61 76 61 69 6c  le, or not avail
9db0: 61 62 6c 65 0a 2a 2a 20 69 6e 20 74 68 65 20 64  able.** in the d
9dc0: 61 74 61 62 61 73 65 20 6e 61 74 69 76 65 20 65  atabase native e
9dd0: 6e 63 6f 64 69 6e 67 2c 20 74 68 65 20 63 6f 6c  ncoding, the col
9de0: 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69  lation factory i
9df0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20  s invoked to.** 
9e00: 72 65 71 75 65 73 74 20 69 74 2e 20 49 66 20 74  request it. If t
9e10: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63  he collation fac
9e20: 74 6f 72 79 20 64 6f 65 73 20 6e 6f 74 20 73 75  tory does not su
9e30: 70 70 6c 79 20 73 75 63 68 20 61 20 73 65 71 75  pply such a sequ
9e40: 65 6e 63 65 2c 0a 2a 2a 20 61 6e 64 20 74 68 65  ence,.** and the
9e50: 20 73 65 71 75 65 6e 63 65 20 69 73 20 61 76 61   sequence is ava
9e60: 69 6c 61 62 6c 65 20 69 6e 20 61 6e 6f 74 68 65  ilable in anothe
9e70: 72 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2c  r text encoding,
9e80: 20 74 68 65 6e 20 74 68 61 74 20 69 73 0a 2a 2a   then that is.**
9e90: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
9ea0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76  d..**.** If no v
9eb0: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 72  ersions of the r
9ec0: 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
9ed0: 6f 6e 73 20 73 65 71 75 65 6e 63 65 20 61 72 65  ons sequence are
9ee0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a   available, or.*
9ef0: 2a 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20  * another error 
9f00: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
9f10: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
9f20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 72  error message wr
9f30: 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50  itten into.** pP
9f40: 61 72 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  arse..**.** This
9f50: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 77 72   routine is a wr
9f60: 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c  apper around sql
9f70: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9f80: 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ).  This routine
9f90: 0a 2a 2a 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  .** invokes the 
9fa0: 63 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72  collation factor
9fb0: 79 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 63  y if the named c
9fc0: 6f 6c 6c 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  ollation cannot 
9fd0: 62 65 20 66 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20  be found.** and 
9fe0: 67 65 6e 65 72 61 74 65 73 20 61 6e 20 65 72 72  generates an err
9ff0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 43  or message..*/.C
a000: 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33 4c  ollSeq *sqlite3L
a010: 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 50 61 72  ocateCollSeq(Par
a020: 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
a030: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
a040: 6e 74 20 6e 4e 61 6d 65 29 7b 0a 20 20 73 71 6c  nt nName){.  sql
a050: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
a060: 65 2d 3e 64 62 3b 0a 20 20 75 38 20 65 6e 63 20  e->db;.  u8 enc 
a070: 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 75 38 20  = ENC(db);.  u8 
a080: 69 6e 69 74 62 75 73 79 20 3d 20 64 62 2d 3e 69  initbusy = db->i
a090: 6e 69 74 2e 62 75 73 79 3b 0a 20 20 43 6f 6c 6c  nit.busy;.  Coll
a0a0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 70  Seq *pColl;..  p
a0b0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
a0c0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 65 6e  ndCollSeq(db, en
a0d0: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  c, zName, nName,
a0e0: 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69 66   initbusy);.  if
a0f0: 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20 28  ( !initbusy && (
a100: 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c 6c  !pColl || !pColl
a110: 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20 70  ->xCmp) ){.    p
a120: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65  Coll = sqlite3Ge
a130: 74 43 6f 6c 6c 53 65 71 28 64 62 2c 20 70 43 6f  tCollSeq(db, pCo
a140: 6c 6c 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ll, zName, nName
a150: 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c  );.    if( !pCol
a160: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  l ){.      if( n
a170: 4e 61 6d 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Name<0 ){.      
a180: 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    nName = sqlite
a190: 33 53 74 72 6c 65 6e 28 64 62 2c 20 7a 4e 61 6d  3Strlen(db, zNam
a1a0: 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
a1b0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
a1c0: 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75  g(pParse, "no su
a1d0: 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ch collation seq
a1e0: 75 65 6e 63 65 3a 20 25 2e 2a 73 22 2c 20 6e 4e  uence: %.*s", nN
a1f0: 61 6d 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  ame, zName);.   
a200: 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     pColl = 0;.  
a210: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
a220: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f 2a 0a  n pColl;.}.../*.
a230: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
a240: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63 72 65   that will incre
a250: 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d 61 20  ment the schema 
a260: 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cookie..**.** Th
a270: 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20  e schema cookie 
a280: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
a290: 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20 73 63  mine when the sc
a2a0: 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a 2a 20  hema for the.** 
a2b0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
a2c0: 2e 20 20 41 66 74 65 72 20 65 61 63 68 20 73 63  .  After each sc
a2d0: 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74 68 65  hema change, the
a2e0: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a 2a 2a   cookie value.**
a2f0: 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65 6e 20   changes.  When 
a300: 61 20 70 72 6f 63 65 73 73 20 66 69 72 73 74 20  a process first 
a310: 72 65 61 64 73 20 74 68 65 20 73 63 68 65 6d 61  reads the schema
a320: 20 69 74 20 72 65 63 6f 72 64 73 20 74 68 65 0a   it records the.
a330: 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68 65 72  ** cookie.  Ther
a340: 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76 65 72  eafter, whenever
a350: 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63 63 65   it goes to acce
a360: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ss the database,
a370: 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20 74 68  .** it checks th
a380: 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61 6b 65  e cookie to make
a390: 20 73 75 72 65 20 74 68 65 20 73 63 68 65 6d 61   sure the schema
a3a0: 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67 65 64   has not changed
a3b0: 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77 61 73  .** since it was
a3c0: 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a 0a 2a   last read..**.*
a3d0: 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73 20 6e  * This plan is n
a3e0: 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 62 75  ot completely bu
a3f0: 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49 74 20  llet-proof.  It 
a400: 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 0a  is possible for.
a410: 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 74 6f  ** the schema to
a420: 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70 6c 65   change multiple
a430: 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72 20 74   times and for t
a440: 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62 65 0a  he cookie to be.
a450: 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f 20 70  ** set back to p
a460: 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42 75 74  rior value.  But
a470: 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65 73 20   schema changes 
a480: 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74 0a 2a  are infrequent.*
a490: 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62 61 62  * and the probab
a4a0: 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69 6e 67  ility of hitting
a4b0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b 69 65   the same cookie
a4c0: 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79 0a 2a   value is only.*
a4d0: 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20 32 5e  * 1 chance in 2^
a4e0: 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20 73 61  32.  So we're sa
a4f0: 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a 76 6f  fe enough..*/.vo
a500: 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65  id sqlite3Change
a510: 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a 70 50  Cookie(Parse *pP
a520: 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  arse, int iDb){.
a530: 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74    int r1 = sqlit
a540: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
a550: 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 20  rse);.  sqlite3 
a560: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
a570: 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  ;.  Vdbe *v = pP
a580: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 73  arse->pVdbe;.  s
a590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
a5a0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a5b0: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63  db->aDb[iDb].pSc
a5c0: 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f 6f  hema->schema_coo
a5d0: 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20 73 71  kie+1, r1);.  sq
a5e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
a5f0: 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
a600: 20 69 44 62 2c 20 30 2c 20 72 31 29 3b 0a 20 20   iDb, 0, r1);.  
a610: 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
a620: 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31  mpReg(pParse, r1
a630: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 61 73  );.}../*.** Meas
a640: 75 72 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ure the number o
a650: 66 20 63 68 61 72 61 63 74 65 72 73 20 6e 65 65  f characters nee
a660: 64 65 64 20 74 6f 20 6f 75 74 70 75 74 20 74 68  ded to output th
a670: 65 20 67 69 76 65 6e 0a 2a 2a 20 69 64 65 6e 74  e given.** ident
a680: 69 66 69 65 72 2e 20 20 54 68 65 20 6e 75 6d 62  ifier.  The numb
a690: 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e 63 6c  er returned incl
a6a0: 75 64 65 73 20 61 6e 79 20 71 75 6f 74 65 73 20  udes any quotes 
a6b0: 75 73 65 64 0a 2a 2a 20 62 75 74 20 64 6f 65 73  used.** but does
a6c0: 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65   not include the
a6d0: 20 6e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 6f 72   null terminator
a6e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 73 74 69  ..**.** The esti
a6f0: 6d 61 74 65 20 69 73 20 63 6f 6e 73 65 72 76 61  mate is conserva
a700: 74 69 76 65 2e 20 20 49 74 20 6d 69 67 68 74 20  tive.  It might 
a710: 62 65 20 6c 61 72 67 65 72 20 74 68 61 74 20 77  be larger that w
a720: 68 61 74 20 69 73 0a 2a 2a 20 72 65 61 6c 6c 79  hat is.** really
a730: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
a740: 69 63 20 69 6e 74 20 69 64 65 6e 74 4c 65 6e 67  ic int identLeng
a750: 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  th(const char *z
a760: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f  ){.  int n;.  fo
a770: 72 28 6e 3d 30 3b 20 2a 7a 3b 20 6e 2b 2b 2c 20  r(n=0; *z; n++, 
a780: 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a  z++){.    if( *z
a790: 3d 3d 27 22 27 20 29 7b 20 6e 2b 2b 3b 20 7d 0a  =='"' ){ n++; }.
a7a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
a7b0: 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   2;.}../*.** Thi
a7c0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
a7d0: 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 73  wrapper around s
a7e0: 71 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e 28 29  qlite3GetToken()
a7f0: 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 69 73 56   used by .** isV
a800: 61 6c 69 64 44 69 6d 65 6e 73 69 6f 6e 28 29 2e  alidDimension().
a810: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
a820: 69 66 66 65 72 73 20 66 72 6f 6d 20 73 71 6c 69  iffers from sqli
a830: 74 65 33 47 65 74 54 6f 6b 65 6e 28 29 20 69 6e  te3GetToken() in
a840: 0a 2a 2a 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  .** that:.**.** 
a850: 20 20 2a 20 57 68 69 74 65 73 70 61 63 65 20 69    * Whitespace i
a860: 73 20 69 67 6e 6f 72 65 64 2c 20 61 6e 64 0a 2a  s ignored, and.*
a870: 2a 20 20 20 2a 20 54 68 65 20 6f 75 74 70 75 74  *   * The output
a880: 20 76 61 72 69 61 62 6c 65 20 2a 70 65 54 6f 6b   variable *peTok
a890: 65 6e 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  en is set to 0 i
a8a0: 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
a8b0: 0a 2a 2a 20 20 20 20 20 6e 75 6c 2d 74 65 72 6d  .**     nul-term
a8c0: 69 6e 61 74 65 64 20 69 6e 70 75 74 20 73 74 72  inated input str
a8d0: 69 6e 67 20 69 73 20 72 65 61 63 68 65 64 2e 0a  ing is reached..
a8e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
a8f0: 74 54 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 75 6e  tTokenNoSpace(un
a900: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20  signed char *z, 
a910: 69 6e 74 20 2a 70 65 54 6f 6b 65 6e 29 7b 0a 20  int *peToken){. 
a920: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68   int n = 0;.  wh
a930: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
a940: 61 63 65 28 7a 5b 6e 5d 29 20 29 20 6e 2b 2b 3b  ace(z[n]) ) n++;
a950: 0a 20 20 69 66 28 20 21 7a 5b 6e 5d 20 29 7b 0a  .  if( !z[n] ){.
a960: 20 20 20 20 2a 70 65 54 6f 6b 65 6e 20 3d 20 30      *peToken = 0
a970: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
a980: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 20 2b    }.  return n +
a990: 20 73 71 6c 69 74 65 33 47 65 74 54 6f 6b 65 6e   sqlite3GetToken
a9a0: 28 26 7a 5b 6e 5d 2c 20 70 65 54 6f 6b 65 6e 29  (&z[n], peToken)
a9b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
a9c0: 65 74 65 72 20 7a 20 70 6f 69 6e 74 73 20 74 6f  eter z points to
a9d0: 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
a9e0: 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75 72 6e  d string. Return
a9f0: 20 74 72 75 65 20 69 66 2c 20 77 68 65 6e 0a 2a   true if, when.*
aa00: 2a 20 77 68 69 74 65 73 70 61 63 65 20 69 73 20  * whitespace is 
aa10: 69 67 6e 6f 72 65 64 2c 20 74 68 65 20 63 6f 6e  ignored, the con
aa20: 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 73 74  tents of this st
aa30: 72 69 6e 67 20 6d 61 74 63 68 65 73 20 6f 6e 65  ring matches one
aa40: 20 6f 66 20 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c   of .** the foll
aa50: 6f 77 69 6e 67 20 70 61 74 74 65 72 6e 73 3a 0a  owing patterns:.
aa60: 2a 2a 0a 2a 2a 20 20 20 20 20 22 22 0a 2a 2a 20  **.**     "".** 
aa70: 20 20 20 20 22 28 6e 75 6d 62 65 72 29 22 0a 2a      "(number)".*
aa80: 2a 20 20 20 20 20 22 28 6e 75 6d 62 65 72 2c 6e  *     "(number,n
aa90: 75 6d 62 65 72 29 22 0a 2a 2f 0a 73 74 61 74 69  umber)".*/.stati
aaa0: 63 20 69 6e 74 20 69 73 56 61 6c 69 64 44 69 6d  c int isValidDim
aab0: 65 6e 73 69 6f 6e 28 75 6e 73 69 67 6e 65 64 20  ension(unsigned 
aac0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
aad0: 65 54 6f 6b 65 6e 3b 0a 20 20 69 6e 74 20 6e 20  eToken;.  int n 
aae0: 3d 20 30 3b 0a 20 20 6e 20 2b 3d 20 67 65 74 54  = 0;.  n += getT
aaf0: 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a 5b 6e  okenNoSpace(&z[n
ab00: 5d 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20 20 69  ], &eToken);.  i
ab10: 66 28 20 65 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( eToken ){.   
ab20: 20 69 66 28 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f   if( eToken!=TK_
ab30: 4c 50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  LP ) return 0;. 
ab40: 20 20 20 6e 20 2b 3d 20 67 65 74 54 6f 6b 65 6e     n += getToken
ab50: 4e 6f 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20 26  NoSpace(&z[n], &
ab60: 65 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  eToken);.    if(
ab70: 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 50 4c 55 53   eToken==TK_PLUS
ab80: 20 7c 7c 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 4d   || eToken==TK_M
ab90: 49 4e 55 53 20 29 7b 0a 20 20 20 20 20 20 6e 20  INUS ){.      n 
aba0: 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61  += getTokenNoSpa
abb0: 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65  ce(&z[n], &eToke
abc0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
abd0: 28 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f 49 4e 54  ( eToken!=TK_INT
abe0: 45 47 45 52 20 26 26 20 65 54 6f 6b 65 6e 21 3d  EGER && eToken!=
abf0: 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74 75 72  TK_FLOAT ) retur
ac00: 6e 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65  n 0;.    n += ge
ac10: 74 54 6f 6b 65 6e 4e 6f 53 70 61 63 65 28 26 7a  tTokenNoSpace(&z
ac20: 5b 6e 5d 2c 20 26 65 54 6f 6b 65 6e 29 3b 0a 20  [n], &eToken);. 
ac30: 20 20 20 69 66 28 20 65 54 6f 6b 65 6e 3d 3d 54     if( eToken==T
ac40: 4b 5f 43 4f 4d 4d 41 20 29 7b 0a 20 20 20 20 20  K_COMMA ){.     
ac50: 20 6e 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f   n += getTokenNo
ac60: 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54  Space(&z[n], &eT
ac70: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  oken);.      if(
ac80: 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 50 4c 55 53   eToken==TK_PLUS
ac90: 20 7c 7c 20 65 54 6f 6b 65 6e 3d 3d 54 4b 5f 4d   || eToken==TK_M
aca0: 49 4e 55 53 20 29 7b 0a 20 20 20 20 20 20 20 20  INUS ){.        
acb0: 6e 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f 53  n += getTokenNoS
acc0: 70 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f  pace(&z[n], &eTo
acd0: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ken);.      }.  
ace0: 20 20 20 20 69 66 28 20 65 54 6f 6b 65 6e 21 3d      if( eToken!=
acf0: 54 4b 5f 49 4e 54 45 47 45 52 20 26 26 20 65 54  TK_INTEGER && eT
ad00: 6f 6b 65 6e 21 3d 54 4b 5f 46 4c 4f 41 54 20 29  oken!=TK_FLOAT )
ad10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
ad20: 20 6e 20 2b 3d 20 67 65 74 54 6f 6b 65 6e 4e 6f   n += getTokenNo
ad30: 53 70 61 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54  Space(&z[n], &eT
ad40: 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  oken);.    }.   
ad50: 20 69 66 28 20 65 54 6f 6b 65 6e 21 3d 54 4b 5f   if( eToken!=TK_
ad60: 52 50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  RP ) return 0;. 
ad70: 20 20 20 67 65 74 54 6f 6b 65 6e 4e 6f 53 70 61     getTokenNoSpa
ad80: 63 65 28 26 7a 5b 6e 5d 2c 20 26 65 54 6f 6b 65  ce(&z[n], &eToke
ad90: 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 54  n);.  }.  if( eT
ada0: 6f 6b 65 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  oken ) return 0;
adb0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
adc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
add0: 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70  parameter is a p
ade0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74  ointer to an out
adf0: 70 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20  put buffer. The 
ae00: 73 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d  second .** param
ae10: 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65  eter is a pointe
ae20: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
ae30: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
ae40: 65 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77  e offset at.** w
ae50: 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e  hich to write in
ae60: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
ae70: 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  ffer. This funct
ae80: 69 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a  ion copies the.*
ae90: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * nul-terminated
aea0: 20 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20   string pointed 
aeb0: 74 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20  to by the third 
aec0: 70 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e  parameter, zSign
aed0: 65 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74  edIdent,.** to t
aee0: 68 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66  he specified off
aef0: 73 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65  set in the buffe
af00: 72 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70  r and updates *p
af10: 49 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20  Idx to refer.** 
af20: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
af30: 65 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74  e after the last
af40: 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65   byte written be
af50: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
af60: 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74  ** .** If the st
af70: 72 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e  ring zSignedIden
af80: 74 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72  t consists entir
af90: 65 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d  ely of alpha-num
afa0: 65 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65  eric.** characte
afb0: 72 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67  rs, does not beg
afc0: 69 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20  in with a digit 
afd0: 61 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51  and is not an SQ
afe0: 4c 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68  L keyword,.** th
aff0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
b000: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  to the output bu
b010: 66 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20  ffer exactly as 
b020: 69 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65  it is. Otherwise
b030: 2c 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65  ,.** it is quote
b040: 64 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71  d using double-q
b050: 75 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  uotes..*/.static
b060: 20 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63   void identPut(c
b070: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64  har *z, int *pId
b080: 78 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64  x, char *zSigned
b090: 49 64 65 6e 74 2c 20 69 6e 74 20 69 73 54 79 70  Ident, int isTyp
b0a0: 65 6e 61 6d 65 29 7b 0a 20 20 75 6e 73 69 67 6e  ename){.  unsign
b0b0: 65 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20  ed char *zIdent 
b0c0: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
b0d0: 2a 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a  *)zSignedIdent;.
b0e0: 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64    int i, j, need
b0f0: 51 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49  Quote;.  i = *pI
b100: 64 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  dx;..  for(j=0; 
b110: 7a 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b  zIdent[j]; j++){
b120: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
b130: 33 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b  3Isalnum(zIdent[
b140: 6a 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d  j]) && zIdent[j]
b150: 21 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20  !='_' ) break;. 
b160: 20 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d   }.  needQuote =
b170: 20 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28   sqlite3Isdigit(
b180: 7a 49 64 65 6e 74 5b 30 5d 29 20 7c 7c 20 73 71  zIdent[0]) || sq
b190: 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
b1a0: 28 7a 49 64 65 6e 74 2c 20 6a 29 21 3d 54 4b 5f  (zIdent, j)!=TK_
b1b0: 49 44 3b 0a 20 20 69 66 28 20 21 6e 65 65 64 51  ID;.  if( !needQ
b1c0: 75 6f 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20  uote ){.    if( 
b1d0: 69 73 54 79 70 65 6e 61 6d 65 20 29 7b 0a 20 20  isTypename ){.  
b1e0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
b1f0: 73 20 61 20 74 79 70 65 2d 6e 61 6d 65 2c 20 61  s a type-name, a
b200: 6c 6c 6f 77 20 61 20 6c 69 74 74 6c 65 20 6d 6f  llow a little mo
b210: 72 65 20 66 6c 65 78 69 62 69 6c 69 74 79 2e 20  re flexibility. 
b220: 49 6e 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20  In SQLite,.     
b230: 20 2a 2a 20 61 20 74 79 70 65 2d 6e 61 6d 65 20   ** a type-name 
b240: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 3a  is specified as:
b250: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
b260: 2a 2a 20 20 20 69 64 73 20 5b 69 64 73 5d 20 5b  **   ids [ids] [
b270: 28 6e 75 6d 62 65 72 20 5b 2c 20 6e 75 6d 62 65  (number [, numbe
b280: 72 5d 29 5d 0a 20 20 20 20 20 20 2a 2a 0a 20 20  r])].      **.  
b290: 20 20 20 20 2a 2a 20 77 68 65 72 65 20 22 69 64      ** where "id
b2a0: 73 22 20 69 73 20 65 69 74 68 65 72 20 61 20 71  s" is either a q
b2b0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 6f 72 20  uoted string or 
b2c0: 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69 66  a simple identif
b2d0: 69 65 72 20 28 69 6e 20 74 68 65 0a 20 20 20 20  ier (in the.    
b2e0: 20 20 2a 2a 20 61 62 6f 76 65 20 6e 6f 74 61 74    ** above notat
b2f0: 69 6f 6e 2c 20 5b 5d 20 6d 65 61 6e 73 20 6f 70  ion, [] means op
b300: 74 69 6f 6e 61 6c 29 2e 20 49 74 20 69 73 20 61  tional). It is a
b310: 20 62 69 74 20 74 72 69 63 6b 79 20 74 6f 20 63   bit tricky to c
b320: 68 65 63 6b 0a 20 20 20 20 20 20 2a 2a 20 66 6f  heck.      ** fo
b330: 72 20 61 6c 6c 20 63 61 73 65 73 2c 20 62 75 74  r all cases, but
b340: 20 69 74 20 69 73 20 67 6f 6f 64 20 74 6f 20 61   it is good to a
b350: 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61 72 69  void unnecessari
b360: 6c 79 20 71 75 6f 74 69 6e 67 20 63 6f 6d 6d 6f  ly quoting commo
b370: 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 6e  n.      ** typen
b380: 61 6d 65 73 20 6c 69 6b 65 20 56 41 52 43 48 41  ames like VARCHA
b390: 52 28 31 30 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  R(10)..      */.
b3a0: 20 20 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20        needQuote 
b3b0: 3d 20 21 69 73 56 61 6c 69 64 44 69 6d 65 6e 73  = !isValidDimens
b3c0: 69 6f 6e 28 26 7a 49 64 65 6e 74 5b 6a 5d 29 3b  ion(&zIdent[j]);
b3d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b3e0: 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 7a 49    needQuote = zI
b3f0: 64 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20  dent[j];.    }. 
b400: 20 7d 0a 0a 20 20 69 66 28 20 6e 65 65 64 51 75   }..  if( needQu
b410: 6f 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27  ote ) z[i++] = '
b420: 22 27 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  "';.  for(j=0; z
b430: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
b440: 20 20 20 20 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64      z[i++] = zId
b450: 65 6e 74 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ent[j];.    if( 
b460: 7a 49 64 65 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29  zIdent[j]=='"' )
b470: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
b480: 20 7d 0a 20 20 69 66 28 20 6e 65 65 64 51 75 6f   }.  if( needQuo
b490: 74 65 20 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22  te ) z[i++] = '"
b4a0: 27 3b 0a 20 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20  ';.  z[i] = 0;. 
b4b0: 20 2a 70 49 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f   *pIdx = i;.}../
b4c0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
b4d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
b4e0: 74 65 6d 65 6e 74 20 61 70 70 72 6f 70 72 69 61  tement appropria
b4f0: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
b500: 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 4d 65 6d 6f  .** table.  Memo
b510: 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 74  ry to hold the t
b520: 65 78 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  ext of the state
b530: 6d 65 6e 74 20 69 73 20 6f 62 74 61 69 6e 65 64  ment is obtained
b540: 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  .** from sqliteM
b550: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74  alloc() and must
b560: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
b570: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
b580: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
b590: 72 20 2a 63 72 65 61 74 65 54 61 62 6c 65 53 74  r *createTableSt
b5a0: 6d 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  mt(sqlite3 *db, 
b5b0: 54 61 62 6c 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Table *p){.  int
b5c0: 20 69 2c 20 6b 2c 20 6e 3b 0a 20 20 63 68 61 72   i, k, n;.  char
b5d0: 20 2a 7a 53 74 6d 74 3b 0a 20 20 63 68 61 72 20   *zStmt;.  char 
b5e0: 2a 7a 53 65 70 2c 20 2a 7a 53 65 70 32 2c 20 2a  *zSep, *zSep2, *
b5f0: 7a 45 6e 64 2c 20 2a 7a 3b 0a 20 20 43 6f 6c 75  zEnd, *z;.  Colu
b600: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 6e 20 3d 20  mn *pCol;.  n = 
b610: 30 3b 0a 20 20 66 6f 72 28 70 43 6f 6c 20 3d 20  0;.  for(pCol = 
b620: 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69 3c  p->aCol, i=0; i<
b630: 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70 43  p->nCol; i++, pC
b640: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ol++){.    n += 
b650: 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 43 6f 6c  identLength(pCol
b660: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7a 20  ->zName);.    z 
b670: 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20  = pCol->zType;. 
b680: 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20     if( z ){.    
b690: 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67    n += identLeng
b6a0: 74 68 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  th(z);.    }.  }
b6b0: 0a 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e  .  n += identLen
b6c0: 67 74 68 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  gth(p->zName);. 
b6d0: 20 69 66 28 20 6e 3c 35 30 20 29 7b 0a 20 20 20   if( n<50 ){.   
b6e0: 20 7a 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20   zSep = "";.    
b6f0: 7a 53 65 70 32 20 3d 20 22 2c 22 3b 0a 20 20 20  zSep2 = ",";.   
b700: 20 7a 45 6e 64 20 3d 20 22 29 22 3b 0a 20 20 7d   zEnd = ")";.  }
b710: 65 6c 73 65 7b 0a 20 20 20 20 7a 53 65 70 20 3d  else{.    zSep =
b720: 20 22 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 53 65   "\n  ";.    zSe
b730: 70 32 20 3d 20 22 2c 5c 6e 20 20 22 3b 0a 20 20  p2 = ",\n  ";.  
b740: 20 20 7a 45 6e 64 20 3d 20 22 5c 6e 29 22 3b 0a    zEnd = "\n)";.
b750: 20 20 7d 0a 20 20 6e 20 2b 3d 20 33 35 20 2b 20    }.  n += 35 + 
b760: 36 2a 70 2d 3e 6e 43 6f 6c 3b 0a 20 20 7a 53 74  6*p->nCol;.  zSt
b770: 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  mt = sqlite3Mall
b780: 6f 63 28 20 6e 20 29 3b 0a 20 20 69 66 28 20 7a  oc( n );.  if( z
b790: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
b7a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b7b0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
b7c0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
b7d0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
b7e0: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
b7f0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
b800: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
b810: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
b820: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
b830: 6d 65 2c 20 30 29 3b 0a 20 20 7a 53 74 6d 74 5b  me, 0);.  zStmt[
b840: 6b 2b 2b 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f  k++] = '(';.  fo
b850: 72 28 70 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20  r(pCol=p->aCol, 
b860: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
b870: 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20  i++, pCol++){.  
b880: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
b890: 74 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b  tf(n-k, &zStmt[k
b8a0: 5d 2c 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20  ], zSep);.    k 
b8b0: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
b8c0: 33 30 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20  30(&zStmt[k]);. 
b8d0: 20 20 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b     zSep = zSep2;
b8e0: 0a 20 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53  .    identPut(zS
b8f0: 74 6d 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a  tmt, &k, pCol->z
b900: 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Name, 0);.    if
b910: 28 20 28 7a 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  ( (z = pCol->zTy
b920: 70 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  pe)!=0 ){.      
b930: 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d 20 27 20 27  zStmt[k++] = ' '
b940: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b950: 28 69 6e 74 29 28 73 71 6c 69 74 65 33 53 74 72  (int)(sqlite3Str
b960: 6c 65 6e 33 30 28 7a 29 2b 6b 2b 31 29 3c 3d 6e  len30(z)+k+1)<=n
b970: 20 29 3b 0a 20 20 20 20 20 20 69 64 65 6e 74 50   );.      identP
b980: 75 74 28 7a 53 74 6d 74 2c 20 26 6b 2c 20 7a 2c  ut(zStmt, &k, z,
b990: 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   1);.    }.  }. 
b9a0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b9b0: 66 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d  f(n-k, &zStmt[k]
b9c0: 2c 20 22 25 73 22 2c 20 7a 45 6e 64 29 3b 0a 20  , "%s", zEnd);. 
b9d0: 20 72 65 74 75 72 6e 20 7a 53 74 6d 74 3b 0a 7d   return zStmt;.}
b9e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
b9f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
ba00: 6f 20 72 65 70 6f 72 74 20 74 68 65 20 66 69 6e  o report the fin
ba10: 61 6c 20 22 29 22 20 74 68 61 74 20 74 65 72 6d  al ")" that term
ba20: 69 6e 61 74 65 73 0a 2a 2a 20 61 20 43 52 45 41  inates.** a CREA
ba30: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
ba40: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  nt..**.** The ta
ba50: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 74 68  ble structure th
ba60: 61 74 20 6f 74 68 65 72 20 61 63 74 69 6f 6e 20  at other action 
ba70: 72 6f 75 74 69 6e 65 73 20 68 61 76 65 20 62 65  routines have be
ba80: 65 6e 20 62 75 69 6c 64 69 6e 67 0a 2a 2a 20 69  en building.** i
ba90: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  s added to the i
baa0: 6e 74 65 72 6e 61 6c 20 68 61 73 68 20 74 61 62  nternal hash tab
bab0: 6c 65 73 2c 20 61 73 73 75 6d 69 6e 67 20 6e 6f  les, assuming no
bac0: 20 65 72 72 6f 72 73 20 68 61 76 65 0a 2a 2a 20   errors have.** 
bad0: 6f 63 63 75 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  occurred..**.** 
bae0: 41 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  An entry for the
baf0: 20 74 61 62 6c 65 20 69 73 20 6d 61 64 65 20 69   table is made i
bb00: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  n the master tab
bb10: 6c 65 20 6f 6e 20 64 69 73 6b 2c 20 75 6e 6c 65  le on disk, unle
bb20: 73 73 0a 2a 2a 20 74 68 69 73 20 69 73 20 61 20  ss.** this is a 
bb30: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
bb40: 6f 72 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  or db->init.busy
bb50: 3d 3d 31 2e 20 20 57 68 65 6e 20 64 62 2d 3e 69  ==1.  When db->i
bb60: 6e 69 74 2e 62 75 73 79 3d 3d 31 0a 2a 2a 20 69  nit.busy==1.** i
bb70: 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72  t means we are r
bb80: 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c 69 74  eading the sqlit
bb90: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 62  e_master table b
bba0: 65 63 61 75 73 65 20 77 65 20 6a 75 73 74 0a 2a  ecause we just.*
bbb0: 2a 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 74  * connected to t
bbc0: 68 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 62  he database or b
bbd0: 65 63 61 75 73 65 20 74 68 65 20 73 71 6c 69 74  ecause the sqlit
bbe0: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 68  e_master table h
bbf0: 61 73 0a 2a 2a 20 72 65 63 65 6e 74 6c 79 20 63  as.** recently c
bc00: 68 61 6e 67 65 64 2c 20 73 6f 20 74 68 65 20 65  hanged, so the e
bc10: 6e 74 72 79 20 66 6f 72 20 74 68 69 73 20 74 61  ntry for this ta
bc20: 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ble already exis
bc30: 74 73 20 69 6e 0a 2a 2a 20 74 68 65 20 73 71 6c  ts in.** the sql
bc40: 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
bc50: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 20 77 61 6e  .  We do not wan
bc60: 74 20 74 6f 20 63 72 65 61 74 65 20 69 74 20 61  t to create it a
bc70: 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  gain..**.** If t
bc80: 68 65 20 70 53 65 6c 65 63 74 20 61 72 67 75 6d  he pSelect argum
bc90: 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  ent is not NULL,
bca0: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
bcb0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 77  his routine.** w
bcc0: 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65  as called to cre
bcd0: 61 74 65 20 61 20 74 61 62 6c 65 20 67 65 6e 65  ate a table gene
bce0: 72 61 74 65 64 20 66 72 6f 6d 20 61 20 0a 2a 2a  rated from a .**
bcf0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 2e   "CREATE TABLE .
bd00: 2e 2e 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e  .. AS SELECT ...
bd10: 22 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  " statement.  Th
bd20: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f  e column names o
bd30: 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62  f.** the new tab
bd40: 6c 65 20 77 69 6c 6c 20 6d 61 74 63 68 20 74 68  le will match th
bd50: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20  e result set of 
bd60: 74 68 65 20 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76  the SELECT..*/.v
bd70: 6f 69 64 20 73 71 6c 69 74 65 33 45 6e 64 54 61  oid sqlite3EndTa
bd80: 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ble(.  Parse *pP
bd90: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
bda0: 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74 20  * Parse context 
bdb0: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e  */.  Token *pCon
bdc0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
bdd0: 54 68 65 20 27 2c 27 20 74 6f 6b 65 6e 20 61 66  The ',' token af
bde0: 74 65 72 20 74 68 65 20 6c 61 73 74 20 63 6f 6c  ter the last col
bdf0: 75 6d 6e 20 64 65 66 6e 2e 20 2a 2f 0a 20 20 54  umn defn. */.  T
be00: 6f 6b 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20  oken *pEnd,     
be10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
be20: 6e 61 6c 20 27 29 27 20 74 6f 6b 65 6e 20 69 6e  nal ')' token in
be30: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
be40: 45 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  E */.  Select *p
be50: 53 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f  Select         /
be60: 2a 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20  * Select from a 
be70: 22 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53  "CREATE ... AS S
be80: 45 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54  ELECT" */.){.  T
be90: 61 62 6c 65 20 2a 70 3b 0a 20 20 73 71 6c 69 74  able *p;.  sqlit
bea0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
beb0: 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  >db;.  int iDb;.
bec0: 0a 20 20 69 66 28 20 28 70 45 6e 64 3d 3d 30 20  .  if( (pEnd==0 
bed0: 26 26 20 70 53 65 6c 65 63 74 3d 3d 30 29 20 7c  && pSelect==0) |
bee0: 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  | pParse->nErr |
bef0: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
bf00: 65 64 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  ed ) {.    retur
bf10: 6e 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 70 50 61  n;.  }.  p = pPa
bf20: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
bf30: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
bf40: 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  urn;..  assert( 
bf50: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
bf60: 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20  | !pSelect );.. 
bf70: 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
bf80: 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
bf90: 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 0a 23 69  p->pSchema);..#i
bfa0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
bfb0: 54 5f 43 48 45 43 4b 0a 20 20 2f 2a 20 52 65 73  T_CHECK.  /* Res
bfc0: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
bfd0: 6c 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  l CHECK constrai
bfe0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a  nt expressions..
bff0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 43    */.  if( p->pC
c000: 68 65 63 6b 20 29 7b 0a 20 20 20 20 53 72 63 4c  heck ){.    SrcL
c010: 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20 20  ist sSrc;       
c020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c030: 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20  ake SrcList for 
c040: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
c050: 65 20 2a 2f 0a 20 20 20 20 4e 61 6d 65 43 6f 6e  e */.    NameCon
c060: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
c070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
c080: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61   context for pPa
c090: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
c0a0: 2f 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  /..    memset(&s
c0b0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
c0c0: 43 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  C));.    memset(
c0d0: 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSrc, 0, sizeof
c0e0: 28 73 53 72 63 29 29 3b 0a 20 20 20 20 73 53 72  (sSrc));.    sSr
c0f0: 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  c.nSrc = 1;.    
c100: 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20  sSrc.a[0].zName 
c110: 3d 20 70 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  = p->zName;.    
c120: 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d  sSrc.a[0].pTab =
c130: 20 70 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30   p;.    sSrc.a[0
c140: 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a  ].iCursor = -1;.
c150: 20 20 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d      sNC.pParse =
c160: 20 70 50 61 72 73 65 3b 0a 20 20 20 20 73 4e 43   pParse;.    sNC
c170: 2e 70 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72  .pSrcList = &sSr
c180: 63 3b 0a 20 20 20 20 73 4e 43 2e 69 73 43 68 65  c;.    sNC.isChe
c190: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ck = 1;.    if( 
c1a0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
c1b0: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
c1c0: 3e 70 43 68 65 63 6b 29 20 29 7b 0a 20 20 20 20  >pCheck) ){.    
c1d0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
c1e0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
c1f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
c200: 49 54 5f 43 48 45 43 4b 29 20 2a 2f 0a 0a 20 20  IT_CHECK) */..  
c210: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
c220: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
c230: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
c240: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
c250: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
c260: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
c270: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
c280: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
c290: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
c2a0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
c2b0: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
c2c0: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
c2d0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
c2e0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
c2f0: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
c300: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
c310: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
c320: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
c330: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
c340: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
c350: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
c360: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e   */.  if( db->in
c370: 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 70  it.busy ){.    p
c380: 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69  ->tnum = db->ini
c390: 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 7d 0a 0a  t.newTnum;.  }..
c3a0: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
c3b0: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
c3c0: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
c3d0: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
c3e0: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
c3f0: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
c400: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
c410: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
c420: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
c430: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
c440: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
c450: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
c460: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
c470: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
c480: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
c490: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
c4a0: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
c4b0: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
c4c0: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
c4d0: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
c4e0: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
c4f0: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
c500: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
c510: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
c520: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
c530: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
c540: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
c550: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
c560: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
c570: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
c580: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
c590: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
c5a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
c5b0: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp1(v, OP_Clo
c5c0: 73 65 2c 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  se, 0);..    /* 
c5d0: 0a 20 20 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  .    ** Initiali
c5e0: 7a 65 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65  ze zType for the
c5f0: 20 6e 65 77 20 76 69 65 77 20 6f 72 20 74 61 62   new view or tab
c600: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
c610: 66 28 20 70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  f( p->pSelect==0
c620: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 72   ){.      /* A r
c630: 65 67 75 6c 61 72 20 74 61 62 6c 65 20 2a 2f 0a  egular table */.
c640: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 74        zType = "t
c650: 61 62 6c 65 22 3b 0a 20 20 20 20 20 20 7a 54 79  able";.      zTy
c660: 70 65 32 20 3d 20 22 54 41 42 4c 45 22 3b 0a 23  pe2 = "TABLE";.#
c670: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c680: 49 54 5f 56 49 45 57 0a 20 20 20 20 7d 65 6c 73  IT_VIEW.    }els
c690: 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 76 69  e{.      /* A vi
c6a0: 65 77 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70  ew */.      zTyp
c6b0: 65 20 3d 20 22 76 69 65 77 22 3b 0a 20 20 20 20  e = "view";.    
c6c0: 20 20 7a 54 79 70 65 32 20 3d 20 22 56 49 45 57    zType2 = "VIEW
c6d0: 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  ";.#endif.    }.
c6e0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
c6f0: 69 73 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  is a CREATE TABL
c700: 45 20 78 78 20 41 53 20 53 45 4c 45 43 54 20 2e  E xx AS SELECT .
c710: 2e 2e 2c 20 65 78 65 63 75 74 65 20 74 68 65 20  .., execute the 
c720: 53 45 4c 45 43 54 0a 20 20 20 20 2a 2a 20 73 74  SELECT.    ** st
c730: 61 74 65 6d 65 6e 74 20 74 6f 20 70 6f 70 75 6c  atement to popul
c740: 61 74 65 20 74 68 65 20 6e 65 77 20 74 61 62 6c  ate the new tabl
c750: 65 2e 20 54 68 65 20 72 6f 6f 74 2d 70 61 67 65  e. The root-page
c760: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 0a   number for the.
c770: 20 20 20 20 2a 2a 20 6e 65 77 20 74 61 62 6c 65      ** new table
c780: 20 69 73 20 69 6e 20 72 65 67 69 73 74 65 72 20   is in register 
c790: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2e  pParse->regRoot.
c7a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f  .    **.    ** O
c7b0: 6e 63 65 20 74 68 65 20 53 45 4c 45 43 54 20 68  nce the SELECT h
c7c0: 61 73 20 62 65 65 6e 20 63 6f 64 65 64 20 62 79  as been coded by
c7d0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 29   sqlite3Select()
c7e0: 2c 20 69 74 20 69 73 20 69 6e 20 61 0a 20 20 20  , it is in a.   
c7f0: 20 2a 2a 20 73 75 69 74 61 62 6c 65 20 73 74 61   ** suitable sta
c800: 74 65 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20  te to query for 
c810: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
c820: 20 61 6e 64 20 74 79 70 65 73 20 74 6f 20 62 65   and types to be
c830: 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 62 79 20   used.    ** by 
c840: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 20  the new table.. 
c850: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 73     **.    ** A s
c860: 68 61 72 65 64 2d 63 61 63 68 65 20 77 72 69 74  hared-cache writ
c870: 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  e-lock is not re
c880: 71 75 69 72 65 64 20 74 6f 20 77 72 69 74 65 20  quired to write 
c890: 74 6f 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  to the new table
c8a0: 2c 0a 20 20 20 20 2a 2a 20 61 73 20 61 20 73 63  ,.    ** as a sc
c8b0: 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75 73 74 20 68  hema-lock must h
c8c0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
c8d0: 20 6f 62 74 61 69 6e 65 64 20 74 6f 20 63 72 65   obtained to cre
c8e0: 61 74 65 20 69 74 2e 20 53 69 6e 63 65 0a 20 20  ate it. Since.  
c8f0: 20 20 2a 2a 20 61 20 73 63 68 65 6d 61 2d 6c 6f    ** a schema-lo
c900: 63 6b 20 65 78 63 6c 75 64 65 73 20 61 6c 6c 20  ck excludes all 
c910: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 75  other database u
c920: 73 65 72 73 2c 20 74 68 65 20 77 72 69 74 65 2d  sers, the write-
c930: 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20 20 20 20 2a  lock would.    *
c940: 2a 20 62 65 20 72 65 64 75 6e 64 61 6e 74 2e 0a  * be redundant..
c950: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
c960: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
c970: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
c980: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
c990: 65 6c 54 61 62 3b 0a 0a 20 20 20 20 20 20 61 73  elTab;..      as
c9a0: 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e 54 61  sert(pParse->nTa
c9b0: 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  b==1);.      sql
c9c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
c9d0: 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20  , OP_OpenWrite, 
c9e0: 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f  1, pParse->regRo
c9f0: 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  ot, iDb);.      
ca00: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
ca10: 65 50 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20  eP5(v, 1);.     
ca20: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20   pParse->nTab = 
ca30: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
ca40: 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28 26  SelectDestInit(&
ca50: 64 65 73 74 2c 20 53 52 54 5f 54 61 62 6c 65 2c  dest, SRT_Table,
ca60: 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   1);.      sqlit
ca70: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
ca80: 20 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29   pSelect, &dest)
ca90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
caa0: 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
cab0: 43 6c 6f 73 65 2c 20 31 29 3b 0a 20 20 20 20 20  Close, 1);.     
cac0: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
cad0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r==0 ){.        
cae0: 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65  pSelTab = sqlite
caf0: 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65  3ResultSetOfSele
cb00: 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 65  ct(pParse, pSele
cb10: 63 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ct);.        if(
cb20: 20 70 53 65 6c 54 61 62 3d 3d 30 20 29 20 72 65   pSelTab==0 ) re
cb30: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  turn;.        as
cb40: 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 3d 3d 30  sert( p->aCol==0
cb50: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   );.        p->n
cb60: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 6e  Col = pSelTab->n
cb70: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  Col;.        p->
cb80: 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
cb90: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
cba0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
cbb0: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
cbc0: 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
cbd0: 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
cbe0: 65 54 61 62 6c 65 28 70 53 65 6c 54 61 62 29 3b  eTable(pSelTab);
cbf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
cc00: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
cc10: 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74  he complete text
cc20: 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20 73   of the CREATE s
cc30: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20  tatement */.    
cc40: 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20  if( pSelect ){. 
cc50: 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65       zStmt = cre
cc60: 61 74 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c  ateTableStmt(db,
cc70: 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
cc80: 20 20 20 20 20 20 6e 20 3d 20 28 69 6e 74 29 28        n = (int)(
cc90: 70 45 6e 64 2d 3e 7a 20 2d 20 70 50 61 72 73 65  pEnd->z - pParse
cca0: 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e 7a 29 20  ->sNameToken.z) 
ccb0: 2b 20 31 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74  + 1;.      zStmt
ccc0: 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
ccd0: 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  f(db, .         
cce0: 20 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73   "CREATE %s %.*s
ccf0: 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50  ", zType2, n, pP
cd00: 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e  arse->sNameToken
cd10: 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .z.      );.    
cd20: 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74  }..    /* A slot
cd30: 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20   for the record 
cd40: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
cd50: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68   allocated in th
cd60: 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  e .    ** SQLITE
cd70: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20  _MASTER table.  
cd80: 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20  We just need to 
cd90: 75 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74  update that slot
cda0: 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a   with all.    **
cdb0: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
cdc0: 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64   we've collected
cdd0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
cde0: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
cdf0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55  pParse,.      "U
ce00: 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20  PDATE %Q.%s ".  
ce10: 20 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65         "SET type
ce20: 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20  ='%s', name=%Q, 
ce30: 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f  tbl_name=%Q, roo
ce40: 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25  tpage=#%d, sql=%
ce50: 51 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  Q ".       "WHER
ce60: 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20  E rowid=#%d",.  
ce70: 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d      db->aDb[iDb]
ce80: 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
ce90: 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20  ABLE(iDb),.     
cea0: 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d   zType,.      p-
ceb0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d  >zName,.      p-
cec0: 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50  >zName,.      pP
ced0: 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20  arse->regRoot,. 
cee0: 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20       zStmt,.    
cef0: 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77    pParse->regRow
cf00: 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71  id.    );.    sq
cf10: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
cf20: 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  zStmt);.    sqli
cf30: 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
cf40: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23  pParse, iDb);..#
cf50: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
cf60: 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  IT_AUTOINCREMENT
cf70: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
cf80: 20 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20   see if we need 
cf90: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  to create an sql
cfa0: 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
cfb0: 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65  le for.    ** ke
cfc0: 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61  eping track of a
cfd0: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79  utoincrement key
cfe0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
cff0: 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  ( p->tabFlags & 
d000: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
d010: 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44   ){.      Db *pD
d020: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  b = &db->aDb[iDb
d030: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62  ];.      if( pDb
d040: 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53 65 71 54  ->pSchema->pSeqT
d050: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ab==0 ){.       
d060: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
d070: 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20  rse(pParse,.    
d080: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
d090: 42 4c 45 20 25 51 2e 73 71 6c 69 74 65 5f 73 65  BLE %Q.sqlite_se
d0a0: 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73 65 71 29  quence(name,seq)
d0b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 62  ",.          pDb
d0c0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20  ->zName.        
d0d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
d0e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
d0f0: 52 65 70 61 72 73 65 20 65 76 65 72 79 74 68 69  Reparse everythi
d100: 6e 67 20 74 6f 20 75 70 64 61 74 65 20 6f 75 72  ng to update our
d110: 20 69 6e 74 65 72 6e 61 6c 20 64 61 74 61 20 73   internal data s
d120: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
d130: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d140: 70 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63  p4(v, OP_ParseSc
d150: 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c  hema, iDb, 0, 0,
d160: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
d170: 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 74 62 6c  MPrintf(db, "tbl
d180: 5f 6e 61 6d 65 3d 27 25 71 27 22 2c 70 2d 3e 7a  _name='%q'",p->z
d190: 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41 4d 49  Name), P4_DYNAMI
d1a0: 43 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41  C);.  }...  /* A
d1b0: 64 64 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  dd the table to 
d1c0: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72 65  the in-memory re
d1d0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
d1e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
d1f0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69  */.  if( db->ini
d200: 74 2e 62 75 73 79 20 26 26 20 70 50 61 72 73 65  t.busy && pParse
d210: 2d 3e 6e 45 72 72 3d 3d 30 20 29 7b 0a 20 20 20  ->nErr==0 ){.   
d220: 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
d230: 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 20 0a    FKey *pFKey; .
d240: 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68      Schema *pSch
d250: 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61  ema = p->pSchema
d260: 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
d270: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
d280: 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
d290: 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20  , p->zName,.    
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d2c0: 53 74 72 6c 65 6e 33 30 28 70 2d 3e 7a 4e 61 6d  Strlen30(p->zNam
d2d0: 65 29 2c 70 29 3b 0a 20 20 20 20 69 66 28 20 70  e),p);.    if( p
d2e0: 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20 61 73 73  Old ){.      ass
d2f0: 65 72 74 28 20 70 3d 3d 70 4f 6c 64 20 29 3b 20  ert( p==pOld ); 
d300: 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
d310: 68 61 76 65 20 66 61 69 6c 65 64 20 69 6e 73 69  have failed insi
d320: 64 65 20 48 61 73 68 49 6e 73 65 72 74 28 29 20  de HashInsert() 
d330: 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c  */.      db->mal
d340: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
d350: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
d360: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
d370: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
d380: 45 59 0a 20 20 20 20 66 6f 72 28 70 46 4b 65 79  EY.    for(pFKey
d390: 3d 70 2d 3e 70 46 4b 65 79 3b 20 70 46 4b 65 79  =p->pFKey; pFKey
d3a0: 3b 20 70 46 4b 65 79 3d 70 46 4b 65 79 2d 3e 70  ; pFKey=pFKey->p
d3b0: 4e 65 78 74 46 72 6f 6d 29 7b 0a 20 20 20 20 20  NextFrom){.     
d3c0: 20 76 6f 69 64 20 2a 64 61 74 61 3b 0a 20 20 20   void *data;.   
d3d0: 20 20 20 69 6e 74 20 6e 54 6f 20 3d 20 73 71 6c     int nTo = sql
d3e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 46 4b  ite3Strlen30(pFK
d3f0: 65 79 2d 3e 7a 54 6f 29 3b 0a 20 20 20 20 20 20  ey->zTo);.      
d400: 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
d410: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
d420: 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b 65 79  (&pSchema->aFKey
d430: 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 6e 54  , pFKey->zTo, nT
d440: 6f 29 3b 0a 20 20 20 20 20 20 64 61 74 61 20 3d  o);.      data =
d450: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65   sqlite3HashInse
d460: 72 74 28 26 70 53 63 68 65 6d 61 2d 3e 61 46 4b  rt(&pSchema->aFK
d470: 65 79 2c 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20  ey, pFKey->zTo, 
d480: 6e 54 6f 2c 20 70 46 4b 65 79 29 3b 0a 20 20 20  nTo, pFKey);.   
d490: 20 20 20 69 66 28 20 64 61 74 61 3d 3d 28 76 6f     if( data==(vo
d4a0: 69 64 20 2a 29 70 46 4b 65 79 20 29 7b 0a 20 20  id *)pFKey ){.  
d4b0: 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63        db->malloc
d4c0: 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
d4d0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
d4e0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  .    pParse->pNe
d4f0: 77 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  wTable = 0;.    
d500: 64 62 2d 3e 6e 54 61 62 6c 65 2b 2b 3b 0a 20 20  db->nTable++;.  
d510: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
d520: 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e  QLITE_InternChan
d530: 67 65 73 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ges;..#ifndef SQ
d540: 4c 49 54 45 5f 4f 4d 49 54 5f 41 4c 54 45 52 54  LITE_OMIT_ALTERT
d550: 41 42 4c 45 0a 20 20 20 20 69 66 28 20 21 70 2d  ABLE.    if( !p-
d560: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
d570: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
d580: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
d590: 72 20 2a 29 70 50 61 72 73 65 2d 3e 73 4e 61 6d  r *)pParse->sNam
d5a0: 65 54 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20  eToken.z;.      
d5b0: 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 20 20 20  int nName;.     
d5c0: 20 61 73 73 65 72 74 28 20 21 70 53 65 6c 65 63   assert( !pSelec
d5d0: 74 20 26 26 20 70 43 6f 6e 73 20 26 26 20 70 45  t && pCons && pE
d5e0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nd );.      if( 
d5f0: 70 43 6f 6e 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20  pCons->z==0 ){. 
d600: 20 20 20 20 20 20 20 70 43 6f 6e 73 20 3d 20 70         pCons = p
d610: 45 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  End;.      }.   
d620: 20 20 20 6e 4e 61 6d 65 20 3d 20 28 69 6e 74 29     nName = (int)
d630: 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70  ((const char *)p
d640: 43 6f 6e 73 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29  Cons->z - zName)
d650: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 64 64 43 6f  ;.      p->addCo
d660: 6c 4f 66 66 73 65 74 20 3d 20 31 33 20 2b 20 73  lOffset = 13 + s
d670: 71 6c 69 74 65 33 55 74 66 38 43 68 61 72 4c 65  qlite3Utf8CharLe
d680: 6e 28 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  n(zName, nName);
d690: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d6a0: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
d6b0: 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a  ITE_OMIT_VIEW./*
d6c0: 0a 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63  .** The parser c
d6d0: 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e  alls this routin
d6e0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72  e in order to cr
d6f0: 65 61 74 65 20 61 20 6e 65 77 20 56 49 45 57 0a  eate a new VIEW.
d700: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
d710: 72 65 61 74 65 56 69 65 77 28 0a 20 20 50 61 72  reateView(.  Par
d720: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
d730: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
d740: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
d750: 6e 20 2a 70 42 65 67 69 6e 2c 20 20 20 20 20 2f  n *pBegin,     /
d760: 2a 20 54 68 65 20 43 52 45 41 54 45 20 74 6f 6b  * The CREATE tok
d770: 65 6e 20 74 68 61 74 20 62 65 67 69 6e 73 20 74  en that begins t
d780: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
d790: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
d7a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65       /* The toke
d7b0: 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  n that holds the
d7c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65   name of the vie
d7d0: 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  w */.  Token *pN
d7e0: 61 6d 65 32 2c 20 20 20 20 20 2f 2a 20 54 68 65  ame2,     /* The
d7f0: 20 74 6f 6b 65 6e 20 74 68 61 74 20 68 6f 6c 64   token that hold
d800: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
d810: 65 20 76 69 65 77 20 2a 2f 0a 20 20 53 65 6c 65  e view */.  Sele
d820: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f  ct *pSelect,   /
d830: 2a 20 41 20 53 45 4c 45 43 54 20 73 74 61 74 65  * A SELECT state
d840: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 62  ment that will b
d850: 65 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 76 69  ecome the new vi
d860: 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 65  ew */.  int isTe
d870: 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 52  mp,        /* TR
d880: 55 45 20 66 6f 72 20 61 20 54 45 4d 50 4f 52 41  UE for a TEMPORA
d890: 52 59 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  RY view */.  int
d8a0: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 20 20   noErr          
d8b0: 2f 2a 20 53 75 70 70 72 65 73 73 20 65 72 72 6f  /* Suppress erro
d8c0: 72 20 6d 65 73 73 61 67 65 73 20 69 66 20 56 49  r messages if VI
d8d0: 45 57 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  EW already exist
d8e0: 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  s */.){.  Table 
d8f0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63  *p;.  int n;.  c
d900: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
d910: 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73  ar *z;.  Token s
d920: 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73  End;.  DbFixer s
d930: 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  Fix;.  Token *pN
d940: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ame;.  int iDb;.
d950: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
d960: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 69  pParse->db;..  i
d970: 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3e  f( pParse->nVar>
d980: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d990: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
d9a0: 20 22 70 61 72 61 6d 65 74 65 72 73 20 61 72 65   "parameters are
d9b0: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
d9c0: 76 69 65 77 73 22 29 3b 0a 20 20 20 20 73 71 6c  views");.    sql
d9d0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
d9e0: 28 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  (db, pSelect);. 
d9f0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
da00: 20 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62   sqlite3StartTab
da10: 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  le(pParse, pName
da20: 31 2c 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d  1, pName2, isTem
da30: 70 2c 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b  p, 1, 0, noErr);
da40: 0a 20 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70  .  p = pParse->p
da50: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20  NewTable;.  if( 
da60: 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  p==0 || pParse->
da70: 6e 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  nErr ){.    sqli
da80: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
da90: 64 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20  db, pSelect);.  
daa0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
dab0: 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61  sqlite3TwoPartNa
dac0: 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65  me(pParse, pName
dad0: 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d  1, pName2, &pNam
dae0: 65 29 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69  e);.  iDb = sqli
daf0: 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
db00: 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29  (db, p->pSchema)
db10: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
db20: 69 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50  ixInit(&sFix, pP
db30: 61 72 73 65 2c 20 69 44 62 2c 20 22 76 69 65 77  arse, iDb, "view
db40: 22 2c 20 70 4e 61 6d 65 29 0a 20 20 20 20 26 26  ", pName).    &&
db50: 20 73 71 6c 69 74 65 33 46 69 78 53 65 6c 65 63   sqlite3FixSelec
db60: 74 28 26 73 46 69 78 2c 20 70 53 65 6c 65 63 74  t(&sFix, pSelect
db70: 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ).  ){.    sqlit
db80: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
db90: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  b, pSelect);.   
dba0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
dbb0: 2f 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f  /* Make a copy o
dbc0: 66 20 74 68 65 20 65 6e 74 69 72 65 20 53 45 4c  f the entire SEL
dbd0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68  ECT statement th
dbe0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
dbf0: 69 65 77 2e 0a 20 20 2a 2a 20 54 68 69 73 20 77  iew..  ** This w
dc00: 69 6c 6c 20 66 6f 72 63 65 20 61 6c 6c 20 74 68  ill force all th
dc10: 65 20 45 78 70 72 2e 74 6f 6b 65 6e 2e 7a 20 76  e Expr.token.z v
dc20: 61 6c 75 65 73 20 74 6f 20 62 65 20 64 79 6e 61  alues to be dyna
dc30: 6d 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 61 6c 6c  mically.  ** all
dc40: 6f 63 61 74 65 64 20 72 61 74 68 65 72 20 74 68  ocated rather th
dc50: 61 6e 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  an point to the 
dc60: 69 6e 70 75 74 20 73 74 72 69 6e 67 20 2d 20 77  input string - w
dc70: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 0a  hich means that.
dc80: 20 20 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 70    ** they will p
dc90: 65 72 73 69 73 74 20 61 66 74 65 72 20 74 68 65  ersist after the
dca0: 20 63 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33   current sqlite3
dcb0: 5f 65 78 65 63 28 29 20 63 61 6c 6c 20 72 65 74  _exec() call ret
dcc0: 75 72 6e 73 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  urns..  */.  p->
dcd0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
dce0: 33 53 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70  3SelectDup(db, p
dcf0: 53 65 6c 65 63 74 2c 20 45 58 50 52 44 55 50 5f  Select, EXPRDUP_
dd00: 52 45 44 55 43 45 29 3b 0a 20 20 73 71 6c 69 74  REDUCE);.  sqlit
dd10: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
dd20: 62 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  b, pSelect);.  i
dd30: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
dd40: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
dd50: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  n;.  }.  if( !db
dd60: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20  ->init.busy ){. 
dd70: 20 20 20 73 71 6c 69 74 65 33 56 69 65 77 47 65     sqlite3ViewGe
dd80: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
dd90: 72 73 65 2c 20 70 29 3b 0a 20 20 7d 0a 0a 20 20  rse, p);.  }..  
dda0: 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
ddb0: 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
ddc0: 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
ddd0: 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
dde0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
ddf0: 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
de00: 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
de10: 65 6e 3b 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a  en;.  if( sEnd.z
de20: 5b 30 5d 21 3d 30 20 26 26 20 73 45 6e 64 2e 7a  [0]!=0 && sEnd.z
de30: 5b 30 5d 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20  [0]!=';' ){.    
de40: 73 45 6e 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e  sEnd.z += sEnd.n
de50: 3b 0a 20 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d  ;.  }.  sEnd.n =
de60: 20 30 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28   0;.  n = (int)(
de70: 73 45 6e 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d  sEnd.z - pBegin-
de80: 3e 7a 29 3b 0a 20 20 7a 20 3d 20 28 63 6f 6e 73  >z);.  z = (cons
de90: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
dea0: 29 70 42 65 67 69 6e 2d 3e 7a 3b 0a 20 20 77 68  )pBegin->z;.  wh
deb0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 28 7a 5b 6e  ile( n>0 && (z[n
dec0: 2d 31 5d 3d 3d 27 3b 27 20 7c 7c 20 73 71 6c 69  -1]==';' || sqli
ded0: 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31  te3Isspace(z[n-1
dee0: 5d 29 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  ])) ){ n--; }.  
def0: 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
df00: 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
df10: 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
df20: 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
df30: 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
df40: 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
df50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
df60: 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
df70: 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 29  se, 0, &sEnd, 0)
df80: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
df90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
dfa0: 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
dfb0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
dfc0: 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
dfd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
dfe0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
dff0: 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
e000: 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
e010: 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
e020: 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
e030: 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
e040: 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
e050: 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
e060: 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
e070: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
e080: 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
e090: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
e0a0: 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
e0b0: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
e0c0: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
e0d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
e0e0: 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
e0f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
e100: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
e110: 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
e120: 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
e130: 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
e140: 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
e150: 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
e160: 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
e170: 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
e180: 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
e190: 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
e1a0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
e1b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
e1c0: 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
e1d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
e1e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
e1f0: 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
e200: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
e210: 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
e220: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
e230: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
e240: 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
e250: 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
e260: 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 28  rrors */.  int (
e270: 2a 78 41 75 74 68 29 28 76 6f 69 64 2a 2c 69 6e  *xAuth)(void*,in
e280: 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  t,const char*,co
e290: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
e2a0: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
e2b0: 2a 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *);..  assert( p
e2c0: 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65  Table );..#ifnde
e2d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e2e0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
e2f0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c   sqlite3VtabCall
e300: 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20  Connect(pParse, 
e310: 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72  pTable) ){.    r
e320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
e330: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73  OR;.  }.  if( Is
e340: 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20  Virtual(pTable) 
e350: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
e360: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
e370: 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f  TE_OMIT_VIEW.  /
e380: 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f  * A positive nCo
e390: 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75  l means the colu
e3a0: 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68  mns names for th
e3b0: 69 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a  is view are.  **
e3c0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a   already known..
e3d0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c    */.  if( pTabl
e3e0: 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75  e->nCol>0 ) retu
e3f0: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65  rn 0;..  /* A ne
e400: 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61  gative nCol is a
e410: 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20   special marker 
e420: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20  meaning that we 
e430: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
e440: 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d  ** trying to com
e450: 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  pute the column 
e460: 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e  names.  If we en
e470: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
e480: 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67   with.  ** a neg
e490: 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d  ative nCol, it m
e4a0: 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65  eans two or more
e4b0: 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f   views form a lo
e4c0: 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  op, like this:. 
e4d0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45   **.  **     CRE
e4e0: 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20  ATE VIEW one AS 
e4f0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77  SELECT * FROM tw
e500: 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  o;.  **     CREA
e510: 54 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53  TE VIEW two AS S
e520: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65  ELECT * FROM one
e530: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75  ;.  **.  ** Actu
e540: 61 6c 6c 79 2c 20 74 68 69 73 20 65 72 72 6f 72  ally, this error
e550: 20 69 73 20 63 61 75 67 68 74 20 70 72 65 76 69   is caught previ
e560: 6f 75 73 6c 79 20 61 6e 64 20 73 6f 20 74 68 65  ously and so the
e570: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 0a   following test.
e580: 20 20 2a 2a 20 73 68 6f 75 6c 64 20 61 6c 77 61    ** should alwa
e590: 79 73 20 66 61 69 6c 2e 20 20 42 75 74 20 77 65  ys fail.  But we
e5a0: 20 77 69 6c 6c 20 6c 65 61 76 65 20 69 74 20 69   will leave it i
e5b0: 6e 20 70 6c 61 63 65 20 6a 75 73 74 20 74 6f 20  n place just to 
e5c0: 62 65 20 73 61 66 65 2e 0a 20 20 2a 2f 0a 20 20  be safe..  */.  
e5d0: 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  if( pTable->nCol
e5e0: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
e5f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
e600: 2c 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69  , "view %s is ci
e610: 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64  rcularly defined
e620: 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  ", pTable->zName
e630: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
e640: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e650: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29  Table->nCol>=0 )
e660: 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65  ;..  /* If we ge
e670: 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
e680: 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20  eans we need to 
e690: 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c  compute the tabl
e6a0: 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f  e names..  ** No
e6b0: 74 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  te that the call
e6c0: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c   to sqlite3Resul
e6d0: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77  tSetOfSelect() w
e6e0: 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20  ill expand any. 
e6f0: 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73   ** "*" elements
e700: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20   in the results 
e710: 73 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20  set of the view 
e720: 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20  and will assign 
e730: 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20  cursors.  ** to 
e740: 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20  the elements of 
e750: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
e760: 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20    But we do not 
e770: 77 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67  want these chang
e780: 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65  es.  ** to be pe
e790: 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65  rmanent.  So the
e7a0: 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20   computation is 
e7b0: 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f  done on a copy o
e7c0: 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a  f the SELECT.  *
e7d0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  * statement that
e7e0: 20 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65   defines the vie
e7f0: 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
e800: 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  ( pTable->pSelec
e810: 74 20 29 3b 0a 20 20 70 53 65 6c 20 3d 20 73 71  t );.  pSel = sq
e820: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64  lite3SelectDup(d
e830: 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65  b, pTable->pSele
e840: 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  ct, 0);.  if( pS
e850: 65 6c 20 29 7b 0a 20 20 20 20 75 38 20 65 6e 61  el ){.    u8 ena
e860: 62 6c 65 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 64  bleLookaside = d
e870: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
e880: 61 62 6c 65 64 3b 0a 20 20 20 20 6e 20 3d 20 70  abled;.    n = p
e890: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20  Parse->nTab;.   
e8a0: 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
e8b0: 73 73 69 67 6e 43 75 72 73 6f 72 73 28 70 50 61  ssignCursors(pPa
e8c0: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 53 72 63 29  rse, pSel->pSrc)
e8d0: 3b 0a 20 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43  ;.    pTable->nC
e8e0: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 64 62 2d  ol = -1;.    db-
e8f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
e900: 6c 65 64 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  led = 0;.#ifndef
e910: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
e920: 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 78  HORIZATION.    x
e930: 41 75 74 68 20 3d 20 64 62 2d 3e 78 41 75 74 68  Auth = db->xAuth
e940: 3b 0a 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20  ;.    db->xAuth 
e950: 3d 20 30 3b 0a 20 20 20 20 70 53 65 6c 54 61 62  = 0;.    pSelTab
e960: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74   = sqlite3Result
e970: 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72  SetOfSelect(pPar
e980: 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 64  se, pSel);.    d
e990: 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
e9a0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 53 65 6c  ;.#else.    pSel
e9b0: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73  Tab = sqlite3Res
e9c0: 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70  ultSetOfSelect(p
e9d0: 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a 23 65  Parse, pSel);.#e
e9e0: 6e 64 69 66 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  ndif.    db->loo
e9f0: 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20  kaside.bEnabled 
ea00: 3d 20 65 6e 61 62 6c 65 4c 6f 6f 6b 61 73 69 64  = enableLookasid
ea10: 65 3b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  e;.    pParse->n
ea20: 54 61 62 20 3d 20 6e 3b 0a 20 20 20 20 69 66 28  Tab = n;.    if(
ea30: 20 70 53 65 6c 54 61 62 20 29 7b 0a 20 20 20 20   pSelTab ){.    
ea40: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 6c 65    assert( pTable
ea50: 2d 3e 61 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20  ->aCol==0 );.   
ea60: 20 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20     pTable->nCol 
ea70: 3d 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b  = pSelTab->nCol;
ea80: 0a 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61  .      pTable->a
ea90: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
eaa0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
eab0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
eac0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
ead0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
eae0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
eaf0: 70 53 65 6c 54 61 62 29 3b 0a 20 20 20 20 20 20  pSelTab);.      
eb00: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
eb10: 3e 66 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72  >flags |= DB_Unr
eb20: 65 73 65 74 56 69 65 77 73 3b 0a 20 20 20 20 7d  esetViews;.    }
eb30: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 61 62  else{.      pTab
eb40: 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
eb50: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
eb60: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  }.    sqlite3Sel
eb70: 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 53  ectDelete(db, pS
eb80: 65 6c 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  el);.  } else {.
eb90: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a      nErr++;.  }.
eba0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
ebb0: 5f 4f 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 20 20  _OMIT_VIEW */.  
ebc0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 20 20 0a 7d  return nErr;  .}
ebd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
ebe0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ebf0: 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65  VIEW) || !define
ec00: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  d(SQLITE_OMIT_VI
ec10: 52 54 55 41 4c 54 41 42 4c 45 29 20 2a 2f 0a 0a  RTUALTABLE) */..
ec20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ec30: 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 43  MIT_VIEW./*.** C
ec40: 6c 65 61 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20  lear the column 
ec50: 6e 61 6d 65 73 20 66 72 6f 6d 20 65 76 65 72 79  names from every
ec60: 20 56 49 45 57 20 69 6e 20 64 61 74 61 62 61 73   VIEW in databas
ec70: 65 20 69 64 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  e idx..*/.static
ec80: 20 76 6f 69 64 20 73 71 6c 69 74 65 56 69 65 77   void sqliteView
ec90: 52 65 73 65 74 41 6c 6c 28 73 71 6c 69 74 65 33  ResetAll(sqlite3
eca0: 20 2a 64 62 2c 20 69 6e 74 20 69 64 78 29 7b 0a   *db, int idx){.
ecb0: 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 0a 20    HashElem *i;. 
ecc0: 20 69 66 28 20 21 44 62 48 61 73 50 72 6f 70 65   if( !DbHasPrope
ecd0: 72 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f  rty(db, idx, DB_
ece0: 55 6e 72 65 73 65 74 56 69 65 77 73 29 20 29 20  UnresetViews) ) 
ecf0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
ed00: 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
ed10: 26 64 62 2d 3e 61 44 62 5b 69 64 78 5d 2e 70 53  &db->aDb[idx].pS
ed20: 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
ed30: 20 69 3b 69 3d 73 71 6c 69 74 65 48 61 73 68 4e   i;i=sqliteHashN
ed40: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 54 61 62  ext(i)){.    Tab
ed50: 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74  le *pTab = sqlit
ed60: 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20  eHashData(i);.  
ed70: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65 6c    if( pTab->pSel
ed80: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ect ){.      sql
ed90: 69 74 65 52 65 73 65 74 43 6f 6c 75 6d 6e 4e 61  iteResetColumnNa
eda0: 6d 65 73 28 70 54 61 62 29 3b 0a 20 20 20 20 7d  mes(pTab);.    }
edb0: 0a 20 20 7d 0a 20 20 44 62 43 6c 65 61 72 50 72  .  }.  DbClearPr
edc0: 6f 70 65 72 74 79 28 64 62 2c 20 69 64 78 2c 20  operty(db, idx, 
edd0: 44 42 5f 55 6e 72 65 73 65 74 56 69 65 77 73 29  DB_UnresetViews)
ede0: 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
edf0: 6e 65 20 73 71 6c 69 74 65 56 69 65 77 52 65 73  ne sqliteViewRes
ee00: 65 74 41 6c 6c 28 41 2c 42 29 0a 23 65 6e 64 69  etAll(A,B).#endi
ee10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
ee20: 5f 56 49 45 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _VIEW */../*.** 
ee30: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
ee40: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 56   called by the V
ee50: 44 42 45 20 74 6f 20 61 64 6a 75 73 74 20 74 68  DBE to adjust th
ee60: 65 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65 6d  e internal schem
ee70: 61 0a 2a 2a 20 75 73 65 64 20 62 79 20 53 51 4c  a.** used by SQL
ee80: 69 74 65 20 77 68 65 6e 20 74 68 65 20 62 74 72  ite when the btr
ee90: 65 65 20 6c 61 79 65 72 20 6d 6f 76 65 73 20 61  ee layer moves a
eea0: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
eeb0: 2e 20 54 68 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61  . The.** root-pa
eec0: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72  ge of a table or
eed0: 20 69 6e 64 65 78 20 69 6e 20 64 61 74 61 62 61   index in databa
eee0: 73 65 20 69 44 62 20 68 61 73 20 63 68 61 6e 67  se iDb has chang
eef0: 65 64 20 66 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a  ed from iFrom.**
ef00: 20 74 6f 20 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54   to iTo..**.** T
ef10: 69 63 6b 65 74 20 23 31 37 32 38 3a 20 20 54 68  icket #1728:  Th
ef20: 65 20 73 79 6d 62 6f 6c 20 74 61 62 6c 65 20 6d  e symbol table m
ef30: 69 67 68 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  ight still conta
ef40: 69 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  in information.*
ef50: 2a 20 6f 6e 20 74 61 62 6c 65 73 20 61 6e 64 2f  * on tables and/
ef60: 6f 72 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  or indices that 
ef70: 61 72 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  are the process 
ef80: 6f 66 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  of being deleted
ef90: 2e 0a 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20  ..** If you are 
efa0: 75 6e 6c 75 63 6b 79 2c 20 6f 6e 65 20 6f 66 20  unlucky, one of 
efb0: 74 68 6f 73 65 20 64 65 6c 65 74 65 64 20 69 6e  those deleted in
efc0: 64 69 63 65 73 20 6f 72 20 74 61 62 6c 65 73 20  dices or tables 
efd0: 6d 69 67 68 74 0a 2a 2a 20 68 61 76 65 20 74 68  might.** have th
efe0: 65 20 73 61 6d 65 20 72 6f 6f 74 70 61 67 65 20  e same rootpage 
eff0: 6e 75 6d 62 65 72 20 61 73 20 74 68 65 20 72 65  number as the re
f000: 61 6c 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  al table or inde
f010: 78 20 74 68 61 74 20 69 73 0a 2a 2a 20 62 65 69  x that is.** bei
f020: 6e 67 20 6d 6f 76 65 64 2e 20 20 53 6f 20 77 65  ng moved.  So we
f030: 20 63 61 6e 6e 6f 74 20 73 74 6f 70 20 73 65 61   cannot stop sea
f040: 72 63 68 69 6e 67 20 61 66 74 65 72 20 74 68 65  rching after the
f050: 20 66 69 72 73 74 20 6d 61 74 63 68 20 0a 2a 2a   first match .**
f060: 20 62 65 63 61 75 73 65 20 74 68 65 20 66 69 72   because the fir
f070: 73 74 20 6d 61 74 63 68 20 6d 69 67 68 74 20 62  st match might b
f080: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
f090: 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73   deleted indices
f0a0: 0a 2a 2a 20 6f 72 20 74 61 62 6c 65 73 20 61 6e  .** or tables an
f0b0: 64 20 6e 6f 74 20 74 68 65 20 74 61 62 6c 65 2f  d not the table/
f0c0: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 61 63  index that is ac
f0d0: 74 75 61 6c 6c 79 20 62 65 69 6e 67 20 6d 6f 76  tually being mov
f0e0: 65 64 2e 0a 2a 2a 20 57 65 20 6d 75 73 74 20 63  ed..** We must c
f0f0: 6f 6e 74 69 6e 75 65 20 6c 6f 6f 70 69 6e 67 20  ontinue looping 
f100: 75 6e 74 69 6c 20 61 6c 6c 20 74 61 62 6c 65 73  until all tables
f110: 20 61 6e 64 20 69 6e 64 69 63 65 73 20 77 69 74   and indices wit
f120: 68 0a 2a 2a 20 72 6f 6f 74 70 61 67 65 3d 3d 69  h.** rootpage==i
f130: 46 72 6f 6d 20 68 61 76 65 20 62 65 65 6e 20 63  From have been c
f140: 6f 6e 76 65 72 74 65 64 20 74 6f 20 68 61 76 65  onverted to have
f150: 20 61 20 72 6f 6f 74 70 61 67 65 20 6f 66 20 69   a rootpage of i
f160: 54 6f 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  To.** in order t
f170: 6f 20 62 65 20 63 65 72 74 61 69 6e 20 74 68 61  o be certain tha
f180: 74 20 77 65 20 67 6f 74 20 74 68 65 20 72 69 67  t we got the rig
f190: 68 74 20 6f 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64  ht one..*/.#ifnd
f1a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
f1b0: 55 54 4f 56 41 43 55 55 4d 0a 76 6f 69 64 20 73  UTOVACUUM.void s
f1c0: 71 6c 69 74 65 33 52 6f 6f 74 50 61 67 65 4d 6f  qlite3RootPageMo
f1d0: 76 65 64 28 44 62 20 2a 70 44 62 2c 20 69 6e 74  ved(Db *pDb, int
f1e0: 20 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29   iFrom, int iTo)
f1f0: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 45  {.  HashElem *pE
f200: 6c 65 6d 3b 0a 20 20 48 61 73 68 20 2a 70 48 61  lem;.  Hash *pHa
f210: 73 68 3b 0a 0a 20 20 70 48 61 73 68 20 3d 20 26  sh;..  pHash = &
f220: 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62  pDb->pSchema->tb
f230: 6c 48 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c  lHash;.  for(pEl
f240: 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  em=sqliteHashFir
f250: 73 74 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d  st(pHash); pElem
f260: 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61  ; pElem=sqliteHa
f270: 73 68 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a  shNext(pElem)){.
f280: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
f290: 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
f2a0: 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28  (pElem);.    if(
f2b0: 20 70 54 61 62 2d 3e 74 6e 75 6d 3d 3d 69 46 72   pTab->tnum==iFr
f2c0: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  om ){.      pTab
f2d0: 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20  ->tnum = iTo;.  
f2e0: 20 20 7d 0a 20 20 7d 0a 20 20 70 48 61 73 68 20    }.  }.  pHash 
f2f0: 3d 20 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  = &pDb->pSchema-
f300: 3e 69 64 78 48 61 73 68 3b 0a 20 20 66 6f 72 28  >idxHash;.  for(
f310: 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
f320: 46 69 72 73 74 28 70 48 61 73 68 29 3b 20 70 45  First(pHash); pE
f330: 6c 65 6d 3b 20 70 45 6c 65 6d 3d 73 71 6c 69 74  lem; pElem=sqlit
f340: 65 48 61 73 68 4e 65 78 74 28 70 45 6c 65 6d 29  eHashNext(pElem)
f350: 29 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49  ){.    Index *pI
f360: 64 78 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  dx = sqliteHashD
f370: 61 74 61 28 70 45 6c 65 6d 29 3b 0a 20 20 20 20  ata(pElem);.    
f380: 69 66 28 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d  if( pIdx->tnum==
f390: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 70  iFrom ){.      p
f3a0: 49 64 78 2d 3e 74 6e 75 6d 20 3d 20 69 54 6f 3b  Idx->tnum = iTo;
f3b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
f3c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  dif../*.** Write
f3d0: 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20 74   code to erase t
f3e0: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
f3f0: 6f 74 2d 70 61 67 65 20 69 54 61 62 6c 65 20 66  ot-page iTable f
f400: 72 6f 6d 20 64 61 74 61 62 61 73 65 20 69 44 62  rom database iDb
f410: 2e 0a 2a 2a 20 41 6c 73 6f 20 77 72 69 74 65 20  ..** Also write 
f420: 63 6f 64 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  code to modify t
f430: 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  he sqlite_master
f440: 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 74 65 72   table and inter
f450: 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 69 66  nal schema.** if
f460: 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20   a root-page of 
f470: 61 6e 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73  another table is
f480: 20 6d 6f 76 65 64 20 62 79 20 74 68 65 20 62 74   moved by the bt
f490: 72 65 65 2d 6c 61 79 65 72 20 77 68 69 6c 73 74  ree-layer whilst
f4a0: 0a 2a 2a 20 65 72 61 73 69 6e 67 20 69 54 61 62  .** erasing iTab
f4b0: 6c 65 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  le (this can hap
f4c0: 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
f4d0: 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
f4e0: 29 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  )..*/ .static vo
f4f0: 69 64 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61  id destroyRootPa
f500: 67 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ge(Parse *pParse
f510: 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
f520: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
f530: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
f540: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 6e  be(pParse);.  in
f550: 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65  t r1 = sqlite3Ge
f560: 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
f570: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
f580: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74  ddOp3(v, OP_Dest
f590: 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c  roy, iTable, r1,
f5a0: 20 69 44 62 29 3b 0a 23 69 66 6e 64 65 66 20 53   iDb);.#ifndef S
f5b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f5c0: 41 43 55 55 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65  ACUUM.  /* OP_De
f5d0: 73 74 72 6f 79 20 73 74 6f 72 65 73 20 61 6e 20  stroy stores an 
f5e0: 69 6e 20 69 6e 74 65 67 65 72 20 72 31 2e 20 49  in integer r1. I
f5f0: 66 20 74 68 69 73 20 69 6e 74 65 67 65 72 0a 20  f this integer. 
f600: 20 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   ** is non-zero,
f610: 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
f620: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
f630: 20 6f 66 20 61 20 74 61 62 6c 65 20 6d 6f 76 65   of a table move
f640: 64 20 74 6f 0a 20 20 2a 2a 20 6c 6f 63 61 74 69  d to.  ** locati
f650: 6f 6e 20 69 54 61 62 6c 65 2e 20 54 68 65 20 66  on iTable. The f
f660: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 64 65 20 6d 6f  ollowing code mo
f670: 64 69 66 69 65 73 20 74 68 65 20 73 71 6c 69 74  difies the sqlit
f680: 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 74  e_master table t
f690: 6f 0a 20 20 2a 2a 20 72 65 66 6c 65 63 74 20 74  o.  ** reflect t
f6a0: 68 69 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  his..  **.  ** T
f6b0: 68 65 20 22 23 4e 4e 4e 22 20 69 6e 20 74 68 65  he "#NNN" in the
f6c0: 20 53 51 4c 20 69 73 20 61 20 73 70 65 63 69 61   SQL is a specia
f6d0: 6c 20 63 6f 6e 73 74 61 6e 74 20 74 68 61 74 20  l constant that 
f6e0: 6d 65 61 6e 73 20 77 68 61 74 65 76 65 72 20 76  means whatever v
f6f0: 61 6c 75 65 0a 20 20 2a 2a 20 69 73 20 69 6e 20  alue.  ** is in 
f700: 72 65 67 69 73 74 65 72 20 4e 4e 4e 2e 20 20 53  register NNN.  S
f710: 65 65 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  ee sqlite3Regist
f720: 65 72 45 78 70 72 28 29 2e 0a 20 20 2a 2f 0a 20  erExpr()..  */. 
f730: 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61   sqlite3NestedPa
f740: 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20  rse(pParse, .   
f750: 20 20 22 55 50 44 41 54 45 20 25 51 2e 25 73 20    "UPDATE %Q.%s 
f760: 53 45 54 20 72 6f 6f 74 70 61 67 65 3d 25 64 20  SET rootpage=%d 
f770: 57 48 45 52 45 20 23 25 64 20 41 4e 44 20 72 6f  WHERE #%d AND ro
f780: 6f 74 70 61 67 65 3d 23 25 64 22 2c 0a 20 20 20  otpage=#%d",.   
f790: 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44    pParse->db->aD
f7a0: 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
f7b0: 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
f7c0: 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 72 31 29   iTable, r1, r1)
f7d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
f7e0: 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
f7f0: 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a  (pParse, r1);.}.
f800: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 56 44 42  ./*.** Write VDB
f810: 45 20 63 6f 64 65 20 74 6f 20 65 72 61 73 65 20  E code to erase 
f820: 74 61 62 6c 65 20 70 54 61 62 20 61 6e 64 20 61  table pTab and a
f830: 6c 6c 20 61 73 73 6f 63 69 61 74 65 64 20 69 6e  ll associated in
f840: 64 69 63 65 73 20 6f 6e 20 64 69 73 6b 2e 0a 2a  dices on disk..*
f850: 2a 20 43 6f 64 65 20 74 6f 20 75 70 64 61 74 65  * Code to update
f860: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
f870: 65 72 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  er tables and in
f880: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 65  ternal schema de
f890: 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 69 6e 20  finitions.** in 
f8a0: 63 61 73 65 20 61 20 72 6f 6f 74 2d 70 61 67 65  case a root-page
f8b0: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 6e   belonging to an
f8c0: 6f 74 68 65 72 20 74 61 62 6c 65 20 69 73 20 6d  other table is m
f8d0: 6f 76 65 64 20 62 79 20 74 68 65 20 62 74 72 65  oved by the btre
f8e0: 65 20 6c 61 79 65 72 0a 2a 2a 20 69 73 20 61 6c  e layer.** is al
f8f0: 73 6f 20 61 64 64 65 64 20 28 74 68 69 73 20 63  so added (this c
f900: 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68 20 61  an happen with a
f910: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
f920: 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74  tabase)..*/.stat
f930: 69 63 20 76 6f 69 64 20 64 65 73 74 72 6f 79 54  ic void destroyT
f940: 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
f950: 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29  se, Table *pTab)
f960: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
f970: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f980: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20    Index *pIdx;. 
f990: 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
f9a0: 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
f9b0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
f9c0: 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 64 65  ->pSchema);.  de
f9d0: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
f9e0: 61 72 73 65 2c 20 70 54 61 62 2d 3e 74 6e 75 6d  arse, pTab->tnum
f9f0: 2c 20 69 44 62 29 3b 0a 20 20 66 6f 72 28 70 49  , iDb);.  for(pI
fa00: 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b  dx=pTab->pIndex;
fa10: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
fa20: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 64 65  ->pNext){.    de
fa30: 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70 50  stroyRootPage(pP
fa40: 61 72 73 65 2c 20 70 49 64 78 2d 3e 74 6e 75 6d  arse, pIdx->tnum
fa50: 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 23 65 6c 73  , iDb);.  }.#els
fa60: 65 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  e.  /* If the da
fa70: 74 61 62 61 73 65 20 6d 61 79 20 62 65 20 61 75  tabase may be au
fa80: 74 6f 2d 76 61 63 75 75 6d 20 63 61 70 61 62 6c  to-vacuum capabl
fa90: 65 20 28 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  e (if SQLITE_OMI
faa0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2a  T_AUTOVACUUM.  *
fab0: 2a 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  * is not defined
fac0: 29 2c 20 74 68 65 6e 20 69 74 20 69 73 20 69 6d  ), then it is im
fad0: 70 6f 72 74 61 6e 74 20 74 6f 20 63 61 6c 6c 20  portant to call 
fae0: 4f 50 5f 44 65 73 74 72 6f 79 20 6f 6e 20 74 68  OP_Destroy on th
faf0: 65 0a 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64  e.  ** table and
fb00: 20 69 6e 64 65 78 20 72 6f 6f 74 2d 70 61 67 65   index root-page
fb10: 73 20 69 6e 20 6f 72 64 65 72 2c 20 73 74 61 72  s in order, star
fb20: 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 6e 75  ting with the nu
fb30: 6d 65 72 69 63 61 6c 6c 79 20 0a 20 20 2a 2a 20  merically .  ** 
fb40: 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67  largest root-pag
fb50: 65 20 6e 75 6d 62 65 72 2e 20 54 68 69 73 20 67  e number. This g
fb60: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 6e  uarantees that n
fb70: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 6f 74 2d  one of the root-
fb80: 70 61 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65  pages.  ** to be
fb90: 20 64 65 73 74 72 6f 79 65 64 20 69 73 20 72 65   destroyed is re
fba0: 6c 6f 63 61 74 65 64 20 62 79 20 61 6e 20 65 61  located by an ea
fbb0: 72 6c 69 65 72 20 4f 50 5f 44 65 73 74 72 6f 79  rlier OP_Destroy
fbc0: 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 0a 20 20  . i.e. if the.  
fbd0: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 65 72  ** following wer
fbe0: 65 20 63 6f 64 65 64 3a 0a 20 20 2a 2a 0a 20 20  e coded:.  **.  
fbf0: 2a 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  ** OP_Destroy 4 
fc00: 30 0a 20 20 2a 2a 20 2e 2e 2e 0a 20 20 2a 2a 20  0.  ** ....  ** 
fc10: 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30 0a 20  OP_Destroy 5 0. 
fc20: 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 72 6f 6f   **.  ** and roo
fc30: 74 20 70 61 67 65 20 35 20 68 61 70 70 65 6e 65  t page 5 happene
fc40: 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 72 67  d to be the larg
fc50: 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  est root-page nu
fc60: 6d 62 65 72 20 69 6e 20 74 68 65 0a 20 20 2a 2a  mber in the.  **
fc70: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20   database, then 
fc80: 72 6f 6f 74 20 70 61 67 65 20 35 20 77 6f 75 6c  root page 5 woul
fc90: 64 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 70 61  d be moved to pa
fca0: 67 65 20 34 20 62 79 20 74 68 65 20 0a 20 20 2a  ge 4 by the .  *
fcb0: 2a 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 34 20  * "OP_Destroy 4 
fcc0: 30 22 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 73  0" opcode. The s
fcd0: 75 62 73 65 71 75 65 6e 74 20 22 4f 50 5f 44 65  ubsequent "OP_De
fce0: 73 74 72 6f 79 20 35 20 30 22 20 77 6f 75 6c 64  stroy 5 0" would
fcf0: 20 68 69 74 0a 20 20 2a 2a 20 61 20 66 72 65 65   hit.  ** a free
fd00: 2d 6c 69 73 74 20 70 61 67 65 2e 0a 20 20 2a 2f  -list page..  */
fd10: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 54  .  int iTab = pT
fd20: 61 62 2d 3e 74 6e 75 6d 3b 0a 20 20 69 6e 74 20  ab->tnum;.  int 
fd30: 69 44 65 73 74 72 6f 79 65 64 20 3d 20 30 3b 0a  iDestroyed = 0;.
fd40: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
fd50: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a     Index *pIdx;.
fd60: 20 20 20 20 69 6e 74 20 69 4c 61 72 67 65 73 74      int iLargest
fd70: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
fd80: 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c 7c 20  Destroyed==0 || 
fd90: 69 54 61 62 3c 69 44 65 73 74 72 6f 79 65 64 20  iTab<iDestroyed 
fda0: 29 7b 0a 20 20 20 20 20 20 69 4c 61 72 67 65 73  ){.      iLarges
fdb0: 74 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 7d 0a  t = iTab;.    }.
fdc0: 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61      for(pIdx=pTa
fdd0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
fde0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
fdf0: 74 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  t){.      int iI
fe00: 64 78 20 3d 20 70 49 64 78 2d 3e 74 6e 75 6d 3b  dx = pIdx->tnum;
fe10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
fe20: 49 64 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  Idx->pSchema==pT
fe30: 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
fe40: 20 20 20 20 20 69 66 28 20 28 69 44 65 73 74 72       if( (iDestr
fe50: 6f 79 65 64 3d 3d 30 20 7c 7c 20 28 69 49 64 78  oyed==0 || (iIdx
fe60: 3c 69 44 65 73 74 72 6f 79 65 64 29 29 20 26 26  <iDestroyed)) &&
fe70: 20 69 49 64 78 3e 69 4c 61 72 67 65 73 74 20 29   iIdx>iLargest )
fe80: 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 72 67 65  {.        iLarge
fe90: 73 74 20 3d 20 69 49 64 78 3b 0a 20 20 20 20 20  st = iIdx;.     
fea0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
feb0: 20 69 4c 61 72 67 65 73 74 3d 3d 30 20 29 7b 0a   iLargest==0 ){.
fec0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
fed0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
fee0: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
fef0: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
ff00: 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e  arse->db, pTab->
ff10: 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20  pSchema);.      
ff20: 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
ff30: 70 50 61 72 73 65 2c 20 69 4c 61 72 67 65 73 74  pParse, iLargest
ff40: 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20 69 44  , iDb);.      iD
ff50: 65 73 74 72 6f 79 65 64 20 3d 20 69 4c 61 72 67  estroyed = iLarg
ff60: 65 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  est;.    }.  }.#
ff70: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
ff80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
ff90: 61 6c 6c 65 64 20 74 6f 20 64 6f 20 74 68 65 20  alled to do the 
ffa0: 77 6f 72 6b 20 6f 66 20 61 20 44 52 4f 50 20 54  work of a DROP T
ffb0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
ffc0: 2a 2a 20 70 4e 61 6d 65 20 69 73 20 74 68 65 20  ** pName is the 
ffd0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
ffe0: 65 20 74 6f 20 62 65 20 64 72 6f 70 70 65 64 2e  e to be dropped.
fff0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10000 44 72 6f 70 54 61 62 6c 65 28 50 61 72 73 65 20  DropTable(Parse 
10010 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74  *pParse, SrcList
10020 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 73 56   *pName, int isV
10030 69 65 77 2c 20 69 6e 74 20 6e 6f 45 72 72 29 7b  iew, int noErr){
10040 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
10050 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 73 71 6c    Vdbe *v;.  sql
10060 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
10070 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 44 62  e->db;.  int iDb
10080 3b 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ;..  if( pParse-
10090 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c  >nErr || db->mal
100a0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
100b0 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f   goto exit_drop_
100c0 74 61 62 6c 65 3b 0a 20 20 7d 0a 20 20 61 73 73  table;.  }.  ass
100d0 65 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63  ert( pName->nSrc
100e0 3d 3d 31 20 29 3b 0a 20 20 70 54 61 62 20 3d 20  ==1 );.  pTab = 
100f0 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
10100 6c 65 28 70 50 61 72 73 65 2c 20 69 73 56 69 65  le(pParse, isVie
10110 77 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  w, .            
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  pName->a[0].zNam
10140 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a  e, pName->a[0].z
10150 44 61 74 61 62 61 73 65 29 3b 0a 0a 20 20 69 66  Database);..  if
10160 28 20 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20  ( pTab==0 ){.   
10170 20 69 66 28 20 6e 6f 45 72 72 20 29 7b 0a 20 20   if( noErr ){.  
10180 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
10190 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
101a0 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 65 78     }.    goto ex
101b0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
101c0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
101d0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
101e0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
101f0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
10200 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
10210 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
10220 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
10230 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
10240 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
10250 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
10260 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
10270 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
10280 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
10290 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
102a0 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
102b0 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
102c0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
102d0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
102e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
102f0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
10300 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
10310 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10320 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
10330 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
10340 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
10350 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
10360 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
10370 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
10380 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
10390 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
103a0 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
103b0 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
103c0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
103d0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
103e0 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
103f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
10400 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
10410 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
10420 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
10430 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
10440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10450 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
10460 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
10470 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
10480 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10490 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
104a0 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
104b0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
104c0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
104d0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
104e0 32 20 3d 20 70 54 61 62 2d 3e 70 4d 6f 64 2d 3e  2 = pTab->pMod->
104f0 7a 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  zName;.#endif.  
10500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
10510 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
10520 26 26 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20  && iDb==1 ){.   
10530 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
10540 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
10550 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LE;.      }else{
10560 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20  .        code = 
10570 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c  SQLITE_DROP_TABL
10580 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
10590 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
105a0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
105b0 2c 20 63 6f 64 65 2c 20 70 54 61 62 2d 3e 7a 4e  , code, pTab->zN
105c0 61 6d 65 2c 20 7a 41 72 67 32 2c 20 7a 44 62 29  ame, zArg2, zDb)
105d0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
105e0 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
105f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
10600 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
10610 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
10620 4c 45 54 45 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  LETE, pTab->zNam
10630 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
10640 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
10650 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a  op_table;.    }.
10660 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
10670 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
10680 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73  (pTab->zName, "s
10690 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29  qlite_", 7)==0 )
106a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
106b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
106c0 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74 20  able %s may not 
106d0 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54 61  be dropped", pTa
106e0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67  b->zName);.    g
106f0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
10700 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  ble;.  }..#ifnde
10710 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
10720 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 44  EW.  /* Ensure D
10730 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f 74  ROP TABLE is not
10740 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77 2c   used on a view,
10750 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20 69   and DROP VIEW i
10760 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a 20  s not used.  ** 
10770 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  on a table..  */
10780 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26 26  .  if( isView &&
10790 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d   pTab->pSelect==
107a0 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
107b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
107c0 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c 45   "use DROP TABLE
107d0 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c 65   to delete table
107e0 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d   %s", pTab->zNam
107f0 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  e);.    goto exi
10800 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
10810 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77 20  }.  if( !isView 
10820 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  && pTab->pSelect
10830 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
10840 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
10850 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20 74  "use DROP VIEW t
10860 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25 73  o delete view %s
10870 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
10880 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
10890 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
108a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
108b0 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65 6d  rate code to rem
108c0 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66 72  ove the table fr
108d0 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74 61  om the master ta
108e0 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73 6b  ble.  ** on disk
108f0 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71 6c  ..  */.  v = sql
10900 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
10910 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
10920 20 20 20 20 54 72 69 67 67 65 72 20 2a 70 54 72      Trigger *pTr
10930 69 67 67 65 72 3b 0a 20 20 20 20 44 62 20 2a 70  igger;.    Db *p
10940 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44  Db = &db->aDb[iD
10950 62 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  b];.    sqlite3B
10960 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
10970 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
10980 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
10990 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
109a0 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 49 73  TABLE.    if( Is
109b0 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29 7b  Virtual(pTab) ){
109c0 0a 20 20 20 20 20 20 69 66 28 20 76 20 29 7b 0a  .      if( v ){.
109d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
109e0 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
109f0 56 42 65 67 69 6e 29 3b 0a 20 20 20 20 20 20 7d  VBegin);.      }
10a00 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
10a10 20 20 20 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 74     /* Drop all t
10a20 72 69 67 67 65 72 73 20 61 73 73 6f 63 69 61 74  riggers associat
10a30 65 64 20 77 69 74 68 20 74 68 65 20 74 61 62 6c  ed with the tabl
10a40 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 2e  e being dropped.
10a50 20 43 6f 64 65 0a 20 20 20 20 2a 2a 20 69 73 20   Code.    ** is 
10a60 67 65 6e 65 72 61 74 65 64 20 74 6f 20 72 65 6d  generated to rem
10a70 6f 76 65 20 65 6e 74 72 69 65 73 20 66 72 6f 6d  ove entries from
10a80 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 61   sqlite_master a
10a90 6e 64 2f 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c  nd/or.    ** sql
10aa0 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 20  ite_temp_master 
10ab0 69 66 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  if required..   
10ac0 20 2a 2f 0a 20 20 20 20 70 54 72 69 67 67 65 72   */.    pTrigger
10ad0 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65   = sqlite3Trigge
10ae0 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54  rList(pParse, pT
10af0 61 62 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ab);.    while( 
10b00 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
10b10 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
10b20 65 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61  er->pSchema==pTa
10b30 62 2d 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20  b->pSchema || . 
10b40 20 20 20 20 20 20 20 20 20 70 54 72 69 67 67 65           pTrigge
10b50 72 2d 3e 70 53 63 68 65 6d 61 3d 3d 64 62 2d 3e  r->pSchema==db->
10b60 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29  aDb[1].pSchema )
10b70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
10b80 72 6f 70 54 72 69 67 67 65 72 50 74 72 28 70 50  ropTriggerPtr(pP
10b90 61 72 73 65 2c 20 70 54 72 69 67 67 65 72 29 3b  arse, pTrigger);
10ba0 0a 20 20 20 20 20 20 70 54 72 69 67 67 65 72 20  .      pTrigger 
10bb0 3d 20 70 54 72 69 67 67 65 72 2d 3e 70 4e 65 78  = pTrigger->pNex
10bc0 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
10bd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
10be0 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20  TOINCREMENT.    
10bf0 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65 6e  /* Remove any en
10c00 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71 6c  tries of the sql
10c10 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62  ite_sequence tab
10c20 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
10c30 74 68 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61  th.    ** the ta
10c40 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65  ble being droppe
10c50 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  d. This is done 
10c60 62 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65  before the table
10c70 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 20 20   is dropped.    
10c80 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
10c90 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
10ca0 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
10cb0 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
10cc0 6f 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 20 61 73  o.    ** move as
10cd0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10ce0 20 64 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65   drop (can happe
10cf0 6e 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  n in auto-vacuum
10d00 20 6d 6f 64 65 29 2e 0a 20 20 20 20 2a 2f 0a 20   mode)..    */. 
10d10 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74 61 62     if( pTab->tab
10d20 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69  Flags & TF_Autoi
10d30 6e 63 72 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20  ncrement ){.    
10d40 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50    sqlite3NestedP
10d50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20  arse(pParse,.   
10d60 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
10d70 4d 20 25 73 2e 73 71 6c 69 74 65 5f 73 65 71 75  M %s.sqlite_sequ
10d80 65 6e 63 65 20 57 48 45 52 45 20 6e 61 6d 65 3d  ence WHERE name=
10d90 25 51 22 2c 0a 20 20 20 20 20 20 20 20 70 44 62  %Q",.        pDb
10da0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
10db0 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  Name.      );.  
10dc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
10dd0 2f 2a 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49  /* Drop all SQLI
10de0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20  TE_MASTER table 
10df0 61 6e 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65  and index entrie
10e00 73 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  s that refer to 
10e10 74 68 65 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  the.    ** table
10e20 2e 20 54 68 65 20 70 72 6f 67 72 61 6d 20 6e 61  . The program na
10e30 6d 65 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68  me loops through
10e40 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c   the master tabl
10e50 65 20 61 6e 64 20 64 65 6c 65 74 65 73 0a 20 20  e and deletes.  
10e60 20 20 2a 2a 20 65 76 65 72 79 20 72 6f 77 20 74    ** every row t
10e70 68 61 74 20 72 65 66 65 72 73 20 74 6f 20 61 20  hat refers to a 
10e80 74 61 62 6c 65 20 6f 66 20 74 68 65 20 73 61 6d  table of the sam
10e90 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 6e  e name as the on
10ea0 65 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 64  e being.    ** d
10eb0 72 6f 70 70 65 64 2e 20 54 72 69 67 67 65 72 73  ropped. Triggers
10ec0 20 61 72 65 20 68 61 6e 64 6c 65 64 20 73 65 70   are handled sep
10ed0 65 72 61 74 65 6c 79 20 62 65 63 61 75 73 65 20  erately because 
10ee0 61 20 74 72 69 67 67 65 72 20 63 61 6e 20 62 65  a trigger can be
10ef0 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20  .    ** created 
10f00 69 6e 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  in the temp data
10f10 62 61 73 65 20 74 68 61 74 20 72 65 66 65 72 73  base that refers
10f20 20 74 6f 20 61 20 74 61 62 6c 65 20 69 6e 20 61   to a table in a
10f30 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 64 61  nother.    ** da
10f40 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
10f50 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64     sqlite3Nested
10f60 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
10f70 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
10f80 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
10f90 74 62 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20  tbl_name=%Q and 
10fa0 74 79 70 65 21 3d 27 74 72 69 67 67 65 72 27 22  type!='trigger'"
10fb0 2c 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a  ,.        pDb->z
10fc0 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42  Name, SCHEMA_TAB
10fd0 4c 45 28 69 44 62 29 2c 20 70 54 61 62 2d 3e 7a  LE(iDb), pTab->z
10fe0 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  Name);..    /* D
10ff0 72 6f 70 20 61 6e 79 20 73 74 61 74 69 73 74 69  rop any statisti
11000 63 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c 69  cs from the sqli
11010 74 65 5f 73 74 61 74 31 20 74 61 62 6c 65 2c 20  te_stat1 table, 
11020 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f 0a  if it exists */.
11030 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
11040 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 22 73 71  indTable(db, "sq
11050 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 64 62 2d  lite_stat1", db-
11060 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 29  >aDb[iDb].zName)
11070 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11080 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
11090 72 73 65 2c 0a 20 20 20 20 20 20 20 20 22 44 45  rse,.        "DE
110a0 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c  LETE FROM %Q.sql
110b0 69 74 65 5f 73 74 61 74 31 20 57 48 45 52 45 20  ite_stat1 WHERE 
110c0 74 62 6c 3d 25 51 22 2c 20 70 44 62 2d 3e 7a 4e  tbl=%Q", pDb->zN
110d0 61 6d 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  ame, pTab->zName
110e0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
110f0 0a 20 20 20 20 69 66 28 20 21 69 73 56 69 65 77  .    if( !isView
11100 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
11110 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 64 65  Tab) ){.      de
11120 73 74 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73  stroyTable(pPars
11130 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a  e, pTab);.    }.
11140 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74  .    /* Remove t
11150 68 65 20 74 61 62 6c 65 20 65 6e 74 72 79 20 66  he table entry f
11160 72 6f 6d 20 53 51 4c 69 74 65 27 73 20 69 6e 74  rom SQLite's int
11170 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 61 6e 64  ernal schema and
11180 20 6d 6f 64 69 66 79 0a 20 20 20 20 2a 2a 20 74   modify.    ** t
11190 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65  he schema cookie
111a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
111b0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
111c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
111d0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
111e0 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c  P_VDestroy, iDb,
111f0 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61   0, 0, pTab->zNa
11200 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  me, 0);.    }.  
11210 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
11220 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61  Op4(v, OP_DropTa
11230 62 6c 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ble, iDb, 0, 0, 
11240 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  pTab->zName, 0);
11250 0a 20 20 20 20 73 71 6c 69 74 65 33 43 68 61 6e  .    sqlite3Chan
11260 67 65 43 6f 6f 6b 69 65 28 70 50 61 72 73 65 2c  geCookie(pParse,
11270 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   iDb);.  }.  sql
11280 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
11290 64 62 2c 20 69 44 62 29 3b 0a 0a 65 78 69 74 5f  db, iDb);..exit_
112a0 64 72 6f 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71  drop_table:.  sq
112b0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
112c0 74 65 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d  te(db, pName);.}
112d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
112e0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
112f0 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 66  o create a new f
11300 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68  oreign key on th
11310 65 20 74 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65  e table.** curre
11320 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74  ntly under const
11330 72 75 63 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43  ruction.  pFromC
11340 6f 6c 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ol determines wh
11350 69 63 68 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69  ich columns.** i
11360 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 61  n the current ta
11370 62 6c 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ble point to the
11380 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 49   foreign key.  I
11390 66 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68  f pFromCol==0 th
113a0 65 6e 0a 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68  en.** connect th
113b0 65 20 6b 65 79 20 74 6f 20 74 68 65 20 6c 61 73  e key to the las
113c0 74 20 63 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65  t column inserte
113d0 64 2e 20 20 70 54 6f 20 69 73 20 74 68 65 20 6e  d.  pTo is the n
113e0 61 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61  ame of.** the ta
113f0 62 6c 65 20 72 65 66 65 72 72 65 64 20 74 6f 2e  ble referred to.
11400 20 20 70 54 6f 43 6f 6c 20 69 73 20 61 20 6c 69    pToCol is a li
11410 73 74 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  st of tables in 
11420 74 68 65 20 6f 74 68 65 72 0a 2a 2a 20 70 54 6f  the other.** pTo
11430 20 74 61 62 6c 65 20 74 68 61 74 20 74 68 65 20   table that the 
11440 66 6f 72 65 69 67 6e 20 6b 65 79 20 70 6f 69 6e  foreign key poin
11450 74 73 20 74 6f 2e 20 20 66 6c 61 67 73 20 63 6f  ts to.  flags co
11460 6e 74 61 69 6e 73 20 61 6c 6c 0a 2a 2a 20 69 6e  ntains all.** in
11470 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
11480 74 68 65 20 63 6f 6e 66 6c 69 63 74 20 72 65 73  the conflict res
11490 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68  olution algorith
114a0 6d 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  ms specified.** 
114b0 69 6e 20 74 68 65 20 4f 4e 20 44 45 4c 45 54 45  in the ON DELETE
114c0 2c 20 4f 4e 20 55 50 44 41 54 45 20 61 6e 64 20  , ON UPDATE and 
114d0 4f 4e 20 49 4e 53 45 52 54 20 63 6c 61 75 73 65  ON INSERT clause
114e0 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 46 4b 65 79  s..**.** An FKey
114f0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
11500 65 61 74 65 64 20 61 6e 64 20 61 64 64 65 64 20  eated and added 
11510 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
11520 72 65 6e 74 6c 79 0a 2a 2a 20 75 6e 64 65 72 20  rently.** under 
11530 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20  construction in 
11540 74 68 65 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  the pParse->pNew
11550 54 61 62 6c 65 20 66 69 65 6c 64 2e 20 20 54 68  Table field.  Th
11560 65 20 6e 65 77 20 46 4b 65 79 0a 2a 2a 20 69 73  e new FKey.** is
11570 20 6e 6f 74 20 6c 69 6e 6b 65 64 20 69 6e 74 6f   not linked into
11580 20 64 62 2d 3e 61 46 4b 65 79 20 61 74 20 74 68   db->aFKey at th
11590 69 73 20 70 6f 69 6e 74 20 2d 20 74 68 61 74 20  is point - that 
115a0 64 6f 65 73 20 6e 6f 74 20 68 61 70 70 65 6e 0a  does not happen.
115b0 2a 2a 20 75 6e 74 69 6c 20 73 71 6c 69 74 65 33  ** until sqlite3
115c0 45 6e 64 54 61 62 6c 65 28 29 2e 0a 2a 2a 0a 2a  EndTable()..**.*
115d0 2a 20 54 68 65 20 66 6f 72 65 69 67 6e 20 6b 65  * The foreign ke
115e0 79 20 69 73 20 73 65 74 20 66 6f 72 20 49 4d 4d  y is set for IMM
115f0 45 44 49 41 54 45 20 70 72 6f 63 65 73 73 69 6e  EDIATE processin
11600 67 2e 20 20 41 20 73 75 62 73 65 71 75 65 6e 74  g.  A subsequent
11610 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 73 71 6c 69   call.** to sqli
11620 74 65 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b  te3DeferForeignK
11630 65 79 28 29 20 6d 69 67 68 74 20 63 68 61 6e 67  ey() might chang
11640 65 20 74 68 69 73 20 74 6f 20 44 45 46 45 52 52  e this to DEFERR
11650 45 44 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ED..*/.void sqli
11660 74 65 33 43 72 65 61 74 65 46 6f 72 65 69 67 6e  te3CreateForeign
11670 4b 65 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Key(.  Parse *pP
11680 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
11690 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
116a0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 46  /.  ExprList *pF
116b0 72 6f 6d 43 6f 6c 2c 20 20 2f 2a 20 43 6f 6c 75  romCol,  /* Colu
116c0 6d 6e 73 20 69 6e 20 74 68 69 73 20 74 61 62 6c  mns in this tabl
116d0 65 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  e that point to 
116e0 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
116f0 20 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 20 20 20   Token *pTo,    
11700 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
11710 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
11720 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
11730 70 54 6f 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f  pToCol,    /* Co
11740 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6f 74 68  lumns in the oth
11750 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  er table */.  in
11760 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
11770 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20 72     /* Conflict r
11780 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
11790 74 68 6d 73 2e 20 2a 2f 0a 29 7b 0a 20 20 73 71  thms. */.){.  sq
117a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
117b0 73 65 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20  se->db;.#ifndef 
117c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
117d0 49 47 4e 5f 4b 45 59 0a 20 20 46 4b 65 79 20 2a  IGN_KEY.  FKey *
117e0 70 46 4b 65 79 20 3d 20 30 3b 0a 20 20 54 61 62  pFKey = 0;.  Tab
117f0 6c 65 20 2a 70 20 3d 20 70 50 61 72 73 65 2d 3e  le *p = pParse->
11800 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 69 6e 74  pNewTable;.  int
11810 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 69 3b   nByte;.  int i;
11820 0a 20 20 69 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63  .  int nCol;.  c
11830 68 61 72 20 2a 7a 3b 0a 0a 20 20 61 73 73 65 72  har *z;..  asser
11840 74 28 20 70 54 6f 21 3d 30 20 29 3b 0a 20 20 69  t( pTo!=0 );.  i
11850 66 28 20 70 3d 3d 30 20 7c 7c 20 70 50 61 72 73  f( p==0 || pPars
11860 65 2d 3e 6e 45 72 72 20 7c 7c 20 49 4e 5f 44 45  e->nErr || IN_DE
11870 43 4c 41 52 45 5f 56 54 41 42 20 29 20 67 6f 74  CLARE_VTAB ) got
11880 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 69 66 28 20  o fk_end;.  if( 
11890 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20  pFromCol==0 ){. 
118a0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 2d     int iCol = p-
118b0 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 20 20 69 66 28  >nCol-1;.    if(
118c0 20 69 43 6f 6c 3c 30 20 29 20 67 6f 74 6f 20 66   iCol<0 ) goto f
118d0 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
118e0 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
118f0 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
11900 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
11910 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
11920 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
11930 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
11940 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
11950 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
11960 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
11970 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
11980 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
11990 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
119a0 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
119b0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
119c0 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
119d0 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
119e0 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
119f0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
11a00 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
11a10 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
11a20 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
11a30 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
11a40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
11a50 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
11a60 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
11a70 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
11a80 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
11a90 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
11aa0 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
11ab0 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
11ac0 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
11ad0 2b 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 70 46  + nCol*sizeof(pF
11ae0 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 29 20 2b 20  Key->aCol[0]) + 
11af0 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a 20 20 69 66  pTo->n + 1;.  if
11b00 28 20 70 54 6f 43 6f 6c 20 29 7b 0a 20 20 20 20  ( pToCol ){.    
11b10 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 43 6f  for(i=0; i<pToCo
11b20 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  l->nExpr; i++){.
11b30 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 73        nByte += s
11b40 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
11b50 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
11b60 65 29 20 2b 20 31 3b 0a 20 20 20 20 7d 0a 20 20  e) + 1;.    }.  
11b70 7d 0a 20 20 70 46 4b 65 79 20 3d 20 73 71 6c 69  }.  pFKey = sqli
11b80 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
11b90 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  db, nByte );.  i
11ba0 66 28 20 70 46 4b 65 79 3d 3d 30 20 29 7b 0a 20  f( pFKey==0 ){. 
11bb0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
11bc0 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 70 46 72    }.  pFKey->pFr
11bd0 6f 6d 20 3d 20 70 3b 0a 20 20 70 46 4b 65 79 2d  om = p;.  pFKey-
11be0 3e 70 4e 65 78 74 46 72 6f 6d 20 3d 20 70 2d 3e  >pNextFrom = p->
11bf0 70 46 4b 65 79 3b 0a 20 20 7a 20 3d 20 28 63 68  pFKey;.  z = (ch
11c00 61 72 2a 29 26 70 46 4b 65 79 5b 31 5d 3b 0a 20  ar*)&pFKey[1];. 
11c10 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 20 3d 20 28   pFKey->aCol = (
11c20 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 2a 29  struct sColMap*)
11c30 7a 3b 0a 20 20 7a 20 2b 3d 20 73 69 7a 65 6f 66  z;.  z += sizeof
11c40 28 73 74 72 75 63 74 20 73 43 6f 6c 4d 61 70 29  (struct sColMap)
11c50 2a 6e 43 6f 6c 3b 0a 20 20 70 46 4b 65 79 2d 3e  *nCol;.  pFKey->
11c60 7a 54 6f 20 3d 20 7a 3b 0a 20 20 6d 65 6d 63 70  zTo = z;.  memcp
11c70 79 28 7a 2c 20 70 54 6f 2d 3e 7a 2c 20 70 54 6f  y(z, pTo->z, pTo
11c80 2d 3e 6e 29 3b 0a 20 20 7a 5b 70 54 6f 2d 3e 6e  ->n);.  z[pTo->n
11c90 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
11ca0 44 65 71 75 6f 74 65 28 7a 29 3b 0a 20 20 7a 20  Dequote(z);.  z 
11cb0 2b 3d 20 70 54 6f 2d 3e 6e 2b 31 3b 0a 20 20 70  += pTo->n+1;.  p
11cc0 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20  FKey->pNextTo = 
11cd0 30 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c  0;.  pFKey->nCol
11ce0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70   = nCol;.  if( p
11cf0 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20  FromCol==0 ){.  
11d00 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d    pFKey->aCol[0]
11d10 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c  .iFrom = p->nCol
11d20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
11d30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
11d40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
11d50 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
11d60 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a  =0; j<p->nCol; j
11d70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
11d80 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
11d90 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65  p->aCol[j].zName
11da0 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d  , pFromCol->a[i]
11db0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
11dc0 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61          pFKey->a
11dd0 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a  Col[i].iFrom = j
11de0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
11df0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11e00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
11e10 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  >=p->nCol ){.   
11e20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11e30 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
11e40 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e          "unknown
11e50 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69   column \"%s\" i
11e60 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65  n foreign key de
11e70 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20  finition", .    
11e80 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e        pFromCol->
11e90 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  a[i].zName);.   
11ea0 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64       goto fk_end
11eb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11ec0 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c    }.  if( pToCol
11ed0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
11ee0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11ef0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
11f00 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f  ite3Strlen30(pTo
11f10 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29  Col->a[i].zName)
11f20 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61  ;.      pFKey->a
11f30 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b  Col[i].zCol = z;
11f40 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c  .      memcpy(z,
11f50 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e   pToCol->a[i].zN
11f60 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a  ame, n);.      z
11f70 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  [n] = 0;.      z
11f80 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20   += n+1;.    }. 
11f90 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65   }.  pFKey->isDe
11fa0 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46  ferred = 0;.  pF
11fb0 4b 65 79 2d 3e 64 65 6c 65 74 65 43 6f 6e 66 20  Key->deleteConf 
11fc0 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30  = (u8)(flags & 0
11fd0 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 75  xff);.  pFKey->u
11fe0 70 64 61 74 65 43 6f 6e 66 20 3d 20 28 75 38 29  pdateConf = (u8)
11ff0 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20 26  ((flags >> 8 ) &
12000 20 30 78 66 66 29 3b 0a 20 20 70 46 4b 65 79 2d   0xff);.  pFKey-
12010 3e 69 6e 73 65 72 74 43 6f 6e 66 20 3d 20 28 75  >insertConf = (u
12020 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 31 36 20  8)((flags >> 16 
12030 29 20 26 20 30 78 66 66 29 3b 0a 0a 20 20 2f 2a  ) & 0xff);..  /*
12040 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67   Link the foreig
12050 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62  n key to the tab
12060 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20 73  le as the last s
12070 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70  tep..  */.  p->p
12080 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20  FKey = pFKey;.  
12090 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65  pFKey = 0;..fk_e
120a0 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  nd:.  sqlite3DbF
120b0 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a  ree(db, pFKey);.
120c0 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
120d0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
120e0 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20  OREIGN_KEY) */. 
120f0 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
12100 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d  Delete(db, pFrom
12110 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  Col);.  sqlite3E
12120 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
12130 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a  , pToCol);.}../*
12140 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12150 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
12160 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d  an INITIALLY IMM
12170 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41  EDIATE or INITIA
12180 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20  LLY DEFERRED.** 
12190 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20 61  clause is seen a
121a0 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65  s part of a fore
121b0 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69  ign key definiti
121c0 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65 72  on.  The isDefer
121d0 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  red.** parameter
121e0 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41   is 1 for INITIA
121f0 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e 64  LLY DEFERRED and
12200 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59   0 for INITIALLY
12210 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54   IMMEDIATE..** T
12220 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74  he behavior of t
12230 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
12240 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e   created foreign
12250 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65 64   key is adjusted
12260 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  .** accordingly.
12270 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
12280 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28  DeferForeignKey(
12290 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
122a0 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a  nt isDeferred){.
122b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
122c0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
122d0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20    Table *pTab;. 
122e0 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20   FKey *pFKey;.  
122f0 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61 72  if( (pTab = pPar
12300 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d  se->pNewTable)==
12310 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54  0 || (pFKey = pT
12320 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20  ab->pFKey)==0 ) 
12330 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
12340 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20  ( isDeferred==0 
12350 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31  || isDeferred==1
12360 20 29 3b 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44   );.  pFKey->isD
12370 65 66 65 72 72 65 64 20 3d 20 28 75 38 29 69 73  eferred = (u8)is
12380 44 65 66 65 72 72 65 64 3b 0a 23 65 6e 64 69 66  Deferred;.#endif
12390 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
123a0 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c  te code that wil
123b0 6c 20 65 72 61 73 65 20 61 6e 64 20 72 65 66 69  l erase and refi
123c0 6c 6c 20 69 6e 64 65 78 20 2a 70 49 64 78 2e 20  ll index *pIdx. 
123d0 20 54 68 69 73 20 69 73 0a 2a 2a 20 75 73 65 64   This is.** used
123e0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   to initialize a
123f0 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 69   newly created i
12400 6e 64 65 78 20 6f 72 20 74 6f 20 72 65 63 6f 6d  ndex or to recom
12410 70 75 74 65 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  pute the.** cont
12420 65 6e 74 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  ent of an index 
12430 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 61  in response to a
12440 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64   REINDEX command
12450 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6d 65 6d 52 6f  ..**.** if memRo
12460 6f 74 50 61 67 65 20 69 73 20 6e 6f 74 20 6e 65  otPage is not ne
12470 67 61 74 69 76 65 2c 20 69 74 20 6d 65 61 6e 73  gative, it means
12480 20 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20   that the index 
12490 69 73 20 6e 65 77 6c 79 0a 2a 2a 20 63 72 65 61  is newly.** crea
124a0 74 65 64 2e 20 20 54 68 65 20 72 65 67 69 73 74  ted.  The regist
124b0 65 72 20 73 70 65 63 69 66 69 65 64 20 62 79 20  er specified by 
124c0 6d 65 6d 52 6f 6f 74 50 61 67 65 20 63 6f 6e 74  memRootPage cont
124d0 61 69 6e 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  ains the.** root
124e0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
124f0 74 68 65 20 69 6e 64 65 78 2e 20 20 49 66 20 6d  the index.  If m
12500 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20 6e 65  emRootPage is ne
12510 67 61 74 69 76 65 2c 20 74 68 65 6e 0a 2a 2a 20  gative, then.** 
12520 74 68 65 20 69 6e 64 65 78 20 61 6c 72 65 61 64  the index alread
12530 79 20 65 78 69 73 74 73 20 61 6e 64 20 6d 75 73  y exists and mus
12540 74 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66  t be cleared bef
12550 6f 72 65 20 62 65 69 6e 67 20 72 65 66 69 6c 6c  ore being refill
12560 65 64 20 61 6e 64 0a 2a 2a 20 74 68 65 20 72 6f  ed and.** the ro
12570 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ot page number o
12580 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 74  f the index is t
12590 61 6b 65 6e 20 66 72 6f 6d 20 70 49 6e 64 65 78  aken from pIndex
125a0 2d 3e 74 6e 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69  ->tnum..*/.stati
125b0 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  c void sqlite3Re
125c0 66 69 6c 6c 49 6e 64 65 78 28 50 61 72 73 65 20  fillIndex(Parse 
125d0 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 2a  *pParse, Index *
125e0 70 49 6e 64 65 78 2c 20 69 6e 74 20 6d 65 6d 52  pIndex, int memR
125f0 6f 6f 74 50 61 67 65 29 7b 0a 20 20 54 61 62 6c  ootPage){.  Tabl
12600 65 20 2a 70 54 61 62 20 3d 20 70 49 6e 64 65 78  e *pTab = pIndex
12610 2d 3e 70 54 61 62 6c 65 3b 20 20 2f 2a 20 54 68  ->pTable;  /* Th
12620 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20  e table that is 
12630 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74  indexed */.  int
12640 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
12650 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a 20 42  nTab++;     /* B
12660 74 72 65 65 20 63 75 72 73 6f 72 20 75 73 65 64  tree cursor used
12670 20 66 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 69   for pTab */.  i
12680 6e 74 20 69 49 64 78 20 3d 20 70 50 61 72 73 65  nt iIdx = pParse
12690 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20 20 20 2f 2a  ->nTab++;     /*
126a0 20 42 74 72 65 65 20 63 75 72 73 6f 72 20 75 73   Btree cursor us
126b0 65 64 20 66 6f 72 20 70 49 6e 64 65 78 20 2a 2f  ed for pIndex */
126c0 0a 20 20 69 6e 74 20 61 64 64 72 31 3b 20 20 20  .  int addr1;   
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
126f0 74 6f 70 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20  top of loop */. 
12700 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20 20 20   int tnum;      
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
12730 69 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20  index */.  Vdbe 
12740 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
12750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 6e            /* Gen
12760 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
12770 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
12780 68 69 6e 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  hine */.  KeyInf
12790 6f 20 2a 70 4b 65 79 3b 20 20 20 20 20 20 20 20  o *pKey;        
127a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 49           /* KeyI
127b0 6e 66 6f 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f  nfo for index */
127c0 0a 20 20 69 6e 74 20 72 65 67 49 64 78 4b 65 79  .  int regIdxKey
127d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
127e0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 73 20 63    /* Registers c
127f0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e  ontaining the in
12800 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  dex key */.  int
12810 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
12820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12830 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
12840 61 73 73 65 6d 62 6c 69 65 64 20 69 6e 64 65 78  assemblied index
12850 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
12860 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
12870 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54  e->db;      /* T
12880 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
12890 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
128a0 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
128b0 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
128c0 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b  Index->pSchema);
128d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
128e0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
128f0 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ION.  if( sqlite
12900 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
12910 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45  e, SQLITE_REINDE
12920 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  X, pIndex->zName
12930 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61  , 0,.      db->a
12940 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20  Db[iDb].zName ) 
12950 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
12960 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12970 52 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Require a write-
12980 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c  lock on the tabl
12990 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69  e to perform thi
129a0 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20  s operation */. 
129b0 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
129c0 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70  k(pParse, iDb, p
129d0 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54  Tab->tnum, 1, pT
129e0 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76  ab->zName);..  v
129f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
12a00 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28  e(pParse);.  if(
12a10 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   v==0 ) return;.
12a20 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67    if( memRootPag
12a30 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d  e>=0 ){.    tnum
12a40 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a   = memRootPage;.
12a50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75    }else{.    tnu
12a60 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  m = pIndex->tnum
12a70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
12a80 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 43 6c  eAddOp2(v, OP_Cl
12a90 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62 29 3b  ear, tnum, iDb);
12aa0 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71  .  }.  pKey = sq
12ab0 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66  lite3IndexKeyinf
12ac0 6f 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  o(pParse, pIndex
12ad0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12ae0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
12af0 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e  nWrite, iIdx, tn
12b00 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20  um, iDb, .      
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
12b20 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  har *)pKey, P4_K
12b30 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
12b40 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61  .  if( memRootPa
12b50 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ge>=0 ){.    sql
12b60 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
12b70 28 76 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 73 71  (v, 1);.  }.  sq
12b80 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70  lite3OpenTable(p
12b90 50 61 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62  Parse, iTab, iDb
12ba0 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52  , pTab, OP_OpenR
12bb0 65 61 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20  ead);.  addr1 = 
12bc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12bd0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
12be0 69 54 61 62 2c 20 30 29 3b 0a 20 20 72 65 67 52  iTab, 0);.  regR
12bf0 65 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47  ecord = sqlite3G
12c00 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
12c10 29 3b 0a 20 20 72 65 67 49 64 78 4b 65 79 20 3d  );.  regIdxKey =
12c20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65   sqlite3Generate
12c30 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c  IndexKey(pParse,
12c40 20 70 49 6e 64 65 78 2c 20 69 54 61 62 2c 20 72   pIndex, iTab, r
12c50 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20 20  egRecord, 1);.  
12c60 69 66 28 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72  if( pIndex->onEr
12c70 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a  ror!=OE_None ){.
12c80 20 20 20 20 69 6e 74 20 6a 31 2c 20 6a 32 3b 0a      int j1, j2;.
12c90 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
12ca0 3b 0a 0a 20 20 20 20 72 65 67 52 6f 77 69 64 20  ;..    regRowid 
12cb0 3d 20 72 65 67 49 64 78 4b 65 79 20 2b 20 70 49  = regIdxKey + pI
12cc0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20  ndex->nColumn;. 
12cd0 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33 56     j1 = sqlite3V
12ce0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
12cf0 49 73 4e 75 6c 6c 2c 20 72 65 67 49 64 78 4b 65  IsNull, regIdxKe
12d00 79 2c 20 30 2c 20 70 49 6e 64 65 78 2d 3e 6e 43  y, 0, pIndex->nC
12d10 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 6a 32 20 3d  olumn);.    j2 =
12d20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12d30 70 34 28 76 2c 20 4f 50 5f 49 73 55 6e 69 71 75  p4(v, OP_IsUniqu
12d40 65 2c 20 69 49 64 78 2c 0a 20 20 20 20 20 20 20  e, iIdx,.       
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d60 20 20 20 20 30 2c 20 72 65 67 52 6f 77 69 64 2c      0, regRowid,
12d70 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
12d80 54 52 28 72 65 67 52 65 63 6f 72 64 29 2c 20 50  TR(regRecord), P
12d90 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 73 71  4_INT32);.    sq
12da0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
12db0 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
12dc0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 4f  TE_CONSTRAINT, O
12dd0 45 5f 41 62 6f 72 74 2c 20 30 2c 0a 20 20 20 20  E_Abort, 0,.    
12de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12df0 22 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 73  "indexed columns
12e00 20 61 72 65 20 6e 6f 74 20 75 6e 69 71 75 65 22   are not unique"
12e10 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P4_STATIC);.  
12e20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12e30 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
12e40 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
12e50 70 48 65 72 65 28 76 2c 20 6a 32 29 3b 0a 20 20  pHere(v, j2);.  
12e60 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
12e70 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp2(v, OP_IdxI
12e80 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
12e90 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74  Record);.  sqlit
12ea0 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
12eb0 28 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f  (pParse, regReco
12ec0 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rd);.  sqlite3Vd
12ed0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
12ee0 65 78 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31  ext, iTab, addr1
12ef0 2b 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  +1);.  sqlite3Vd
12f00 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
12f10 64 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  dr1);.  sqlite3V
12f20 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
12f30 43 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20  Close, iTab);.  
12f40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
12f50 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69  1(v, OP_Close, i
12f60 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Idx);.}../*.** C
12f70 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64 65  reate a new inde
12f80 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61 62  x for an SQL tab
12f90 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61 6d  le.  pName1.pNam
12fa0 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  e2 is the name o
12fb0 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a 20  f the index .** 
12fc0 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73 20  and pTblList is 
12fd0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
12fe0 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
12ff0 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42 6f   be indexed.  Bo
13000 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20 4e  th will .** be N
13010 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61 72  ULL for a primar
13020 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64 65  y key or an inde
13030 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74 65  x that is create
13040 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a 2a  d to satisfy a.*
13050 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  * UNIQUE constra
13060 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65 20  int.  If pTable 
13070 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20 4e  and pIndex are N
13080 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65 2d  ULL, use pParse-
13090 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61 73  >pNewTable.** as
130a0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
130b0 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72 73   indexed.  pPars
130c0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73 20  e->pNewTable is 
130d0 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 0a  a table that is.
130e0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ** currently bei
130f0 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 62  ng constructed b
13100 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  y a CREATE TABLE
13110 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a 2a   statement..**.*
13120 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73  * pList is a lis
13130 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20  t of columns to 
13140 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c 69  be indexed.  pLi
13150 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  st will be NULL 
13160 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61 20  if this.** is a 
13170 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 75  primary key or u
13180 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e 74  nique-constraint
13190 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
131a0 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ent column added
131b0 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c 65  .** to the table
131c0 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
131d0 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20   construction.  
131e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
131f0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
13200 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
13210 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
13220 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
13230 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
13240 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
13250 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
13260 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
13270 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
13280 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
13290 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
132a0 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
132b0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
132c0 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
132d0 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
132e0 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
132f0 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
13300 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
13310 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
13320 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
13330 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
13340 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
13350 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
13360 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
13370 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
13380 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
13390 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
133a0 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
133b0 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
133c0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b  atement */.  Tok
133d0 65 6e 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  en *pEnd,       
133e0 2f 2a 20 54 68 65 20 22 29 22 20 74 68 61 74 20  /* The ")" that 
133f0 63 6c 6f 73 65 73 20 74 68 65 20 43 52 45 41 54  closes the CREAT
13400 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
13410 74 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  t */.  int sortO
13420 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53 6f 72  rder,     /* Sor
13430 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69 6d 61  t order of prima
13440 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c 69 73  ry key when pLis
13450 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  t==NULL */.  int
13460 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20 20 20   ifNotExist     
13470 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20 69 66  /* Omit error if
13480 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
13490 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61  xists */.){.  Ta
134a0 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20 20  ble *pTab = 0;  
134b0 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 62     /* Table to b
134c0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 49  e indexed */.  I
134d0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 30  ndex *pIndex = 0
134e0 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ;   /* The index
134f0 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20 2a   to be created *
13500 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  /.  char *zName 
13510 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65  = 0;     /* Name
13520 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
13530 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
13540 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
13550 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
13560 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69 6e  in zName */.  in
13570 74 20 69 2c 20 6a 3b 0a 20 20 54 6f 6b 65 6e 20  t i, j;.  Token 
13580 6e 75 6c 6c 49 64 3b 20 20 20 20 20 20 20 20 2f  nullId;        /
13590 2a 20 46 61 6b 65 20 74 6f 6b 65 6e 20 66 6f 72  * Fake token for
135a0 20 61 6e 20 65 6d 70 74 79 20 49 44 20 6c 69 73   an empty ID lis
135b0 74 20 2a 2f 0a 20 20 44 62 46 69 78 65 72 20 73  t */.  DbFixer s
135c0 46 69 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  Fix;        /* F
135d0 6f 72 20 61 73 73 69 67 6e 69 6e 67 20 64 61 74  or assigning dat
135e0 61 62 61 73 65 20 6e 61 6d 65 73 20 74 6f 20 70  abase names to p
135f0 54 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73  Table */.  int s
13600 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 20 20 20  ortOrderMask;   
13610 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f 72 20 44 45  /* 1 to honor DE
13620 53 43 20 69 6e 20 69 6e 64 65 78 2e 20 20 30 20  SC in index.  0 
13630 74 6f 20 69 67 6e 6f 72 65 2e 20 2a 2f 0a 20 20  to ignore. */.  
13640 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
13650 61 72 73 65 2d 3e 64 62 3b 0a 20 20 44 62 20 2a  arse->db;.  Db *
13660 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
13670 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63   /* The specific
13680 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
13690 67 20 74 68 65 20 69 6e 64 65 78 65 64 20 64 61  g the indexed da
136a0 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
136b0 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
136c0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65   /* Index of the
136d0 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69   database that i
136e0 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  s being written 
136f0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
13700 65 20 3d 20 30 3b 20 20 20 20 2f 2a 20 55 6e 71  e = 0;    /* Unq
13710 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66  ualified name of
13720 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 63 72   the index to cr
13730 65 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  eate */.  struct
13740 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
13750 70 4c 69 73 74 49 74 65 6d 3b 20 2f 2a 20 46 6f  pListItem; /* Fo
13760 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70  r looping over p
13770 4c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  List */.  int nC
13780 6f 6c 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72 61  ol;.  int nExtra
13790 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45   = 0;.  char *zE
137a0 78 74 72 61 3b 0a 0a 20 20 69 66 28 20 70 50 61  xtra;..  if( pPa
137b0 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d  rse->nErr || db-
137c0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
137d0 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42   IN_DECLARE_VTAB
137e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
137f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13800 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
13810 69 6e 64 20 74 68 65 20 74 61 62 6c 65 20 74 68  ind the table th
13820 61 74 20 69 73 20 74 6f 20 62 65 20 69 6e 64 65  at is to be inde
13830 78 65 64 2e 20 20 52 65 74 75 72 6e 20 65 61 72  xed.  Return ear
13840 6c 79 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ly if not found.
13850 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 62 6c  .  */.  if( pTbl
13860 4e 61 6d 65 21 3d 30 20 29 7b 0a 0a 20 20 20 20  Name!=0 ){..    
13870 2f 2a 20 55 73 65 20 74 68 65 20 74 77 6f 2d 70  /* Use the two-p
13880 61 72 74 20 69 6e 64 65 78 20 6e 61 6d 65 20 74  art index name t
13890 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
138a0 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a 2a  database .    **
138b0 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 74   to search for t
138c0 68 65 20 74 61 62 6c 65 2e 20 27 46 69 78 27 20  he table. 'Fix' 
138d0 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 74  the table name t
138e0 6f 20 74 68 69 73 20 64 62 0a 20 20 20 20 2a 2a  o this db.    **
138f0 20 62 65 66 6f 72 65 20 6c 6f 6f 6b 69 6e 67 20   before looking 
13900 75 70 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20  up the table..  
13910 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
13920 20 70 4e 61 6d 65 31 20 26 26 20 70 4e 61 6d 65   pName1 && pName
13930 32 20 29 3b 0a 20 20 20 20 69 44 62 20 3d 20 73  2 );.    iDb = s
13940 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
13950 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
13960 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
13970 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
13980 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
13990 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 23 69 66 6e  ate_index;..#ifn
139a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
139b0 54 45 4d 50 44 42 0a 20 20 20 20 2f 2a 20 49 66  TEMPDB.    /* If
139c0 20 74 68 65 20 69 6e 64 65 78 20 6e 61 6d 65 20   the index name 
139d0 77 61 73 20 75 6e 71 75 61 6c 69 66 69 65 64 2c  was unqualified,
139e0 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 74 68   check if the th
139f0 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69  e table.    ** i
13a00 73 20 61 20 74 65 6d 70 20 74 61 62 6c 65 2e 20  s a temp table. 
13a10 49 66 20 73 6f 2c 20 73 65 74 20 74 68 65 20 64  If so, set the d
13a20 61 74 61 62 61 73 65 20 74 6f 20 31 2e 20 44 6f  atabase to 1. Do
13a30 20 6e 6f 74 20 64 6f 20 74 68 69 73 0a 20 20 20   not do this.   
13a40 20 2a 2a 20 69 66 20 69 6e 69 74 69 61 6c 69 73   ** if initialis
13a50 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 73  ing a database s
13a60 63 68 65 6d 61 2e 0a 20 20 20 20 2a 2f 0a 20 20  chema..    */.  
13a70 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e    if( !db->init.
13a80 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 70 54  busy ){.      pT
13a90 61 62 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  ab = sqlite3SrcL
13aa0 69 73 74 4c 6f 6f 6b 75 70 28 70 50 61 72 73 65  istLookup(pParse
13ab0 2c 20 70 54 62 6c 4e 61 6d 65 29 3b 0a 20 20 20  , pTblName);.   
13ac0 20 20 20 69 66 28 20 70 4e 61 6d 65 32 20 26 26     if( pName2 &&
13ad0 20 70 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26   pName2->n==0 &&
13ae0 20 70 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70   pTab && pTab->p
13af0 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
13b00 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20  1].pSchema ){.  
13b10 20 20 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20        iDb = 1;. 
13b20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
13b30 64 69 66 0a 0a 20 20 20 20 69 66 28 20 73 71 6c  dif..    if( sql
13b40 69 74 65 33 46 69 78 49 6e 69 74 28 26 73 46 69  ite3FixInit(&sFi
13b50 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62 2c 20  x, pParse, iDb, 
13b60 22 69 6e 64 65 78 22 2c 20 70 4e 61 6d 65 29 20  "index", pName) 
13b70 26 26 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  &&.        sqlit
13b80 65 33 46 69 78 53 72 63 4c 69 73 74 28 26 73 46  e3FixSrcList(&sF
13b90 69 78 2c 20 70 54 62 6c 4e 61 6d 65 29 0a 20 20  ix, pTblName).  
13ba0 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42 65    ){.      /* Be
13bb0 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65 72  cause the parser
13bc0 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62 6c   constructs pTbl
13bd0 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e 67  Name from a sing
13be0 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a 20  le identifier,. 
13bf0 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 46       ** sqlite3F
13c00 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e 65  ixSrcList can ne
13c10 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20 20  ver fail. */.   
13c20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
13c30 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20 73    }.    pTab = s
13c40 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
13c50 65 28 70 50 61 72 73 65 2c 20 30 2c 20 70 54 62  e(pParse, 0, pTb
13c60 6c 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d  lName->a[0].zNam
13c70 65 2c 20 0a 20 20 20 20 20 20 20 20 70 54 62 6c  e, .        pTbl
13c80 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61  Name->a[0].zData
13c90 62 61 73 65 29 3b 0a 20 20 20 20 69 66 28 20 21  base);.    if( !
13ca0 70 54 61 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  pTab || db->mall
13cb0 6f 63 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20  ocFailed ) goto 
13cc0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
13cd0 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  x;.    assert( d
13ce0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68  b->aDb[iDb].pSch
13cf0 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
13d00 6d 61 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ma );.  }else{. 
13d10 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
13d20 3d 3d 30 20 29 3b 0a 20 20 20 20 70 54 61 62 20  ==0 );.    pTab 
13d30 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
13d40 62 6c 65 3b 0a 20 20 20 20 69 66 28 20 21 70 54  ble;.    if( !pT
13d50 61 62 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63  ab ) 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 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
13d80 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
13d90 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  pTab->pSchema);.
13da0 20 20 7d 0a 20 20 70 44 62 20 3d 20 26 64 62 2d    }.  pDb = &db-
13db0 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20 69 66  >aDb[iDb];..  if
13dc0 28 20 70 54 61 62 3d 3d 30 20 7c 7c 20 70 50 61  ( pTab==0 || pPa
13dd0 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
13de0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13df0 65 78 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  ex;.  if( sqlite
13e00 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
13e10 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
13e20 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20  , 7)==0 .       
13e30 26 26 20 6d 65 6d 63 6d 70 28 26 70 54 61 62 2d  && memcmp(&pTab-
13e40 3e 7a 4e 61 6d 65 5b 37 5d 2c 22 61 6c 74 65 72  >zName[7],"alter
13e50 74 61 62 5f 22 2c 39 29 21 3d 30 20 29 7b 0a 20  tab_",9)!=0 ){. 
13e60 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
13e70 73 67 28 70 50 61 72 73 65 2c 20 22 74 61 62 6c  sg(pParse, "tabl
13e80 65 20 25 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  e %s may not be 
13e90 69 6e 64 65 78 65 64 22 2c 20 70 54 61 62 2d 3e  indexed", pTab->
13ea0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
13eb0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
13ec0 65 78 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  ex;.  }.#ifndef 
13ed0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57  SQLITE_OMIT_VIEW
13ee0 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 70 53 65  .  if( pTab->pSe
13ef0 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
13f00 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
13f10 73 65 2c 20 22 76 69 65 77 73 20 6d 61 79 20 6e  se, "views may n
13f20 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 29 3b  ot be indexed");
13f30 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
13f40 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
13f50 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
13f60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13f70 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
13f80 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
13f90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
13fa0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
13fb0 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20 6d 61  irtual tables ma
13fc0 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64  y not be indexed
13fd0 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  ");.    goto exi
13fe0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
13ff0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
14000 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e  .  ** Find the n
14010 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ame of the index
14020 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
14030 72 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  re is not alread
14040 79 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 69  y another.  ** i
14050 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 77 69  ndex or table wi
14060 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
14070 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 78  .  .  **.  ** Ex
14080 63 65 70 74 69 6f 6e 3a 20 20 49 66 20 77 65 20  ception:  If we 
14090 61 72 65 20 72 65 61 64 69 6e 67 20 74 68 65 20  are reading the 
140a0 6e 61 6d 65 73 20 6f 66 20 70 65 72 6d 61 6e 65  names of permane
140b0 6e 74 20 69 6e 64 69 63 65 73 20 66 72 6f 6d 20  nt indices from 
140c0 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f  the.  ** sqlite_
140d0 6d 61 73 74 65 72 20 74 61 62 6c 65 20 28 62 65  master table (be
140e0 63 61 75 73 65 20 73 6f 6d 65 20 6f 74 68 65 72  cause some other
140f0 20 70 72 6f 63 65 73 73 20 63 68 61 6e 67 65 64   process changed
14100 20 74 68 65 20 73 63 68 65 6d 61 29 20 61 6e 64   the schema) and
14110 0a 20 20 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  .  ** one of the
14120 20 69 6e 64 65 78 20 6e 61 6d 65 73 20 63 6f 6c   index names col
14130 6c 69 64 65 73 20 77 69 74 68 20 74 68 65 20 6e  lides with the n
14140 61 6d 65 20 6f 66 20 61 20 74 65 6d 70 6f 72 61  ame of a tempora
14150 72 79 20 74 61 62 6c 65 20 6f 72 0a 20 20 2a 2a  ry table or.  **
14160 20 69 6e 64 65 78 2c 20 74 68 65 6e 20 77 65 20   index, then we 
14170 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
14180 20 70 72 6f 63 65 73 73 20 74 68 69 73 20 69 6e   process this in
14190 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  dex..  **.  ** I
141a0 66 20 70 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65  f pName==0 it me
141b0 61 6e 73 20 74 68 61 74 20 77 65 20 61 72 65 0a  ans that we are.
141c0 20 20 2a 2a 20 64 65 61 6c 69 6e 67 20 77 69 74    ** dealing wit
141d0 68 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  h a primary key 
141e0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
141f0 61 69 6e 74 2e 20 20 57 65 20 68 61 76 65 20 74  aint.  We have t
14200 6f 20 69 6e 76 65 6e 74 20 6f 75 72 0a 20 20 2a  o invent our.  *
14210 2a 20 6f 77 6e 20 6e 61 6d 65 2e 0a 20 20 2a 2f  * own name..  */
14220 0a 20 20 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a  .  if( pName ){.
14230 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
14240 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
14250 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20  (db, pName);.   
14260 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
14270 73 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d  sqlite3ReadSchem
14280 61 28 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f  a(pParse) ) goto
14290 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
142a0 65 78 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  ex;.    if( zNam
142b0 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
142c0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
142d0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
142e0 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62  !=sqlite3CheckOb
142f0 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c  jectName(pParse,
14300 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20   zName) ){.     
14310 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14320 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
14330 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74     if( !db->init
14340 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69  .busy ){.      i
14350 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
14360 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
14370 70 50 61 72 73 65 29 20 29 20 67 6f 74 6f 20 65  pParse) ) goto e
14380 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
14390 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
143a0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
143b0 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20 29 7b   zName, 0)!=0 ){
143c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
143d0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
143e0 20 22 74 68 65 72 65 20 69 73 20 61 6c 72 65 61   "there is alrea
143f0 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 64  dy a table named
14400 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20   %s", zName);.  
14410 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
14420 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
14430 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14440 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49  if( sqlite3FindI
14450 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  ndex(db, zName, 
14460 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30 20 29  pDb->zName)!=0 )
14470 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 66 4e  {.      if( !ifN
14480 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20 20 20  otExist ){.     
14490 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
144a0 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
144b0 78 20 25 73 20 61 6c 72 65 61 64 79 20 65 78 69  x %s already exi
144c0 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  sts", zName);.  
144d0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
144e0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
144f0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ex;.    }.  }els
14500 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  e{.    int n;.  
14510 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a    Index *pLoop;.
14520 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54      for(pLoop=pT
14530 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b  ab->pIndex, n=1;
14540 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c   pLoop; pLoop=pL
14550 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29  oop->pNext, n++)
14560 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  {}.    zName = s
14570 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
14580 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e  , "sqlite_autoin
14590 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62  dex_%s_%d", pTab
145a0 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20  ->zName, n);.   
145b0 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
145c0 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
145d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
145e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
145f0 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69  heck for authori
14600 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65  zation to create
14610 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a   an index..  */.
14620 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14630 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
14640 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  N.  {.    const 
14650 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d  char *zDb = pDb-
14660 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20  >zName;.    if( 
14670 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
14680 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
14690 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54  INSERT, SCHEMA_T
146a0 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44  ABLE(iDb), 0, zD
146b0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
146c0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
146d0 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20  ex;.    }.    i 
146e0 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  = SQLITE_CREATE_
146f0 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21  INDEX;.    if( !
14700 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69  OMIT_TEMPDB && i
14710 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49  Db==1 ) i = SQLI
14720 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
14730 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
14740 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
14750 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c  Parse, i, zName,
14760 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
14770 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
14780 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
14790 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  ex;.    }.  }.#e
147a0 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c  ndif..  /* If pL
147b0 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73  ist==0, it means
147c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
147d0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65  s called to make
147e0 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20   a primary.  ** 
147f0 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  key out of the l
14800 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64  ast column added
14810 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e   to the table un
14820 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
14830 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65  ..  ** So create
14840 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20   a fake list to 
14850 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20  simulate this.. 
14860 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   */.  if( pList=
14870 3d 30 20 29 7b 0a 20 20 20 20 6e 75 6c 6c 49 64  =0 ){.    nullId
14880 2e 7a 20 3d 20 28 75 38 2a 29 70 54 61 62 2d 3e  .z = (u8*)pTab->
14890 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d  aCol[pTab->nCol-
148a0 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 75  1].zName;.    nu
148b0 6c 6c 49 64 2e 6e 20 3d 20 73 71 6c 69 74 65 33  llId.n = sqlite3
148c0 53 74 72 6c 65 6e 33 30 28 28 63 68 61 72 2a 29  Strlen30((char*)
148d0 6e 75 6c 6c 49 64 2e 7a 29 3b 0a 20 20 20 20 70  nullId.z);.    p
148e0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
148f0 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61  prListAppend(pPa
14900 72 73 65 2c 20 30 2c 20 30 2c 20 26 6e 75 6c 6c  rse, 0, 0, &null
14910 49 64 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  Id);.    if( pLi
14920 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69  st==0 ) goto exi
14930 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
14940 20 20 20 20 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e      pList->a[0].
14950 73 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38 29  sortOrder = (u8)
14960 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
14970 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
14980 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
14990 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
149a0 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
149b0 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
149c0 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
149d0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
149e0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
149f0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
14a00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
14a10 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 43 6f 6c   *pExpr;.    Col
14a20 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20  lSeq *pColl;.   
14a30 20 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 4c   if( (pExpr = pL
14a40 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
14a50 21 3d 30 20 26 26 20 28 70 43 6f 6c 6c 20 3d 20  !=0 && (pColl = 
14a60 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 29 21 3d 30  pExpr->pColl)!=0
14a70 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61   ){.      nExtra
14a80 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33   += (1 + sqlite3
14a90 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e  Strlen30(pColl->
14aa0 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  zName));.    }. 
14ab0 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 41   }..  /* .  ** A
14ac0 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65  llocate the inde
14ad0 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a 20 20  x structure. .  
14ae0 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  */.  nName = sql
14af0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
14b00 6d 65 29 3b 0a 20 20 6e 43 6f 6c 20 3d 20 70 4c  me);.  nCol = pL
14b10 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49  ist->nExpr;.  pI
14b20 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 44 62  ndex = sqlite3Db
14b30 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a  MallocZero(db, .
14b40 20 20 20 20 20 20 73 69 7a 65 6f 66 28 49 6e 64        sizeof(Ind
14b50 65 78 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ex) +           
14b60 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75     /* Index stru
14b70 63 74 75 72 65 20 20 2a 2f 0a 20 20 20 20 20 20  cture  */.      
14b80 73 69 7a 65 6f 66 28 69 6e 74 29 2a 6e 43 6f 6c  sizeof(int)*nCol
14b90 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20   +           /* 
14ba0 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 20  Index.aiColumn  
14bb0 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
14bc0 28 69 6e 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  (int)*(nCol+1) +
14bd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
14be0 61 69 52 6f 77 45 73 74 20 20 20 2a 2f 0a 20 20  aiRowEst   */.  
14bf0 20 20 20 20 73 69 7a 65 6f 66 28 63 68 61 72 20      sizeof(char 
14c00 2a 29 2a 6e 43 6f 6c 20 2b 20 20 20 20 20 20 20  *)*nCol +       
14c10 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c   /* Index.azColl
14c20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 69       */.      si
14c30 7a 65 6f 66 28 75 38 29 2a 6e 43 6f 6c 20 2b 20  zeof(u8)*nCol + 
14c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
14c50 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20 2a  dex.aSortOrder *
14c60 2f 0a 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20  /.      nName + 
14c70 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
14c80 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 7a 4e       /* Index.zN
14c90 61 6d 65 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ame      */.    
14ca0 20 20 6e 45 78 74 72 61 20 20 20 20 20 20 20 20    nExtra        
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14cc0 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  * Collation sequ
14cd0 65 6e 63 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  ence names */.  
14ce0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
14cf0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14d00 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
14d10 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70  e_index;.  }.  p
14d20 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20  Index->azColl = 
14d30 28 63 68 61 72 2a 2a 29 28 26 70 49 6e 64 65 78  (char**)(&pIndex
14d40 5b 31 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  [1]);.  pIndex->
14d50 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 6e 74 20  aiColumn = (int 
14d60 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 7a 43 6f  *)(&pIndex->azCo
14d70 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e  ll[nCol]);.  pIn
14d80 64 65 78 2d 3e 61 69 52 6f 77 45 73 74 20 3d 20  dex->aiRowEst = 
14d90 28 75 6e 73 69 67 6e 65 64 20 2a 29 28 26 70 49  (unsigned *)(&pI
14da0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  ndex->aiColumn[n
14db0 43 6f 6c 5d 29 3b 0a 20 20 70 49 6e 64 65 78 2d  Col]);.  pIndex-
14dc0 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75  >aSortOrder = (u
14dd0 38 20 2a 29 28 26 70 49 6e 64 65 78 2d 3e 61 69  8 *)(&pIndex->ai
14de0 52 6f 77 45 73 74 5b 6e 43 6f 6c 2b 31 5d 29 3b  RowEst[nCol+1]);
14df0 0a 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65  .  pIndex->zName
14e00 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
14e10 64 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  dex->aSortOrder[
14e20 6e 43 6f 6c 5d 29 3b 0a 20 20 7a 45 78 74 72 61  nCol]);.  zExtra
14e30 20 3d 20 28 63 68 61 72 20 2a 29 28 26 70 49 6e   = (char *)(&pIn
14e40 64 65 78 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65  dex->zName[nName
14e50 2b 31 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  +1]);.  memcpy(p
14e60 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  Index->zName, zN
14e70 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29 3b 0a 20  ame, nName+1);. 
14e80 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 20   pIndex->pTable 
14e90 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e 64 65 78  = pTab;.  pIndex
14ea0 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 4c 69 73  ->nColumn = pLis
14eb0 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 49 6e 64  t->nExpr;.  pInd
14ec0 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28 75  ex->onError = (u
14ed0 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49 6e  8)onError;.  pIn
14ee0 64 65 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20 3d  dex->autoIndex =
14ef0 20 28 75 38 29 28 70 4e 61 6d 65 3d 3d 30 29 3b   (u8)(pName==0);
14f00 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
14f10 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
14f20 5d 2e 70 53 63 68 65 6d 61 3b 0a 0a 20 20 2f 2a  ].pSchema;..  /*
14f30 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
14f40 20 77 65 20 73 68 6f 75 6c 64 20 68 6f 6e 6f 72   we should honor
14f50 20 44 45 53 43 20 72 65 71 75 65 73 74 73 20 6f   DESC requests o
14f60 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 0a  n index columns.
14f70 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 2d 3e    */.  if( pDb->
14f80 70 53 63 68 65 6d 61 2d 3e 66 69 6c 65 5f 66 6f  pSchema->file_fo
14f90 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 73  rmat>=4 ){.    s
14fa0 6f 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 2d  ortOrderMask = -
14fb0 31 3b 20 20 20 2f 2a 20 48 6f 6e 6f 72 20 44 45  1;   /* Honor DE
14fc0 53 43 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  SC */.  }else{. 
14fd0 20 20 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b     sortOrderMask
14fe0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49 67 6e 6f   = 0;    /* Igno
14ff0 72 65 20 44 45 53 43 20 2a 2f 0a 20 20 7d 0a 0a  re DESC */.  }..
15000 20 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 6e 61    /* Scan the na
15010 6d 65 73 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  mes of the colum
15020 6e 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ns of the table 
15030 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 61 6e  to be indexed an
15040 64 0a 20 20 2a 2a 20 6c 6f 61 64 20 74 68 65 20  d.  ** load the 
15050 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73 20 69  column indices i
15060 6e 74 6f 20 74 68 65 20 49 6e 64 65 78 20 73 74  nto the Index st
15070 72 75 63 74 75 72 65 2e 20 20 52 65 70 6f 72 74  ructure.  Report
15080 20 61 6e 20 65 72 72 6f 72 0a 20 20 2a 2a 20 69   an error.  ** i
15090 66 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 69 73 20  f any column is 
150a0 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a  not found..  */.
150b0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 69 73 74    for(i=0, pList
150c0 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
150d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
150e0 2b 2b 2c 20 70 4c 69 73 74 49 74 65 6d 2b 2b 29  ++, pListItem++)
150f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
15100 20 2a 7a 43 6f 6c 4e 61 6d 65 20 3d 20 70 4c 69   *zColName = pLi
15110 73 74 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20  stItem->zName;. 
15120 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 54 61 62 43     Column *pTabC
15130 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 72 65 71 75  ol;.    int requ
15140 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 3b 0a  estedSortOrder;.
15150 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b      char *zColl;
15160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15170 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6f 6e 20     /* Collation 
15180 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f  sequence name */
15190 0a 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  ..    for(j=0, p
151a0 54 61 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  TabCol=pTab->aCo
151b0 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  l; j<pTab->nCol;
151c0 20 6a 2b 2b 2c 20 70 54 61 62 43 6f 6c 2b 2b 29   j++, pTabCol++)
151d0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
151e0 74 65 33 53 74 72 49 43 6d 70 28 7a 43 6f 6c 4e  te3StrICmp(zColN
151f0 61 6d 65 2c 20 70 54 61 62 43 6f 6c 2d 3e 7a 4e  ame, pTabCol->zN
15200 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
15210 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
15220 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a  >=pTab->nCol ){.
15230 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15240 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 74  orMsg(pParse, "t
15250 61 62 6c 65 20 25 73 20 68 61 73 20 6e 6f 20 63  able %s has no c
15260 6f 6c 75 6d 6e 20 6e 61 6d 65 64 20 25 73 22 2c  olumn named %s",
15270 0a 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 7a  .        pTab->z
15280 4e 61 6d 65 2c 20 7a 43 6f 6c 4e 61 6d 65 29 3b  Name, zColName);
15290 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
152a0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
152b0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 54 4f 44 4f     }.    /* TODO
152c0 3a 20 20 41 64 64 20 61 20 74 65 73 74 20 74 6f  :  Add a test to
152d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
152e0 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
152f0 69 73 20 6e 6f 74 20 6e 61 6d 65 64 0a 20 20 20  is not named.   
15300 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   ** more than on
15310 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ce within the sa
15320 6d 65 20 69 6e 64 65 78 2e 20 20 4f 6e 6c 79 20  me index.  Only 
15330 74 68 65 20 66 69 72 73 74 20 69 6e 73 74 61 6e  the first instan
15340 63 65 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ce of.    ** the
15350 20 63 6f 6c 75 6d 6e 20 77 69 6c 6c 20 65 76 65   column will eve
15360 72 20 62 65 20 75 73 65 64 20 62 79 20 74 68 65  r be used by the
15370 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 4e 6f 74   optimizer.  Not
15380 65 20 74 68 61 74 20 75 73 69 6e 67 20 74 68 65  e that using the
15390 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20 63 6f 6c  .    ** same col
153a0 75 6d 6e 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  umn more than on
153b0 63 65 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20  ce cannot be an 
153c0 65 72 72 6f 72 20 62 65 63 61 75 73 65 20 74 68  error because th
153d0 61 74 20 77 6f 75 6c 64 20 0a 20 20 20 20 2a 2a  at would .    **
153e0 20 62 72 65 61 6b 20 62 61 63 6b 77 61 72 64 73   break backwards
153f0 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 2d   compatibility -
15400 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
15410 61 20 77 61 72 6e 69 6e 67 2e 0a 20 20 20 20 2a  a warning..    *
15420 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 69  /.    pIndex->ai
15430 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 6a 3b 0a 20  Column[i] = j;. 
15440 20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d     if( pListItem
15450 2d 3e 70 45 78 70 72 20 26 26 20 70 4c 69 73 74  ->pExpr && pList
15460 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 70 43 6f  Item->pExpr->pCo
15470 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ll ){.      asse
15480 72 74 28 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70  rt( pListItem->p
15490 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 29 3b 0a 20  Expr->pColl );. 
154a0 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 7a 45 78       zColl = zEx
154b0 74 72 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tra;.      sqlit
154c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 45 78 74  e3_snprintf(nExt
154d0 72 61 2c 20 7a 45 78 74 72 61 2c 20 22 25 73 22  ra, zExtra, "%s"
154e0 2c 20 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  , pListItem->pEx
154f0 70 72 2d 3e 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  pr->pColl->zName
15500 29 3b 0a 20 20 20 20 20 20 7a 45 78 74 72 61 20  );.      zExtra 
15510 2b 3d 20 28 73 71 6c 69 74 65 33 53 74 72 6c 65  += (sqlite3Strle
15520 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 29 3b  n30(zColl) + 1);
15530 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15540 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
15550 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
15560 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6c 6c 20       if( !zColl 
15570 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c  ){.        zColl
15580 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
15590 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 7d  ->zName;.      }
155a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
155b0 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 26 26  db->init.busy &&
155c0 20 21 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 43   !sqlite3LocateC
155d0 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 7a  ollSeq(pParse, z
155e0 43 6f 6c 6c 2c 20 2d 31 29 20 29 7b 0a 20 20 20  Coll, -1) ){.   
155f0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
15600 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d  ate_index;.    }
15610 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
15620 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f 6c 6c 3b 0a  oll[i] = zColl;.
15630 20 20 20 20 72 65 71 75 65 73 74 65 64 53 6f 72      requestedSor
15640 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 49 74  tOrder = pListIt
15650 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 26 20  em->sortOrder & 
15660 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b 3b 0a 20  sortOrderMask;. 
15670 20 20 20 70 49 6e 64 65 78 2d 3e 61 53 6f 72 74     pIndex->aSort
15680 4f 72 64 65 72 5b 69 5d 20 3d 20 28 75 38 29 72  Order[i] = (u8)r
15690 65 71 75 65 73 74 65 64 53 6f 72 74 4f 72 64 65  equestedSortOrde
156a0 72 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  r;.  }.  sqlite3
156b0 44 65 66 61 75 6c 74 52 6f 77 45 73 74 28 70 49  DefaultRowEst(pI
156c0 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54  ndex);..  if( pT
156d0 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77  ab==pParse->pNew
156e0 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20  Table ){.    /* 
156f0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
15700 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20   been called to 
15710 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61  create an automa
15720 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20  tic index as a. 
15730 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20     ** result of 
15740 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72  a PRIMARY KEY or
15750 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f   UNIQUE clause o
15760 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e  n a column defin
15770 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a  ition, or.    **
15780 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
15790 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
157a0 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f  following the co
157b0 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73  lumn definitions
157c0 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e  ..    ** i.e. on
157d0 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  e of:.    **.   
157e0 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45   ** CREATE TABLE
157f0 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59   t(x PRIMARY KEY
15800 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45  , y);.    ** CRE
15810 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79  ATE TABLE t(x, y
15820 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b  , UNIQUE(x, y));
15830 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
15840 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b  ither way, check
15850 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 74   to see if the t
15860 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73  able already has
15870 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20   such an index. 
15880 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f  If.    ** so, do
15890 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61 74  n't bother creat
158a0 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68  ing this one. Th
158b0 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20  is only applies 
158c0 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61  to.    ** automa
158d0 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20  tically created 
158e0 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20 63  indices. Users c
158f0 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77 69  an do as they wi
15900 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65  sh with.    ** e
15910 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e  xplicit indices.
15920 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64 65  .    */.    Inde
15930 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f 72  x *pIdx;.    for
15940 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
15950 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
15960 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
15970 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
15980 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6f 6e  assert( pIdx->on
15990 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
159a0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
159b0 70 49 64 78 2d 3e 61 75 74 6f 49 6e 64 65 78 20  pIdx->autoIndex 
159c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
159d0 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72   pIndex->onError
159e0 21 3d 4f 45 5f 4e 6f 6e 65 20 29 3b 0a 0a 20 20  !=OE_None );..  
159f0 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43      if( pIdx->nC
15a00 6f 6c 75 6d 6e 21 3d 70 49 6e 64 65 78 2d 3e 6e  olumn!=pIndex->n
15a10 43 6f 6c 75 6d 6e 20 29 20 63 6f 6e 74 69 6e 75  Column ) continu
15a20 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
15a30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; k<pIdx->nColum
15a40 6e 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; k++){.       
15a50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 20   const char *z1 
15a60 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b  = pIdx->azColl[k
15a70 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
15a80 20 63 68 61 72 20 2a 7a 32 20 3d 20 70 49 6e 64   char *z2 = pInd
15a90 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20  ex->azColl[k];. 
15aa0 20 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d         if( pIdx-
15ab0 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d 70 49  >aiColumn[k]!=pI
15ac0 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  ndex->aiColumn[k
15ad0 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
15ae0 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f     if( pIdx->aSo
15af0 72 74 4f 72 64 65 72 5b 6b 5d 21 3d 70 49 6e 64  rtOrder[k]!=pInd
15b00 65 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6b  ex->aSortOrder[k
15b10 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
15b20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26     if( z1!=z2 &&
15b30 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
15b40 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b  z1, z2) ) break;
15b50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15b60 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  f( k==pIdx->nCol
15b70 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  umn ){.        i
15b80 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
15b90 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
15ba0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
15bb0 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
15bc0 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
15bd0 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
15be0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
15bf0 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
15c00 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
15c10 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
15c20 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
15c30 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
15c40 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
15c50 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
15c60 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
15c70 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
15c80 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
15c90 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
15ca0 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
15cb0 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
15cc0 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
15cd0 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
15ce0 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
15cf0 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
15d00 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
15d10 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
15d20 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
15d30 20 62 65 68 61 76 69 6f 75 72 20 66 6f 72 20 74   behaviour for t
15d40 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20  he index..      
15d50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
15d60 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45   if( !(pIdx->onE
15d70 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74  rror==OE_Default
15d80 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72   || pIndex->onEr
15d90 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29  ror==OE_Default)
15da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15db0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15dc0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
15dd0 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69           "confli
15de0 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43  cting ON CONFLIC
15df0 54 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66  T clauses specif
15e00 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ied", 0);.      
15e10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15e20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f  if( pIdx->onErro
15e30 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b  r==OE_Default ){
15e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64  .            pId
15e50 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e  x->onError = pIn
15e60 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20  dex->onError;.  
15e70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e80 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
15e90 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
15ea0 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ex;.      }.    
15eb0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 69 6e 6b  }.  }..  /* Link
15ec0 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 20 73   the new Index s
15ed0 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20  tructure to its 
15ee0 74 61 62 6c 65 20 61 6e 64 20 74 6f 20 74 68 65  table and to the
15ef0 20 6f 74 68 65 72 0a 20 20 2a 2a 20 69 6e 2d 6d   other.  ** in-m
15f00 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 73  emory database s
15f10 74 72 75 63 74 75 72 65 73 2e 20 0a 20 20 2a 2f  tructures. .  */
15f20 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
15f30 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64 65  busy ){.    Inde
15f40 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
15f50 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
15f60 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61  &pIndex->pSchema
15f70 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20  ->idxHash, .    
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e        pIndex->zN
15fa0 61 6d 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c  ame, sqlite3Strl
15fb0 65 6e 33 30 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  en30(pIndex->zNa
15fc0 6d 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me),.           
15fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
15fe0 49 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20  Index);.    if( 
15ff0 70 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  p ){.      asser
16000 74 28 20 70 3d 3d 70 49 6e 64 65 78 20 29 3b 20  t( p==pIndex ); 
16010 20 2f 2a 20 4d 61 6c 6c 6f 63 20 6d 75 73 74 20   /* Malloc must 
16020 68 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20  have failed */. 
16030 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
16040 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
16050 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74   goto exit_creat
16060 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20  e_index;.    }. 
16070 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20     db->flags |= 
16080 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
16090 6e 67 65 73 3b 0a 20 20 20 20 69 66 28 20 70 54  nges;.    if( pT
160a0 62 6c 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20  blName!=0 ){.   
160b0 20 20 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 20     pIndex->tnum 
160c0 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e  = db->init.newTn
160d0 75 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  um;.    }.  }.. 
160e0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69   /* If the db->i
160f0 6e 69 74 2e 62 75 73 79 20 69 73 20 30 20 74 68  nit.busy is 0 th
16100 65 6e 20 63 72 65 61 74 65 20 74 68 65 20 69 6e  en create the in
16110 64 65 78 20 6f 6e 20 64 69 73 6b 2e 20 20 54 68  dex on disk.  Th
16120 69 73 0a 20 20 2a 2a 20 69 6e 76 6f 6c 76 65 73  is.  ** involves
16130 20 77 72 69 74 69 6e 67 20 74 68 65 20 69 6e 64   writing the ind
16140 65 78 20 69 6e 74 6f 20 74 68 65 20 6d 61 73 74  ex into the mast
16150 65 72 20 74 61 62 6c 65 20 61 6e 64 20 66 69 6c  er table and fil
16160 6c 69 6e 67 20 69 6e 20 74 68 65 0a 20 20 2a 2a  ling in the.  **
16170 20 69 6e 64 65 78 20 77 69 74 68 20 74 68 65 20   index with the 
16180 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 63 6f  current table co
16190 6e 74 65 6e 74 73 2e 0a 20 20 2a 2a 0a 20 20 2a  ntents..  **.  *
161a0 2a 20 54 68 65 20 64 62 2d 3e 69 6e 69 74 2e 62  * The db->init.b
161b0 75 73 79 20 69 73 20 30 20 77 68 65 6e 20 74 68  usy is 0 when th
161c0 65 20 75 73 65 72 20 66 69 72 73 74 20 65 6e 74  e user first ent
161d0 65 72 73 20 61 20 43 52 45 41 54 45 20 49 4e 44  ers a CREATE IND
161e0 45 58 20 0a 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64  EX .  ** command
161f0 2e 20 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  .  db->init.busy
16200 20 69 73 20 31 20 77 68 65 6e 20 61 20 64 61 74   is 1 when a dat
16210 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20  abase is opened 
16220 61 6e 64 20 0a 20 20 2a 2a 20 43 52 45 41 54 45  and .  ** CREATE
16230 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74   INDEX statement
16240 73 20 61 72 65 20 72 65 61 64 20 6f 75 74 20 6f  s are read out o
16250 66 20 74 68 65 20 6d 61 73 74 65 72 20 74 61 62  f the master tab
16260 6c 65 2e 20 20 49 6e 0a 20 20 2a 2a 20 74 68 65  le.  In.  ** the
16270 20 6c 61 74 74 65 72 20 63 61 73 65 20 74 68 65   latter case the
16280 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79 20 65   index already e
16290 78 69 73 74 73 20 6f 6e 20 64 69 73 6b 2c 20 77  xists on disk, w
162a0 68 69 63 68 20 69 73 20 77 68 79 0a 20 20 2a 2a  hich is why.  **
162b0 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
162c0 6f 20 72 65 63 72 65 61 74 65 20 69 74 2e 0a 20  o recreate it.. 
162d0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 54 62 6c   **.  ** If pTbl
162e0 4e 61 6d 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73  Name==0 it means
162f0 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 67   this index is g
16300 65 6e 65 72 61 74 65 64 20 61 73 20 61 20 70 72  enerated as a pr
16310 69 6d 61 72 79 20 6b 65 79 0a 20 20 2a 2a 20 6f  imary key.  ** o
16320 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72 61  r UNIQUE constra
16330 69 6e 74 20 6f 66 20 61 20 43 52 45 41 54 45 20  int of a CREATE 
16340 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e  TABLE statement.
16350 20 20 53 69 6e 63 65 20 74 68 65 20 74 61 62 6c    Since the tabl
16360 65 0a 20 20 2a 2a 20 68 61 73 20 6a 75 73 74 20  e.  ** has just 
16370 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20 69 74  been created, it
16380 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74   contains no dat
16390 61 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20  a and the index 
163a0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  initialization. 
163b0 20 2a 2a 20 73 74 65 70 20 63 61 6e 20 62 65 20   ** step can be 
163c0 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
163d0 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 69 6e 69  else if( db->ini
163e0 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
163f0 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 63 68   Vdbe *v;.    ch
16400 61 72 20 2a 7a 53 74 6d 74 3b 0a 20 20 20 20 69  ar *zStmt;.    i
16410 6e 74 20 69 4d 65 6d 20 3d 20 2b 2b 70 50 61 72  nt iMem = ++pPar
16420 73 65 2d 3e 6e 4d 65 6d 3b 0a 0a 20 20 20 20 76  se->nMem;..    v
16430 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
16440 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69  e(pParse);.    i
16450 66 28 20 76 3d 3d 30 20 29 20 67 6f 74 6f 20 65  f( v==0 ) goto e
16460 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
16470 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  ;...    /* Creat
16480 65 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66  e the rootpage f
16490 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  or the index.   
164a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
164b0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
164c0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
164d0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
164e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
164f0 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69 44 62  CreateIndex, iDb
16500 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  , iMem);..    /*
16510 20 47 61 74 68 65 72 20 74 68 65 20 63 6f 6d 70   Gather the comp
16520 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
16530 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74   CREATE INDEX st
16540 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20 20 20  atement into.   
16550 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20 76 61   ** the zStmt va
16560 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a 20 20  riable.    */.  
16570 20 20 69 66 28 20 70 53 74 61 72 74 20 26 26 20    if( pStart && 
16580 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pEnd ){.      /*
16590 20 41 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77   A named index w
165a0 69 74 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ith an explicit 
165b0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
165c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20  tement */.      
165d0 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d  zStmt = sqlite3M
165e0 50 72 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41  Printf(db, "CREA
165f0 54 45 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22  TE%s INDEX %.*s"
16600 2c 0a 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f  ,.        onErro
16610 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20  r==OE_None ? "" 
16620 3a 20 22 20 55 4e 49 51 55 45 22 2c 0a 20 20 20  : " UNIQUE",.   
16630 20 20 20 20 20 70 45 6e 64 2d 3e 7a 20 2d 20 70       pEnd->z - p
16640 4e 61 6d 65 2d 3e 7a 20 2b 20 31 2c 0a 20 20 20  Name->z + 1,.   
16650 20 20 20 20 20 70 4e 61 6d 65 2d 3e 7a 29 3b 0a       pName->z);.
16660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16670 20 2f 2a 20 41 6e 20 61 75 74 6f 6d 61 74 69 63   /* An automatic
16680 20 69 6e 64 65 78 20 63 72 65 61 74 65 64 20 62   index created b
16690 79 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  y a PRIMARY KEY 
166a0 6f 72 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  or UNIQUE constr
166b0 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  aint */.      /*
166c0 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   zStmt = sqlite3
166d0 4d 50 72 69 6e 74 66 28 22 22 29 3b 20 2a 2f 0a  MPrintf(""); */.
166e0 20 20 20 20 20 20 7a 53 74 6d 74 20 3d 20 30 3b        zStmt = 0;
166f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
16700 64 64 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 73  dd an entry in s
16710 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 66 6f 72  qlite_master for
16720 20 74 68 69 73 20 69 6e 64 65 78 0a 20 20 20 20   this index.    
16730 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  */.    sqlite3Ne
16740 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
16750 2c 20 0a 20 20 20 20 20 20 20 20 22 49 4e 53 45  , .        "INSE
16760 52 54 20 49 4e 54 4f 20 25 51 2e 25 73 20 56 41  RT INTO %Q.%s VA
16770 4c 55 45 53 28 27 69 6e 64 65 78 27 2c 25 51 2c  LUES('index',%Q,
16780 25 51 2c 23 25 64 2c 25 51 29 3b 22 2c 0a 20 20  %Q,#%d,%Q);",.  
16790 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
167a0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
167b0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
167c0 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
167d0 6d 65 2c 0a 20 20 20 20 20 20 20 20 70 54 61 62  me,.        pTab
167e0 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ->zName,.       
167f0 20 69 4d 65 6d 2c 0a 20 20 20 20 20 20 20 20 7a   iMem,.        z
16800 53 74 6d 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  Stmt.    );.    
16810 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16820 2c 20 7a 53 74 6d 74 29 3b 0a 0a 20 20 20 20 2f  , zStmt);..    /
16830 2a 20 46 69 6c 6c 20 74 68 65 20 69 6e 64 65 78  * Fill the index
16840 20 77 69 74 68 20 64 61 74 61 20 61 6e 64 20 72   with data and r
16850 65 70 61 72 73 65 20 74 68 65 20 73 63 68 65 6d  eparse the schem
16860 61 2e 20 43 6f 64 65 20 61 6e 20 4f 50 5f 45 78  a. Code an OP_Ex
16870 70 69 72 65 0a 20 20 20 20 2a 2a 20 74 6f 20 69  pire.    ** to i
16880 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
16890 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  e-compiled state
168a0 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ments..    */.  
168b0 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 20 29    if( pTblName )
168c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  {.      sqlite3R
168d0 65 66 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73  efillIndex(pPars
168e0 65 2c 20 70 49 6e 64 65 78 2c 20 69 4d 65 6d 29  e, pIndex, iMem)
168f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
16900 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61 72  hangeCookie(pPar
16910 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20  se, iDb);.      
16920 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
16930 34 28 76 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(v, OP_ParseSch
16940 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 0a  ema, iDb, 0, 0,.
16950 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16960 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d  MPrintf(db, "nam
16970 65 3d 27 25 71 27 22 2c 20 70 49 6e 64 65 78 2d  e='%q'", pIndex-
16980 3e 7a 4e 61 6d 65 29 2c 20 50 34 5f 44 59 4e 41  >zName), P4_DYNA
16990 4d 49 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  MIC);.      sqli
169a0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
169b0 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a   OP_Expire, 0);.
169c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
169d0 57 68 65 6e 20 61 64 64 69 6e 67 20 61 6e 20 69  When adding an i
169e0 6e 64 65 78 20 74 6f 20 74 68 65 20 6c 69 73 74  ndex to the list
169f0 20 6f 66 20 69 6e 64 69 63 65 73 20 66 6f 72 20   of indices for 
16a00 61 20 74 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20  a table, make.  
16a10 2a 2a 20 73 75 72 65 20 61 6c 6c 20 69 6e 64 69  ** sure all indi
16a20 63 65 73 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52  ces labeled OE_R
16a30 65 70 6c 61 63 65 20 63 6f 6d 65 20 61 66 74 65  eplace come afte
16a40 72 20 61 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65  r all those labe
16a50 6c 65 64 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f  led.  ** OE_Igno
16a60 72 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  re.  This is nec
16a70 65 73 73 61 72 79 20 66 6f 72 20 74 68 65 20 63  essary for the c
16a80 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
16a90 20 6f 66 20 55 50 44 41 54 45 0a 20 20 2a 2a 20   of UPDATE.  ** 
16aa0 61 6e 64 20 49 4e 53 45 52 54 2e 0a 20 20 2a 2f  and INSERT..  */
16ab0 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
16ac0 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
16ad0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
16ae0 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
16af0 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
16b00 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
16b10 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
16b20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
16b30 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
16b40 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
16b50 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
16b60 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
16b70 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
16b80 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
16b90 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
16ba0 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
16bb0 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
16bc0 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
16bd0 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
16be0 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
16bf0 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
16c00 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
16c10 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
16c20 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
16c30 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
16c40 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
16c50 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
16c60 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
16c70 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
16c80 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
16c90 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
16ca0 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
16cb0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
16cc0 72 65 65 28 70 49 6e 64 65 78 2d 3e 7a 43 6f 6c  ree(pIndex->zCol
16cd0 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Aff);.    sqlite
16ce0 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 64  3DbFree(db, pInd
16cf0 65 78 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ex);.  }.  sqlit
16d00 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
16d10 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 73  (db, pList);.  s
16d20 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c  qlite3SrcListDel
16d30 65 74 65 28 64 62 2c 20 70 54 62 6c 4e 61 6d 65  ete(db, pTblName
16d40 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16d50 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
16d60 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
16d70 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
16d80 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
16d90 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e 75 6d   file format num
16da0 62 65 72 20 69 73 20 61 74 20 6c 65 61 73 74 20  ber is at least 
16db0 6d 69 6e 46 6f 72 6d 61 74 2e 0a 2a 2a 20 54 68  minFormat..** Th
16dc0 65 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65  e generated code
16dd0 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 74   will increase t
16de0 68 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 6e  he file format n
16df0 75 6d 62 65 72 20 69 66 20 6e 65 63 65 73 73 61  umber if necessa
16e00 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ry..*/.void sqli
16e10 74 65 33 4d 69 6e 69 6d 75 6d 46 69 6c 65 46 6f  te3MinimumFileFo
16e20 72 6d 61 74 28 50 61 72 73 65 20 2a 70 50 61 72  rmat(Parse *pPar
16e30 73 65 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  se, int iDb, int
16e40 20 6d 69 6e 46 6f 72 6d 61 74 29 7b 0a 20 20 56   minFormat){.  V
16e50 64 62 65 20 2a 76 3b 0a 20 20 76 20 3d 20 73 71  dbe *v;.  v = sq
16e60 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
16e70 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
16e80 0a 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71  .    int r1 = sq
16e90 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
16ea0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 6e 74  pParse);.    int
16eb0 20 72 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r2 = sqlite3Get
16ec0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16ed0 0a 20 20 20 20 69 6e 74 20 6a 31 3b 0a 20 20 20  .    int j1;.   
16ee0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
16ef0 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
16f00 6b 69 65 2c 20 69 44 62 2c 20 72 31 2c 20 31 29  kie, iDb, r1, 1)
16f10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
16f20 65 55 73 65 73 42 74 72 65 65 28 76 2c 20 69 44  eUsesBtree(v, iD
16f30 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
16f40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16f50 49 6e 74 65 67 65 72 2c 20 6d 69 6e 46 6f 72 6d  Integer, minForm
16f60 61 74 2c 20 72 32 29 3b 0a 20 20 20 20 6a 31 20  at, r2);.    j1 
16f70 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16f80 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20 72 32  Op3(v, OP_Ge, r2
16f90 2c 20 30 2c 20 72 31 29 3b 0a 20 20 20 20 73 71  , 0, r1);.    sq
16fa0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
16fb0 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c  v, OP_SetCookie,
16fc0 20 69 44 62 2c 20 31 2c 20 72 32 29 3b 0a 20 20   iDb, 1, r2);.  
16fd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
16fe0 70 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 20 20  pHere(v, j1);.  
16ff0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
17000 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
17010 72 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r1);.    sqlite3
17020 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17030 50 61 72 73 65 2c 20 72 32 29 3b 0a 20 20 7d 0a  Parse, r2);.  }.
17040 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74 68  }../*.** Fill th
17050 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73 74  e Index.aiRowEst
17060 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64 65  [] array with de
17070 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69 6f  fault informatio
17080 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  n - information.
17090 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77 68  ** to be used wh
170a0 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72  en we have not r
170b0 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20 63  un the ANALYZE c
170c0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61 69  ommand..**.** ai
170d0 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75 70  RowEst[0] is sup
170e0 70 6f 73 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20  pose to contain 
170f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
17100 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e  ements in the in
17110 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20 77 65  dex..** Since we
17120 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20 67 75   do not know, gu
17130 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e 20 20  ess 1 million.  
17140 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73 20 61  aiRowEst[1] is a
17150 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
17160 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72  e.** number of r
17170 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ows in the table
17180 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
17190 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c 75 65  particular value
171a0 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   of the.** first
171b0 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
171c0 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73 74 5b  ndex.  aiRowEst[
171d0 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74  2] is an estimat
171e0 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 0a  e of the number.
171f0 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20  ** of rows that 
17200 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74 69 63  match any partic
17210 75 6c 61 72 20 63 6f 6d 62 69 6e 69 61 74 69 6f  ular combiniatio
17220 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 32  n of the first 2
17230 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20 74   columns.** of t
17240 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20 73  he index.  And s
17250 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75 73  o forth.  It mus
17260 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65 20  t always be the 
17270 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20 20  case that.*.**  
17280 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45 73           aiRowEs
17290 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b 4e  t[N]<=aiRowEst[N
172a0 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  -1].**          
172b0 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31 0a   aiRowEst[N]>=1.
172c0 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f 6d  **.** Apart from
172d0 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20 6c   that, we have l
172e0 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20 62  ittle to go on b
172f0 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f 6e  esides intuition
17300 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61 69   as to.** how ai
17310 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64 20  RowEst[] should 
17320 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  be initialized. 
17330 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65 6e   The numbers gen
17340 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20 61  erated here.** a
17350 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70 69  re based on typi
17360 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e 64  cal values found
17370 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69 63   in actual indic
17380 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  es..*/.void sqli
17390 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73 74  te3DefaultRowEst
173a0 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
173b0 20 75 6e 73 69 67 6e 65 64 20 2a 61 20 3d 20 70   unsigned *a = p
173c0 49 64 78 2d 3e 61 69 52 6f 77 45 73 74 3b 0a 20  Idx->aiRowEst;. 
173d0 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
173e0 28 20 61 21 3d 30 20 29 3b 0a 20 20 61 5b 30 5d  ( a!=0 );.  a[0]
173f0 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20 66 6f   = 1000000;.  fo
17400 72 28 69 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  r(i=pIdx->nColum
17410 6e 3b 20 69 3e 3d 35 3b 20 69 2d 2d 29 7b 0a 20  n; i>=5; i--){. 
17420 20 20 20 61 5b 69 5d 20 3d 20 35 3b 0a 20 20 7d     a[i] = 5;.  }
17430 0a 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 29  .  while( i>=1 )
17440 7b 0a 20 20 20 20 61 5b 69 5d 20 3d 20 31 31 20  {.    a[i] = 11 
17450 2d 20 69 3b 0a 20 20 20 20 69 2d 2d 3b 0a 20 20  - i;.    i--;.  
17460 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e  }.  if( pIdx->on
17470 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29  Error!=OE_None )
17480 7b 0a 20 20 20 20 61 5b 70 49 64 78 2d 3e 6e 43  {.    a[pIdx->nC
17490 6f 6c 75 6d 6e 5d 20 3d 20 31 3b 0a 20 20 7d 0a  olumn] = 1;.  }.
174a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
174b0 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70 20  utine will drop 
174c0 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d 65  an existing name
174d0 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20 72  d index.  This r
174e0 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65 6d  outine.** implem
174f0 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49 4e  ents the DROP IN
17500 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  DEX statement..*
17510 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72  /.void sqlite3Dr
17520 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  opIndex(Parse *p
17530 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
17540 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78 69  pName, int ifExi
17550 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  sts){.  Index *p
17560 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a 76  Index;.  Vdbe *v
17570 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
17580 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
17590 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66 28 20  int iDb;..  if( 
175a0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
175b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
175c0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
175d0 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
175e0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d  }.  assert( pNam
175f0 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  e->nSrc==1 );.  
17600 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
17610 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
17620 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
17630 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
17640 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 70 49 6e 64  ndex;.  }.  pInd
17650 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ex = sqlite3Find
17660 49 6e 64 65 78 28 64 62 2c 20 70 4e 61 6d 65 2d  Index(db, pName-
17670 3e 61 5b 30 5d 2e 7a 4e 61 6d 65 2c 20 70 4e 61  >a[0].zName, pNa
17680 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
17690 73 65 29 3b 0a 20 20 69 66 28 20 70 49 6e 64 65  se);.  if( pInde
176a0 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  x==0 ){.    if( 
176b0 21 69 66 45 78 69 73 74 73 20 29 7b 0a 20 20 20  !ifExists ){.   
176c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
176d0 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
176e0 75 63 68 20 69 6e 64 65 78 3a 20 25 53 22 2c 20  uch index: %S", 
176f0 70 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d  pName, 0);.    }
17700 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65  .    pParse->che
17710 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20  ckSchema = 1;.  
17720 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17730 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 66  _index;.  }.  if
17740 28 20 70 49 6e 64 65 78 2d 3e 61 75 74 6f 49 6e  ( pIndex->autoIn
17750 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dex ){.    sqlit
17760 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
17770 65 2c 20 22 69 6e 64 65 78 20 61 73 73 6f 63 69  e, "index associ
17780 61 74 65 64 20 77 69 74 68 20 55 4e 49 51 55 45  ated with UNIQUE
17790 20 22 0a 20 20 20 20 20 20 22 6f 72 20 50 52 49   ".      "or PRI
177a0 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61  MARY KEY constra
177b0 69 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 64 72  int cannot be dr
177c0 6f 70 70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  opped", 0);.    
177d0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
177e0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 69 44 62 20  ndex;.  }.  iDb 
177f0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
17800 6f 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65  oIndex(db, pInde
17810 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 23 69 66  x->pSchema);.#if
17820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17830 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
17840 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 20   {.    int code 
17850 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 49 4e  = SQLITE_DROP_IN
17860 44 45 58 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  DEX;.    Table *
17870 70 54 61 62 20 3d 20 70 49 6e 64 65 78 2d 3e 70  pTab = pIndex->p
17880 54 61 62 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  Table;.    const
17890 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
178a0 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
178b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
178c0 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54  *zTab = SCHEMA_T
178d0 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 69  ABLE(iDb);.    i
178e0 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
178f0 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
17900 54 45 5f 44 45 4c 45 54 45 2c 20 7a 54 61 62 2c  TE_DELETE, zTab,
17910 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20   0, zDb) ){.    
17920 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
17930 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20  _index;.    }.  
17940 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
17950 44 42 20 26 26 20 69 44 62 20 29 20 63 6f 64 65  DB && iDb ) code
17960 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54   = SQLITE_DROP_T
17970 45 4d 50 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69  EMP_INDEX;.    i
17980 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  f( sqlite3AuthCh
17990 65 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65  eck(pParse, code
179a0 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
179b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44   pTab->zName, zD
179c0 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  b) ){.      goto
179d0 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78   exit_drop_index
179e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
179f0 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  if..  /* Generat
17a00 65 20 63 6f 64 65 20 74 6f 20 72 65 6d 6f 76 65  e code to remove
17a10 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 66   the index and f
17a20 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
17a30 61 62 6c 65 20 2a 2f 0a 20 20 76 20 3d 20 73 71  able */.  v = sq
17a40 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
17a50 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
17a60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
17a70 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
17a80 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
17a90 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74  .    sqlite3Nest
17aa0 65 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a  edParse(pParse,.
17ab0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
17ac0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
17ad0 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20  name=%Q",.      
17ae0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17af0 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
17b00 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20 20 70  E(iDb),.       p
17b10 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20 20 20  Index->zName.   
17b20 20 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   );.    if( sqli
17b30 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
17b40 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c   "sqlite_stat1",
17b50 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e   db->aDb[iDb].zN
17b60 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ame) ){.      sq
17b70 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65  lite3NestedParse
17b80 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
17b90 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51   "DELETE FROM %Q
17ba0 2e 73 71 6c 69 74 65 5f 73 74 61 74 31 20 57 48  .sqlite_stat1 WH
17bb0 45 52 45 20 69 64 78 3d 25 51 22 2c 0a 20 20 20  ERE idx=%Q",.   
17bc0 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62       db->aDb[iDb
17bd0 5d 2e 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 2d  ].zName, pIndex-
17be0 3e 7a 4e 61 6d 65 0a 20 20 20 20 20 20 29 3b 0a  >zName.      );.
17bf0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17c00 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50  3ChangeCookie(pP
17c10 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20  arse, iDb);.    
17c20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28  destroyRootPage(
17c30 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e  pParse, pIndex->
17c40 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20  tnum, iDb);.    
17c50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17c60 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65  4(v, OP_DropInde
17c70 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49  x, iDb, 0, 0, pI
17c80 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b  ndex->zName, 0);
17c90 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f  .  }..exit_drop_
17ca0 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33  index:.  sqlite3
17cb0 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
17cc0 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , pName);.}../*.
17cd0 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70  ** pArray is a p
17ce0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
17cf0 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20  ay of objects.  
17d00 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74  Each object in t
17d10 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73  he.** array is s
17d20 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20  zEntry bytes in 
17d30 73 69 7a 65 2e 20 20 54 68 69 73 20 72 6f 75 74  size.  This rout
17d40 69 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20  ine allocates a 
17d50 6e 65 77 0a 2a 2a 20 6f 62 6a 65 63 74 20 6f 6e  new.** object on
17d60 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
17d70 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e  array..**.** *pn
17d80 45 6e 74 72 79 20 69 73 20 74 68 65 20 6e 75 6d  Entry is the num
17d90 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 61  ber of entries a
17da0 6c 72 65 61 64 79 20 69 6e 20 75 73 65 2e 20 20  lready in use.  
17db0 2a 70 6e 41 6c 6c 6f 63 20 69 73 0a 2a 2a 20 74  *pnAlloc is.** t
17dc0 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c  he previously al
17dd0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
17de0 74 68 65 20 61 72 72 61 79 2e 20 20 69 6e 69 74  the array.  init
17df0 53 69 7a 65 20 69 73 20 74 68 65 0a 2a 2a 20 73  Size is the.** s
17e00 75 67 67 65 73 74 65 64 20 69 6e 69 74 69 61 6c  uggested initial
17e10 20 61 72 72 61 79 20 73 69 7a 65 20 61 6c 6c 6f   array size allo
17e20 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
17e30 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e  e index of the n
17e40 65 77 20 65 6e 74 72 79 20 69 73 20 72 65 74 75  ew entry is retu
17e50 72 6e 65 64 20 69 6e 20 2a 70 49 64 78 2e 0a 2a  rned in *pIdx..*
17e60 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17e70 65 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  e returns a poin
17e80 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61 79  ter to the array
17e90 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 20 54 68   of objects.  Th
17ea0 69 73 0a 2a 2a 20 6d 69 67 68 74 20 62 65 20 74  is.** might be t
17eb0 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 70  he same as the p
17ec0 41 72 72 61 79 20 70 61 72 61 6d 65 74 65 72 20  Array parameter 
17ed0 6f 72 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  or it might be a
17ee0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 70 6f   different.** po
17ef0 69 6e 74 65 72 20 69 66 20 74 68 65 20 61 72 72  inter if the arr
17f00 61 79 20 77 61 73 20 72 65 73 69 7a 65 64 2e 0a  ay was resized..
17f10 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
17f20 41 72 72 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20  ArrayAllocate(. 
17f30 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
17f40 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
17f50 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61   to notify of ma
17f60 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f  lloc failures */
17f70 0a 20 20 76 6f 69 64 20 2a 70 41 72 72 61 79 2c  .  void *pArray,
17f80 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
17f90 20 6f 62 6a 65 63 74 73 2e 20 20 4d 69 67 68 74   objects.  Might
17fa0 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20   be reallocated 
17fb0 2a 2f 0a 20 20 69 6e 74 20 73 7a 45 6e 74 72 79  */.  int szEntry
17fc0 2c 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  ,      /* Size o
17fd0 66 20 65 61 63 68 20 6f 62 6a 65 63 74 20 69 6e  f each object in
17fe0 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 20 20   the array */.  
17ff0 69 6e 74 20 69 6e 69 74 53 69 7a 65 2c 20 20 20  int initSize,   
18000 20 20 2f 2a 20 53 75 67 67 65 73 74 65 64 20 69    /* Suggested i
18010 6e 69 74 69 61 6c 20 61 6c 6c 6f 63 61 74 69 6f  nitial allocatio
18020 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 2a  n, in elements *
18030 2f 0a 20 20 69 6e 74 20 2a 70 6e 45 6e 74 72 79  /.  int *pnEntry
18040 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
18050 6f 66 20 6f 62 6a 65 63 74 73 20 63 75 72 72 65  of objects curre
18060 6e 74 6c 79 20 69 6e 20 75 73 65 20 2a 2f 0a 20  ntly in use */. 
18070 20 69 6e 74 20 2a 70 6e 41 6c 6c 6f 63 2c 20 20   int *pnAlloc,  
18080 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
18090 7a 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ze of the alloca
180a0 74 69 6f 6e 2c 20 69 6e 20 65 6c 65 6d 65 6e 74  tion, in element
180b0 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78  s */.  int *pIdx
180c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
180d0 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  e the index of a
180e0 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a   new slot here *
180f0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
18100 20 20 69 66 28 20 2a 70 6e 45 6e 74 72 79 20 3e    if( *pnEntry >
18110 3d 20 2a 70 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  = *pnAlloc ){.  
18120 20 20 76 6f 69 64 20 2a 70 4e 65 77 3b 0a 20 20    void *pNew;.  
18130 20 20 69 6e 74 20 6e 65 77 53 69 7a 65 3b 0a 20    int newSize;. 
18140 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 28 2a 70     newSize = (*p
18150 6e 41 6c 6c 6f 63 29 2a 32 20 2b 20 69 6e 69 74  nAlloc)*2 + init
18160 53 69 7a 65 3b 0a 20 20 20 20 70 4e 65 77 20 3d  Size;.    pNew =
18170 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
18180 63 28 64 62 2c 20 70 41 72 72 61 79 2c 20 6e 65  c(db, pArray, ne
18190 77 53 69 7a 65 2a 73 7a 45 6e 74 72 79 29 3b 0a  wSize*szEntry);.
181a0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
181b0 29 7b 0a 20 20 20 20 20 20 2a 70 49 64 78 20 3d  ){.      *pIdx =
181c0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
181d0 6e 20 70 41 72 72 61 79 3b 0a 20 20 20 20 7d 0a  n pArray;.    }.
181e0 20 20 20 20 2a 70 6e 41 6c 6c 6f 63 20 3d 20 73      *pnAlloc = s
181f0 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69  qlite3DbMallocSi
18200 7a 65 28 64 62 2c 20 70 4e 65 77 29 2f 73 7a 45  ze(db, pNew)/szE
18210 6e 74 72 79 3b 0a 20 20 20 20 70 41 72 72 61 79  ntry;.    pArray
18220 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a   = pNew;.  }.  z
18230 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79   = (char*)pArray
18240 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 2a 70  ;.  memset(&z[*p
18250 6e 45 6e 74 72 79 20 2a 20 73 7a 45 6e 74 72 79  nEntry * szEntry
18260 5d 2c 20 30 2c 20 73 7a 45 6e 74 72 79 29 3b 0a  ], 0, szEntry);.
18270 20 20 2a 70 49 64 78 20 3d 20 2a 70 6e 45 6e 74    *pIdx = *pnEnt
18280 72 79 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72 79  ry;.  ++*pnEntry
18290 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72 61  ;.  return pArra
182a0 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  y;.}../*.** Appe
182b0 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  nd a new element
182c0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49 64   to the given Id
182d0 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61 20  List.  Create a 
182e0 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a 2a  new IdList if.**
182f0 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a 20   need be..**.** 
18300 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73 20  A new IdList is 
18310 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55 4c  returned, or NUL
18320 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66 61  L if malloc() fa
18330 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20 2a  ils..*/.IdList *
18340 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70 70  sqlite3IdListApp
18350 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  end(sqlite3 *db,
18360 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20   IdList *pList, 
18370 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a  Token *pToken){.
18380 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
18390 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  List==0 ){.    p
183a0 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44 62  List = sqlite3Db
183b0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
183c0 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29 3b  izeof(IdList) );
183d0 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
183e0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
183f0 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
18400 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  = 0;.  }.  pList
18410 2d 3e 61 20 3d 20 73 71 6c 69 74 65 33 41 72 72  ->a = sqlite3Arr
18420 61 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20  ayAllocate(.    
18430 20 20 64 62 2c 0a 20 20 20 20 20 20 70 4c 69 73    db,.      pLis
18440 74 2d 3e 61 2c 0a 20 20 20 20 20 20 73 69 7a 65  t->a,.      size
18450 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c  of(pList->a[0]),
18460 0a 20 20 20 20 20 20 35 2c 0a 20 20 20 20 20 20  .      5,.      
18470 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20 20  &pList->nId,.   
18480 20 20 20 26 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f     &pList->nAllo
18490 63 2c 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b  c,.      &i.  );
184a0 0a 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20  .  if( i<0 ){.  
184b0 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44    sqlite3IdListD
184c0 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
184d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
184e0 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69    }.  pList->a[i
184f0 5d 2e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ].zName = sqlite
18500 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64  3NameFromToken(d
18510 62 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65  b, pToken);.  re
18520 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
18530 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49  *.** Delete an I
18540 64 4c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  dList..*/.void s
18550 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65  qlite3IdListDele
18560 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
18570 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  IdList *pList){.
18580 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
18590 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
185a0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
185b0 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b  List->nId; i++){
185c0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
185d0 65 65 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b  ee(db, pList->a[
185e0 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
185f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
18600 62 2c 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  b, pList->a);.  
18610 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
18620 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , pList);.}../*.
18630 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e  ** Return the in
18640 64 65 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20  dex in pList of 
18650 74 68 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e  the identifier n
18660 61 6d 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72  amed zId.  Retur
18670 6e 20 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66  n -1.** if not f
18680 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ound..*/.int sql
18690 69 74 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28  ite3IdListIndex(
186a0 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63  IdList *pList, c
186b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
186c0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
186d0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
186e0 75 72 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d  urn -1;.  for(i=
186f0 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b  0; i<pList->nId;
18700 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
18710 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c  qlite3StrICmp(pL
18720 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c  ist->a[i].zName,
18730 20 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74   zName)==0 ) ret
18740 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  urn i;.  }.  ret
18750 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
18760 20 45 78 70 61 6e 64 20 74 68 65 20 73 70 61 63   Expand the spac
18770 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
18780 74 68 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73  the given SrcLis
18790 74 20 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63  t object by.** c
187a0 72 65 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e  reating nExtra n
187b0 65 77 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69  ew slots beginni
187c0 6e 67 20 61 74 20 69 53 74 61 72 74 2e 20 20 69  ng at iStart.  i
187d0 53 74 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61  Start is zero ba
187e0 73 65 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74  sed..** New slot
187f0 73 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a  s are zeroed..**
18800 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
18810 20 73 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69   suppose a SrcLi
18820 73 74 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e  st initially con
18830 74 61 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65  tains two entrie
18840 73 3a 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70  s: A,B..** To ap
18850 70 65 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69  pend 3 new entri
18860 65 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c  es onto the end,
18870 20 64 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   do this:.**.** 
18880 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
18890 74 45 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72  tEnlarge(db, pSr
188a0 63 6c 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a  clist, 3, 2);.**
188b0 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 63 61  .** After the ca
188c0 6c 6c 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c  ll above it woul
188d0 64 20 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42  d contain:  A, B
188e0 2c 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e  , nil, nil, nil.
188f0 0a 2a 2a 20 49 66 20 74 68 65 20 69 53 74 61 72  .** If the iStar
18900 74 20 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62  t argument had b
18910 65 65 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66  een 1 instead of
18920 20 32 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73   2, then the res
18930 75 6c 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76  ult.** would hav
18940 65 20 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c  e been:  A, nil,
18950 20 6e 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54   nil, nil, B.  T
18960 6f 20 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65  o prepend the ne
18970 77 20 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20  w slots,.** the 
18980 69 53 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75  iStart value wou
18990 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 72 65  ld be 0.  The re
189a0 73 75 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a  sult then would.
189b0 2a 2a 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c  ** be: nil, nil,
189c0 20 6e 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a   nil, A, B..**.*
189d0 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c  * If a memory al
189e0 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74  location fails t
189f0 68 65 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e  he SrcList is un
18a00 63 68 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a  changed.  The.**
18a10 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
18a20 64 20 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73  d flag will be s
18a30 65 74 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53  et to true..*/.S
18a40 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
18a50 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20  rcListEnlarge(. 
18a60 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
18a70 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
18a80 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f  connection to no
18a90 74 69 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f  tify of OOM erro
18aa0 72 73 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  rs */.  SrcList 
18ab0 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68  *pSrc,     /* Th
18ac0 65 20 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20  e SrcList to be 
18ad0 65 6e 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e  enlarged */.  in
18ae0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
18af0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
18b00 77 20 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74  w slots to add t
18b10 6f 20 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20  o pSrc->a[] */. 
18b20 20 69 6e 74 20 69 53 74 61 72 74 20 20 20 20 20   int iStart     
18b30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
18b40 70 53 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72  pSrc->a[] of fir
18b50 73 74 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29  st new slot */.)
18b60 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
18b70 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
18b80 20 6f 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61   on calling para
18b90 6d 65 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65  meters */.  asse
18ba0 72 74 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b  rt( iStart>=0 );
18bb0 0a 20 20 61 73 73 65 72 74 28 20 6e 45 78 74 72  .  assert( nExtr
18bc0 61 3e 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 53  a>=1 );.  if( pS
18bd0 72 63 3d 3d 30 20 7c 7c 20 69 53 74 61 72 74 3e  rc==0 || iStart>
18be0 70 53 72 63 2d 3e 6e 53 72 63 20 29 7b 0a 20 20  pSrc->nSrc ){.  
18bf0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
18c00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
18c10 20 20 72 65 74 75 72 6e 20 70 53 72 63 3b 0a 20    return pSrc;. 
18c20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74   }..  /* Allocat
18c30 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 70 61  e additional spa
18c40 63 65 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  ce if needed */.
18c50 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63    if( pSrc->nSrc
18c60 2b 6e 45 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41  +nExtra>pSrc->nA
18c70 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 53 72 63 4c  lloc ){.    SrcL
18c80 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69  ist *pNew;.    i
18c90 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63  nt nAlloc = pSrc
18ca0 2d 3e 6e 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20  ->nSrc+nExtra;. 
18cb0 20 20 20 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20     int nGot;.   
18cc0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
18cd0 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72  bRealloc(db, pSr
18ce0 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
18cf0 20 20 73 69 7a 65 6f 66 28 2a 70 53 72 63 29 20    sizeof(*pSrc) 
18d00 2b 20 28 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a  + (nAlloc-1)*siz
18d10 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20  eof(pSrc->a[0]) 
18d20 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  );.    if( pNew=
18d30 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
18d40 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
18d50 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65  iled );.      re
18d60 74 75 72 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d  turn pSrc;.    }
18d70 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4e 65 77  .    pSrc = pNew
18d80 3b 0a 20 20 20 20 6e 47 6f 74 20 3d 20 28 73 71  ;.    nGot = (sq
18d90 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a  lite3DbMallocSiz
18da0 65 28 64 62 2c 20 70 4e 65 77 29 20 2d 20 73 69  e(db, pNew) - si
18db0 7a 65 6f 66 28 2a 70 53 72 63 29 29 2f 73 69 7a  zeof(*pSrc))/siz
18dc0 65 6f 66 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b  eof(pSrc->a[0])+
18dd0 31 3b 0a 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c  1;.    pSrc->nAl
18de0 6c 6f 63 20 3d 20 28 75 31 36 29 6e 47 6f 74 3b  loc = (u16)nGot;
18df0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20  .  }..  /* Move 
18e00 65 78 69 73 74 69 6e 67 20 73 6c 6f 74 73 20 74  existing slots t
18e10 68 61 74 20 63 6f 6d 65 20 61 66 74 65 72 20 74  hat come after t
18e20 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65  he newly inserte
18e30 64 20 73 6c 6f 74 73 0a 20 20 2a 2a 20 6f 75 74  d slots.  ** out
18e40 20 6f 66 20 74 68 65 20 77 61 79 20 2a 2f 0a 20   of the way */. 
18e50 20 66 6f 72 28 69 3d 70 53 72 63 2d 3e 6e 53 72   for(i=pSrc->nSr
18e60 63 2d 31 3b 20 69 3e 3d 69 53 74 61 72 74 3b 20  c-1; i>=iStart; 
18e70 69 2d 2d 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e  i--){.    pSrc->
18e80 61 5b 69 2b 6e 45 78 74 72 61 5d 20 3d 20 70 53  a[i+nExtra] = pS
18e90 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20  rc->a[i];.  }.  
18ea0 70 53 72 63 2d 3e 6e 53 72 63 20 2b 3d 20 28 69  pSrc->nSrc += (i
18eb0 31 36 29 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  16)nExtra;..  /*
18ec0 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
18ed0 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
18ee0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
18ef0 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
18f00 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
18f10 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
18f20 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
18f30 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
18f40 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
18f50 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
18f60 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
18f70 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
18f80 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
18f90 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
18fa0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
18fb0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
18fc0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
18fd0 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
18fe0 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
18ff0 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
19000 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
19010 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
19020 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
19030 66 20 70 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c  f pToken is NULL
19040 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
19050 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
19060 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
19070 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
19080 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
19090 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
190a0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
190b0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
190c0 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
190d0 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
190e0 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
190f0 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
19100 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
19110 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
19120 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
19130 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
19140 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
19150 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
19160 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
19170 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
19180 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
19190 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
191a0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
191b0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
191c0 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
191d0 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
191e0 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
191f0 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
19200 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
19210 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
19220 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
19230 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
19240 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
19250 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
19260 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
19270 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
19280 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
19290 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
192a0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
192b0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
192c0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
192d0 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
192e0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
192f0 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
19300 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
19310 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
19320 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
19330 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
19340 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
19350 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
19360 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
19370 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
19380 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
19390 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
193a0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
193b0 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
193c0 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
193d0 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
193e0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
193f0 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
19400 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
19410 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
19420 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
19430 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
19440 61 73 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 53 72 63  ase name..*/.Src
19450 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
19460 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71  ListAppend(.  sq
19470 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
19480 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
19490 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c  to notify of mal
194a0 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  loc failures */.
194b0 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74    SrcList *pList
194c0 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ,     /* Append 
194d0 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e  to this SrcList.
194e0 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20   NULL creates a 
194f0 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20  new SrcList */. 
19500 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20   Token *pTable, 
19510 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f       /* Table to
19520 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b   append */.  Tok
19530 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20  en *pDatabase   
19540 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20   /* Database of 
19550 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  the table */.){.
19560 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
19570 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
19580 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
19590 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
195a0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
195b0 64 62 2c 20 73 69 7a 65 6f 66 28 53 72 63 4c 69  db, sizeof(SrcLi
195c0 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
195d0 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
195e0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   0;.    pList->n
195f0 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20 7d 0a 20  Alloc = 1;.  }. 
19600 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
19610 53 72 63 4c 69 73 74 45 6e 6c 61 72 67 65 28 64  SrcListEnlarge(d
19620 62 2c 20 70 4c 69 73 74 2c 20 31 2c 20 70 4c 69  b, pList, 1, pLi
19630 73 74 2d 3e 6e 53 72 63 29 3b 0a 20 20 69 66 28  st->nSrc);.  if(
19640 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
19650 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
19660 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62  SrcListDelete(db
19670 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 72 65  , pList);.    re
19680 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 49  turn 0;.  }.  pI
19690 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
196a0 70 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 5d 3b 0a  pList->nSrc-1];.
196b0 20 20 69 66 28 20 70 44 61 74 61 62 61 73 65 20    if( pDatabase 
196c0 26 26 20 70 44 61 74 61 62 61 73 65 2d 3e 7a 3d  && pDatabase->z=
196d0 3d 30 20 29 7b 0a 20 20 20 20 70 44 61 74 61 62  =0 ){.    pDatab
196e0 61 73 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  ase = 0;.  }.  i
196f0 66 28 20 70 44 61 74 61 62 61 73 65 20 26 26 20  f( pDatabase && 
19700 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 54 6f  pTable ){.    To
19710 6b 65 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61  ken *pTemp = pDa
19720 74 61 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74  tabase;.    pDat
19730 61 62 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a  abase = pTable;.
19740 20 20 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65      pTable = pTe
19750 6d 70 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  mp;.  }.  pItem-
19760 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
19770 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
19780 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74  , pTable);.  pIt
19790 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20  em->zDatabase = 
197a0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
197b0 6f 6b 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61  oken(db, pDataba
197c0 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c  se);.  return pL
197d0 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73  ist;.}../*.** As
197e0 73 69 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20  sign VdbeCursor 
197f0 69 6e 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f  index numbers to
19800 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
19810 20 53 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64   SrcList.*/.void
19820 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41   sqlite3SrcListA
19830 73 73 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72  ssignCursors(Par
19840 73 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c  se *pParse, SrcL
19850 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
19860 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53  nt i;.  struct S
19870 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
19880 65 6d 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  em;.  assert(pLi
19890 73 74 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  st || pParse->db
198a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
198b0 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
198c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  .    for(i=0, pI
198d0 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
198e0 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
198f0 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
19900 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75    if( pItem->iCu
19910 72 73 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b  rsor>=0 ) break;
19920 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43  .      pItem->iC
19930 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
19940 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nTab++;.      if
19950 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  ( pItem->pSelect
19960 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
19970 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
19980 43 75 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20  Cursors(pParse, 
19990 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e  pItem->pSelect->
199a0 70 53 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSrc);.      }. 
199b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
199c0 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69  * Delete an enti
199d0 72 65 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75  re SrcList inclu
199e0 64 69 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62  ding all its sub
199f0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f  structure..*/.vo
19a00 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
19a10 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20  tDelete(sqlite3 
19a20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c  *db, SrcList *pL
19a30 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
19a40 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
19a50 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
19a60 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
19a70 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65  turn;.  for(pIte
19a80 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b  m=pList->a, i=0;
19a90 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20   i<pList->nSrc; 
19aa0 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
19ab0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
19ac0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74  (db, pItem->zDat
19ad0 61 62 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69  abase);.    sqli
19ae0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
19af0 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
19b00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
19b10 62 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  b, pItem->zAlias
19b20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
19b30 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
19b40 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 73 71 6c  zIndex);.    sql
19b50 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
19b60 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
19b70 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
19b80 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d  elete(db, pItem-
19b90 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73  >pSelect);.    s
19ba0 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
19bb0 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29  (db, pItem->pOn)
19bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c  ;.    sqlite3IdL
19bd0 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49  istDelete(db, pI
19be0 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
19bf0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
19c00 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a  e(db, pList);.}.
19c10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
19c20 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
19c30 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61   the parser to a
19c40 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f  dd a new term to
19c50 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61   the.** end of a
19c60 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c   growing FROM cl
19c70 61 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70  ause.  The "p" p
19c80 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
19c90 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46  part of.** the F
19ca0 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20  ROM clause that 
19cb0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
19cc0 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22   constructed.  "
19cd0 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66  p" is NULL.** if
19ce0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
19cf0 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46  st term of the F
19d00 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61  ROM clause.  pTa
19d10 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73  ble and pDatabas
19d20 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d  e.** are the nam
19d30 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  e of the table a
19d40 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  nd database name
19d50 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  d in the FROM cl
19d60 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44  ause term..** pD
19d70 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20  atabase is NULL 
19d80 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
19d90 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69  name qualifier i
19da0 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a  s missing - the.
19db0 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20  ** usual case.  
19dc0 49 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20  If the term has 
19dd0 61 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  a alias, then pA
19de0 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
19df0 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
19e00 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
19e10 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
19e20 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
19e30 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
19e40 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
19e50 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
19e60 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
19e70 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
19e80 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
19e90 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
19ea0 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
19eb0 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
19ec0 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
19ed0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
19ee0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
19ef0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
19f00 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
19f10 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
19f20 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
19f30 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
19f40 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
19f50 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
19f60 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
19f70 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
19f80 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
19f90 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
19fa0 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
19fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19fc0 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
19fd0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
19fe0 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
19ff0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1a000 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1a010 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1a020 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1a030 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1a040 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1a050 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1a060 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1a070 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1a080 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1a090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1a0a0 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1a0b0 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1a0c0 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1a0d0 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1a0e0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1a0f0 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1a100 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1a110 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1a120 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a130 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1a140 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1a150 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1a160 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1a170 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1a180 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1a190 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1a1a0 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1a1b0 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1a1c0 3e 64 62 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  >db;.  p = sqlit
1a1d0 65 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28  e3SrcListAppend(
1a1e0 64 62 2c 20 70 2c 20 70 54 61 62 6c 65 2c 20 70  db, p, pTable, p
1a1f0 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28  Database);.  if(
1a200 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 53 72 63   p==0 || p->nSrc
1a210 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1a220 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1a230 20 70 4f 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74   pOn);.    sqlit
1a240 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 64  e3IdListDelete(d
1a250 62 2c 20 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  b, pUsing);.    
1a260 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c  sqlite3SelectDel
1a270 65 74 65 28 64 62 2c 20 70 53 75 62 71 75 65 72  ete(db, pSubquer
1a280 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  y);.    return p
1a290 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20  ;.  }.  pItem = 
1a2a0 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d  &p->a[p->nSrc-1]
1a2b0 3b 0a 20 20 69 66 28 20 70 41 6c 69 61 73 20 26  ;.  if( pAlias &
1a2c0 26 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20  & pAlias->n ){. 
1a2d0 20 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73     pItem->zAlias
1a2e0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1a2f0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69  omToken(db, pAli
1a300 61 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d  as);.  }.  pItem
1a310 2d 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62  ->pSelect = pSub
1a320 71 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e  query;.  pItem->
1a330 70 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74  pOn = pOn;.  pIt
1a340 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73  em->pUsing = pUs
1a350 69 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  ing;.  return p;
1a360 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1a370 20 49 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e   INDEXED BY or N
1a380 4f 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73  OT INDEXED claus
1a390 65 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65  e to the most re
1a3a0 63 65 6e 74 6c 79 20 61 64 64 65 64 20 0a 2a 2a  cently added .**
1a3b0 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
1a3c0 73 6f 75 72 63 65 2d 6c 69 73 74 20 70 61 73 73  source-list pass
1a3d0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1a3e0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f   argument..*/.vo
1a3f0 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73  id sqlite3SrcLis
1a400 74 49 6e 64 65 78 65 64 42 79 28 50 61 72 73 65  tIndexedBy(Parse
1a410 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1a420 74 20 2a 70 2c 20 54 6f 6b 65 6e 20 2a 70 49 6e  t *p, Token *pIn
1a430 64 65 78 65 64 42 79 29 7b 0a 20 20 69 66 28 20  dexedBy){.  if( 
1a440 70 49 6e 64 65 78 65 64 42 79 20 26 26 20 70 20  pIndexedBy && p 
1a450 26 26 20 70 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a  && p->nSrc>0 ){.
1a460 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
1a470 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
1a480 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31   &p->a[p->nSrc-1
1a490 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1a4a0 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78 65 64  Item->notIndexed
1a4b0 3d 3d 30 20 26 26 20 70 49 74 65 6d 2d 3e 7a 49  ==0 && pItem->zI
1a4c0 6e 64 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ndex==0 );.    i
1a4d0 66 28 20 70 49 6e 64 65 78 65 64 42 79 2d 3e 6e  f( pIndexedBy->n
1a4e0 3d 3d 31 20 26 26 20 21 70 49 6e 64 65 78 65 64  ==1 && !pIndexed
1a4f0 42 79 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 2f  By->z ){.      /
1a500 2a 20 41 20 22 4e 4f 54 20 49 4e 44 45 58 45 44  * A "NOT INDEXED
1a510 22 20 63 6c 61 75 73 65 20 77 61 73 20 73 75 70  " clause was sup
1a520 70 6c 69 65 64 2e 20 53 65 65 20 70 61 72 73 65  plied. See parse
1a530 2e 79 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  .y .      ** con
1a540 73 74 72 75 63 74 20 22 69 6e 64 65 78 65 64 5f  struct "indexed_
1a550 6f 70 74 22 20 66 6f 72 20 64 65 74 61 69 6c 73  opt" for details
1a560 2e 20 2a 2f 0a 20 20 20 20 20 20 70 49 74 65 6d  . */.      pItem
1a570 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31  ->notIndexed = 1
1a580 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a590 20 20 20 70 49 74 65 6d 2d 3e 7a 49 6e 64 65 78     pItem->zIndex
1a5a0 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
1a5b0 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e  omToken(pParse->
1a5c0 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79 29 3b  db, pIndexedBy);
1a5d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1a5e0 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c 64 69 6e  .** When buildin
1a5f0 67 20 75 70 20 61 20 46 52 4f 4d 20 63 6c 61 75  g up a FROM clau
1a600 73 65 20 69 6e 20 74 68 65 20 70 61 72 73 65 72  se in the parser
1a610 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70 65 72 61  , the join opera
1a620 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69 74 69 61  tor.** is initia
1a630 6c 6c 79 20 61 74 74 61 63 68 65 64 20 74 6f 20  lly attached to 
1a640 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64  the left operand
1a650 2e 20 20 42 75 74 20 74 68 65 20 63 6f 64 65 20  .  But the code 
1a660 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 65 78 70  generator.** exp
1a670 65 63 74 73 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ects the join op
1a680 65 72 61 74 6f 72 20 74 6f 20 62 65 20 6f 6e 20  erator to be on 
1a690 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  the right operan
1a6a0 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  d.  This routine
1a6b0 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c 6c 20 6a  .** Shifts all j
1a6c0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73 20 66 72  oin operators fr
1a6d0 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74  om left to right
1a6e0 20 66 6f 72 20 61 6e 20 65 6e 74 69 72 65 20 46   for an entire F
1a6f0 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65 2e 0a 2a  ROM.** clause..*
1a700 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a 20 53 75  *.** Example: Su
1a710 70 70 6f 73 65 20 74 68 65 20 6a 6f 69 6e 20 69  ppose the join i
1a720 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  s like this:.**.
1a730 2a 2a 20 20 20 20 20 20 20 20 20 20 20 41 20 6e  **           A n
1a740 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69  atural cross joi
1a750 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 70  n B.**.** The op
1a760 65 72 61 74 6f 72 20 69 73 20 22 6e 61 74 75 72  erator is "natur
1a770 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e 22 2e 20  al cross join". 
1a780 20 54 68 65 20 41 20 61 6e 64 20 42 20 6f 70 65   The A and B ope
1a790 72 61 6e 64 73 20 61 72 65 20 73 74 6f 72 65 64  rands are stored
1a7a0 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30 5d 20 61  .** in p->a[0] a
1a7b0 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72 65 73 70  nd p->a[1], resp
1a7c0 65 63 74 69 76 65 6c 79 2e 20 20 54 68 65 20 70  ectively.  The p
1a7d0 61 72 73 65 72 20 69 6e 69 74 69 61 6c 6c 79 20  arser initially 
1a7e0 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a 20 6f 70  stores the.** op
1a7f0 65 72 61 74 6f 72 20 77 69 74 68 20 41 2e 20 20  erator with A.  
1a800 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 69  This routine shi
1a810 66 74 73 20 74 68 61 74 20 6f 70 65 72 61 74 6f  fts that operato
1a820 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a 2a 2f 0a  r over to B..*/.
1a830 76 6f 69 64 20 73 71 6c 69 74 65 33 53 72 63 4c  void sqlite3SrcL
1a840 69 73 74 53 68 69 66 74 4a 6f 69 6e 54 79 70 65  istShiftJoinType
1a850 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
1a860 69 66 28 20 70 20 26 26 20 70 2d 3e 61 20 29 7b  if( p && p->a ){
1a870 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1a880 66 6f 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b  for(i=p->nSrc-1;
1a890 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   i>0; i--){.    
1a8a0 20 20 70 2d 3e 61 5b 69 5d 2e 6a 6f 69 6e 74 79    p->a[i].jointy
1a8b0 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 6a  pe = p->a[i-1].j
1a8c0 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ointype;.    }. 
1a8d0 20 20 20 70 2d 3e 61 5b 30 5d 2e 6a 6f 69 6e 74     p->a[0].joint
1a8e0 79 70 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ype = 0;.  }.}..
1a8f0 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 74 72  /*.** Begin a tr
1a900 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a 76 6f 69  ansaction.*/.voi
1a910 64 20 73 71 6c 69 74 65 33 42 65 67 69 6e 54 72  d sqlite3BeginTr
1a920 61 6e 73 61 63 74 69 6f 6e 28 50 61 72 73 65 20  ansaction(Parse 
1a930 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 74 79 70  *pParse, int typ
1a940 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1a950 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  b;.  Vdbe *v;.  
1a960 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 50  int i;..  if( pP
1a970 61 72 73 65 3d 3d 30 20 7c 7c 20 28 64 62 3d 70  arse==0 || (db=p
1a980 50 61 72 73 65 2d 3e 64 62 29 3d 3d 30 20 7c 7c  Parse->db)==0 ||
1a990 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1a9a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
1a9b0 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  f( pParse->nErr 
1a9c0 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
1a9d0 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
1a9e0 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
1a9f0 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
1aa00 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c  ITE_TRANSACTION,
1aa10 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 29 20   "BEGIN", 0, 0) 
1aa20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 76 20 3d  ) return;..  v =
1aa30 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1aa40 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 21  pParse);.  if( !
1aa50 76 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  v ) return;.  if
1aa60 28 20 74 79 70 65 21 3d 54 4b 5f 44 45 46 45 52  ( type!=TK_DEFER
1aa70 52 45 44 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  RED ){.    for(i
1aa80 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1aa90 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1aaa0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1aab0 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20  OP_Transaction, 
1aac0 69 2c 20 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43  i, (type==TK_EXC
1aad0 4c 55 53 49 56 45 29 2b 31 29 3b 0a 20 20 20 20  LUSIVE)+1);.    
1aae0 20 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65    sqlite3VdbeUse
1aaf0 73 42 74 72 65 65 28 76 2c 20 69 29 3b 0a 20 20  sBtree(v, i);.  
1ab00 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1ab10 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1ab20 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c  P_AutoCommit, 0,
1ab30 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   0);.}../*.** Co
1ab40 6d 6d 69 74 20 61 20 74 72 61 6e 73 61 63 74 69  mmit a transacti
1ab50 6f 6e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  on.*/.void sqlit
1ab60 65 33 43 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74  e3CommitTransact
1ab70 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
1ab80 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e){.  sqlite3 *d
1ab90 62 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20  b;.  Vdbe *v;.. 
1aba0 20 69 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c   if( pParse==0 |
1abb0 7c 20 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62  | (db=pParse->db
1abc0 29 3d 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b  )==0 || db->aDb[
1abd0 30 5d 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75  0].pBt==0 ) retu
1abe0 72 6e 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  rn;.  if( pParse
1abf0 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61  ->nErr || db->ma
1ac00 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1ac10 75 72 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  urn;.  if( sqlit
1ac20 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1ac30 73 65 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  se, SQLITE_TRANS
1ac40 41 43 54 49 4f 4e 2c 20 22 43 4f 4d 4d 49 54 22  ACTION, "COMMIT"
1ac50 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1ac60 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1ac70 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1ac80 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1ac90 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1aca0 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1acb0 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d  it, 1, 0);.  }.}
1acc0 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
1acd0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a   a transaction.*
1ace0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
1acf0 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f  llbackTransactio
1ad00 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29  n(Parse *pParse)
1ad10 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1ad20 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 69  .  Vdbe *v;..  i
1ad30 66 28 20 70 50 61 72 73 65 3d 3d 30 20 7c 7c 20  f( pParse==0 || 
1ad40 28 64 62 3d 70 50 61 72 73 65 2d 3e 64 62 29 3d  (db=pParse->db)=
1ad50 3d 30 20 7c 7c 20 64 62 2d 3e 61 44 62 5b 30 5d  =0 || db->aDb[0]
1ad60 2e 70 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  .pBt==0 ) return
1ad70 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
1ad80 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
1ad90 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72  ocFailed ) retur
1ada0 6e 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  n;.  if( sqlite3
1adb0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
1adc0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
1add0 54 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22  TION, "ROLLBACK"
1ade0 2c 20 30 2c 20 30 29 20 29 20 72 65 74 75 72 6e  , 0, 0) ) return
1adf0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1ae00 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1ae10 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1ae20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ae30 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  2(v, OP_AutoComm
1ae40 69 74 2c 20 31 2c 20 31 29 3b 0a 20 20 7d 0a 7d  it, 1, 1);.  }.}
1ae50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1ae60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1ae70 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77 68  by the parser wh
1ae80 65 6e 20 69 74 20 70 61 72 73 65 73 20 61 20 63  en it parses a c
1ae90 6f 6d 6d 61 6e 64 20 74 6f 20 63 72 65 61 74 65  ommand to create
1aea0 2c 0a 2a 2a 20 72 65 6c 65 61 73 65 20 6f 72 20  ,.** release or 
1aeb0 72 6f 6c 6c 62 61 63 6b 20 61 6e 20 53 51 4c 20  rollback an SQL 
1aec0 73 61 76 65 70 6f 69 6e 74 2e 20 0a 2a 2f 0a 76  savepoint. .*/.v
1aed0 6f 69 64 20 73 71 6c 69 74 65 33 53 61 76 65 70  oid sqlite3Savep
1aee0 6f 69 6e 74 28 50 61 72 73 65 20 2a 70 50 61 72  oint(Parse *pPar
1aef0 73 65 2c 20 69 6e 74 20 6f 70 2c 20 54 6f 6b 65  se, int op, Toke
1af00 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
1af10 72 20 2a 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  r *zName = sqlit
1af20 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1af30 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4e 61 6d  pParse->db, pNam
1af40 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  e);.  if( zName 
1af50 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d  ){.    Vdbe *v =
1af60 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
1af70 70 50 61 72 73 65 29 3b 0a 23 69 66 6e 64 65 66  pParse);.#ifndef
1af80 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1af90 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 73  HORIZATION.    s
1afa0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1afb0 20 2a 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49   *az[] = { "BEGI
1afc0 4e 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22  N", "RELEASE", "
1afd0 52 4f 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20  ROLLBACK" };.   
1afe0 20 61 73 73 65 72 74 28 20 21 53 41 56 45 50 4f   assert( !SAVEPO
1aff0 49 4e 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56  INT_BEGIN && SAV
1b000 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d  EPOINT_RELEASE==
1b010 31 20 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52  1 && SAVEPOINT_R
1b020 4f 4c 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65  OLLBACK==2 );.#e
1b030 6e 64 69 66 0a 20 20 20 20 69 66 28 20 21 76 20  ndif.    if( !v 
1b040 7c 7c 20 73 71 6c 69 74 65 33 41 75 74 68 43 68  || sqlite3AuthCh
1b050 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
1b060 54 45 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a  TE_SAVEPOINT, az
1b070 5b 6f 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20  [op], zName, 0) 
1b080 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1b090 44 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  DbFree(pParse->d
1b0a0 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  b, zName);.     
1b0b0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1b0c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1b0d0 64 4f 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70  dOp4(v, OP_Savep
1b0e0 6f 69 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  oint, op, 0, 0, 
1b0f0 7a 4e 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49  zName, P4_DYNAMI
1b100 43 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  C);.  }.}../*.**
1b110 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 54   Make sure the T
1b120 45 4d 50 20 64 61 74 61 62 61 73 65 20 69 73 20  EMP database is 
1b130 6f 70 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62  open and availab
1b140 6c 65 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74  le for use.  Ret
1b150 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  urn.** the numbe
1b160 72 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65  r of errors.  Le
1b170 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ave any error me
1b180 73 73 61 67 65 73 20 69 6e 20 74 68 65 20 70 50  ssages in the pP
1b190 61 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a  arse structure..
1b1a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70  */.int sqlite3Op
1b1b0 65 6e 54 65 6d 70 44 61 74 61 62 61 73 65 28 50  enTempDatabase(P
1b1c0 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20  arse *pParse){. 
1b1d0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1b1e0 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28  Parse->db;.  if(
1b1f0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d   db->aDb[1].pBt=
1b200 3d 30 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65  =0 && !pParse->e
1b210 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e  xplain ){.    in
1b220 74 20 72 63 3b 0a 20 20 20 20 73 74 61 74 69 63  t rc;.    static
1b230 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73   const int flags
1b240 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20 53 51   = .          SQ
1b250 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1b260 49 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ITE |.          
1b270 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1b280 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  TE |.          S
1b290 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
1b2a0 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
1b2b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
1b2c0 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
1b2d0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1b2e0 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20  EN_TEMP_DB;..   
1b2f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
1b300 65 65 46 61 63 74 6f 72 79 28 64 62 2c 20 30 2c  eeFactory(db, 0,
1b310 20 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   0, SQLITE_DEFAU
1b320 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 66  LT_CACHE_SIZE, f
1b330 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44 62 5b         &db->aDb[
1b360 31 5d 2e 70 42 74 29 3b 0a 20 20 20 20 69 66 28  1].pBt);.    if(
1b370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b380 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1b390 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1b3a0 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "unable to open 
1b3b0 61 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  a temporary data
1b3c0 62 61 73 65 20 22 0a 20 20 20 20 20 20 20 20 22  base ".        "
1b3d0 66 69 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67  file for storing
1b3e0 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
1b3f0 73 22 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73  s");.      pPars
1b400 65 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  e->rc = rc;.    
1b410 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1b420 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 64  }.    assert( (d
1b430 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
1b440 45 5f 49 6e 54 72 61 6e 73 29 3d 3d 30 20 7c 7c  E_InTrans)==0 ||
1b450 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
1b460 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
1b470 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
1b480 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  a );.    sqlite3
1b490 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
1b4a0 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  (sqlite3BtreePag
1b4b0 65 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42  er(db->aDb[1].pB
1b4c0 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t),.            
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 64 62 2d 3e 64 66 6c 74 4a 6f 75 72 6e 61 6c 4d  db->dfltJournalM
1b4f0 6f 64 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ode);.  }.  retu
1b500 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
1b510 65 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64  enerate VDBE cod
1b520 65 20 74 68 61 74 20 77 69 6c 6c 20 76 65 72 69  e that will veri
1b530 66 79 20 74 68 65 20 73 63 68 65 6d 61 20 63 6f  fy the schema co
1b540 6f 6b 69 65 20 61 6e 64 20 73 74 61 72 74 0a 2a  okie and start.*
1b550 2a 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  * a read-transac
1b560 74 69 6f 6e 20 66 6f 72 20 61 6c 6c 20 6e 61 6d  tion for all nam
1b570 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1b580 73 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  s..**.** It is i
1b590 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 6c  mportant that al
1b5a0 6c 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69 65 73  l schema cookies
1b5b0 20 62 65 20 76 65 72 69 66 69 65 64 20 61 6e 64   be verified and
1b5c0 20 61 6c 6c 0a 2a 2a 20 72 65 61 64 20 74 72 61   all.** read tra
1b5d0 6e 73 61 63 74 69 6f 6e 73 20 62 65 20 73 74 61  nsactions be sta
1b5e0 72 74 65 64 20 62 65 66 6f 72 65 20 61 6e 79 74  rted before anyt
1b5f0 68 69 6e 67 20 65 6c 73 65 20 68 61 70 70 65 6e  hing else happen
1b600 73 20 69 6e 0a 2a 2a 20 74 68 65 20 56 44 42 45  s in.** the VDBE
1b610 20 70 72 6f 67 72 61 6d 2e 20 20 42 75 74 20 74   program.  But t
1b620 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
1b630 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
1b640 6d 75 63 68 20 6f 74 68 65 72 0a 2a 2a 20 63 6f  much other.** co
1b650 64 65 20 68 61 73 20 62 65 65 6e 20 67 65 6e 65  de has been gene
1b660 72 61 74 65 64 2e 20 20 53 6f 20 68 65 72 65 20  rated.  So here 
1b670 69 73 20 77 68 61 74 20 77 65 20 64 6f 3a 0a 2a  is what we do:.*
1b680 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1b690 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1b6a0 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 63   is called, we c
1b6b0 6f 64 65 20 61 6e 20 4f 50 5f 47 6f 74 6f 20 74  ode an OP_Goto t
1b6c0 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 6a 75 6d 70  hat.** will jump
1b6d0 20 74 6f 20 61 20 73 75 62 72 6f 75 74 69 6e 65   to a subroutine
1b6e0 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1b6f0 68 65 20 70 72 6f 67 72 61 6d 2e 20 20 54 68 65  he program.  The
1b700 6e 20 77 65 0a 2a 2a 20 72 65 63 6f 72 64 20 65  n we.** record e
1b710 76 65 72 79 20 64 61 74 61 62 61 73 65 20 74 68  very database th
1b720 61 74 20 6e 65 65 64 73 20 69 74 73 20 73 63 68  at needs its sch
1b730 65 6d 61 20 76 65 72 69 66 69 65 64 20 69 6e 20  ema verified in 
1b740 74 68 65 0a 2a 2a 20 70 50 61 72 73 65 2d 3e 63  the.** pParse->c
1b750 6f 6f 6b 69 65 4d 61 73 6b 20 66 69 65 6c 64 2e  ookieMask field.
1b760 20 20 4c 61 74 65 72 2c 20 61 66 74 65 72 20 61    Later, after a
1b770 6c 6c 20 6f 74 68 65 72 20 63 6f 64 65 20 68 61  ll other code ha
1b780 73 20 62 65 65 6e 0a 2a 2a 20 67 65 6e 65 72 61  s been.** genera
1b790 74 65 64 2c 20 74 68 65 20 73 75 62 72 6f 75 74  ted, the subrout
1b7a0 69 6e 65 20 74 68 61 74 20 64 6f 65 73 20 74 68  ine that does th
1b7b0 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69 63  e cookie verific
1b7c0 61 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 73 74  ations and.** st
1b7d0 61 72 74 73 20 74 68 65 20 74 72 61 6e 73 61 63  arts the transac
1b7e0 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f  tions will be co
1b7f0 64 65 64 20 61 6e 64 20 74 68 65 20 4f 50 5f 47  ded and the OP_G
1b800 6f 74 6f 20 50 32 20 76 61 6c 75 65 0a 2a 2a 20  oto P2 value.** 
1b810 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
1b820 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 20 73 75  point to that su
1b830 62 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 67  broutine.  The g
1b840 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  eneration of the
1b850 0a 2a 2a 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  .** cookie verif
1b860 69 63 61 74 69 6f 6e 20 73 75 62 72 6f 75 74 69  ication subrouti
1b870 6e 65 20 63 6f 64 65 20 68 61 70 70 65 6e 73 20  ne code happens 
1b880 69 6e 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68  in sqlite3Finish
1b890 43 6f 64 69 6e 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  Coding()..**.** 
1b8a0 49 66 20 69 44 62 3c 30 20 74 68 65 6e 20 63 6f  If iDb<0 then co
1b8b0 64 65 20 74 68 65 20 4f 50 5f 47 6f 74 6f 20 6f  de the OP_Goto o
1b8c0 6e 6c 79 20 2d 20 64 6f 6e 27 74 20 73 65 74 20  nly - don't set 
1b8d0 66 6c 61 67 20 74 6f 20 76 65 72 69 66 79 20 74  flag to verify t
1b8e0 68 65 0a 2a 2a 20 73 63 68 65 6d 61 20 6f 6e 20  he.** schema on 
1b8f0 61 6e 79 20 64 61 74 61 62 61 73 65 73 2e 20 20  any databases.  
1b900 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
1b910 20 74 6f 20 70 6f 73 69 74 69 6f 6e 20 74 68 65   to position the
1b920 20 4f 50 5f 47 6f 74 6f 0a 2a 2a 20 65 61 72 6c   OP_Goto.** earl
1b930 79 20 69 6e 20 74 68 65 20 63 6f 64 65 2c 20 62  y in the code, b
1b940 65 66 6f 72 65 20 77 65 20 6b 6e 6f 77 20 69 66  efore we know if
1b950 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 74 61   any database ta
1b960 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 75 73 65  bles will be use
1b970 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
1b980 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
1b990 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
1b9a0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 73 71  , int iDb){.  sq
1b9b0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
1b9c0 65 20 2a 76 3b 0a 20 20 69 6e 74 20 6d 61 73 6b  e *v;.  int mask
1b9d0 3b 0a 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  ;..  v = sqlite3
1b9e0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1b9f0 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
1ba00 74 75 72 6e 3b 20 20 2f 2a 20 54 68 69 73 20 6f  turn;  /* This o
1ba10 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 66 20 74  nly happens if t
1ba20 68 65 72 65 20 77 61 73 20 61 20 70 72 69 6f 72  here was a prior
1ba30 20 65 72 72 6f 72 20 2a 2f 0a 20 20 64 62 20 3d   error */.  db =
1ba40 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
1ba50 66 28 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  f( pParse->cooki
1ba60 65 47 6f 74 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  eGoto==0 ){.    
1ba70 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 47 6f  pParse->cookieGo
1ba80 74 6f 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  to = sqlite3Vdbe
1ba90 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
1baa0 6f 2c 20 30 2c 20 30 29 2b 31 3b 0a 20 20 7d 0a  o, 0, 0)+1;.  }.
1bab0 20 20 69 66 28 20 69 44 62 3e 3d 30 20 29 7b 0a    if( iDb>=0 ){.
1bac0 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62 3c      assert( iDb<
1bad0 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20 61  db->nDb );.    a
1bae0 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69  ssert( db->aDb[i
1baf0 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20 69 44  Db].pBt!=0 || iD
1bb00 62 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  b==1 );.    asse
1bb10 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
1bb20 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
1bb30 0a 20 20 20 20 6d 61 73 6b 20 3d 20 31 3c 3c 69  .    mask = 1<<i
1bb40 44 62 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61  Db;.    if( (pPa
1bb50 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 20  rse->cookieMask 
1bb60 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
1bb70 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6f 6b      pParse->cook
1bb80 69 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  ieMask |= mask;.
1bb90 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 63 6f        pParse->co
1bba0 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
1bbb0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
1bbc0 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
1bbd0 6f 6b 69 65 3b 0a 20 20 20 20 20 20 69 66 28 20  okie;.      if( 
1bbe0 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
1bbf0 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
1bc00 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d    sqlite3OpenTem
1bc10 70 44 61 74 61 62 61 73 65 28 70 50 61 72 73 65  pDatabase(pParse
1bc20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1bc30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
1bc40 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
1bc50 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
1bc60 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
1bc70 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
1bc80 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
1bc90 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
1bca0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
1bcb0 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
1bcc0 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
1bcd0 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
1bce0 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
1bcf0 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
1bd00 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
1bd10 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
1bd20 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
1bd30 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
1bd40 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
1bd50 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
1bd60 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
1bd70 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
1bd80 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
1bd90 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
1bda0 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
1bdb0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
1bdc0 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
1bdd0 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
1bde0 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
1bdf0 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
1be00 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
1be10 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
1be20 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
1be30 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
1be40 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
1be50 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
1be60 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
1be70 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
1be80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
1be90 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
1bea0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
1beb0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
1bec0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
1bed0 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
1bee0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1bef0 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
1bf00 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
1bf10 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
1bf20 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
1bf30 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
1bf40 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
1bf50 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
1bf60 65 74 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33  eturn;.  sqlite3
1bf70 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
1bf80 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
1bf90 20 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61   pParse->writeMa
1bfa0 73 6b 20 7c 3d 20 31 3c 3c 69 44 62 3b 0a 20 20  sk |= 1<<iDb;.  
1bfb0 69 66 28 20 73 65 74 53 74 61 74 65 6d 65 6e 74  if( setStatement
1bfc0 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
1bfd0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ed==0 ){.    sql
1bfe0 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
1bff0 2c 20 4f 50 5f 53 74 61 74 65 6d 65 6e 74 2c 20  , OP_Statement, 
1c000 69 44 62 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iDb);.  }.}../*.
1c010 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
1c020 69 66 20 70 49 6e 64 65 78 20 75 73 65 73 20 74  if pIndex uses t
1c030 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
1c040 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65  uence pColl.  Re
1c050 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
1c060 69 74 20 64 6f 65 73 20 61 6e 64 20 66 61 6c 73  it does and fals
1c070 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
1c080 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
1c090 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58  ITE_OMIT_REINDEX
1c0a0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c  .static int coll
1c0b0 61 74 69 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74  ationMatch(const
1c0c0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e   char *zColl, In
1c0d0 64 65 78 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20  dex *pIndex){.  
1c0e0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1c0f0 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c  ; i<pIndex->nCol
1c100 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  umn; i++){.    c
1c110 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
1c120 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1c130 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 7a 43 6f  ;.    if( z==zCo
1c140 6c 6c 20 7c 7c 20 28 7a 20 26 26 20 7a 43 6f 6c  ll || (z && zCol
1c150 6c 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53  l && 0==sqlite3S
1c160 74 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29  trICmp(z, zColl)
1c170 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1c180 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
1c190 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1c1a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d  dif../*.** Recom
1c1b0 70 75 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  pute all indices
1c1c0 20 6f 66 20 70 54 61 62 20 74 68 61 74 20 75 73   of pTab that us
1c1d0 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  e the collating 
1c1e0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a  sequence pColl..
1c1f0 2a 2a 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  ** If pColl==0 t
1c200 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c  hen recompute al
1c210 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61  l indices of pTa
1c220 62 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  b..*/.#ifndef SQ
1c230 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45  LITE_OMIT_REINDE
1c240 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  X.static void re
1c250 69 6e 64 65 78 54 61 62 6c 65 28 50 61 72 73 65  indexTable(Parse
1c260 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20   *pParse, Table 
1c270 2a 70 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73  *pTab, char cons
1c280 74 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64  t *zColl){.  Ind
1c290 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
1c2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
1c2b0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1c2c0 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20  with pTab */..  
1c2d0 66 6f 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d  for(pIndex=pTab-
1c2e0 3e 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b  >pIndex; pIndex;
1c2f0 20 70 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e   pIndex=pIndex->
1c300 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
1c310 7a 43 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c  zColl==0 || coll
1c320 61 74 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c  ationMatch(zColl
1c330 2c 20 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20  , pIndex) ){.   
1c340 20 20 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c     int iDb = sql
1c350 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1c360 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  x(pParse->db, pT
1c370 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  ab->pSchema);.  
1c380 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1c390 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70  WriteOperation(p
1c3a0 50 61 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a  Parse, 0, iDb);.
1c3b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 66        sqlite3Ref
1c3c0 69 6c 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c  illIndex(pParse,
1c3d0 20 70 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20   pIndex, -1);.  
1c3e0 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
1c3f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74  ../*.** Recomput
1c400 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66  e all indices of
1c410 20 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61   all tables in a
1c420 6c 6c 20 64 61 74 61 62 61 73 65 73 20 77 68 65  ll databases whe
1c430 72 65 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65  re the.** indice
1c440 73 20 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74  s use the collat
1c450 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ing sequence pCo
1c460 6c 6c 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30  ll.  If pColl==0
1c470 20 74 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a   then recompute.
1c480 2a 2a 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65  ** all indices e
1c490 76 65 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69  verywhere..*/.#i
1c4a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c4b0 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
1c4c0 20 76 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74   void reindexDat
1c4d0 61 62 61 73 65 73 28 50 61 72 73 65 20 2a 70 50  abases(Parse *pP
1c4e0 61 72 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74  arse, char const
1c4f0 20 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a   *zColl){.  Db *
1c500 70 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  pDb;            
1c510 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1c520 67 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  gle database */.
1c530 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
1c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c550 20 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   The database in
1c560 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  dex number */.  
1c570 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
1c580 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54  arse->db;   /* T
1c590 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
1c5a0 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68  ection */.  Hash
1c5b0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
1c5c0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1c5d0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
1c5e0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
1c5f0 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
1c600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1c610 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
1c620 61 62 61 73 65 20 2a 2f 0a 0a 20 20 66 6f 72 28  abase */..  for(
1c630 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61  iDb=0, pDb=db->a
1c640 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b  Db; iDb<db->nDb;
1c650 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a   iDb++, pDb++){.
1c660 20 20 20 20 61 73 73 65 72 74 28 20 70 44 62 21      assert( pDb!
1c670 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d  =0 );.    for(k=
1c680 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28  sqliteHashFirst(
1c690 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74  &pDb->pSchema->t
1c6a0 62 6c 48 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73  blHash);  k; k=s
1c6b0 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 6b 29  qliteHashNext(k)
1c6c0 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  ){.      pTab = 
1c6d0 28 54 61 62 6c 65 2a 29 73 71 6c 69 74 65 48 61  (Table*)sqliteHa
1c6e0 73 68 44 61 74 61 28 6b 29 3b 0a 20 20 20 20 20  shData(k);.     
1c6f0 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50   reindexTable(pP
1c700 61 72 73 65 2c 20 70 54 61 62 2c 20 7a 43 6f 6c  arse, pTab, zCol
1c710 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  l);.    }.  }.}.
1c720 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65  #endif../*.** Ge
1c730 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
1c740 74 68 65 20 52 45 49 4e 44 45 58 20 63 6f 6d 6d  the REINDEX comm
1c750 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  and..**.**      
1c760 20 20 52 45 49 4e 44 45 58 20 20 20 20 20 20 20    REINDEX       
1c770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c780 20 20 20 20 20 2d 2d 20 31 0a 2a 2a 20 20 20 20       -- 1.**    
1c790 20 20 20 20 52 45 49 4e 44 45 58 20 20 3c 63 6f      REINDEX  <co
1c7a0 6c 6c 61 74 69 6f 6e 3e 20 20 20 20 20 20 20 20  llation>        
1c7b0 20 20 20 20 20 20 20 2d 2d 20 32 0a 2a 2a 20 20         -- 2.**  
1c7c0 20 20 20 20 20 20 52 45 49 4e 44 45 58 20 20 3f        REINDEX  ?
1c7d0 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 74 61 62  <database>.?<tab
1c7e0 6c 65 6e 61 6d 65 3e 20 20 2d 2d 20 33 0a 2a 2a  lename>  -- 3.**
1c7f0 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58 20          REINDEX 
1c800 20 3f 3c 64 61 74 61 62 61 73 65 3e 2e 3f 3c 69   ?<database>.?<i
1c810 6e 64 65 78 6e 61 6d 65 3e 20 20 2d 2d 20 34 0a  ndexname>  -- 4.
1c820 2a 2a 0a 2a 2a 20 46 6f 72 6d 20 31 20 63 61 75  **.** Form 1 cau
1c830 73 65 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20  ses all indices 
1c840 69 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  in all attached 
1c850 64 61 74 61 62 61 73 65 73 20 74 6f 20 62 65 20  databases to be 
1c860 72 65 62 75 69 6c 74 2e 0a 2a 2a 20 46 6f 72 6d  rebuilt..** Form
1c870 20 32 20 72 65 62 75 69 6c 64 73 20 61 6c 6c 20   2 rebuilds all 
1c880 69 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 64  indices in all d
1c890 61 74 61 62 61 73 65 73 20 74 68 61 74 20 75 73  atabases that us
1c8a0 65 20 74 68 65 20 6e 61 6d 65 64 0a 2a 2a 20 63  e the named.** c
1c8b0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1c8c0 6e 2e 20 20 46 6f 72 6d 73 20 33 20 61 6e 64 20  n.  Forms 3 and 
1c8d0 34 20 72 65 62 75 69 6c 64 20 74 68 65 20 6e 61  4 rebuild the na
1c8e0 6d 65 64 20 69 6e 64 65 78 20 6f 72 20 61 6c 6c  med index or all
1c8f0 0a 2a 2a 20 69 6e 64 69 63 65 73 20 61 73 73 6f  .** indices asso
1c900 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1c910 6e 61 6d 65 64 20 74 61 62 6c 65 2e 0a 2a 2f 0a  named table..*/.
1c920 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c930 4d 49 54 5f 52 45 49 4e 44 45 58 0a 76 6f 69 64  MIT_REINDEX.void
1c940 20 73 71 6c 69 74 65 33 52 65 69 6e 64 65 78 28   sqlite3Reindex(
1c950 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
1c960 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 54 6f  oken *pName1, To
1c970 6b 65 6e 20 2a 70 4e 61 6d 65 32 29 7b 0a 20 20  ken *pName2){.  
1c980 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
1c990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1c9a0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1c9b0 65 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  e to be reindexe
1c9c0 64 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20  d, or NULL */.  
1c9d0 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
1c9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c9f0 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6f  ame of a table o
1ca00 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 63 6f 6e  r index */.  con
1ca10 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20  st char *zDb;   
1ca20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1ca30 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ca40 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1ca50 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1ca60 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 69 6e 20    /* A table in 
1ca70 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
1ca80 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b    Index *pIndex;
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1caa0 20 41 6e 20 69 6e 64 65 78 20 61 73 73 6f 63 69   An index associ
1cab0 61 74 65 64 20 77 69 74 68 20 70 54 61 62 20 2a  ated with pTab *
1cac0 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  /.  int iDb;    
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
1caf0 69 6e 64 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a  index number */.
1cb00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1cb10 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 2f 2a  pParse->db;   /*
1cb20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
1cb30 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 6f  nnection */.  To
1cb40 6b 65 6e 20 2a 70 4f 62 6a 4e 61 6d 65 3b 20 20  ken *pObjName;  
1cb50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1cb60 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f  e of the table o
1cb70 72 20 69 6e 64 65 78 20 74 6f 20 62 65 20 72 65  r index to be re
1cb80 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 2f 2a  indexed */..  /*
1cb90 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61   Read the databa
1cba0 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61 6e  se schema. If an
1cbb0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
1cbc0 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
1cbd0 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20 63  ssage.  ** and c
1cbe0 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61 6e  ode in pParse an
1cbf0 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 2a  d return NULL. *
1cc00 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  /.  if( SQLITE_O
1cc10 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63  K!=sqlite3ReadSc
1cc20 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a  hema(pParse) ){.
1cc30 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1cc40 0a 20 20 69 66 28 20 70 4e 61 6d 65 31 3d 3d 30  .  if( pName1==0
1cc50 20 7c 7c 20 70 4e 61 6d 65 31 2d 3e 7a 3d 3d 30   || pName1->z==0
1cc60 20 29 7b 0a 20 20 20 20 72 65 69 6e 64 65 78 44   ){.    reindexD
1cc70 61 74 61 62 61 73 65 73 28 70 50 61 72 73 65 2c  atabases(pParse,
1cc80 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   0);.    return;
1cc90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 61  .  }else if( pNa
1cca0 6d 65 32 3d 3d 30 20 7c 7c 20 70 4e 61 6d 65 32  me2==0 || pName2
1ccb0 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ->z==0 ){.    ch
1ccc0 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61  ar *zColl;.    a
1ccd0 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a  ssert( pName1->z
1cce0 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20   );.    zColl = 
1ccf0 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
1cd00 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
1cd10 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66   pName1);.    if
1cd20 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72  ( !zColl ) retur
1cd30 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  n;.    pColl = s
1cd40 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
1cd50 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a  q(db, ENC(db), z
1cd60 43 6f 6c 6c 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Coll, -1, 0);.  
1cd70 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1cd80 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 20 29       if( zColl )
1cd90 7b 0a 20 20 20 20 20 20 20 20 72 65 69 6e 64 65  {.        reinde
1cda0 78 44 61 74 61 62 61 73 65 73 28 70 50 61 72 73  xDatabases(pPars
1cdb0 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  e, zColl);.     
1cdc0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1cdd0 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20  (db, zColl);.   
1cde0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1cdf0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  n;.    }.    sql
1ce00 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1ce10 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62  Coll);.  }.  iDb
1ce20 20 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72   = sqlite3TwoPar
1ce30 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e  tName(pParse, pN
1ce40 61 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70  ame1, pName2, &p
1ce50 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
1ce60 69 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a  iDb<0 ) return;.
1ce70 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d    z = sqlite3Nam
1ce80 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
1ce90 4f 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ObjName);.  if( 
1cea0 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  z==0 ) return;. 
1ceb0 20 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69   zDb = db->aDb[i
1cec0 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61  Db].zName;.  pTa
1ced0 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54  b = sqlite3FindT
1cee0 61 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29  able(db, z, zDb)
1cef0 3b 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a  ;.  if( pTab ){.
1cf00 20 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65      reindexTable
1cf10 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30  (pParse, pTab, 0
1cf20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1cf30 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20  Free(db, z);.   
1cf40 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70   return;.  }.  p
1cf50 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46  Index = sqlite3F
1cf60 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20  indIndex(db, z, 
1cf70 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  zDb);.  sqlite3D
1cf80 62 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20  bFree(db, z);.  
1cf90 69 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20  if( pIndex ){.  
1cfa0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
1cfb0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
1cfc0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
1cfd0 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49    sqlite3RefillI
1cfe0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e  ndex(pParse, pIn
1cff0 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65  dex, -1);.    re
1d000 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
1d010 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
1d020 73 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69  se, "unable to i
1d030 64 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65  dentify the obje
1d040 63 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ct to be reindex
1d050 65 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ed");.}.#endif..
1d060 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 64  /*.** Return a d
1d070 79 6e 61 6d 69 63 6c 79 20 61 6c 6c 6f 63 61 74  ynamicly allocat
1d080 65 64 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  ed KeyInfo struc
1d090 74 75 72 65 20 74 68 61 74 20 63 61 6e 20 62 65  ture that can be
1d0a0 20 75 73 65 64 0a 2a 2a 20 77 69 74 68 20 4f 50   used.** with OP
1d0b0 5f 4f 70 65 6e 52 65 61 64 20 6f 72 20 4f 50 5f  _OpenRead or OP_
1d0c0 4f 70 65 6e 57 72 69 74 65 20 74 6f 20 61 63 63  OpenWrite to acc
1d0d0 65 73 73 20 64 61 74 61 62 61 73 65 20 69 6e 64  ess database ind
1d0e0 65 78 20 70 49 64 78 2e 0a 2a 2a 0a 2a 2a 20 49  ex pIdx..**.** I
1d0f0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  f successful, a 
1d100 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
1d110 65 77 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ew structure is 
1d120 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
1d130 73 20 63 61 73 65 0a 2a 2a 20 74 68 65 20 63 61  s case.** the ca
1d140 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
1d150 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 20  ble for calling 
1d160 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d170 2c 20 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  , ) on the retur
1d180 6e 65 64 20 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  ned .** pointer.
1d190 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d1a0 75 72 73 20 28 6f 75 74 20 6f 66 20 6d 65 6d 6f  urs (out of memo
1d1b0 72 79 20 6f 72 20 6d 69 73 73 69 6e 67 20 63 6f  ry or missing co
1d1c0 6c 6c 61 74 69 6f 6e 20 0a 2a 2a 20 73 65 71 75  llation .** sequ
1d1d0 65 6e 63 65 29 2c 20 4e 55 4c 4c 20 69 73 20 72  ence), NULL is r
1d1e0 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
1d1f0 73 74 61 74 65 20 6f 66 20 70 50 61 72 73 65 20  state of pParse 
1d200 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c 65  updated to refle
1d210 63 74 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  ct.** the error.
1d220 0a 2a 2f 0a 4b 65 79 49 6e 66 6f 20 2a 73 71 6c  .*/.KeyInfo *sql
1d230 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f  ite3IndexKeyinfo
1d240 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1d250 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
1d260 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f  int i;.  int nCo
1d270 6c 20 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  l = pIdx->nColum
1d280 6e 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 73 20  n;.  int nBytes 
1d290 3d 20 73 69 7a 65 6f 66 28 4b 65 79 49 6e 66 6f  = sizeof(KeyInfo
1d2a0 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a  ) + (nCol-1)*siz
1d2b0 65 6f 66 28 43 6f 6c 6c 53 65 71 2a 29 20 2b 20  eof(CollSeq*) + 
1d2c0 6e 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  nCol;.  sqlite3 
1d2d0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1d2e0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1d2f0 79 20 3d 20 28 4b 65 79 49 6e 66 6f 20 2a 29 73  y = (KeyInfo *)s
1d300 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
1d310 72 6f 28 64 62 2c 20 6e 42 79 74 65 73 29 3b 0a  ro(db, nBytes);.
1d320 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1d330 20 20 20 70 4b 65 79 2d 3e 64 62 20 3d 20 70 50     pKey->db = pP
1d340 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 70 4b  arse->db;.    pK
1d350 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d  ey->aSortOrder =
1d360 20 28 75 38 20 2a 29 26 28 70 4b 65 79 2d 3e 61   (u8 *)&(pKey->a
1d370 43 6f 6c 6c 5b 6e 43 6f 6c 5d 29 3b 0a 20 20 20  Coll[nCol]);.   
1d380 20 61 73 73 65 72 74 28 20 26 70 4b 65 79 2d 3e   assert( &pKey->
1d390 61 53 6f 72 74 4f 72 64 65 72 5b 6e 43 6f 6c 5d  aSortOrder[nCol]
1d3a0 3d 3d 26 28 28 28 75 38 20 2a 29 70 4b 65 79 29  ==&(((u8 *)pKey)
1d3b0 5b 6e 42 79 74 65 73 5d 29 20 29 3b 0a 20 20 20  [nBytes]) );.   
1d3c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1d3d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
1d3e0 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78  ar *zColl = pIdx
1d3f0 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
1d400 20 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c     assert( zColl
1d410 20 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e   );.      pKey->
1d420 61 43 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74  aColl[i] = sqlit
1d430 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
1d440 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 2c 20 2d  pParse, zColl, -
1d450 31 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 2d 3e  1);.      pKey->
1d460 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1d470 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
1d480 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  [i];.    }.    p
1d490 4b 65 79 2d 3e 6e 46 69 65 6c 64 20 3d 20 28 75  Key->nField = (u
1d4a0 31 36 29 6e 43 6f 6c 3b 0a 20 20 7d 0a 0a 20 20  16)nCol;.  }..  
1d4b0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
1d4c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1d4d0 62 46 72 65 65 28 64 62 2c 20 70 4b 65 79 29 3b  bFree(db, pKey);
1d4e0 0a 20 20 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20  .    pKey = 0;. 
1d4f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79   }.  return pKey
1d500 3b 0a 7d 0a                                      ;.}.