/ Hex Artifact Content
Login

Artifact 2778ccdb327923b2eb6cea304e232efd0c85cbe1:


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 2f 0a 23 69    ROLLBACK.*/.#i
02d0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
02e0: 74 2e 68 22 0a 0a 23 69 66 6e 64 65 66 20 53 51  t.h"..#ifndef SQ
02f0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
0300: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 54 68 65  _CACHE./*.** The
0310: 20 54 61 62 6c 65 4c 6f 63 6b 20 73 74 72 75 63   TableLock struc
0320: 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 75 73 65  ture is only use
0330: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33  d by the sqlite3
0340: 54 61 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 0a  TableLock() and.
0350: 2a 2a 20 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b  ** codeTableLock
0360: 73 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  s() functions..*
0370: 2f 0a 73 74 72 75 63 74 20 54 61 62 6c 65 4c 6f  /.struct TableLo
0380: 63 6b 20 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20  ck {.  int iDb; 
0390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
03a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
03b0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
03c0: 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
03d0: 0a 20 20 69 6e 74 20 69 54 61 62 3b 20 20 20 20  .  int iTab;    
03e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
03f0: 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
0400: 74 61 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b  table to be lock
0410: 65 64 20 2a 2f 0a 20 20 75 38 20 69 73 57 72 69  ed */.  u8 isWri
0420: 74 65 4c 6f 63 6b 3b 20 20 20 20 20 20 2f 2a 20  teLock;      /* 
0430: 54 72 75 65 20 66 6f 72 20 77 72 69 74 65 20 6c  True for write l
0440: 6f 63 6b 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ock.  False for 
0450: 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  a read lock */. 
0460: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
0470: 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
0480: 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 7d 3b   the table */.};
0490: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74  ../*.** Record t
04a0: 68 65 20 66 61 63 74 20 74 68 61 74 20 77 65 20  he fact that we 
04b0: 77 61 6e 74 20 74 6f 20 6c 6f 63 6b 20 61 20 74  want to lock a t
04c0: 61 62 6c 65 20 61 74 20 72 75 6e 2d 74 69 6d 65  able at run-time
04d0: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61  .  .**.** The ta
04e0: 62 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ble to be locked
04f0: 20 68 61 73 20 72 6f 6f 74 20 70 61 67 65 20 69   has root page i
0500: 54 61 62 20 61 6e 64 20 69 73 20 66 6f 75 6e 64  Tab and is found
0510: 20 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   in database iDb
0520: 2e 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 61  ..** A read or a
0530: 20 77 72 69 74 65 20 6c 6f 63 6b 20 63 61 6e 20   write lock can 
0540: 62 65 20 74 61 6b 65 6e 20 64 65 70 65 6e 64 69  be taken dependi
0550: 6e 67 20 6f 6e 20 69 73 57 72 69 74 65 6c 6f 63  ng on isWriteloc
0560: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  k..**.** This ro
0570: 75 74 69 6e 65 20 6a 75 73 74 20 72 65 63 6f 72  utine just recor
0580: 64 73 20 74 68 65 20 66 61 63 74 20 74 68 61 74  ds the fact that
0590: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 64 65 73   the lock is des
05a0: 69 72 65 64 2e 20 20 54 68 65 0a 2a 2a 20 63 6f  ired.  The.** co
05b0: 64 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 6c  de to make the l
05c0: 6f 63 6b 20 6f 63 63 75 72 20 69 73 20 67 65 6e  ock occur is gen
05d0: 65 72 61 74 65 64 20 62 79 20 61 20 6c 61 74 65  erated by a late
05e0: 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 63 6f 64  r call to.** cod
05f0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 20 77 68  eTableLocks() wh
0600: 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
0610: 67 20 73 71 6c 69 74 65 33 46 69 6e 69 73 68 43  g sqlite3FinishC
0620: 6f 64 69 6e 67 28 29 2e 0a 2a 2f 0a 76 6f 69 64  oding()..*/.void
0630: 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63   sqlite3TableLoc
0640: 6b 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  k(.  Parse *pPar
0650: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
0660: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
0670: 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
0680: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
0690: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
06a0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
06b0: 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e   to lock */.  in
06c0: 74 20 69 54 61 62 2c 20 20 20 20 20 20 20 20 20  t iTab,         
06d0: 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6e 75   /* Root page nu
06e0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  mber of the tabl
06f0: 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
0700: 2f 0a 20 20 75 38 20 69 73 57 72 69 74 65 4c 6f  /.  u8 isWriteLo
0710: 63 6b 2c 20 20 20 20 2f 2a 20 54 72 75 65 20 66  ck,    /* True f
0720: 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  or a write lock 
0730: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0740: 2a 7a 4e 61 6d 65 20 20 2f 2a 20 4e 61 6d 65 20  *zName  /* Name 
0750: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
0760: 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 29 7b 0a  be locked */.){.
0770: 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76    Parse *pToplev
0780: 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  el = sqlite3Pars
0790: 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65  eToplevel(pParse
07a0: 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  );.  int i;.  in
07b0: 74 20 6e 42 79 74 65 73 3b 0a 20 20 54 61 62 6c  t nBytes;.  Tabl
07c0: 65 4c 6f 63 6b 20 2a 70 3b 0a 20 20 61 73 73 65  eLock *p;.  asse
07d0: 72 74 28 20 69 44 62 3e 3d 30 20 29 3b 0a 0a 20  rt( iDb>=0 );.. 
07e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 6f 70   for(i=0; i<pTop
07f0: 6c 65 76 65 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63  level->nTableLoc
0800: 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 20 3d  k; i++){.    p =
0810: 20 26 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61   &pToplevel->aTa
0820: 62 6c 65 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20  bleLock[i];.    
0830: 69 66 28 20 70 2d 3e 69 44 62 3d 3d 69 44 62 20  if( p->iDb==iDb 
0840: 26 26 20 70 2d 3e 69 54 61 62 3d 3d 69 54 61 62  && p->iTab==iTab
0850: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 73 57   ){.      p->isW
0860: 72 69 74 65 4c 6f 63 6b 20 3d 20 28 70 2d 3e 69  riteLock = (p->i
0870: 73 57 72 69 74 65 4c 6f 63 6b 20 7c 7c 20 69 73  sWriteLock || is
0880: 57 72 69 74 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  WriteLock);.    
0890: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
08a0: 20 20 7d 0a 0a 20 20 6e 42 79 74 65 73 20 3d 20    }..  nBytes = 
08b0: 73 69 7a 65 6f 66 28 54 61 62 6c 65 4c 6f 63 6b  sizeof(TableLock
08c0: 29 20 2a 20 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  ) * (pToplevel->
08d0: 6e 54 61 62 6c 65 4c 6f 63 6b 2b 31 29 3b 0a 20  nTableLock+1);. 
08e0: 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 61 54 61 62   pToplevel->aTab
08f0: 6c 65 4c 6f 63 6b 20 3d 0a 20 20 20 20 20 20 73  leLock =.      s
0900: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f  qlite3DbReallocO
0910: 72 46 72 65 65 28 70 54 6f 70 6c 65 76 65 6c 2d  rFree(pToplevel-
0920: 3e 64 62 2c 20 70 54 6f 70 6c 65 76 65 6c 2d 3e  >db, pToplevel->
0930: 61 54 61 62 6c 65 4c 6f 63 6b 2c 20 6e 42 79 74  aTableLock, nByt
0940: 65 73 29 3b 0a 20 20 69 66 28 20 70 54 6f 70 6c  es);.  if( pTopl
0950: 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f 63 6b  evel->aTableLock
0960: 20 29 7b 0a 20 20 20 20 70 20 3d 20 26 70 54 6f   ){.    p = &pTo
0970: 70 6c 65 76 65 6c 2d 3e 61 54 61 62 6c 65 4c 6f  plevel->aTableLo
0980: 63 6b 5b 70 54 6f 70 6c 65 76 65 6c 2d 3e 6e 54  ck[pToplevel->nT
0990: 61 62 6c 65 4c 6f 63 6b 2b 2b 5d 3b 0a 20 20 20  ableLock++];.   
09a0: 20 70 2d 3e 69 44 62 20 3d 20 69 44 62 3b 0a 20   p->iDb = iDb;. 
09b0: 20 20 20 70 2d 3e 69 54 61 62 20 3d 20 69 54 61     p->iTab = iTa
09c0: 62 3b 0a 20 20 20 20 70 2d 3e 69 73 57 72 69 74  b;.    p->isWrit
09d0: 65 4c 6f 63 6b 20 3d 20 69 73 57 72 69 74 65 4c  eLock = isWriteL
09e0: 6f 63 6b 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d  ock;.    p->zNam
09f0: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c  e = zName;.  }el
0a00: 73 65 7b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65  se{.    pTopleve
0a10: 6c 2d 3e 6e 54 61 62 6c 65 4c 6f 63 6b 20 3d 20  l->nTableLock = 
0a20: 30 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c  0;.    pToplevel
0a30: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
0a40: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
0a50: 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
0a60: 54 61 62 6c 65 4c 6f 63 6b 20 69 6e 73 74 72 75  TableLock instru
0a70: 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74  ction for each t
0a80: 61 62 6c 65 20 6c 6f 63 6b 65 64 20 62 79 20 74  able locked by t
0a90: 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  he.** statement 
0aa0: 28 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 63  (configured by c
0ab0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 54  alls to sqlite3T
0ac0: 61 62 6c 65 4c 6f 63 6b 28 29 29 2e 0a 2a 2f 0a  ableLock())..*/.
0ad0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
0ae0: 54 61 62 6c 65 4c 6f 63 6b 73 28 50 61 72 73 65  TableLocks(Parse
0af0: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
0b00: 20 69 3b 0a 20 20 56 64 62 65 20 2a 70 56 64 62   i;.  Vdbe *pVdb
0b10: 65 3b 20 0a 0a 20 20 70 56 64 62 65 20 3d 20 73  e; ..  pVdbe = s
0b20: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
0b30: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
0b40: 20 70 56 64 62 65 21 3d 30 20 29 3b 20 2f 2a 20   pVdbe!=0 ); /* 
0b50: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 20 63  sqlite3GetVdbe c
0b60: 61 6e 6e 6f 74 20 66 61 69 6c 3a 20 56 44 42 45  annot fail: VDBE
0b70: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
0b80: 65 64 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30  ed */..  for(i=0
0b90: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  ; i<pParse->nTab
0ba0: 6c 65 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  leLock; i++){.  
0bb0: 20 20 54 61 62 6c 65 4c 6f 63 6b 20 2a 70 20 3d    TableLock *p =
0bc0: 20 26 70 50 61 72 73 65 2d 3e 61 54 61 62 6c 65   &pParse->aTable
0bd0: 4c 6f 63 6b 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  Lock[i];.    int
0be0: 20 70 31 20 3d 20 70 2d 3e 69 44 62 3b 0a 20 20   p1 = p->iDb;.  
0bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
0c00: 4f 70 34 28 70 56 64 62 65 2c 20 4f 50 5f 54 61  Op4(pVdbe, OP_Ta
0c10: 62 6c 65 4c 6f 63 6b 2c 20 70 31 2c 20 70 2d 3e  bleLock, p1, p->
0c20: 69 54 61 62 2c 20 70 2d 3e 69 73 57 72 69 74 65  iTab, p->isWrite
0c30: 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a              p->z
0c50: 4e 61 6d 65 2c 20 50 34 5f 53 54 41 54 49 43 29  Name, P4_STATIC)
0c60: 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20  ;.  }.}.#else.  
0c70: 23 64 65 66 69 6e 65 20 63 6f 64 65 54 61 62 6c  #define codeTabl
0c80: 65 4c 6f 63 6b 73 28 78 29 0a 23 65 6e 64 69 66  eLocks(x).#endif
0c90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
0ca0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
0cb0: 20 79 44 62 4d 61 73 6b 20 6f 62 6a 65 63 74 20   yDbMask object 
0cc0: 69 73 20 65 6d 70 74 79 20 2d 20 69 66 20 69 74  is empty - if it
0cd0: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
0ce0: 31 20 62 69 74 73 2e 20 20 54 68 69 73 20 72 6f  1 bits.  This ro
0cf0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 62 79  utine is used by
0d00: 20 74 68 65 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   the DbMaskAllZe
0d10: 72 6f 28 29 20 61 6e 64 20 44 62 4d 61 73 6b 4e  ro() and DbMaskN
0d20: 6f 74 5a 65 72 6f 28 29 0a 2a 2a 20 6d 61 63 72  otZero().** macr
0d30: 6f 73 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4d  os when SQLITE_M
0d40: 41 58 5f 41 54 54 41 43 48 45 44 20 69 73 20 67  AX_ATTACHED is g
0d50: 72 65 61 74 65 72 20 74 68 61 6e 20 33 30 2e 0a  reater than 30..
0d60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
0d70: 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 69 6e  X_ATTACHED>30.in
0d80: 74 20 73 71 6c 69 74 65 33 44 62 4d 61 73 6b 41  t sqlite3DbMaskA
0d90: 6c 6c 5a 65 72 6f 28 79 44 62 4d 61 73 6b 20 6d  llZero(yDbMask m
0da0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
0db0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
0dc0: 79 44 62 4d 61 73 6b 29 3b 20 69 2b 2b 29 20 69  yDbMask); i++) i
0dd0: 66 28 20 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e  f( m[i] ) return
0de0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   0;.  return 1;.
0df0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
0e00: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0e10: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 73  called after a s
0e20: 69 6e 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d  ingle SQL statem
0e30: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0e40: 70 61 72 73 65 64 20 61 6e 64 20 61 20 56 44 42  parsed and a VDB
0e50: 45 20 70 72 6f 67 72 61 6d 20 74 6f 20 65 78 65  E program to exe
0e60: 63 75 74 65 20 74 68 61 74 20 73 74 61 74 65 6d  cute that statem
0e70: 65 6e 74 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ent has been.** 
0e80: 70 72 65 70 61 72 65 64 2e 20 20 54 68 69 73 20  prepared.  This 
0e90: 72 6f 75 74 69 6e 65 20 70 75 74 73 20 74 68 65  routine puts the
0ea0: 20 66 69 6e 69 73 68 69 6e 67 20 74 6f 75 63 68   finishing touch
0eb0: 65 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 56 44 42  es on the.** VDB
0ec0: 45 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 72 65  E program and re
0ed0: 73 65 74 73 20 74 68 65 20 70 50 61 72 73 65 20  sets the pParse 
0ee0: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
0ef0: 65 20 6e 65 78 74 0a 2a 2a 20 70 61 72 73 65 2e  e next.** parse.
0f00: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
0f10: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
0f20: 75 72 72 65 64 2c 20 69 74 20 6d 69 67 68 74 20  urred, it might 
0f30: 62 65 20 74 68 65 20 63 61 73 65 20 74 68 61 74  be the case that
0f40: 0a 2a 2a 20 6e 6f 20 56 44 42 45 20 63 6f 64 65  .** no VDBE code
0f50: 20 77 61 73 20 67 65 6e 65 72 61 74 65 64 2e 0a   was generated..
0f60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
0f70: 69 6e 69 73 68 43 6f 64 69 6e 67 28 50 61 72 73  inishCoding(Pars
0f80: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71  e *pParse){.  sq
0f90: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62  lite3 *db;.  Vdb
0fa0: 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65 72 74 28  e *v;..  assert(
0fb0: 20 70 50 61 72 73 65 2d 3e 70 54 6f 70 6c 65 76   pParse->pToplev
0fc0: 65 6c 3d 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20  el==0 );.  db = 
0fd0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
0fe0: 28 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64  ( pParse->nested
0ff0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1000: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1010: 64 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72  d || pParse->nEr
1020: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  r ){.    if( pPa
1030: 72 73 65 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  rse->rc==SQLITE_
1040: 4f 4b 20 29 20 70 50 61 72 73 65 2d 3e 72 63 20  OK ) pParse->rc 
1050: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
1060: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1070: 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 67  .  /* Begin by g
1080: 65 6e 65 72 61 74 69 6e 67 20 73 6f 6d 65 20 74  enerating some t
1090: 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 20  ermination code 
10a0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
10b0: 65 0a 20 20 2a 2a 20 76 64 62 65 20 70 72 6f 67  e.  ** vdbe prog
10c0: 72 61 6d 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73  ram.  */.  v = s
10d0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
10e0: 61 72 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28  arse);.  assert(
10f0: 20 21 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74   !pParse->isMult
1100: 69 57 72 69 74 65 20 0a 20 20 20 20 20 20 20 7c  iWrite .       |
1110: 7c 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  | sqlite3VdbeAss
1120: 65 72 74 4d 61 79 41 62 6f 72 74 28 76 2c 20 70  ertMayAbort(v, p
1130: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
1140: 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
1150: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
1160: 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f  VdbeDeletePriorO
1170: 70 63 6f 64 65 28 76 2c 20 4f 50 5f 43 6c 6f 73  pcode(v, OP_Clos
1180: 65 29 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74  e) ){}.    sqlit
1190: 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
11a0: 4f 50 5f 48 61 6c 74 29 3b 0a 0a 23 69 66 20 53  OP_Halt);..#if S
11b0: 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
11c0: 4e 54 49 43 41 54 49 4f 4e 0a 20 20 20 20 69 66  NTICATION.    if
11d0: 28 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 6c 65  ( pParse->nTable
11e0: 4c 6f 63 6b 3e 30 20 26 26 20 64 62 2d 3e 69 6e  Lock>0 && db->in
11f0: 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20  it.busy==0 ){.  
1200: 20 20 20 20 73 71 6c 69 74 65 33 55 73 65 72 41      sqlite3UserA
1210: 75 74 68 49 6e 69 74 28 64 62 29 3b 0a 20 20 20  uthInit(db);.   
1220: 20 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68 2e     if( db->auth.
1230: 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48 5f  authLevel<UAUTH_
1240: 55 73 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  User ){.        
1250: 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53 51 4c  pParse->rc = SQL
1260: 49 54 45 5f 41 55 54 48 5f 55 53 45 52 3b 0a 20  ITE_AUTH_USER;. 
1270: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
1280: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1290: 75 73 65 72 20 6e 6f 74 20 61 75 74 68 65 6e 74  user not authent
12a0: 69 63 61 74 65 64 22 29 3b 0a 20 20 20 20 20 20  icated");.      
12b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
12c0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
12d0: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6f 6b 69      /* The cooki
12e0: 65 20 6d 61 73 6b 20 63 6f 6e 74 61 69 6e 73 20  e mask contains 
12f0: 6f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  one bit for each
1300: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f   database file o
1310: 70 65 6e 2e 0a 20 20 20 20 2a 2a 20 28 42 69 74  pen..    ** (Bit
1320: 20 30 20 69 73 20 66 6f 72 20 6d 61 69 6e 2c 20   0 is for main, 
1330: 62 69 74 20 31 20 69 73 20 66 6f 72 20 74 65 6d  bit 1 is for tem
1340: 70 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 2e  p, and so forth.
1350: 29 20 20 42 69 74 73 20 61 72 65 0a 20 20 20 20  )  Bits are.    
1360: 2a 2a 20 73 65 74 20 66 6f 72 20 65 61 63 68 20  ** set for each 
1370: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 69 73  database that is
1380: 20 75 73 65 64 2e 20 20 47 65 6e 65 72 61 74 65   used.  Generate
1390: 20 63 6f 64 65 20 74 6f 20 73 74 61 72 74 20 61   code to start a
13a0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
13b0: 69 6f 6e 20 6f 6e 20 65 61 63 68 20 75 73 65 64  ion on each used
13c0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 6f   database and to
13d0: 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
13e0: 6d 61 20 63 6f 6f 6b 69 65 0a 20 20 20 20 2a 2a  ma cookie.    **
13f0: 20 6f 6e 20 65 61 63 68 20 75 73 65 64 20 64 61   on each used da
1400: 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
1410: 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
1420: 63 46 61 69 6c 65 64 3d 3d 30 20 0a 20 20 20 20  cFailed==0 .    
1430: 20 26 26 20 28 44 62 4d 61 73 6b 4e 6f 6e 5a 65   && (DbMaskNonZe
1440: 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f 6b 69  ro(pParse->cooki
1450: 65 4d 61 73 6b 29 20 7c 7c 20 70 50 61 72 73 65  eMask) || pParse
1460: 2d 3e 70 43 6f 6e 73 74 45 78 70 72 29 0a 20 20  ->pConstExpr).  
1470: 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69    ){.      int i
1480: 44 62 2c 20 69 3b 0a 20 20 20 20 20 20 61 73 73  Db, i;.      ass
1490: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
14a0: 47 65 74 4f 70 28 76 2c 20 30 29 2d 3e 6f 70 63  GetOp(v, 0)->opc
14b0: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 29 3b 0a  ode==OP_Init );.
14c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
14d0: 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 30 29 3b  eJumpHere(v, 0);
14e0: 0a 20 20 20 20 20 20 66 6f 72 28 69 44 62 3d 30  .      for(iDb=0
14f0: 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69  ; iDb<db->nDb; i
1500: 44 62 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Db++){.        i
1510: 66 28 20 44 62 4d 61 73 6b 54 65 73 74 28 70 50  f( DbMaskTest(pP
1520: 61 72 73 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b  arse->cookieMask
1530: 2c 20 69 44 62 29 3d 3d 30 20 29 20 63 6f 6e 74  , iDb)==0 ) cont
1540: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71  inue;.        sq
1550: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
1560: 65 65 28 76 2c 20 69 44 62 29 3b 0a 20 20 20 20  ee(v, iDb);.    
1570: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1580: 64 64 4f 70 34 49 6e 74 28 76 2c 0a 20 20 20 20  ddOp4Int(v,.    
1590: 20 20 20 20 20 20 4f 50 5f 54 72 61 6e 73 61 63        OP_Transac
15a0: 74 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  tion,           
15b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63 6f           /* Opco
15c0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  de */.          
15d0: 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  iDb,            
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
1600: 20 20 20 20 20 20 44 62 4d 61 73 6b 54 65 73 74        DbMaskTest
1610: 28 70 50 61 72 73 65 2d 3e 77 72 69 74 65 4d 61  (pParse->writeMa
1620: 73 6b 2c 69 44 62 29 2c 20 2f 2a 20 50 32 20 2a  sk,iDb), /* P2 *
1630: 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  /.          pPar
1640: 73 65 2d 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b  se->cookieValue[
1650: 69 44 62 5d 2c 20 20 20 20 20 20 20 20 20 20 2f  iDb],          /
1660: 2a 20 50 33 20 2a 2f 0a 20 20 20 20 20 20 20 20  * P3 */.        
1670: 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70    db->aDb[iDb].p
1680: 53 63 68 65 6d 61 2d 3e 69 47 65 6e 65 72 61 74  Schema->iGenerat
1690: 69 6f 6e 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ion  /* P4 */.  
16a0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
16b0: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
16c0: 73 79 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56  sy==0 ) sqlite3V
16d0: 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 31  dbeChangeP5(v, 1
16e0: 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
16f0: 6f 6d 6d 65 6e 74 28 28 76 2c 0a 20 20 20 20 20  omment((v,.     
1700: 20 20 20 20 20 20 20 20 20 22 75 73 65 73 53 74           "usesSt
1710: 6d 74 4a 6f 75 72 6e 61 6c 3d 25 64 22 2c 20 70  mtJournal=%d", p
1720: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 20  Parse->mayAbort 
1730: 26 26 20 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  && pParse->isMul
1740: 74 69 57 72 69 74 65 29 29 3b 0a 20 20 20 20 20  tiWrite));.     
1750: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
1760: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1770: 42 4c 45 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  BLE.      for(i=
1780: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 74  0; i<pParse->nVt
1790: 61 62 4c 6f 63 6b 3b 20 69 2b 2b 29 7b 0a 20 20  abLock; i++){.  
17a0: 20 20 20 20 20 20 63 68 61 72 20 2a 76 74 61 62        char *vtab
17b0: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
17c0: 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c 20  e3GetVTable(db, 
17d0: 70 50 61 72 73 65 2d 3e 61 70 56 74 61 62 4c 6f  pParse->apVtabLo
17e0: 63 6b 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ck[i]);.        
17f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1800: 34 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 2c 20  4(v, OP_VBegin, 
1810: 30 2c 20 30 2c 20 30 2c 20 76 74 61 62 2c 20 50  0, 0, 0, vtab, P
1820: 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 20 20 7d  4_VTAB);.      }
1830: 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e  .      pParse->n
1840: 56 74 61 62 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65  VtabLock = 0;.#e
1850: 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 4f  ndif..      /* O
1860: 6e 63 65 20 61 6c 6c 20 74 68 65 20 63 6f 6f 6b  nce all the cook
1870: 69 65 73 20 68 61 76 65 20 62 65 65 6e 20 76 65  ies have been ve
1880: 72 69 66 69 65 64 20 61 6e 64 20 74 72 61 6e 73  rified and trans
1890: 61 63 74 69 6f 6e 73 20 6f 70 65 6e 65 64 2c 20  actions opened, 
18a0: 0a 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e  .      ** obtain
18b0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
18c0: 62 6c 65 2d 6c 6f 63 6b 73 2e 20 54 68 69 73 20  ble-locks. This 
18d0: 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
18e0: 73 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  s the .      ** 
18f0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65 61  shared-cache fea
1900: 74 75 72 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  ture is enabled.
1910: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1920: 63 6f 64 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  codeTableLocks(p
1930: 50 61 72 73 65 29 3b 0a 0a 20 20 20 20 20 20 2f  Parse);..      /
1940: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 79  * Initialize any
1950: 20 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 20 64   AUTOINCREMENT d
1960: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20 72  ata structures r
1970: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 20 20 2a  equired..      *
1980: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41  /.      sqlite3A
1990: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 42 65 67 69  utoincrementBegi
19a0: 6e 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 20 20  n(pParse);..    
19b0: 20 20 2f 2a 20 43 6f 64 65 20 63 6f 6e 73 74 61    /* Code consta
19c0: 6e 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  nt expressions t
19d0: 68 61 74 20 77 68 65 72 65 20 66 61 63 74 6f 72  hat where factor
19e0: 65 64 20 6f 75 74 20 6f 66 20 69 6e 6e 65 72 20  ed out of inner 
19f0: 6c 6f 6f 70 73 20 2a 2f 0a 20 20 20 20 20 20 69  loops */.      i
1a00: 66 28 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73  f( pParse->pCons
1a10: 74 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  tExpr ){.       
1a20: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 20 3d   ExprList *pEL =
1a30: 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a40: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61  xpr;.        pPa
1a50: 72 73 65 2d 3e 6f 6b 43 6f 6e 73 74 46 61 63 74  rse->okConstFact
1a60: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  or = 0;.        
1a70: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c 2d 3e  for(i=0; i<pEL->
1a80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
1a90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
1aa0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
1ab0: 45 4c 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20  EL->a[i].pExpr, 
1ac0: 70 45 4c 2d 3e 61 5b 69 5d 2e 75 2e 69 43 6f 6e  pEL->a[i].u.iCon
1ad0: 73 74 45 78 70 72 52 65 67 29 3b 0a 20 20 20 20  stExprReg);.    
1ae0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
1af0: 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c       /* Finally,
1b00: 20 6a 75 6d 70 20 62 61 63 6b 20 74 6f 20 74 68   jump back to th
1b10: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
1b20: 68 65 20 65 78 65 63 75 74 61 62 6c 65 20 63 6f  he executable co
1b30: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  de. */.      sql
1b40: 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76 2c 20  ite3VdbeGoto(v, 
1b50: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  1);.    }.  }...
1b60: 20 20 2f 2a 20 47 65 74 20 74 68 65 20 56 44 42    /* Get the VDB
1b70: 45 20 70 72 6f 67 72 61 6d 20 72 65 61 64 79 20  E program ready 
1b80: 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 0a 20 20  for execution.  
1b90: 2a 2f 0a 20 20 69 66 28 20 76 20 26 26 20 70 50  */.  if( v && pP
1ba0: 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 26 26  arse->nErr==0 &&
1bb0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
1bc0: 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ed ){.    assert
1bd0: 28 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65  ( pParse->iCache
1be0: 4c 65 76 65 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20  Level==0 );  /* 
1bf0: 44 69 73 61 62 6c 65 73 20 61 6e 64 20 72 65 2d  Disables and re-
1c00: 65 6e 61 62 6c 65 73 20 6d 61 74 63 68 20 2a 2f  enables match */
1c10: 0a 20 20 20 20 2f 2a 20 41 20 6d 69 6e 69 6d 75  .    /* A minimu
1c20: 6d 20 6f 66 20 6f 6e 65 20 63 75 72 73 6f 72 20  m of one cursor 
1c30: 69 73 20 72 65 71 75 69 72 65 64 20 69 66 20 61  is required if a
1c40: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 69 73 20  utoincrement is 
1c50: 75 73 65 64 0a 20 20 20 20 2a 20 20 53 65 65 20  used.    *  See 
1c60: 74 69 63 6b 65 74 20 5b 61 36 39 36 33 37 39 63  ticket [a696379c
1c70: 31 66 30 38 38 36 36 5d 20 2a 2f 0a 20 20 20 20  1f08866] */.    
1c80: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 41 69 6e  if( pParse->pAin
1c90: 63 21 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e  c!=0 && pParse->
1ca0: 6e 54 61 62 3d 3d 30 20 29 20 70 50 61 72 73 65  nTab==0 ) pParse
1cb0: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 20 20  ->nTab = 1;.    
1cc0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52  sqlite3VdbeMakeR
1cd0: 65 61 64 79 28 76 2c 20 70 50 61 72 73 65 29 3b  eady(v, pParse);
1ce0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
1cf0: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
1d00: 20 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c 4e 61     pParse->colNa
1d10: 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20 7d 65  mesSet = 0;.  }e
1d20: 6c 73 65 7b 0a 20 20 20 20 70 50 61 72 73 65 2d  lse{.    pParse-
1d30: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52  >rc = SQLITE_ERR
1d40: 4f 52 3b 0a 20 20 7d 0a 20 20 70 50 61 72 73 65  OR;.  }.  pParse
1d50: 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 70 50  ->nTab = 0;.  pP
1d60: 61 72 73 65 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a  arse->nMem = 0;.
1d70: 20 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 20 3d    pParse->nSet =
1d80: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 56   0;.  pParse->nV
1d90: 61 72 20 3d 20 30 3b 0a 20 20 44 62 4d 61 73 6b  ar = 0;.  DbMask
1da0: 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 63 6f 6f  Zero(pParse->coo
1db0: 6b 69 65 4d 61 73 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  kieMask);.}../*.
1dc0: 2a 2a 20 52 75 6e 20 74 68 65 20 70 61 72 73 65  ** Run the parse
1dd0: 72 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  r and code gener
1de0: 61 74 6f 72 20 72 65 63 75 72 73 69 76 65 6c 79  ator recursively
1df0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 6e   in order to gen
1e00: 65 72 61 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f  erate.** code fo
1e10: 72 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  r the SQL statem
1e20: 65 6e 74 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74  ent given onto t
1e30: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 50  he end of the pP
1e40: 61 72 73 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20  arse context.** 
1e50: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
1e60: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 57  construction.  W
1e70: 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 69  hen the parser i
1e80: 73 20 72 75 6e 20 72 65 63 75 72 73 69 76 65 6c  s run recursivel
1e90: 79 0a 2a 2a 20 74 68 69 73 20 77 61 79 2c 20 74  y.** this way, t
1ea0: 68 65 20 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74  he final OP_Halt
1eb0: 20 69 73 20 6e 6f 74 20 61 70 70 65 6e 64 65 64   is not appended
1ec0: 20 61 6e 64 20 6f 74 68 65 72 20 69 6e 69 74 69   and other initi
1ed0: 61 6c 69 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64  alization.** and
1ee0: 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74   finalization st
1ef0: 65 70 73 20 61 72 65 20 6f 6d 69 74 74 65 64 20  eps are omitted 
1f00: 62 65 63 61 75 73 65 20 74 68 6f 73 65 20 61 72  because those ar
1f10: 65 20 68 61 6e 64 6c 69 6e 67 20 62 79 20 74 68  e handling by th
1f20: 65 0a 2a 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70  e.** outermost p
1f30: 61 72 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  arser..**.** Not
1f40: 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 6e   everything is n
1f50: 65 73 74 61 62 6c 65 2e 20 20 54 68 69 73 20 66  estable.  This f
1f60: 61 63 69 6c 69 74 79 20 69 73 20 64 65 73 69 67  acility is desig
1f70: 6e 65 64 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a  ned to permit.**
1f80: 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 2c   INSERT, UPDATE,
1f90: 20 61 6e 64 20 44 45 4c 45 54 45 20 6f 70 65 72   and DELETE oper
1fa0: 61 74 69 6f 6e 73 20 61 67 61 69 6e 73 74 20 53  ations against S
1fb0: 51 4c 49 54 45 5f 4d 41 53 54 45 52 2e 20 20 55  QLITE_MASTER.  U
1fc0: 73 65 0a 2a 2a 20 63 61 72 65 20 69 66 20 79 6f  se.** care if yo
1fd0: 75 20 64 65 63 69 64 65 20 74 6f 20 74 72 79 20  u decide to try 
1fe0: 74 6f 20 75 73 65 20 74 68 69 73 20 72 6f 75 74  to use this rout
1ff0: 69 6e 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68  ine for some oth
2000: 65 72 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a  er purposes..*/.
2010: 76 6f 69 64 20 73 71 6c 69 74 65 33 4e 65 73 74  void sqlite3Nest
2020: 65 64 50 61 72 73 65 28 50 61 72 73 65 20 2a 70  edParse(Parse *p
2030: 50 61 72 73 65 2c 20 63 6f 6e 73 74 20 63 68 61  Parse, const cha
2040: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
2050: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2060: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2070: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2080: 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
2090: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23   = pParse->db;.#
20a0: 20 64 65 66 69 6e 65 20 53 41 56 45 5f 53 5a 20   define SAVE_SZ 
20b0: 20 28 73 69 7a 65 6f 66 28 50 61 72 73 65 29 20   (sizeof(Parse) 
20c0: 2d 20 6f 66 66 73 65 74 6f 66 28 50 61 72 73 65  - offsetof(Parse
20d0: 2c 6e 56 61 72 29 29 0a 20 20 63 68 61 72 20 73  ,nVar)).  char s
20e0: 61 76 65 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b  aveBuf[SAVE_SZ];
20f0: 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
2100: 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b 0a 20  nErr ) return;. 
2110: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
2120: 3e 6e 65 73 74 65 64 3c 31 30 20 29 3b 20 20 2f  >nested<10 );  /
2130: 2a 20 4e 65 73 74 69 6e 67 20 73 68 6f 75 6c 64  * Nesting should
2140: 20 6f 6e 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69   only be of limi
2150: 74 65 64 20 64 65 70 74 68 20 2a 2f 0a 20 20 76  ted depth */.  v
2160: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
2170: 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73  mat);.  zSql = s
2180: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 64  qlite3VMPrintf(d
2190: 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  b, zFormat, ap);
21a0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
21b0: 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
21c0: 20 20 20 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a      return;   /*
21d0: 20 41 20 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68   A malloc must h
21e0: 61 76 65 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20  ave failed */.  
21f0: 7d 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73 74  }.  pParse->nest
2200: 65 64 2b 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73  ed++;.  memcpy(s
2210: 61 76 65 42 75 66 2c 20 26 70 50 61 72 73 65 2d  aveBuf, &pParse-
2220: 3e 6e 56 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b  >nVar, SAVE_SZ);
2230: 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73  .  memset(&pPars
2240: 65 2d 3e 6e 56 61 72 2c 20 30 2c 20 53 41 56 45  e->nVar, 0, SAVE
2250: 5f 53 5a 29 3b 0a 20 20 73 71 6c 69 74 65 33 52  _SZ);.  sqlite3R
2260: 75 6e 50 61 72 73 65 72 28 70 50 61 72 73 65 2c  unParser(pParse,
2270: 20 7a 53 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29   zSql, &zErrMsg)
2280: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
2290: 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
22a0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22b0: 64 62 2c 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d  db, zSql);.  mem
22c0: 63 70 79 28 26 70 50 61 72 73 65 2d 3e 6e 56 61  cpy(&pParse->nVa
22d0: 72 2c 20 73 61 76 65 42 75 66 2c 20 53 41 56 45  r, saveBuf, SAVE
22e0: 5f 53 5a 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  _SZ);.  pParse->
22f0: 6e 65 73 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66  nested--;.}..#if
2300: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
2310: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a  HENTICATION./*.*
2320: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2330: 20 7a 54 61 62 6c 65 20 69 73 20 74 68 65 20 6e   zTable is the n
2340: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
2350: 6d 20 74 61 62 6c 65 20 74 68 61 74 20 73 74 6f  m table that sto
2360: 72 65 73 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20  res the.** list 
2370: 6f 66 20 75 73 65 72 73 20 61 6e 64 20 74 68 65  of users and the
2380: 69 72 20 61 63 63 65 73 73 20 63 72 65 64 65 6e  ir access creden
2390: 74 69 61 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  tials..*/.int sq
23a0: 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
23b0: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
23c0: 54 61 62 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e  Table){.  return
23d0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
23e0: 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
23f0: 5f 75 73 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65  _user")==0;.}.#e
2400: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  ndif../*.** Loca
2410: 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  te the in-memory
2420: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
2430: 64 65 73 63 72 69 62 65 73 20 61 20 70 61 72 74  describes a part
2440: 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 0a  icular database.
2450: 2a 2a 20 74 61 62 6c 65 20 67 69 76 65 6e 20 74  ** table given t
2460: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
2470: 74 61 62 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f  table and (optio
2480: 6e 61 6c 6c 79 29 20 74 68 65 20 6e 61 6d 65 20  nally) the name 
2490: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
24a0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  se containing th
24b0: 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e  e table.  Return
24c0: 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75   NULL if not fou
24d0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61  nd..**.** If zDa
24e0: 74 61 62 61 73 65 20 69 73 20 30 2c 20 61 6c 6c  tabase is 0, all
24f0: 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20 73   databases are s
2500: 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 65 20  earched for the 
2510: 74 61 62 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a  table and the.**
2520: 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
2530: 74 61 62 6c 65 20 69 73 20 72 65 74 75 72 6e 65  table is returne
2540: 64 2e 20 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67  d.  (No checking
2550: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 65 20 74   for duplicate t
2560: 61 62 6c 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73  able.** names is
2570: 20 64 6f 6e 65 2e 29 20 20 54 68 65 20 73 65 61   done.)  The sea
2580: 72 63 68 20 6f 72 64 65 72 20 69 73 20 54 45 4d  rch order is TEM
2590: 50 20 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41  P first, then MA
25a0: 49 4e 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20  IN, then any.** 
25b0: 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61  auxiliary databa
25c0: 73 65 73 20 61 64 64 65 64 20 75 73 69 6e 67 20  ses added using 
25d0: 74 68 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61  the ATTACH comma
25e0: 6e 64 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  nd..**.** See al
25f0: 73 6f 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65  so sqlite3Locate
2600: 54 61 62 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c  Table()..*/.Tabl
2610: 65 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 54 61  e *sqlite3FindTa
2620: 62 6c 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ble(sqlite3 *db,
2630: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
2640: 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
2650: 7a 44 61 74 61 62 61 73 65 29 7b 0a 20 20 54 61  zDatabase){.  Ta
2660: 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  ble *p = 0;.  in
2670: 74 20 69 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d  t i;..  /* All m
2680: 75 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69  utexes are requi
2690: 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61  red for schema a
26a0: 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72  ccess.  Make sur
26b0: 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20  e we hold them. 
26c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 61  */.  assert( zDa
26d0: 74 61 62 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c  tabase!=0 || sql
26e0: 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41 6c  ite3BtreeHoldsAl
26f0: 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b 0a  lMutexes(db) );.
2700: 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
2710: 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
2720: 20 2f 2a 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d   /* Only the adm
2730: 69 6e 20 75 73 65 72 20 69 73 20 61 6c 6c 6f 77  in user is allow
2740: 65 64 20 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20  ed to know that 
2750: 74 68 65 20 73 71 6c 69 74 65 5f 75 73 65 72 20  the sqlite_user 
2760: 74 61 62 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74  table.  ** exist
2770: 73 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  s */.  if( db->a
2780: 75 74 68 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41  uth.authLevel<UA
2790: 55 54 48 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c  UTH_Admin && sql
27a0: 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62 6c  ite3UserAuthTabl
27b0: 65 28 7a 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20  e(zName)!=0 ){. 
27c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
27d0: 0a 23 65 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d  .#endif.  for(i=
27e0: 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64  OMIT_TEMPDB; i<d
27f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
2800: 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20    int j = (i<2) 
2810: 3f 20 69 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20  ? i^1 : i;   /* 
2820: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
2830: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69  re MAIN */.    i
2840: 66 28 20 7a 44 61 74 61 62 61 73 65 21 3d 30 20  f( zDatabase!=0 
2850: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2860: 70 28 7a 44 61 74 61 62 61 73 65 2c 20 64 62 2d  p(zDatabase, db-
2870: 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29  >aDb[j].zName) )
2880: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61   continue;.    a
2890: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
28a0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
28b0: 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20 20 70  , j, 0) );.    p
28c0: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
28d0: 6e 64 28 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  nd(&db->aDb[j].p
28e0: 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c  Schema->tblHash,
28f0: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28   zName);.    if(
2900: 20 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a   p ) break;.  }.
2910: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
2920: 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20  *.** Locate the 
2930: 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  in-memory struct
2940: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
2950: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
2960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c  database.** tabl
2970: 65 20 67 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  e given the name
2980: 20 6f 66 20 74 68 61 74 20 74 61 62 6c 65 20 61   of that table a
2990: 6e 64 20 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20  nd (optionally) 
29a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a  the name of the.
29b0: 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ** database cont
29c0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 62 6c 65  aining the table
29d0: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
29e0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c  f not found.  Al
29f0: 73 6f 20 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65  so leave an.** e
2a00: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2a10: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
2a20: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
2a30: 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
2a40: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 73  is routine and s
2a50: 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
2a60: 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a 2a  ) is that this.*
2a70: 2a 20 72 6f 75 74 69 6e 65 20 6c 65 61 76 65 73  * routine leaves
2a80: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2a90: 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e in pParse->zEr
2aa0: 72 4d 73 67 20 77 68 65 72 65 0a 2a 2a 20 73 71  rMsg where.** sq
2ab0: 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29  lite3FindTable()
2ac0: 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61   does not..*/.Ta
2ad0: 62 6c 65 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61  ble *sqlite3Loca
2ae0: 74 65 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  teTable(.  Parse
2af0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
2b00: 20 20 2f 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20    /* context in 
2b10: 77 68 69 63 68 20 74 6f 20 72 65 70 6f 72 74 20  which to report 
2b20: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
2b30: 69 73 56 69 65 77 2c 20 20 20 20 20 20 20 20 20  isView,         
2b40: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f     /* True if lo
2b50: 6f 6b 69 6e 67 20 66 6f 72 20 61 20 56 49 45 57  oking for a VIEW
2b60: 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 54   rather than a T
2b70: 41 42 4c 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ABLE */.  const 
2b80: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
2b90: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2ba0: 74 61 62 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f  table we are loo
2bb0: 6b 69 6e 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f  king for */.  co
2bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 61 73 65  nst char *zDbase
2bd0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2be0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
2bf0: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
2c00: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a  ){.  Table *p;..
2c10: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
2c20: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
2c30: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2c40: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
2c50: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 61  r message.  ** a
2c60: 6e 64 20 63 6f 64 65 20 69 6e 20 70 50 61 72 73  nd code in pPars
2c70: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  e and return NUL
2c80: 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  L. */.  if( SQLI
2c90: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
2ca0: 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
2cb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
2cc0: 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  ;.  }..  p = sql
2cd0: 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 70 50  ite3FindTable(pP
2ce0: 61 72 73 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c  arse->db, zName,
2cf0: 20 7a 44 62 61 73 65 29 3b 0a 20 20 69 66 28 20   zDbase);.  if( 
2d00: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p==0 ){.    cons
2d10: 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69  t char *zMsg = i
2d20: 73 56 69 65 77 20 3f 20 22 6e 6f 20 73 75 63 68  sView ? "no such
2d30: 20 76 69 65 77 22 20 3a 20 22 6e 6f 20 73 75 63   view" : "no suc
2d40: 68 20 74 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65  h table";.#ifnde
2d50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
2d60: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69  RTUALTABLE.    i
2d70: 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62  f( sqlite3FindDb
2d80: 4e 61 6d 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Name(pParse->db,
2d90: 20 7a 44 62 61 73 65 29 3c 31 20 29 7b 0a 20 20   zDbase)<1 ){.  
2da0: 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20      /* If zName 
2db0: 69 73 20 74 68 65 20 6e 6f 74 20 74 68 65 20 6e  is the not the n
2dc0: 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20 69  ame of a table i
2dd0: 6e 20 74 68 65 20 73 63 68 65 6d 61 20 63 72 65  n the schema cre
2de0: 61 74 65 64 20 75 73 69 6e 67 0a 20 20 20 20 20  ated using.     
2df0: 20 2a 2a 20 43 52 45 41 54 45 2c 20 74 68 65 6e   ** CREATE, then
2e00: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
2e10: 20 69 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20   it is the name 
2e20: 6f 66 20 61 6e 20 76 69 72 74 75 61 6c 20 74 61  of an virtual ta
2e30: 62 6c 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a  ble that.      *
2e40: 2a 20 63 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e  * can be an epon
2e50: 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 20 74 61  ymous virtual ta
2e60: 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f  ble. */.      Mo
2e70: 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f  dule *pMod = (Mo
2e80: 64 75 6c 65 2a 29 73 71 6c 69 74 65 33 48 61 73  dule*)sqlite3Has
2e90: 68 46 69 6e 64 28 26 70 50 61 72 73 65 2d 3e 64  hFind(&pParse->d
2ea0: 62 2d 3e 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d  b->aModule, zNam
2eb0: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  e);.      if( pM
2ec0: 6f 64 20 26 26 20 73 71 6c 69 74 65 33 56 74 61  od && sqlite3Vta
2ed0: 62 45 70 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49  bEponymousTableI
2ee0: 6e 69 74 28 70 50 61 72 73 65 2c 20 70 4d 6f 64  nit(pParse, pMod
2ef0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
2f00: 75 72 6e 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61  urn pMod->pEpoTa
2f10: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
2f20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
2f30: 7a 44 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20  zDbase ){.      
2f40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
2f50: 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 2e  pParse, "%s: %s.
2f60: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73  %s", zMsg, zDbas
2f70: 65 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  e, zName);.    }
2f80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2f90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2fa0: 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d  se, "%s: %s", zM
2fb0: 73 67 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  sg, zName);.    
2fc0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
2fd0: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
2fe0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a   }..  return p;.
2ff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
3000: 74 68 65 20 74 61 62 6c 65 20 69 64 65 6e 74 69  the table identi
3010: 66 69 65 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a  fied by *p..**.*
3020: 2a 20 54 68 69 73 20 69 73 20 61 20 77 72 61 70  * This is a wrap
3030: 70 65 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74  per around sqlit
3040: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 2e  e3LocateTable().
3050: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
3060: 62 65 74 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74  between.** sqlit
3070: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 29 20  e3LocateTable() 
3080: 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
3090: 6e 20 69 73 20 74 68 61 74 20 74 68 69 73 20 66  n is that this f
30a0: 75 6e 63 74 69 6f 6e 20 72 65 73 74 72 69 63 74  unction restrict
30b0: 73 0a 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20  s.** the search 
30c0: 74 6f 20 73 63 68 65 6d 61 20 28 70 2d 3e 70 53  to schema (p->pS
30d0: 63 68 65 6d 61 29 20 69 66 20 69 74 20 69 73 20  chema) if it is 
30e0: 6e 6f 74 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63  not NULL. p->pSc
30f0: 68 65 6d 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e  hema may be.** n
3100: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 69 74 20 69 73  on-NULL if it is
3110: 20 70 61 72 74 20 6f 66 20 61 20 76 69 65 77 20   part of a view 
3120: 6f 72 20 74 72 69 67 67 65 72 20 70 72 6f 67 72  or trigger progr
3130: 61 6d 20 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53  am definition. S
3140: 65 65 0a 2a 2a 20 73 71 6c 69 74 65 33 46 69 78  ee.** sqlite3Fix
3150: 53 72 63 4c 69 73 74 28 29 20 66 6f 72 20 64 65  SrcList() for de
3160: 74 61 69 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20  tails..*/.Table 
3170: 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61  *sqlite3LocateTa
3180: 62 6c 65 49 74 65 6d 28 0a 20 20 50 61 72 73 65  bleItem(.  Parse
3190: 20 2a 70 50 61 72 73 65 2c 20 0a 20 20 69 6e 74   *pParse, .  int
31a0: 20 69 73 56 69 65 77 2c 20 0a 20 20 73 74 72 75   isView, .  stru
31b0: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
31c0: 2a 70 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *p.){.  const ch
31d0: 61 72 20 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72  ar *zDb;.  asser
31e0: 74 28 20 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30  t( p->pSchema==0
31f0: 20 7c 7c 20 70 2d 3e 7a 44 61 74 61 62 61 73 65   || p->zDatabase
3200: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  ==0 );.  if( p->
3210: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 69  pSchema ){.    i
3220: 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33  nt iDb = sqlite3
3230: 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50  SchemaToIndex(pP
3240: 61 72 73 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63  arse->db, p->pSc
3250: 68 65 6d 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d  hema);.    zDb =
3260: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62   pParse->db->aDb
3270: 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  [iDb].zName;.  }
3280: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
3290: 70 2d 3e 7a 44 61 74 61 62 61 73 65 3b 0a 20 20  p->zDatabase;.  
32a0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
32b0: 65 33 4c 6f 63 61 74 65 54 61 62 6c 65 28 70 50  e3LocateTable(pP
32c0: 61 72 73 65 2c 20 69 73 56 69 65 77 2c 20 70 2d  arse, isView, p-
32d0: 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a  >zName, zDb);.}.
32e0: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68  ./*.** Locate th
32f0: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75  e in-memory stru
3300: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
3310: 69 62 65 73 20 0a 2a 2a 20 61 20 70 61 72 74 69  ibes .** a parti
3320: 63 75 6c 61 72 20 69 6e 64 65 78 20 67 69 76 65  cular index give
3330: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
3340: 61 74 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  at index.** and 
3350: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
3360: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 6f  database that co
3370: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
3380: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
3390: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
33a0: 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62 61 73  *.** If zDatabas
33b0: 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61 74 61  e is 0, all data
33c0: 62 61 73 65 73 20 61 72 65 20 73 65 61 72 63 68  bases are search
33d0: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61  ed for the.** ta
33e0: 62 6c 65 20 61 6e 64 20 74 68 65 20 66 69 72 73  ble and the firs
33f0: 74 20 6d 61 74 63 68 69 6e 67 20 69 6e 64 65 78  t matching index
3400: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 28   is returned.  (
3410: 4e 6f 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66  No checking.** f
3420: 6f 72 20 64 75 70 6c 69 63 61 74 65 20 69 6e 64  or duplicate ind
3430: 65 78 20 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65  ex names is done
3440: 2e 29 20 20 54 68 65 20 73 65 61 72 63 68 20 6f  .)  The search o
3450: 72 64 65 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20  rder is.** TEMP 
3460: 66 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e  first, then MAIN
3470: 2c 20 74 68 65 6e 20 61 6e 79 20 61 75 78 69 6c  , then any auxil
3480: 69 61 72 79 20 64 61 74 61 62 61 73 65 73 20 61  iary databases a
3490: 64 64 65 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68  dded.** using th
34a0: 65 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64  e ATTACH command
34b0: 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ..*/.Index *sqli
34c0: 74 65 33 46 69 6e 64 49 6e 64 65 78 28 73 71 6c  te3FindIndex(sql
34d0: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
34e0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e  char *zName, con
34f0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
3500: 20 49 6e 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20   Index *p = 0;. 
3510: 20 69 6e 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c   int i;.  /* All
3520: 20 6d 75 74 65 78 65 73 20 61 72 65 20 72 65 71   mutexes are req
3530: 75 69 72 65 64 20 66 6f 72 20 73 63 68 65 6d 61  uired for schema
3540: 20 61 63 63 65 73 73 2e 20 20 4d 61 6b 65 20 73   access.  Make s
3550: 75 72 65 20 77 65 20 68 6f 6c 64 20 74 68 65 6d  ure we hold them
3560: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  . */.  assert( z
3570: 44 62 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  Db!=0 || sqlite3
3580: 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74  BtreeHoldsAllMut
3590: 65 78 65 73 28 64 62 29 20 29 3b 0a 20 20 66 6f  exes(db) );.  fo
35a0: 72 28 69 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b  r(i=OMIT_TEMPDB;
35b0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
35c0: 7b 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 28 69  {.    int j = (i
35d0: 3c 32 29 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20  <2) ? i^1 : i;  
35e0: 2f 2a 20 53 65 61 72 63 68 20 54 45 4d 50 20 62  /* Search TEMP b
35f0: 65 66 6f 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20  efore MAIN */.  
3600: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
3610: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70  a = db->aDb[j].p
3620: 53 63 68 65 6d 61 3b 0a 20 20 20 20 61 73 73 65  Schema;.    asse
3630: 72 74 28 20 70 53 63 68 65 6d 61 20 29 3b 0a 20  rt( pSchema );. 
3640: 20 20 20 69 66 28 20 7a 44 62 20 26 26 20 73 71     if( zDb && sq
3650: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
3660: 2c 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61  , db->aDb[j].zNa
3670: 6d 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  me) ) continue;.
3680: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
3690: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
36a0: 6c 64 28 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a  ld(db, j, 0) );.
36b0: 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 48      p = sqlite3H
36c0: 61 73 68 46 69 6e 64 28 26 70 53 63 68 65 6d 61  ashFind(&pSchema
36d0: 2d 3e 69 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65  ->idxHash, zName
36e0: 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29 20 62  );.    if( p ) b
36f0: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
3700: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn p;.}../*.** R
3710: 65 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72  eclaim the memor
3720: 79 20 75 73 65 64 20 62 79 20 61 6e 20 69 6e 64  y used by an ind
3730: 65 78 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ex.*/.static voi
3740: 64 20 66 72 65 65 49 6e 64 65 78 28 73 71 6c 69  d freeIndex(sqli
3750: 74 65 33 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a  te3 *db, Index *
3760: 70 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  p){.#ifndef SQLI
3770: 54 45 5f 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a  TE_OMIT_ANALYZE.
3780: 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 49    sqlite3DeleteI
3790: 6e 64 65 78 53 61 6d 70 6c 65 73 28 64 62 2c 20  ndexSamples(db, 
37a0: 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  p);.#endif.  sql
37b0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
37c0: 62 2c 20 70 2d 3e 70 50 61 72 74 49 64 78 57 68  b, p->pPartIdxWh
37d0: 65 72 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ere);.  sqlite3E
37e0: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
37f0: 2c 20 70 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a  , p->aColExpr);.
3800: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3810: 64 62 2c 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b  db, p->zColAff);
3820: 0a 20 20 69 66 28 20 70 2d 3e 69 73 52 65 73 69  .  if( p->isResi
3830: 7a 65 64 20 29 20 73 71 6c 69 74 65 33 44 62 46  zed ) sqlite3DbF
3840: 72 65 65 28 64 62 2c 20 28 76 6f 69 64 20 2a 29  ree(db, (void *)
3850: 70 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64  p->azColl);.#ifd
3860: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
3870: 5f 53 54 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a  _STAT3_OR_STAT4.
3880: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3890: 2d 3e 61 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e  ->aiRowEst);.#en
38a0: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44 62 46  dif.  sqlite3DbF
38b0: 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
38c0: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 69 6e 64  *.** For the ind
38d0: 65 78 20 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61  ex called zIdxNa
38e0: 6d 65 20 77 68 69 63 68 20 69 73 20 66 6f 75 6e  me which is foun
38f0: 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  d in the databas
3900: 65 20 69 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65  e iDb,.** unlike
3910: 20 74 68 61 74 20 69 6e 64 65 78 20 66 72 6f 6d   that index from
3920: 20 69 74 73 20 54 61 62 6c 65 20 74 68 65 6e 20   its Table then 
3930: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64 65 78  remove the index
3940: 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64   from.** the ind
3950: 65 78 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  ex hash table an
3960: 64 20 66 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  d free all memor
3970: 79 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73  y structures ass
3980: 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
3990: 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  the index..*/.vo
39a0: 69 64 20 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b  id sqlite3Unlink
39b0: 41 6e 64 44 65 6c 65 74 65 49 6e 64 65 78 28 73  AndDeleteIndex(s
39c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
39d0: 69 44 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  iDb, const char 
39e0: 2a 7a 49 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e  *zIdxName){.  In
39f0: 64 65 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48  dex *pIndex;.  H
3a00: 61 73 68 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61  ash *pHash;..  a
3a10: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
3a20: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
3a30: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 70  , iDb, 0) );.  p
3a40: 48 61 73 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b  Hash = &db->aDb[
3a50: 69 44 62 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64  iDb].pSchema->id
3a60: 78 48 61 73 68 3b 0a 20 20 70 49 6e 64 65 78 20  xHash;.  pIndex 
3a70: 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  = sqlite3HashIns
3a80: 65 72 74 28 70 48 61 73 68 2c 20 7a 49 64 78 4e  ert(pHash, zIdxN
3a90: 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 41  ame, 0);.  if( A
3aa0: 4c 57 41 59 53 28 70 49 6e 64 65 78 29 20 29 7b  LWAYS(pIndex) ){
3ab0: 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d  .    if( pIndex-
3ac0: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d  >pTable->pIndex=
3ad0: 3d 70 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 20  =pIndex ){.     
3ae0: 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d   pIndex->pTable-
3af0: 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64 65 78  >pIndex = pIndex
3b00: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
3b10: 73 65 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  se{.      Index 
3b20: 2a 70 3b 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73  *p;.      /* Jus
3b30: 74 69 66 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c  tification of AL
3b40: 57 41 59 53 28 29 3b 20 20 54 68 65 20 69 6e 64  WAYS();  The ind
3b50: 65 78 20 6d 75 73 74 20 62 65 20 6f 6e 20 74 68  ex must be on th
3b60: 65 20 6c 69 73 74 20 6f 66 0a 20 20 20 20 20 20  e list of.      
3b70: 2a 2a 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20  ** indices. */. 
3b80: 20 20 20 20 20 70 20 3d 20 70 49 6e 64 65 78 2d       p = pIndex-
3b90: 3e 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b  >pTable->pIndex;
3ba0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
3bb0: 57 41 59 53 28 70 29 20 26 26 20 70 2d 3e 70 4e  WAYS(p) && p->pN
3bc0: 65 78 74 21 3d 70 49 6e 64 65 78 20 29 7b 20 70  ext!=pIndex ){ p
3bd0: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20   = p->pNext; }. 
3be0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
3bf0: 70 20 26 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70  p && p->pNext==p
3c00: 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20 20  Index) ){.      
3c10: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
3c20: 64 65 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  dex->pNext;.    
3c30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72    }.    }.    fr
3c40: 65 65 49 6e 64 65 78 28 64 62 2c 20 70 49 6e 64  eeIndex(db, pInd
3c50: 65 78 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66  ex);.  }.  db->f
3c60: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
3c70: 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a  nternChanges;.}.
3c80: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f  ./*.** Look thro
3c90: 75 67 68 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ugh the list of 
3ca0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
3cb0: 6c 65 73 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  les in db->aDb[]
3cc0: 20 61 6e 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68   and if.** any h
3cd0: 61 76 65 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c  ave been closed,
3ce0: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
3cf0: 6d 20 74 68 65 20 6c 69 73 74 2e 20 20 52 65 61  m the list.  Rea
3d00: 6c 6c 6f 63 61 74 65 20 74 68 65 0a 2a 2a 20 64  llocate the.** d
3d10: 62 2d 3e 61 44 62 5b 5d 20 73 74 72 75 63 74 75  b->aDb[] structu
3d20: 72 65 20 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20  re to a smaller 
3d30: 73 69 7a 65 2c 20 69 66 20 70 6f 73 73 69 62 6c  size, if possibl
3d40: 65 2e 0a 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30  e..**.** Entry 0
3d50: 20 28 74 68 65 20 22 6d 61 69 6e 22 20 64 61 74   (the "main" dat
3d60: 61 62 61 73 65 29 20 61 6e 64 20 65 6e 74 72 79  abase) and entry
3d70: 20 31 20 28 74 68 65 20 22 74 65 6d 70 22 20 64   1 (the "temp" d
3d80: 61 74 61 62 61 73 65 29 0a 2a 2a 20 61 72 65 20  atabase).** are 
3d90: 6e 65 76 65 72 20 63 61 6e 64 69 64 61 74 65 73  never candidates
3da0: 20 66 6f 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61   for being colla
3db0: 70 73 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  psed..*/.void sq
3dc0: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
3dd0: 61 62 61 73 65 41 72 72 61 79 28 73 71 6c 69 74  abaseArray(sqlit
3de0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
3df0: 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32  , j;.  for(i=j=2
3e00: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
3e10: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62  ){.    struct Db
3e20: 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62   *pDb = &db->aDb
3e30: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62  [i];.    if( pDb
3e40: 2d 3e 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->pBt==0 ){.    
3e50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
3e60: 64 62 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b  db, pDb->zName);
3e70: 0a 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d  .      pDb->zNam
3e80: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  e = 0;.      con
3e90: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
3ea0: 20 69 66 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20   if( j<i ){.    
3eb0: 20 20 64 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64    db->aDb[j] = d
3ec0: 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d  b->aDb[i];.    }
3ed0: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
3ee0: 6d 65 6d 73 65 74 28 26 64 62 2d 3e 61 44 62 5b  memset(&db->aDb[
3ef0: 6a 5d 2c 20 30 2c 20 28 64 62 2d 3e 6e 44 62 2d  j], 0, (db->nDb-
3f00: 6a 29 2a 73 69 7a 65 6f 66 28 64 62 2d 3e 61 44  j)*sizeof(db->aD
3f10: 62 5b 6a 5d 29 29 3b 0a 20 20 64 62 2d 3e 6e 44  b[j]));.  db->nD
3f20: 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20 64 62 2d  b = j;.  if( db-
3f30: 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62 2d 3e 61  >nDb<=2 && db->a
3f40: 44 62 21 3d 64 62 2d 3e 61 44 62 53 74 61 74 69  Db!=db->aDbStati
3f50: 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  c ){.    memcpy(
3f60: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 2c 20 64  db->aDbStatic, d
3f70: 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a 65 6f 66  b->aDb, 2*sizeof
3f80: 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29 3b 0a 20  (db->aDb[0]));. 
3f90: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
3fa0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 29 3b 0a 20  (db, db->aDb);. 
3fb0: 20 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d     db->aDb = db-
3fc0: 3e 61 44 62 53 74 61 74 69 63 3b 0a 20 20 7d 0a  >aDbStatic;.  }.
3fd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65 74 20 74  }../*.** Reset t
3fe0: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
3ff0: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 69 6e  e database at in
4000: 64 65 78 20 69 44 62 2e 20 20 41 6c 73 6f 20 72  dex iDb.  Also r
4010: 65 73 65 74 20 74 68 65 0a 2a 2a 20 54 45 4d 50  eset the.** TEMP
4020: 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76 6f 69 64   schema..*/.void
4030: 20 73 71 6c 69 74 65 33 52 65 73 65 74 4f 6e 65   sqlite3ResetOne
4040: 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33 20 2a  Schema(sqlite3 *
4050: 64 62 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  db, int iDb){.  
4060: 44 62 20 2a 70 44 62 3b 0a 20 20 61 73 73 65 72  Db *pDb;.  asser
4070: 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  t( iDb<db->nDb )
4080: 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20 31 3a 20  ;..  /* Case 1: 
4090: 20 52 65 73 65 74 20 74 68 65 20 73 69 6e 67 6c   Reset the singl
40a0: 65 20 73 63 68 65 6d 61 20 69 64 65 6e 74 69 66  e schema identif
40b0: 69 65 64 20 62 79 20 69 44 62 20 2a 2f 0a 20 20  ied by iDb */.  
40c0: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
40d0: 44 62 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73  Db];.  assert( s
40e0: 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
40f0: 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
4100: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
4110: 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29  Db->pSchema!=0 )
4120: 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d  ;.  sqlite3Schem
4130: 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53 63 68  aClear(pDb->pSch
4140: 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  ema);..  /* If a
4150: 6e 79 20 64 61 74 61 62 61 73 65 20 6f 74 68 65  ny database othe
4160: 72 20 74 68 61 6e 20 54 45 4d 50 20 69 73 20 72  r than TEMP is r
4170: 65 73 65 74 2c 20 74 68 65 6e 20 61 6c 73 6f 20  eset, then also 
4180: 72 65 73 65 74 20 54 45 4d 50 0a 20 20 2a 2a 20  reset TEMP.  ** 
4190: 73 69 6e 63 65 20 54 45 4d 50 20 6d 69 67 68 74  since TEMP might
41a0: 20 62 65 20 68 6f 6c 64 69 6e 67 20 74 72 69 67   be holding trig
41b0: 67 65 72 73 20 74 68 61 74 20 72 65 66 65 72 65  gers that refere
41c0: 6e 63 65 20 74 61 62 6c 65 73 20 69 6e 20 74 68  nce tables in th
41d0: 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 64 61 74  e.  ** other dat
41e0: 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  abase..  */.  if
41f0: 28 20 69 44 62 21 3d 31 20 29 7b 0a 20 20 20 20  ( iDb!=1 ){.    
4200: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 31  pDb = &db->aDb[1
4210: 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
4220: 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d 30 20 29  Db->pSchema!=0 )
4230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68  ;.    sqlite3Sch
4240: 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70 53  emaClear(pDb->pS
4250: 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 72 65  chema);.  }.  re
4260: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  turn;.}../*.** E
4270: 72 61 73 65 20 61 6c 6c 20 73 63 68 65 6d 61 20  rase all schema 
4280: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
4290: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
42a0: 74 61 62 61 73 65 73 20 28 69 6e 63 6c 75 64 69  tabases (includi
42b0: 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20 61 6e 64  ng.** "main" and
42c0: 20 22 74 65 6d 70 22 29 20 66 6f 72 20 61 20 73   "temp") for a s
42d0: 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 63  ingle database c
42e0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
42f0: 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74 41  id sqlite3ResetA
4300: 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65  llSchemasOfConne
4310: 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64  ction(sqlite3 *d
4320: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  b){.  int i;.  s
4330: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
4340: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
4350: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
4360: 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a 70 44 62  ++){.    Db *pDb
4370: 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a   = &db->aDb[i];.
4380: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63      if( pDb->pSc
4390: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
43a0: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
43b0: 28 70 44 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pDb->pSchema);.
43c0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e      }.  }.  db->
43d0: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
43e0: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a  _InternChanges;.
43f0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c    sqlite3VtabUnl
4400: 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 20 20 73  ockList(db);.  s
4410: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
4420: 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  All(db);.  sqlit
4430: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
4440: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 7d 0a 0a  seArray(db);.}..
4450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4460: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
4470: 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63 63 75 72  n a commit occur
4480: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
4490: 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
44a0: 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20  Changes(sqlite3 
44b0: 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66 6c 61 67  *db){.  db->flag
44c0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 49 6e 74  s &= ~SQLITE_Int
44d0: 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f  ernChanges;.}../
44e0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d 65 6d 6f  *.** Delete memo
44f0: 72 79 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ry allocated for
4500: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
4510: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 6f 72 20  s of a table or 
4520: 76 69 65 77 20 28 74 68 65 0a 2a 2a 20 54 61 62  view (the.** Tab
4530: 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72 61 79 29  le.aCol[] array)
4540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4550: 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d  3DeleteColumnNam
4560: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
4570: 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
4580: 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f 6c 75 6d    int i;.  Colum
4590: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73 73 65 72  n *pCol;.  asser
45a0: 74 28 20 70 54 61 62 6c 65 21 3d 30 20 29 3b 0a  t( pTable!=0 );.
45b0: 20 20 69 66 28 20 28 70 43 6f 6c 20 3d 20 70 54    if( (pCol = pT
45c0: 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d 30 20 29  able->aCol)!=0 )
45d0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
45e0: 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69  <pTable->nCol; i
45f0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
4600: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4610: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  (db, pCol->zName
4620: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4630: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4640: 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a 20 20 20  Col->pDflt);.   
4650: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4660: 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74  (db, pCol->zDflt
4670: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
4680: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d  DbFree(db, pCol-
4690: 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20 20 20 73  >zType);.      s
46a0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
46b0: 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29 3b 0a 20   pCol->zColl);. 
46c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
46d0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c  DbFree(db, pTabl
46e0: 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 0a 7d 0a  e->aCol);.  }.}.
46f0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
4700: 65 20 6d 65 6d 6f 72 79 20 64 61 74 61 20 73 74  e memory data st
4710: 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69 61  ructures associa
4720: 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76  ted with the giv
4730: 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20 20 4e 6f  en.** Table.  No
4740: 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   changes are mad
4750: 65 20 74 6f 20 64 69 73 6b 20 62 79 20 74 68 69  e to disk by thi
4760: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
4770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
4780: 73 74 20 64 65 6c 65 74 65 73 20 74 68 65 20 64  st deletes the d
4790: 61 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20  ata structure.  
47a0: 49 74 20 64 6f 65 73 20 6e 6f 74 20 75 6e 6c 69  It does not unli
47b0: 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  nk.** the table 
47c0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 66  data structure f
47d0: 72 6f 6d 20 74 68 65 20 68 61 73 68 20 74 61 62  rom the hash tab
47e0: 6c 65 2e 20 20 42 75 74 20 69 74 20 64 6f 65 73  le.  But it does
47f0: 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d 65 6d 6f   destroy.** memo
4800: 72 79 20 73 74 72 75 63 74 75 72 65 73 20 6f 66  ry structures of
4810: 20 74 68 65 20 69 6e 64 69 63 65 73 20 61 6e 64   the indices and
4820: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 73   foreign keys as
4830: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a  sociated with .*
4840: 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  * the table..**.
4850: 2a 2a 20 54 68 65 20 64 62 20 70 61 72 61 6d 65  ** The db parame
4860: 74 65 72 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e  ter is optional.
4870: 20 20 49 74 20 69 73 20 6e 65 65 64 65 64 20 69    It is needed i
4880: 66 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  f the Table obje
4890: 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20  ct .** contains 
48a0: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
48b0: 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a 65 63 74  .  (Table object
48c0: 73 20 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20  s in the schema 
48d0: 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a 20 6c 6f  do not use.** lo
48e0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2c 20  okaside memory, 
48f0: 62 75 74 20 73 6f 6d 65 20 65 70 68 65 6d 65 72  but some ephemer
4900: 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 73  al Table objects
4910: 20 64 6f 2e 29 20 20 4f 72 20 74 68 65 0a 2a 2a   do.)  Or the.**
4920: 20 64 62 20 70 61 72 61 6d 65 74 65 72 20 63 61   db parameter ca
4930: 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20 64  n be used with d
4940: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
4950: 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 6d  to measure the m
4960: 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64 20 62 79  emory.** used by
4970: 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65 63   the Table objec
4980: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
4990: 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71  e3DeleteTable(sq
49a0: 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65  lite3 *db, Table
49b0: 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 49 6e 64   *pTable){.  Ind
49c0: 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a 70 4e 65  ex *pIndex, *pNe
49d0: 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20  xt;.  TESTONLY( 
49e0: 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64 65 3b 20  int nLookaside; 
49f0: 29 20 2f 2a 20 55 73 65 64 20 74 6f 20 76 65 72  ) /* Used to ver
4a00: 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65 20 6e 6f  ify lookaside no
4a10: 74 20 75 73 65 64 20 66 6f 72 20 73 63 68 65 6d  t used for schem
4a20: 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  a */..  assert( 
4a30: 21 70 54 61 62 6c 65 20 7c 7c 20 70 54 61 62 6c  !pTable || pTabl
4a40: 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  e->nRef>0 );..  
4a50: 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  /* Do not delete
4a60: 20 74 68 65 20 74 61 62 6c 65 20 75 6e 74 69 6c   the table until
4a70: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
4a80: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
4a90: 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21 70 54 61  o. */.  if( !pTa
4aa0: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
4ab0: 69 66 28 20 28 28 21 64 62 20 7c 7c 20 64 62 2d  if( ((!db || db-
4ac0: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
4ad0: 29 20 26 26 20 28 2d 2d 70 54 61 62 6c 65 2d 3e  ) && (--pTable->
4ae0: 6e 52 65 66 29 3e 30 29 20 29 20 72 65 74 75 72  nRef)>0) ) retur
4af0: 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  n;..  /* Record 
4b00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75  the number of ou
4b10: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f 6b 61 73  tstanding lookas
4b20: 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ide allocations 
4b30: 69 6e 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  in schema Tables
4b40: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 64  .  ** prior to d
4b50: 6f 69 6e 67 20 61 6e 79 20 66 72 65 65 28 29 20  oing any free() 
4b60: 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20 53 69 6e  operations.  Sin
4b70: 63 65 20 73 63 68 65 6d 61 20 54 61 62 6c 65 73  ce schema Tables
4b80: 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20 20 2a 2a   do not use.  **
4b90: 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74 68 69 73   lookaside, this
4ba0: 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c 64 20 6e   number should n
4bb0: 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f 0a 20 20  ot change. */.  
4bc0: 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f 6f 6b 61  TESTONLY( nLooka
4bd0: 73 69 64 65 20 3d 20 28 64 62 20 26 26 20 28 70  side = (db && (p
4be0: 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61 67 73 20  Table->tabFlags 
4bf0: 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29 3d  & TF_Ephemeral)=
4c00: 3d 30 29 20 3f 0a 20 20 20 20 20 20 20 20 20 20  =0) ?.          
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
4c20: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
4c30: 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f 2a 20 44  t : 0 );..  /* D
4c40: 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64 69 63 65  elete all indice
4c50: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
4c60: 68 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  h this table. */
4c70: 0a 20 20 66 6f 72 28 70 49 6e 64 65 78 20 3d 20  .  for(pIndex = 
4c80: 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 20  pTable->pIndex; 
4c90: 70 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3d 70  pIndex; pIndex=p
4ca0: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
4cb0: 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74   = pIndex->pNext
4cc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
4cd0: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70  ndex->pSchema==p
4ce0: 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 20 29  Table->pSchema )
4cf0: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 20 7c 7c  ;.    if( !db ||
4d00: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
4d10: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  d==0 ){.      ch
4d20: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70 49 6e 64  ar *zName = pInd
4d30: 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20 20 20 20  ex->zName; .    
4d40: 20 20 54 45 53 54 4f 4e 4c 59 20 28 20 49 6e 64    TESTONLY ( Ind
4d50: 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20 73 71 6c  ex *pOld = ) sql
4d60: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 0a  ite3HashInsert(.
4d70: 20 20 20 20 20 20 20 20 20 26 70 49 6e 64 65 78           &pIndex
4d80: 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ->pSchema->idxHa
4d90: 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a 20 20 20  sh, zName, 0.   
4da0: 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
4db0: 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20 73 71 6c  rt( db==0 || sql
4dc0: 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
4dd0: 65 6c 64 28 64 62 2c 20 30 2c 20 70 49 6e 64 65  eld(db, 0, pInde
4de0: 78 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20  x->pSchema) );. 
4df0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 6c       assert( pOl
4e00: 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20 70 4f 6c  d==pIndex || pOl
4e10: 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  d==0 );.    }.  
4e20: 20 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20    freeIndex(db, 
4e30: 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 0a 20 20  pIndex);.  }..  
4e40: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 66 6f  /* Delete any fo
4e50: 72 65 69 67 6e 20 6b 65 79 73 20 61 74 74 61 63  reign keys attac
4e60: 68 65 64 20 74 6f 20 74 68 69 73 20 74 61 62 6c  hed to this tabl
4e70: 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46  e. */.  sqlite3F
4e80: 6b 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61 62  kDelete(db, pTab
4e90: 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  le);..  /* Delet
4ea0: 65 20 74 68 65 20 54 61 62 6c 65 20 73 74 72 75  e the Table stru
4eb0: 63 74 75 72 65 20 69 74 73 65 6c 66 2e 0a 20 20  cture itself..  
4ec0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44 65 6c 65  */.  sqlite3Dele
4ed0: 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62  teColumnNames(db
4ee0: 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20 73 71 6c  , pTable);.  sql
4ef0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4f00: 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  Table->zName);. 
4f10: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
4f20: 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43 6f 6c 41  b, pTable->zColA
4f30: 66 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ff);.  sqlite3Se
4f40: 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
4f50: 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74 29 3b  Table->pSelect);
4f60: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
4f70: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54 61  stDelete(db, pTa
4f80: 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b 0a 23 69  ble->pCheck);.#i
4f90: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4fa0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
4fb0: 20 73 71 6c 69 74 65 33 56 74 61 62 43 6c 65 61   sqlite3VtabClea
4fc0: 72 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 23  r(db, pTable);.#
4fd0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 44  endif.  sqlite3D
4fe0: 62 46 72 65 65 28 64 62 2c 20 70 54 61 62 6c 65  bFree(db, pTable
4ff0: 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  );..  /* Verify 
5000: 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61 73 69 64  that no lookasid
5010: 65 20 6d 65 6d 6f 72 79 20 77 61 73 20 75 73 65  e memory was use
5020: 64 20 62 79 20 73 63 68 65 6d 61 20 74 61 62 6c  d by schema tabl
5030: 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
5040: 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30 20 7c 7c  nLookaside==0 ||
5050: 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 64 62 2d   nLookaside==db-
5060: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
5070: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  );.}../*.** Unli
5080: 6e 6b 20 74 68 65 20 67 69 76 65 6e 20 74 61 62  nk the given tab
5090: 6c 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68  le from the hash
50a0: 20 74 61 62 6c 65 73 20 61 6e 64 20 74 68 65 20   tables and the 
50b0: 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a 20 74 61  delete the.** ta
50c0: 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 77 69  ble structure wi
50d0: 74 68 20 61 6c 6c 20 69 74 73 20 69 6e 64 69 63  th all its indic
50e0: 65 73 20 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b  es and foreign k
50f0: 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  eys..*/.void sql
5100: 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64 44 65 6c  ite3UnlinkAndDel
5110: 65 74 65 54 61 62 6c 65 28 73 71 6c 69 74 65 33  eteTable(sqlite3
5120: 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 63   *db, int iDb, c
5130: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 4e  onst char *zTabN
5140: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
5150: 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a 0a 20 20  ;.  Db *pDb;..  
5160: 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b  assert( db!=0 );
5170: 0a 20 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d  .  assert( iDb>=
5180: 30 20 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62  0 && iDb<db->nDb
5190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 54   );.  assert( zT
51a0: 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65  abName );.  asse
51b0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
51c0: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
51d0: 44 62 2c 20 30 29 20 29 3b 0a 20 20 74 65 73 74  Db, 0) );.  test
51e0: 63 61 73 65 28 20 7a 54 61 62 4e 61 6d 65 5b 30  case( zTabName[0
51f0: 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a 65 72 6f  ]==0 );  /* Zero
5200: 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65 20 6e 61  -length table na
5210: 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  mes are allowed 
5220: 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e  */.  pDb = &db->
5230: 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70 20 3d 20  aDb[iDb];.  p = 
5240: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
5250: 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  t(&pDb->pSchema-
5260: 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61 62 4e 61  >tblHash, zTabNa
5270: 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  me, 0);.  sqlite
5280: 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c  3DeleteTable(db,
5290: 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73   p);.  db->flags
52a0: 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65 72   |= SQLITE_Inter
52b0: 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a 0a  nChanges;.}../*.
52c0: 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f 6b 65 6e  ** Given a token
52d0: 2c 20 72 65 74 75 72 6e 20 61 20 73 74 72 69 6e  , return a strin
52e0: 67 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73 20  g that consists 
52f0: 6f 66 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  of the text of t
5300: 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e 20 20 53  hat.** token.  S
5310: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
5320: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
5330: 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
5340: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
5350: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
5360: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
5370: 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
5380: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71 75 6f 74  ..**.** Any quot
5390: 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28 65 78 3a  ation marks (ex:
53a0: 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61 6d 65 27    "name", 'name'
53b0: 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20 60 6e 61  , [name], or `na
53c0: 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20 73 75 72  me`) that.** sur
53d0: 72 6f 75 6e 64 20 74 68 65 20 62 6f 64 79 20 6f  round the body o
53e0: 66 20 74 68 65 20 74 6f 6b 65 6e 20 61 72 65 20  f the token are 
53f0: 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  removed..**.** T
5400: 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74 65 6e 20  okens are often 
5410: 6a 75 73 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  just pointers in
5420: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
5430: 53 51 4c 20 74 65 78 74 20 61 6e 64 20 73 6f 0a  SQL text and so.
5440: 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30 30 30 20  ** are not \000 
5450: 74 65 72 6d 69 6e 61 74 65 64 20 61 6e 64 20 61  terminated and a
5460: 72 65 20 6e 6f 74 20 70 65 72 73 69 73 74 65 6e  re not persisten
5470: 74 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65 64  t.  The returned
5480: 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20 5c 30   string.** is \0
5490: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
54a0: 64 20 69 73 20 70 65 72 73 69 73 74 65 6e 74 2e  d is persistent.
54b0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
54c0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 73  3NameFromToken(s
54d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 6f 6b 65  qlite3 *db, Toke
54e0: 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 63 68 61  n *pName){.  cha
54f0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 66 28 20  r *zName;.  if( 
5500: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61  pName ){.    zNa
5510: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5520: 72 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a  rNDup(db, (char*
5530: 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65  )pName->z, pName
5540: 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ->n);.    sqlite
5550: 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d 65 29 3b  3Dequote(zName);
5560: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4e  .  }else{.    zN
5570: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ame = 0;.  }.  r
5580: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 0a  eturn zName;.}..
5590: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
55a0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
55b0: 6c 65 20 73 74 6f 72 65 64 20 69 6e 20 64 61 74  le stored in dat
55c0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 69 44 62  abase number iDb
55d0: 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 2e   for.** writing.
55e0: 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 6f 70   The table is op
55f0: 65 6e 65 64 20 75 73 69 6e 67 20 63 75 72 73 6f  ened using curso
5600: 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  r 0..*/.void sql
5610: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
5620: 62 6c 65 28 50 61 72 73 65 20 2a 70 2c 20 69 6e  ble(Parse *p, in
5630: 74 20 69 44 62 29 7b 0a 20 20 56 64 62 65 20 2a  t iDb){.  Vdbe *
5640: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
5650: 62 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  be(p);.  sqlite3
5660: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 44 62  TableLock(p, iDb
5670: 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 31  , MASTER_ROOT, 1
5680: 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
5690: 44 62 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  Db));.  sqlite3V
56a0: 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20  dbeAddOp4Int(v, 
56b0: 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c 20 30 2c  OP_OpenWrite, 0,
56c0: 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20 69 44   MASTER_ROOT, iD
56d0: 62 2c 20 35 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, 5);.  if( p->
56e0: 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nTab==0 ){.    p
56f0: 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20 20 7d 0a  ->nTab = 1;.  }.
5700: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
5710: 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e 74 73 20  er zName points 
5720: 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  to a nul-termina
5730: 74 65 64 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ted buffer conta
5740: 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 0a 2a  ining the name.*
5750: 2a 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  * of a database 
5760: 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
5770: 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  or the name of a
5780: 6e 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20  n attached db). 
5790: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
57a0: 20 72 65 74 75 72 6e 73 20 74 68 65 20 69 6e 64   returns the ind
57b0: 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20  ex of the named 
57c0: 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e  database in db->
57d0: 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20 2d 31 20  aDb[], or.** -1 
57e0: 69 66 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20  if the named db 
57f0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
5800: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
5810: 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c 69 74 65  indDbName(sqlite
5820: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
5830: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  r *zName){.  int
5840: 20 69 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20   i = -1;        
5850: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 75 6d   /* Database num
5860: 62 65 72 20 2a 2f 0a 20 20 69 66 28 20 7a 4e 61  ber */.  if( zNa
5870: 6d 65 20 29 7b 0a 20 20 20 20 44 62 20 2a 70 44  me ){.    Db *pD
5880: 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  b;.    int n = s
5890: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
58a0: 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 69  Name);.    for(i
58b0: 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c 20 70 44  =(db->nDb-1), pD
58c0: 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 20 69  b=&db->aDb[i]; i
58d0: 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62 2d 2d 29  >=0; i--, pDb--)
58e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 28 21 4f 4d  {.      if( (!OM
58f0: 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20 69 21 3d  IT_TEMPDB || i!=
5900: 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c 69 74 65  1 ) && n==sqlite
5910: 33 53 74 72 6c 65 6e 33 30 28 70 44 62 2d 3e 7a  3Strlen30(pDb->z
5920: 4e 61 6d 65 29 20 26 26 20 0a 20 20 20 20 20 20  Name) && .      
5930: 20 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 53 74      0==sqlite3St
5940: 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e 61 6d 65  rICmp(pDb->zName
5950: 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20  , zName) ){.    
5960: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5970: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5980: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn i;.}../*.*
5990: 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a 70 4e 61  * The token *pNa
59a0: 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  me contains the 
59b0: 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61  name of a databa
59c0: 73 65 20 28 65 69 74 68 65 72 20 22 6d 61 69 6e  se (either "main
59d0: 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70 22 20 6f  " or.** "temp" o
59e0: 72 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  r the name of an
59f0: 20 61 74 74 61 63 68 65 64 20 64 62 29 2e 20 54   attached db). T
5a00: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
5a10: 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78  rns the.** index
5a20: 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 64 61   of the named da
5a30: 74 61 62 61 73 65 20 69 6e 20 64 62 2d 3e 61 44  tabase in db->aD
5a40: 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66 20 74 68  b[], or -1 if th
5a50: 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a 2a 20 64  e named db .** d
5a60: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  oes not exist..*
5a70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69 6e  /.int sqlite3Fin
5a80: 64 44 62 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  dDb(sqlite3 *db,
5a90: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
5aa0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ac0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
5ad0: 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63  se number */.  c
5ae0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
5af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b00: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77 65 20 61      /* Name we a
5b10: 72 65 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72  re searching for
5b20: 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d 20 73 71   */.  zName = sq
5b30: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
5b40: 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20  en(db, pName);. 
5b50: 20 69 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64   i = sqlite3Find
5b60: 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e 61 6d 65  DbName(db, zName
5b70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
5b80: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ee(db, zName);. 
5b90: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a   return i;.}../*
5ba0: 20 54 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   The table or vi
5bb0: 65 77 20 6f 72 20 74 72 69 67 67 65 72 20 6e 61  ew or trigger na
5bc0: 6d 65 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  me is passed to 
5bd0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69 61  this routine via
5be0: 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e 61 6d 65   tokens.** pName
5bf0: 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e 20 49 66  1 and pName2. If
5c00: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5c10: 77 61 73 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  was fully qualif
5c20: 69 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ied, for example
5c30: 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54  :.**.** CREATE T
5c40: 41 42 4c 45 20 78 78 78 2e 79 79 79 20 28 2e 2e  ABLE xxx.yyy (..
5c50: 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68 65 6e 20  .);.** .** Then 
5c60: 70 4e 61 6d 65 31 20 69 73 20 73 65 74 20 74 6f  pName1 is set to
5c70: 20 22 78 78 78 22 20 61 6e 64 20 70 4e 61 6d 65   "xxx" and pName
5c80: 32 20 22 79 79 79 22 2e 20 4f 6e 20 74 68 65 20  2 "yyy". On the 
5c90: 6f 74 68 65 72 20 68 61 6e 64 20 69 66 0a 2a 2a  other hand if.**
5ca0: 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
5cb0: 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20 71 75 61  is not fully qua
5cc0: 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a 0a 2a 2a  lified, i.e.:.**
5cd0: 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45  .** CREATE TABLE
5ce0: 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a 0a 2a 2a   yyy(...);.**.**
5cf0: 20 54 68 65 6e 20 70 4e 61 6d 65 31 20 69 73 20   Then pName1 is 
5d00: 73 65 74 20 74 6f 20 22 79 79 79 22 20 61 6e 64  set to "yyy" and
5d10: 20 70 4e 61 6d 65 32 20 69 73 20 22 22 2e 0a 2a   pName2 is ""..*
5d20: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5d30: 65 20 73 65 74 73 20 74 68 65 20 2a 70 70 55 6e  e sets the *ppUn
5d40: 71 75 61 6c 20 70 6f 69 6e 74 65 72 20 74 6f 20  qual pointer to 
5d50: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 74 6f 6b  point at the tok
5d60: 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72 0a 2a 2a  en (pName1 or.**
5d70: 20 70 4e 61 6d 65 32 29 20 74 68 61 74 20 73 74   pName2) that st
5d80: 6f 72 65 73 20 74 68 65 20 75 6e 71 75 61 6c 69  ores the unquali
5d90: 66 69 65 64 20 74 61 62 6c 65 20 6e 61 6d 65 2e  fied table name.
5da0: 20 20 54 68 65 20 69 6e 64 65 78 20 6f 66 20 74    The index of t
5db0: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 22  he.** database "
5dc0: 78 78 78 22 20 69 73 20 72 65 74 75 72 6e 65 64  xxx" is returned
5dd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5de0: 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a 20 20 50  TwoPartName(.  P
5df0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5e00: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
5e10: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
5e20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
5e30: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20  oken *pName1,   
5e40: 20 20 20 2f 2a 20 54 68 65 20 22 78 78 78 22 20     /* The "xxx" 
5e50: 69 6e 20 74 68 65 20 6e 61 6d 65 20 22 78 78 78  in the name "xxx
5e60: 2e 79 79 79 22 20 6f 72 20 22 78 78 78 22 20 2a  .yyy" or "xxx" *
5e70: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
5e80: 32 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22  2,      /* The "
5e90: 79 79 79 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  yyy" in the name
5ea0: 20 22 78 78 78 2e 79 79 79 22 20 2a 2f 0a 20 20   "xxx.yyy" */.  
5eb0: 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75 61 6c 20  Token **pUnqual 
5ec0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
5ed0: 20 75 6e 71 75 61 6c 69 66 69 65 64 20 6f 62 6a   unqualified obj
5ee0: 65 63 74 20 6e 61 6d 65 20 68 65 72 65 20 2a 2f  ect name here */
5ef0: 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20  .){.  int iDb;  
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f10: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
5f20: 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a 65 63 74  lding the object
5f30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
5f40: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
5f50: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
5f60: 32 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4e  2!=0 );.  if( pN
5f70: 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  ame2->n>0 ){.   
5f80: 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75   if( db->init.bu
5f90: 73 79 20 29 20 7b 0a 20 20 20 20 20 20 73 71 6c  sy ) {.      sql
5fa0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5fb0: 72 73 65 2c 20 22 63 6f 72 72 75 70 74 20 64 61  rse, "corrupt da
5fc0: 74 61 62 61 73 65 22 29 3b 0a 20 20 20 20 20 20  tabase");.      
5fd0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
5fe0: 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c 20 3d 20  .    *pUnqual = 
5ff0: 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69 44 62 20  pName2;.    iDb 
6000: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 28  = sqlite3FindDb(
6010: 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20  db, pName1);.   
6020: 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20   if( iDb<0 ){.  
6030: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6040: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
6050: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 20 25 54  nown database %T
6060: 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  ", pName1);.    
6070: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
6080: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
6090: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
60a0: 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62 2d 3e 69  .iDb==0 || db->i
60b0: 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20 20 20 20  nit.busy );.    
60c0: 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 69  iDb = db->init.i
60d0: 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c  Db;.    *pUnqual
60e0: 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20 7d 0a 20   = pName1;.  }. 
60f0: 20 72 65 74 75 72 6e 20 69 44 62 3b 0a 7d 0a 0a   return iDb;.}..
6100: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
6110: 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 63 68  ne is used to ch
6120: 65 63 6b 20 69 66 20 74 68 65 20 55 54 46 2d 38  eck if the UTF-8
6130: 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65 20 69 73   string zName is
6140: 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75 6e 71 75   a legal.** unqu
6150: 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 66 6f 72  alified name for
6160: 20 61 20 6e 65 77 20 73 63 68 65 6d 61 20 6f 62   a new schema ob
6170: 6a 65 63 74 20 28 74 61 62 6c 65 2c 20 69 6e 64  ject (table, ind
6180: 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a 2a 20 74  ex, view or.** t
6190: 72 69 67 67 65 72 29 2e 20 41 6c 6c 20 6e 61 6d  rigger). All nam
61a0: 65 73 20 61 72 65 20 6c 65 67 61 6c 20 65 78 63  es are legal exc
61b0: 65 70 74 20 74 68 6f 73 65 20 74 68 61 74 20 62  ept those that b
61c0: 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 73 74  egin with the st
61d0: 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  ring.** "sqlite_
61e0: 22 20 28 69 6e 20 75 70 70 65 72 2c 20 6c 6f 77  " (in upper, low
61f0: 65 72 20 6f 72 20 6d 69 78 65 64 20 63 61 73 65  er or mixed case
6200: 29 2e 20 54 68 69 73 20 70 6f 72 74 69 6f 6e 20  ). This portion 
6210: 6f 66 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  of the namespace
6220: 0a 2a 2a 20 69 73 20 72 65 73 65 72 76 65 64 20  .** is reserved 
6230: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 75 73 65  for internal use
6240: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6250: 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28  CheckObjectName(
6260: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
6270: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
6280: 29 7b 0a 20 20 69 66 28 20 21 70 50 61 72 73 65  ){.  if( !pParse
6290: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20  ->db->init.busy 
62a0: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
62b0: 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  d==0 .          
62c0: 26 26 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e  && (pParse->db->
62d0: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 57  flags & SQLITE_W
62e0: 72 69 74 65 53 63 68 65 6d 61 29 3d 3d 30 0a 20  riteSchema)==0. 
62f0: 20 20 20 20 20 20 20 20 20 26 26 20 30 3d 3d 73           && 0==s
6300: 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a  qlite3StrNICmp(z
6310: 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c  Name, "sqlite_",
6320: 20 37 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   7) ){.    sqlit
6330: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6340: 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61 6d 65 20  e, "object name 
6350: 72 65 73 65 72 76 65 64 20 66 6f 72 20 69 6e 74  reserved for int
6360: 65 72 6e 61 6c 20 75 73 65 3a 20 25 73 22 2c 20  ernal use: %s", 
6370: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
6380: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
6390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
63a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
63b0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 52 49  * Return the PRI
63c0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 20 6f  MARY KEY index o
63d0: 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a 49 6e 64  f a table.*/.Ind
63e0: 65 78 20 2a 73 71 6c 69 74 65 33 50 72 69 6d 61  ex *sqlite3Prima
63f0: 72 79 4b 65 79 49 6e 64 65 78 28 54 61 62 6c 65  ryKeyIndex(Table
6400: 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e 64 65 78   *pTab){.  Index
6410: 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 54 61   *p;.  for(p=pTa
6420: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20 26 26 20  b->pIndex; p && 
6430: 21 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64  !IsPrimaryKeyInd
6440: 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70 4e 65 78  ex(p); p=p->pNex
6450: 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  t){}.  return p;
6460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6470: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 69   the column of i
6480: 6e 64 65 78 20 70 49 64 78 20 74 68 61 74 20 63  ndex pIdx that c
6490: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 61  orresponds to ta
64a0: 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 69 43  ble.** column iC
64b0: 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69  ol.  Return -1 i
64c0: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
64d0: 69 31 36 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d  i16 sqlite3Colum
64e0: 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65 78 20 2a  nOfIndex(Index *
64f0: 70 49 64 78 2c 20 69 31 36 20 69 43 6f 6c 29 7b  pIdx, i16 iCol){
6500: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
6510: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
6520: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
6530: 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64 78 2d 3e  if( iCol==pIdx->
6540: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29 20 72 65  aiColumn[i] ) re
6550: 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65  turn i;.  }.  re
6560: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
6570: 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74 72 75 63  * Begin construc
6580: 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
6590: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
65a0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73  in memory.  This
65b0: 20 69 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   is.** the first
65c0: 20 6f 66 20 73 65 76 65 72 61 6c 20 61 63 74 69   of several acti
65d0: 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74 68 61 74  on routines that
65e0: 20 67 65 74 20 63 61 6c 6c 65 64 20 69 6e 20 72   get called in r
65f0: 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f 20 61 20  esponse.** to a 
6600: 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61  CREATE TABLE sta
6610: 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70 61 72 74  tement.  In part
6620: 69 63 75 6c 61 72 2c 20 74 68 69 73 20 72 6f 75  icular, this rou
6630: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 0a 2a  tine is called.*
6640: 2a 20 61 66 74 65 72 20 73 65 65 69 6e 67 20 74  * after seeing t
6650: 6f 6b 65 6e 73 20 22 43 52 45 41 54 45 22 20 61  okens "CREATE" a
6660: 6e 64 20 22 54 41 42 4c 45 22 20 61 6e 64 20 74  nd "TABLE" and t
6670: 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 20 54  he table name. T
6680: 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20 66 6c 61  he isTemp.** fla
6690: 67 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  g is true if the
66a0: 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65   table should be
66b0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 61   stored in the a
66c0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
66d0: 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73 74 65 61  e.** file instea
66e0: 64 20 6f 66 20 69 6e 20 74 68 65 20 6d 61 69 6e  d of in the main
66f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
6700: 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c   This is normall
6710: 79 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  y the case.** wh
6720: 65 6e 20 74 68 65 20 22 54 45 4d 50 22 20 6f 72  en the "TEMP" or
6730: 20 22 54 45 4d 50 4f 52 41 52 59 22 20 6b 65 79   "TEMPORARY" key
6740: 77 6f 72 64 20 6f 63 63 75 72 73 20 69 6e 20 62  word occurs in b
6750: 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45 41 54 45  etween.** CREATE
6760: 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a 2a 0a 2a   and TABLE..**.*
6770: 2a 20 54 68 65 20 6e 65 77 20 74 61 62 6c 65 20  * The new table 
6780: 72 65 63 6f 72 64 20 69 73 20 69 6e 69 74 69 61  record is initia
6790: 6c 69 7a 65 64 20 61 6e 64 20 70 75 74 20 69 6e  lized and put in
67a0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
67b0: 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72 65 20 6f  le..** As more o
67c0: 66 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42  f the CREATE TAB
67d0: 4c 45 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  LE statement is 
67e0: 70 61 72 73 65 64 2c 20 61 64 64 69 74 69 6f 6e  parsed, addition
67f0: 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20 72 6f 75  al action.** rou
6800: 74 69 6e 65 73 20 77 69 6c 6c 20 62 65 20 63 61  tines will be ca
6810: 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d 6f 72 65  lled to add more
6820: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20   information to 
6830: 74 68 69 73 20 72 65 63 6f 72 64 2e 0a 2a 2a 20  this record..** 
6840: 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  At the end of th
6850: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
6860: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 73 71  tatement, the sq
6870: 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28 29 20  lite3EndTable() 
6880: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
6890: 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
68a0: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 69 6f   the constructio
68b0: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  n of the new tab
68c0: 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f 0a 76 6f  le record..*/.vo
68d0: 69 64 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  id sqlite3StartT
68e0: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
68f0: 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73  Parse,   /* Pars
6900: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6910: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20  Token *pName1,  
6920: 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
6930: 66 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  f the name of th
6940: 65 20 74 61 62 6c 65 20 6f 72 20 76 69 65 77 20  e table or view 
6950: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
6960: 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20  e2,   /* Second 
6970: 70 61 72 74 20 6f 66 20 74 68 65 20 6e 61 6d 65  part of the name
6980: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72   of the table or
6990: 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74 20 69   view */.  int i
69a0: 73 54 65 6d 70 2c 20 20 20 20 20 20 2f 2a 20 54  sTemp,      /* T
69b0: 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
69c0: 20 54 45 4d 50 20 74 61 62 6c 65 20 2a 2f 0a 20   TEMP table */. 
69d0: 20 69 6e 74 20 69 73 56 69 65 77 2c 20 20 20 20   int isView,    
69e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
69f0: 73 20 69 73 20 61 20 56 49 45 57 20 2a 2f 0a 20  s is a VIEW */. 
6a00: 20 69 6e 74 20 69 73 56 69 72 74 75 61 6c 2c 20   int isVirtual, 
6a10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
6a20: 73 20 69 73 20 61 20 56 49 52 54 55 41 4c 20 74  s is a VIRTUAL t
6a30: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  able */.  int no
6a40: 45 72 72 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  Err        /* Do
6a50: 20 6e 6f 74 68 69 6e 67 20 69 66 20 74 61 62 6c   nothing if tabl
6a60: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
6a70: 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a   */.){.  Table *
6a80: 70 54 61 62 6c 65 3b 0a 20 20 63 68 61 72 20 2a  pTable;.  char *
6a90: 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 54 68  zName = 0; /* Th
6aa0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6e 65  e name of the ne
6ab0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c  w table */.  sql
6ac0: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
6ad0: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
6ae0: 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20  ;.  int iDb;    
6af0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
6b00: 20 6e 75 6d 62 65 72 20 74 6f 20 63 72 65 61 74   number to creat
6b10: 65 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 2a  e the table in *
6b20: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  /.  Token *pName
6b30: 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61 6c 69 66  ;    /* Unqualif
6b40: 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  ied name of the 
6b50: 74 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20  table to create 
6b60: 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e  */..  if( db->in
6b70: 69 74 2e 62 75 73 79 20 26 26 20 64 62 2d 3e 69  it.busy && db->i
6b80: 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d 31 20 29  nit.newTnum==1 )
6b90: 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c  {.    /* Special
6ba0: 20 63 61 73 65 3a 20 20 50 61 72 73 69 6e 67 20   case:  Parsing 
6bb0: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
6bc0: 72 20 6f 72 20 73 71 6c 69 74 65 5f 74 65 6d 70  r or sqlite_temp
6bd0: 5f 6d 61 73 74 65 72 20 73 63 68 65 6d 61 20 2a  _master schema *
6be0: 2f 0a 20 20 20 20 69 44 62 20 3d 20 64 62 2d 3e  /.    iDb = db->
6bf0: 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20 20 7a 4e  init.iDb;.    zN
6c00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
6c10: 74 72 44 75 70 28 64 62 2c 20 53 43 48 45 4d 41  trDup(db, SCHEMA
6c20: 5f 54 41 42 4c 45 28 69 44 62 29 29 3b 0a 20 20  _TABLE(iDb));.  
6c30: 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61 6d 65 31    pName = pName1
6c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
6c50: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
6c60: 65 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 73  e */.    iDb = s
6c70: 71 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d  qlite3TwoPartNam
6c80: 65 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31  e(pParse, pName1
6c90: 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65  , pName2, &pName
6ca0: 29 3b 0a 20 20 20 20 69 66 28 20 69 44 62 3c 30  );.    if( iDb<0
6cb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 69   ) return;.    i
6cc0: 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20  f( !OMIT_TEMPDB 
6cd0: 26 26 20 69 73 54 65 6d 70 20 26 26 20 70 4e 61  && isTemp && pNa
6ce0: 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69 44 62 21  me2->n>0 && iDb!
6cf0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =1 ){.      /* I
6d00: 66 20 63 72 65 61 74 69 6e 67 20 61 20 74 65 6d  f creating a tem
6d10: 70 20 74 61 62 6c 65 2c 20 74 68 65 20 6e 61 6d  p table, the nam
6d20: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 71 75 61  e may not be qua
6d30: 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 20 0a  lified. Unless .
6d40: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
6d50: 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 22 74  abase name is "t
6d60: 65 6d 70 22 20 61 6e 79 77 61 79 2e 20 20 2a 2f  emp" anyway.  */
6d70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6d80: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6d90: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
6da0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 75 6e 71  name must be unq
6db0: 75 61 6c 69 66 69 65 64 22 29 3b 0a 20 20 20 20  ualified");.    
6dc0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
6dd0: 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45      if( !OMIT_TE
6de0: 4d 50 44 42 20 26 26 20 69 73 54 65 6d 70 20 29  MPDB && isTemp )
6df0: 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 7a 4e   iDb = 1;.    zN
6e00: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
6e10: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
6e20: 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Name);.  }.  pPa
6e30: 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 20  rse->sNameToken 
6e40: 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69 66 28 20  = *pName;.  if( 
6e50: 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  zName==0 ) retur
6e60: 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  n;.  if( SQLITE_
6e70: 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68 65 63 6b  OK!=sqlite3Check
6e80: 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50 61 72 73  ObjectName(pPars
6e90: 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20 20 20  e, zName) ){.   
6ea0: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
6eb0: 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 69  e_error;.  }.  i
6ec0: 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69 44 62 3d  f( db->init.iDb=
6ed0: 3d 31 20 29 20 69 73 54 65 6d 70 20 3d 20 31 3b  =1 ) isTemp = 1;
6ee0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6ef0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
6f00: 4f 4e 0a 20 20 61 73 73 65 72 74 28 20 69 73 54  ON.  assert( isT
6f10: 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70  emp==0 || isTemp
6f20: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
6f30: 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c 20 69 73   isView==0 || is
6f40: 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20 7b 0a 20  View==1 );.  {. 
6f50: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
6f60: 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20 7b 0a 20  u8 aCode[] = {. 
6f70: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
6f80: 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20 20 20 20  ATE_TABLE,.     
6f90: 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f    SQLITE_CREATE_
6fa0: 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20 20 20 20  TEMP_TABLE,.    
6fb0: 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45     SQLITE_CREATE
6fc0: 5f 56 49 45 57 2c 0a 20 20 20 20 20 20 20 53 51  _VIEW,.       SQ
6fd0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
6fe0: 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a 20 20 20  _VIEW.    };.   
6ff0: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 64 62 2d   char *zDb = db-
7000: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 3b  >aDb[iDb].zName;
7010: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
7020: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
7030: 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c  , SQLITE_INSERT,
7040: 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 73   SCHEMA_TABLE(is
7050: 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62 29 20 29  Temp), 0, zDb) )
7060: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 65 67  {.      goto beg
7070: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
7080: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 69      }.    if( !i
7090: 73 56 69 72 74 75 61 6c 20 26 26 20 73 71 6c 69  sVirtual && sqli
70a0: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
70b0: 72 73 65 2c 20 28 69 6e 74 29 61 43 6f 64 65 5b  rse, (int)aCode[
70c0: 69 73 54 65 6d 70 2b 32 2a 69 73 56 69 65 77 5d  isTemp+2*isView]
70d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 2c 20           zName, 
7100: 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  0, zDb) ){.     
7110: 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c   goto begin_tabl
7120: 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
7130: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
7140: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6e 65  Make sure the ne
7150: 77 20 74 61 62 6c 65 20 6e 61 6d 65 20 64 6f 65  w table name doe
7160: 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65 20 77 69  s not collide wi
7170: 74 68 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  th an existing. 
7180: 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74 61 62   ** index or tab
7190: 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  le name in the s
71a0: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
71b0: 73 73 75 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  ssue an error me
71c0: 73 73 61 67 65 20 69 66 0a 20 20 2a 2a 20 69 74  ssage if.  ** it
71d0: 20 64 6f 65 73 2e 20 54 68 65 20 65 78 63 65 70   does. The excep
71e0: 74 69 6f 6e 20 69 73 20 69 66 20 74 68 65 20 73  tion is if the s
71f0: 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 70  tatement being p
7200: 61 72 73 65 64 20 77 61 73 20 70 61 73 73 65 64  arsed was passed
7210: 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73 71 6c 69  .  ** to an sqli
7220: 74 65 33 5f 64 65 63 6c 61 72 65 5f 76 74 61 62  te3_declare_vtab
7230: 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74 68 61 74  () call. In that
7240: 20 63 61 73 65 20 6f 6e 6c 79 20 74 68 65 20 63   case only the c
7250: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20 20 2a 2a  olumn names.  **
7260: 20 61 6e 64 20 74 79 70 65 73 20 77 69 6c 6c 20   and types will 
7270: 62 65 20 75 73 65 64 2c 20 73 6f 20 74 68 65 72  be used, so ther
7280: 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
7290: 74 65 73 74 20 66 6f 72 20 6e 61 6d 65 73 70 61  test for namespa
72a0: 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69 73 69 6f  ce.  ** collisio
72b0: 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  ns..  */.  if( !
72c0: 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41 42 20  IN_DECLARE_VTAB 
72d0: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 44 62  ){.    char *zDb
72e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
72f0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 53  zName;.    if( S
7300: 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
7310: 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
7320: 73 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  se) ){.      got
7330: 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72  o begin_table_er
7340: 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ror;.    }.    p
7350: 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 46  Table = sqlite3F
7360: 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 4e 61  indTable(db, zNa
7370: 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66  me, zDb);.    if
7380: 28 20 70 54 61 62 6c 65 20 29 7b 0a 20 20 20 20  ( pTable ){.    
7390: 20 20 69 66 28 20 21 6e 6f 45 72 72 20 29 7b 0a    if( !noErr ){.
73a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
73b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
73c0: 22 74 61 62 6c 65 20 25 54 20 61 6c 72 65 61 64  "table %T alread
73d0: 79 20 65 78 69 73 74 73 22 2c 20 70 4e 61 6d 65  y exists", pName
73e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
73f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7400: 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c  !db->init.busy |
7410: 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
7420: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
7430: 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
7440: 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
7450: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
7460: 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72   begin_table_err
7470: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
7480: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 64  ( sqlite3FindInd
7490: 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  ex(db, zName, zD
74a0: 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  b)!=0 ){.      s
74b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
74c0: 50 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73  Parse, "there is
74d0: 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e 64 65   already an inde
74e0: 78 20 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61  x named %s", zNa
74f0: 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
7500: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
7510: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
7520: 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  pTable = sqlite3
7530: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
7540: 20 73 69 7a 65 6f 66 28 54 61 62 6c 65 29 29 3b   sizeof(Table));
7550: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 3d 3d 30  .  if( pTable==0
7560: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c   ){.    db->mall
7570: 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
7580: 20 20 70 50 61 72 73 65 2d 3e 72 63 20 3d 20 53    pParse->rc = S
7590: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
75a0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
75b0: 0a 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f  .    goto begin_
75c0: 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d  table_error;.  }
75d0: 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65  .  pTable->zName
75e0: 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62   = zName;.  pTab
75f0: 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  le->iPKey = -1;.
7600: 20 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d    pTable->pSchem
7610: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  a = db->aDb[iDb]
7620: 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 54 61 62  .pSchema;.  pTab
7630: 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  le->nRef = 1;.  
7640: 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
7650: 73 74 20 3d 20 32 30 30 3b 20 61 73 73 65 72 74  st = 200; assert
7660: 28 20 32 30 30 3d 3d 73 71 6c 69 74 65 33 4c 6f  ( 200==sqlite3Lo
7670: 67 45 73 74 28 31 30 34 38 35 37 36 29 20 29 3b  gEst(1048576) );
7680: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
7690: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 30 20  e->pNewTable==0 
76a0: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 70 4e 65  );.  pParse->pNe
76b0: 77 54 61 62 6c 65 20 3d 20 70 54 61 62 6c 65 3b  wTable = pTable;
76c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
76d0: 73 20 74 68 65 20 6d 61 67 69 63 20 73 71 6c 69  s the magic sqli
76e0: 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
76f0: 65 20 75 73 65 64 20 62 79 20 61 75 74 6f 69 6e  e used by autoin
7700: 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a 20 74 68  crement,.  ** th
7710: 65 6e 20 72 65 63 6f 72 64 20 61 20 70 6f 69 6e  en record a poin
7720: 74 65 72 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ter to this tabl
7730: 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61  e in the main da
7740: 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
7750: 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 49 4e  .  ** so that IN
7760: 53 45 52 54 20 63 61 6e 20 66 69 6e 64 20 74 68  SERT can find th
7770: 65 20 74 61 62 6c 65 20 65 61 73 69 6c 79 2e 0a  e table easily..
7780: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
7790: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43  ITE_OMIT_AUTOINC
77a0: 52 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  REMENT.  if( !pP
77b0: 61 72 73 65 2d 3e 6e 65 73 74 65 64 20 26 26 20  arse->nested && 
77c0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 22 73  strcmp(zName, "s
77d0: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29  qlite_sequence")
77e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
77f0: 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
7800: 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
7810: 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 54 61  b, 0) );.    pTa
7820: 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  ble->pSchema->pS
7830: 65 71 54 61 62 20 3d 20 70 54 61 62 6c 65 3b 0a  eqTab = pTable;.
7840: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
7850: 20 42 65 67 69 6e 20 67 65 6e 65 72 61 74 69 6e   Begin generatin
7860: 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  g the code that 
7870: 77 69 6c 6c 20 69 6e 73 65 72 74 20 74 68 65 20  will insert the 
7880: 74 61 62 6c 65 20 72 65 63 6f 72 64 20 69 6e 74  table record int
7890: 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54  o.  ** the SQLIT
78a0: 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20  E_MASTER table. 
78b0: 20 4e 6f 74 65 20 69 6e 20 70 61 72 74 69 63 75   Note in particu
78c0: 6c 61 72 20 74 68 61 74 20 77 65 20 6d 75 73 74  lar that we must
78d0: 20 67 6f 20 61 68 65 61 64 0a 20 20 2a 2a 20 61   go ahead.  ** a
78e0: 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  nd allocate the 
78f0: 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f  record number fo
7900: 72 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74 72  r the table entr
7910: 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72 65 20 61  y now.  Before a
7920: 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41 52 59 20  ny.  ** PRIMARY 
7930: 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20 6b 65  KEY or UNIQUE ke
7940: 79 77 6f 72 64 73 20 61 72 65 20 70 61 72 73 65  ywords are parse
7950: 64 2e 20 20 54 68 6f 73 65 20 6b 65 79 77 6f 72  d.  Those keywor
7960: 64 73 20 77 69 6c 6c 20 63 61 75 73 65 0a 20 20  ds will cause.  
7970: 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 62 65  ** indices to be
7980: 20 63 72 65 61 74 65 64 20 61 6e 64 20 74 68 65   created and the
7990: 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6d 75   table record mu
79a0: 73 74 20 63 6f 6d 65 20 62 65 66 6f 72 65 20 74  st come before t
79b0: 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73  he .  ** indices
79c0: 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20 72 65  .  Hence, the re
79d0: 63 6f 72 64 20 6e 75 6d 62 65 72 20 66 6f 72 20  cord number for 
79e0: 74 68 65 20 74 61 62 6c 65 20 6d 75 73 74 20 62  the table must b
79f0: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 2a 2a  e allocated.  **
7a00: 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   now..  */.  if(
7a10: 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20   !db->init.busy 
7a20: 26 26 20 28 76 20 3d 20 73 71 6c 69 74 65 33 47  && (v = sqlite3G
7a30: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 29 21  etVdbe(pParse))!
7a40: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 64  =0 ){.    int ad
7a50: 64 72 31 3b 0a 20 20 20 20 69 6e 74 20 66 69 6c  dr1;.    int fil
7a60: 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20 69 6e 74  eFormat;.    int
7a70: 20 72 65 67 31 2c 20 72 65 67 32 2c 20 72 65 67   reg1, reg2, reg
7a80: 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c 6c 52 6f  3;.    /* nullRo
7a90: 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f 52 65 63  w[] is an OP_Rec
7aa0: 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  ord encoding of 
7ab0: 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e 69 6e 67  a row containing
7ac0: 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20 20 20 20   5 NULLs */.    
7ad0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7ae0: 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d 20 7b 20  r nullRow[] = { 
7af0: 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  6, 0, 0, 0, 0, 0
7b00: 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   };.    sqlite3B
7b10: 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
7b20: 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
7b30: 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  b);..#ifndef SQL
7b40: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
7b50: 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 69 73  TABLE.    if( is
7b60: 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20 20 20  Virtual ){.     
7b70: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7b80: 70 30 28 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29  p0(v, OP_VBegin)
7b90: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
7ba0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
7bb0: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 65 6e  le format and en
7bc0: 63 6f 64 69 6e 67 20 69 6e 20 74 68 65 20 64 61  coding in the da
7bd0: 74 61 62 61 73 65 20 68 61 76 65 20 6e 6f 74 20  tabase have not 
7be0: 62 65 65 6e 20 73 65 74 2c 20 0a 20 20 20 20 2a  been set, .    *
7bf0: 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f 77 2e 0a  * set them now..
7c00: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67 31 20      */.    reg1 
7c10: 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77  = pParse->regRow
7c20: 69 64 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  id = ++pParse->n
7c30: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32 20 3d 20  Mem;.    reg2 = 
7c40: 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 20  pParse->regRoot 
7c50: 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
7c60: 3b 0a 20 20 20 20 72 65 67 33 20 3d 20 2b 2b 70  ;.    reg3 = ++p
7c70: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
7c80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7c90: 70 33 28 76 2c 20 4f 50 5f 52 65 61 64 43 6f 6f  p3(v, OP_ReadCoo
7ca0: 6b 69 65 2c 20 69 44 62 2c 20 72 65 67 33 2c 20  kie, iDb, reg3, 
7cb0: 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d 41  BTREE_FILE_FORMA
7cc0: 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  T);.    sqlite3V
7cd0: 64 62 65 55 73 65 73 42 74 72 65 65 28 76 2c 20  dbeUsesBtree(v, 
7ce0: 69 44 62 29 3b 0a 20 20 20 20 61 64 64 72 31 20  iDb);.    addr1 
7cf0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
7d00: 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c 20 72 65  Op1(v, OP_If, re
7d10: 67 33 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  g3); VdbeCoverag
7d20: 65 28 76 29 3b 0a 20 20 20 20 66 69 6c 65 46 6f  e(v);.    fileFo
7d30: 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66 6c 61 67  rmat = (db->flag
7d40: 73 20 26 20 53 51 4c 49 54 45 5f 4c 65 67 61 63  s & SQLITE_Legac
7d50: 79 46 69 6c 65 46 6d 74 29 21 3d 30 20 3f 0a 20  yFileFmt)!=0 ?. 
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d70: 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d 41 58 5f   1 : SQLITE_MAX_
7d80: 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a 20 20 20  FILE_FORMAT;.   
7d90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7da0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
7db0: 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c 20 72 65  , fileFormat, re
7dc0: 67 33 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  g3);.    sqlite3
7dd0: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
7de0: 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c  _SetCookie, iDb,
7df0: 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f 52 4d   BTREE_FILE_FORM
7e00: 41 54 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  AT, reg3);.    s
7e10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
7e20: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
7e30: 45 4e 43 28 64 62 29 2c 20 72 65 67 33 29 3b 0a  ENC(db), reg3);.
7e40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7e50: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43  ddOp3(v, OP_SetC
7e60: 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45  ookie, iDb, BTRE
7e70: 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49 4e 47 2c  E_TEXT_ENCODING,
7e80: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7e90: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
7ea0: 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20 20 20 20  v, addr1);..    
7eb0: 2f 2a 20 54 68 69 73 20 6a 75 73 74 20 63 72 65  /* This just cre
7ec0: 61 74 65 73 20 61 20 70 6c 61 63 65 2d 68 6f 6c  ates a place-hol
7ed0: 64 65 72 20 72 65 63 6f 72 64 20 69 6e 20 74 68  der record in th
7ee0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
7ef0: 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 54 68  table..    ** Th
7f00: 65 20 72 65 63 6f 72 64 20 63 72 65 61 74 65 64  e record created
7f10: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
7f20: 6e 20 61 6e 79 74 68 69 6e 67 20 79 65 74 2e 20  n anything yet. 
7f30: 20 49 74 20 77 69 6c 6c 20 62 65 20 72 65 70 6c   It will be repl
7f40: 61 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74  aced.    ** by t
7f50: 68 65 20 72 65 61 6c 20 65 6e 74 72 79 20 69 6e  he real entry in
7f60: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
7f70: 61 74 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  at sqlite3EndTab
7f80: 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  le()..    **.   
7f90: 20 2a 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f   ** The rowid fo
7fa0: 72 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  r the new entry 
7fb0: 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67 69 73  is left in regis
7fc0: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
7fd0: 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20 54 68 65  owid..    ** The
7fe0: 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65   root page numbe
7ff0: 72 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62  r of the new tab
8000: 6c 65 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  le is left in re
8010: 67 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f  g pParse->regRoo
8020: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 6f  t..    ** The ro
8030: 77 69 64 20 61 6e 64 20 72 6f 6f 74 20 70 61 67  wid and root pag
8040: 65 20 6e 75 6d 62 65 72 20 76 61 6c 75 65 73 20  e number values 
8050: 61 72 65 20 6e 65 65 64 65 64 20 62 79 20 74 68  are needed by th
8060: 65 20 63 6f 64 65 20 74 68 61 74 0a 20 20 20 20  e code that.    
8070: 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62  ** sqlite3EndTab
8080: 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  le will generate
8090: 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20 21 64 65  ..    */.#if !de
80a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
80b0: 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66 69  T_VIEW) || !defi
80c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
80d0: 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 20 20  VIRTUALTABLE).  
80e0: 20 20 69 66 28 20 69 73 56 69 65 77 20 7c 7c 20    if( isView || 
80f0: 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20 20  isVirtual ){.   
8100: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8110: 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
8120: 65 72 2c 20 30 2c 20 72 65 67 32 29 3b 0a 20 20  er, 0, reg2);.  
8130: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
8140: 20 20 20 7b 0a 20 20 20 20 20 20 70 50 61 72 73     {.      pPars
8150: 65 2d 3e 61 64 64 72 43 72 54 61 62 20 3d 20 73  e->addrCrTab = s
8160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
8170: 28 76 2c 20 4f 50 5f 43 72 65 61 74 65 54 61 62  (v, OP_CreateTab
8180: 6c 65 2c 20 69 44 62 2c 20 72 65 67 32 29 3b 0a  le, iDb, reg2);.
8190: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
81a0: 33 4f 70 65 6e 4d 61 73 74 65 72 54 61 62 6c 65  3OpenMasterTable
81b0: 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
81c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
81d0: 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f  dOp2(v, OP_NewRo
81e0: 77 69 64 2c 20 30 2c 20 72 65 67 31 29 3b 0a 20  wid, 0, reg1);. 
81f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8200: 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c 6f 62 2c  dOp4(v, OP_Blob,
8210: 20 36 2c 20 72 65 67 33 2c 20 30 2c 20 6e 75 6c   6, reg3, 0, nul
8220: 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54 49 43 29  lRow, P4_STATIC)
8230: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8240: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
8250: 73 65 72 74 2c 20 30 2c 20 72 65 67 33 2c 20 72  sert, 0, reg3, r
8260: 65 67 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  eg1);.    sqlite
8270: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
8280: 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e 44 29 3b   OPFLAG_APPEND);
8290: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
82a0: 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 43 6c 6f  AddOp0(v, OP_Clo
82b0: 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  se);.  }..  /* N
82c0: 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72 72 6f 72  ormal (non-error
82d0: 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 72  ) return. */.  r
82e0: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
82f0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
8300: 20 77 65 20 6a 75 6d 70 20 68 65 72 65 20 2a 2f   we jump here */
8310: 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72  .begin_table_err
8320: 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  or:.  sqlite3DbF
8330: 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  ree(db, zName);.
8340: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
8350: 53 65 74 20 70 72 6f 70 65 72 74 69 65 73 20 6f  Set properties o
8360: 66 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  f a table column
8370: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 28 6d   based on the (m
8380: 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61 6d 65 20  agical).** name 
8390: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  of the column..*
83a0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
83b0: 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f 4c 55 4d  BLE_HIDDEN_COLUM
83c0: 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  NS.void sqlite3C
83d0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
83e0: 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65 20 2a 70  romName(Table *p
83f0: 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  Tab, Column *pCo
8400: 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l){.  if( sqlite
8410: 33 5f 73 74 72 6e 69 63 6d 70 28 70 43 6f 6c 2d  3_strnicmp(pCol-
8420: 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69 64 64 65  >zName, "__hidde
8430: 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  n__", 10)==0 ){.
8440: 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61      pCol->colFla
8450: 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f 48 49  gs |= COLFLAG_HI
8460: 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DDEN;.  }else if
8470: 28 20 70 54 61 62 20 26 26 20 70 43 6f 6c 21 3d  ( pTab && pCol!=
8480: 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26 20 28 70  pTab->aCol && (p
8490: 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c 61 67 73  Col[-1].colFlags
84a0: 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49 44 44 45   & COLFLAG_HIDDE
84b0: 4e 29 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  N) ){.    pTab->
84c0: 74 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 4f  tabFlags |= TF_O
84d0: 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d 0a 7d 0a  OOHidden;.  }.}.
84e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41  #endif.../*.** A
84f0: 64 64 20 61 20 6e 65 77 20 63 6f 6c 75 6d 6e 20  dd a new column 
8500: 74 6f 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  to the table cur
8510: 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 63 6f 6e  rently being con
8520: 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  structed..**.** 
8530: 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
8540: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e   this routine on
8550: 63 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ce for each colu
8560: 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  mn declaration.*
8570: 2a 20 69 6e 20 61 20 43 52 45 41 54 45 20 54 41  * in a CREATE TA
8580: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
8590: 73 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c  sqlite3StartTabl
85a0: 65 28 29 20 67 65 74 73 20 63 61 6c 6c 65 64 0a  e() gets called.
85b0: 2a 2a 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ** first to get 
85c0: 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e 20 20 54  things going.  T
85d0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
85e0: 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 65   is called for e
85f0: 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a  ach.** column..*
8600: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64  /.void sqlite3Ad
8610: 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65 20 2a 70  dColumn(Parse *p
8620: 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e  Parse, Token *pN
8630: 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70  ame){.  Table *p
8640: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
8650: 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a  r *z;.  Column *
8660: 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74 65 33 20  pCol;.  sqlite3 
8670: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
8680: 3b 0a 20 20 69 66 28 20 28 70 20 3d 20 70 50 61  ;.  if( (p = pPa
8690: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
86a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
86b0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
86c0: 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e 43 6f 6c  MN.  if( p->nCol
86d0: 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  +1>db->aLimit[SQ
86e0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
86f0: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
8700: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8710: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75  , "too many colu
8720: 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70 2d 3e 7a  mns on %s", p->z
8730: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
8740: 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  n;.  }.#endif.  
8750: 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  z = sqlite3NameF
8760: 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61  romToken(db, pNa
8770: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
8780: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8790: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20  i=0; i<p->nCol; 
87a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
87b0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 2c  lite3_stricmp(z,
87c0: 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 4e 61 6d   p->aCol[i].zNam
87d0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  e)==0 ){.      s
87e0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
87f0: 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61 74  Parse, "duplicat
8800: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  e column name: %
8810: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 73 71  s", z);.      sq
8820: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8830: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
8840: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
8850: 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20 30 78 37  ( (p->nCol & 0x7
8860: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 6f 6c 75  )==0 ){.    Colu
8870: 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20 20 61 4e  mn *aNew;.    aN
8880: 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
8890: 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61 43 6f 6c  alloc(db,p->aCol
88a0: 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a 73 69 7a  ,(p->nCol+8)*siz
88b0: 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29  eof(p->aCol[0]))
88c0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d  ;.    if( aNew==
88d0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
88e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 29 3b  e3DbFree(db, z);
88f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
8900: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 43 6f 6c     }.    p->aCol
8910: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 20 20 70   = aNew;.  }.  p
8920: 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70  Col = &p->aCol[p
8930: 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65 6d 73 65  ->nCol];.  memse
8940: 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(pCol, 0, sizeo
8950: 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29 29 3b 0a  f(p->aCol[0]));.
8960: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 20 3d 20    pCol->zName = 
8970: 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43 6f 6c 75  z;.  sqlite3Colu
8980: 6d 6e 50 72 6f 70 65 72 74 69 65 73 46 72 6f 6d  mnPropertiesFrom
8990: 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29 3b 0a 20  Name(p, pCol);. 
89a0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
89b0: 73 20 6e 6f 20 74 79 70 65 20 73 70 65 63 69 66  s no type specif
89c0: 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20 68 61 76  ied, columns hav
89d0: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 66  e the default af
89e0: 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27 42 4c 4f  finity.  ** 'BLO
89f0: 42 27 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  B'. If there is 
8a00: 61 20 74 79 70 65 20 73 70 65 63 69 66 69 65 64  a type specified
8a10: 2c 20 74 68 65 6e 20 73 71 6c 69 74 65 33 41 64  , then sqlite3Ad
8a20: 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29 20 77 69  dColumnType() wi
8a30: 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61 6c 6c 65  ll.  ** be calle
8a40: 64 20 6e 65 78 74 20 74 6f 20 73 65 74 20 70 43  d next to set pC
8a50: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 63 6f 72  ol->affinity cor
8a60: 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 70  rectly..  */.  p
8a70: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  Col->affinity = 
8a80: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b  SQLITE_AFF_BLOB;
8a90: 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73 74 20 3d  .  pCol->szEst =
8aa0: 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c 2b 2b 3b   1;.  p->nCol++;
8ab0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
8ac0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8ad0: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 77   by the parser w
8ae0: 68 69 6c 65 20 69 6e 20 74 68 65 20 6d 69 64 64  hile in the midd
8af0: 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73 69 6e 67  le of.** parsing
8b00: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
8b10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 41 20 22 4e  statement.  A "N
8b20: 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74 72 61  OT NULL" constra
8b30: 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20  int has.** been 
8b40: 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  seen on a column
8b50: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
8b60: 73 65 74 73 20 74 68 65 20 6e 6f 74 4e 75 6c 6c  sets the notNull
8b70: 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74 68 65 20   flag on.** the 
8b80: 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74 6c 79  column currently
8b90: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
8ba0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
8bb0: 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c 6c 28 50  ite3AddNotNull(P
8bc0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e  arse *pParse, in
8bd0: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 54 61  t onError){.  Ta
8be0: 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d 20 70 50  ble *p;.  p = pP
8bf0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
8c00: 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20 4e  .  if( p==0 || N
8c10: 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29 20  EVER(p->nCol<1) 
8c20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 2d 3e 61  ) return;.  p->a
8c30: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 2e 6e  Col[p->nCol-1].n
8c40: 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29 6f 6e 45  otNull = (u8)onE
8c50: 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rror;.}../*.** S
8c60: 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 74  can the column t
8c70: 79 70 65 20 6e 61 6d 65 20 7a 54 79 70 65 20 28  ype name zType (
8c80: 6c 65 6e 67 74 68 20 6e 54 79 70 65 29 20 61 6e  length nType) an
8c90: 64 20 72 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20  d return the.** 
8ca0: 61 73 73 6f 63 69 61 74 65 64 20 61 66 66 69 6e  associated affin
8cb0: 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20  ity type..**.** 
8cc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
8cd0: 73 20 61 20 63 61 73 65 2d 69 6e 64 65 70 65 6e  s a case-indepen
8ce0: 64 65 6e 74 20 73 65 61 72 63 68 20 6f 66 20 7a  dent search of z
8cf0: 54 79 70 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  Type for the .**
8d00: 20 73 75 62 73 74 72 69 6e 67 73 20 69 6e 20 74   substrings in t
8d10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
8d20: 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66 20 74 68  le. If one of th
8d30: 65 20 73 75 62 73 74 72 69 6e 67 73 20 69 73 0a  e substrings is.
8d40: 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65 20 63 6f  ** found, the co
8d50: 72 72 65 73 70 6f 6e 64 69 6e 67 20 61 66 66 69  rresponding affi
8d60: 6e 69 74 79 20 69 73 20 72 65 74 75 72 6e 65 64  nity is returned
8d70: 2e 20 49 66 20 7a 54 79 70 65 20 63 6f 6e 74 61  . If zType conta
8d80: 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  ins.** more than
8d90: 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73   one of the subs
8da0: 74 72 69 6e 67 73 2c 20 65 6e 74 72 69 65 73 20  trings, entries 
8db0: 74 6f 77 61 72 64 20 74 68 65 20 74 6f 70 20 6f  toward the top o
8dc0: 66 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20  f .** the table 
8dd0: 74 61 6b 65 20 70 72 69 6f 72 69 74 79 2e 20 46  take priority. F
8de0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 7a  or example, if z
8df0: 54 79 70 65 20 69 73 20 27 42 4c 4f 42 49 4e 54  Type is 'BLOBINT
8e00: 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46  ', .** SQLITE_AF
8e10: 46 5f 49 4e 54 45 47 45 52 20 69 73 20 72 65 74  F_INTEGER is ret
8e20: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 75 62  urned..**.** Sub
8e30: 73 74 72 69 6e 67 20 20 20 20 20 7c 20 41 66 66  string     | Aff
8e40: 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  inity.** -------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 27 49 4e  ---------.** 'IN
8e70: 54 27 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c  T'         | SQL
8e80: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 0a  ITE_AFF_INTEGER.
8e90: 2a 2a 20 27 43 48 41 52 27 20 20 20 20 20 20 20  ** 'CHAR'       
8ea0: 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   | SQLITE_AFF_TE
8eb0: 58 54 0a 2a 2a 20 27 43 4c 4f 42 27 20 20 20 20  XT.** 'CLOB'    
8ec0: 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46      | SQLITE_AFF
8ed0: 5f 54 45 58 54 0a 2a 2a 20 27 54 45 58 54 27 20  _TEXT.** 'TEXT' 
8ee0: 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
8ef0: 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27 42 4c 4f  AFF_TEXT.** 'BLO
8f00: 42 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  B'        | SQLI
8f10: 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a 2a 20 27  TE_AFF_BLOB.** '
8f20: 52 45 41 4c 27 20 20 20 20 20 20 20 20 7c 20 53  REAL'        | S
8f30: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 0a 2a  QLITE_AFF_REAL.*
8f40: 2a 20 27 46 4c 4f 41 27 20 20 20 20 20 20 20 20  * 'FLOA'        
8f50: 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  | SQLITE_AFF_REA
8f60: 4c 0a 2a 2a 20 27 44 4f 55 42 27 20 20 20 20 20  L.** 'DOUB'     
8f70: 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 46 46 5f     | SQLITE_AFF_
8f80: 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  REAL.**.** If no
8f90: 6e 65 20 6f 66 20 74 68 65 20 73 75 62 73 74 72  ne of the substr
8fa0: 69 6e 67 73 20 69 6e 20 74 68 65 20 61 62 6f 76  ings in the abov
8fb0: 65 20 74 61 62 6c 65 20 61 72 65 20 66 6f 75 6e  e table are foun
8fc0: 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46  d,.** SQLITE_AFF
8fd0: 5f 4e 55 4d 45 52 49 43 20 69 73 20 72 65 74 75  _NUMERIC is retu
8fe0: 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  rned..*/.char sq
8ff0: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
9000: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  e(const char *zI
9010: 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74 29 7b 0a  n, u8 *pszEst){.
9020: 20 20 75 33 32 20 68 20 3d 20 30 3b 0a 20 20 63    u32 h = 0;.  c
9030: 68 61 72 20 61 66 66 20 3d 20 53 51 4c 49 54 45  har aff = SQLITE
9040: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
9050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 61  const char *zCha
9060: 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 7a 49  r = 0;..  if( zI
9070: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 66  n==0 ) return af
9080: 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a 49 6e 5b  f;.  while( zIn[
9090: 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d 20 28 68  0] ){.    h = (h
90a0: 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65 33 55 70  <<8) + sqlite3Up
90b0: 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a 7a 49 6e  perToLower[(*zIn
90c0: 29 26 30 78 66 66 5d 3b 0a 20 20 20 20 7a 49 6e  )&0xff];.    zIn
90d0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 28  ++;.    if( h==(
90e0: 28 27 63 27 3c 3c 32 34 29 2b 28 27 68 27 3c 3c  ('c'<<24)+('h'<<
90f0: 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b 27 72 27  16)+('a'<<8)+'r'
9100: 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20  ) ){            
9110: 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20 20 20 20   /* CHAR */.    
9120: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9130: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7a  FF_TEXT;.      z
9140: 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20 20 20 20  Char = zIn;.    
9150: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9160: 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36  c'<<24)+('l'<<16
9170: 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20  )+('o'<<8)+'b') 
9180: 29 7b 20 20 20 20 20 20 20 2f 2a 20 43 4c 4f 42  ){       /* CLOB
9190: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20   */.      aff = 
91a0: 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b  SQLITE_AFF_TEXT;
91b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
91c0: 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b 28 27 65  ==(('t'<<24)+('e
91d0: 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c 38 29 2b  '<<16)+('x'<<8)+
91e0: 27 74 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a  't') ){       /*
91f0: 20 54 45 58 54 20 2a 2f 0a 20 20 20 20 20 20 61   TEXT */.      a
9200: 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  ff = SQLITE_AFF_
9210: 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20  TEXT;.    }else 
9220: 69 66 28 20 68 3d 3d 28 28 27 62 27 3c 3c 32 34  if( h==(('b'<<24
9230: 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28 27 6f 27  )+('l'<<16)+('o'
9240: 3c 3c 38 29 2b 27 62 27 29 20 20 20 20 20 20 20  <<8)+'b')       
9250: 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f 0a 20 20     /* BLOB */.  
9260: 20 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53        && (aff==S
9270: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
9280: 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45  C || aff==SQLITE
9290: 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b 0a 20 20  _AFF_REAL) ){.  
92a0: 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45      aff = SQLITE
92b0: 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20 20 20 20  _AFF_BLOB;.     
92c0: 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d 27 28 27   if( zIn[0]=='('
92d0: 20 29 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a   ) zChar = zIn;.
92e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
92f0: 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
9300: 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  NT.    }else if(
9310: 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34 29 2b 28   h==(('r'<<24)+(
9320: 27 65 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38  'e'<<16)+('a'<<8
9330: 29 2b 27 6c 27 29 20 20 20 20 20 20 20 20 20 20  )+'l')          
9340: 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20 20 20 20  /* REAL */.     
9350: 20 20 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54     && aff==SQLIT
9360: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b  E_AFF_NUMERIC ){
9370: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
9380: 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20  ITE_AFF_REAL;.  
9390: 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28    }else if( h==(
93a0: 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c 27 3c 3c  ('f'<<24)+('l'<<
93b0: 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 61 27  16)+('o'<<8)+'a'
93c0: 29 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 4c  )          /* FL
93d0: 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26  OA */.        &&
93e0: 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46   aff==SQLITE_AFF
93f0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
9400: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9410: 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20 7d 65 6c  FF_REAL;.    }el
9420: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 64 27 3c  se if( h==(('d'<
9430: 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36 29 2b 28  <24)+('o'<<16)+(
9440: 27 75 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'u'<<8)+'b')    
9450: 20 20 20 20 20 20 2f 2a 20 44 4f 55 42 20 2a 2f        /* DOUB */
9460: 0a 20 20 20 20 20 20 20 20 26 26 20 61 66 66 3d  .        && aff=
9470: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
9480: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 61 66 66  RIC ){.      aff
9490: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45   = SQLITE_AFF_RE
94a0: 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  AL;.#endif.    }
94b0: 65 6c 73 65 20 69 66 28 20 28 68 26 30 78 30 30  else if( (h&0x00
94c0: 46 46 46 46 46 46 29 3d 3d 28 28 27 69 27 3c 3c  FFFFFF)==(('i'<<
94d0: 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b 27 74 27  16)+('n'<<8)+'t'
94e0: 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e 54 20 2a  ) ){    /* INT *
94f0: 2f 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51  /.      aff = SQ
9500: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
9510: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9520: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
9530: 66 20 70 73 7a 45 73 74 20 69 73 20 6e 6f 74 20  f pszEst is not 
9540: 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61 6e 20 65  NULL, store an e
9550: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 66  stimate of the f
9560: 69 65 6c 64 20 73 69 7a 65 2e 20 20 54 68 65 0a  ield size.  The.
9570: 20 20 2a 2a 20 65 73 74 69 6d 61 74 65 20 69 73    ** estimate is
9580: 20 73 63 61 6c 65 64 20 73 6f 20 74 68 61 74 20   scaled so that 
9590: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 69  the size of an i
95a0: 6e 74 65 67 65 72 20 69 73 20 31 2e 20 20 2a 2f  nteger is 1.  */
95b0: 0a 20 20 69 66 28 20 70 73 7a 45 73 74 20 29 7b  .  if( pszEst ){
95c0: 0a 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20 31  .    *pszEst = 1
95d0: 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c 74 20 73  ;   /* default s
95e0: 69 7a 65 20 69 73 20 61 70 70 72 6f 78 20 34 20  ize is approx 4 
95f0: 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 66 28  bytes */.    if(
9600: 20 61 66 66 3c 53 51 4c 49 54 45 5f 41 46 46 5f   aff<SQLITE_AFF_
9610: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
9620: 20 69 66 28 20 7a 43 68 61 72 20 29 7b 0a 20 20   if( zChar ){.  
9630: 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 43 68        while( zCh
9640: 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20  ar[0] ){.       
9650: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
9660: 64 69 67 69 74 28 7a 43 68 61 72 5b 30 5d 29 20  digit(zChar[0]) 
9670: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
9680: 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt v = 0;.      
9690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 65 74        sqlite3Get
96a0: 49 6e 74 33 32 28 7a 43 68 61 72 2c 20 26 76 29  Int32(zChar, &v)
96b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 20  ;.            v 
96c0: 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20 20 20 20  = v/4 + 1;.     
96d0: 20 20 20 20 20 20 20 69 66 28 20 76 3e 32 35 35         if( v>255
96e0: 20 29 20 76 20 3d 20 32 35 35 3b 0a 20 20 20 20   ) v = 255;.    
96f0: 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20          *pszEst 
9700: 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28 6b 29 2c  = v; /* BLOB(k),
9710: 20 56 41 52 43 48 41 52 28 6b 29 2c 20 43 48 41   VARCHAR(k), CHA
9720: 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f 34 2b 31  R(k) -> r=(k/4+1
9730: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
9740: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
9750: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 43    }.          zC
9760: 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  har++;.        }
9770: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9780: 20 20 20 20 20 20 2a 70 73 7a 45 73 74 20 3d 20        *pszEst = 
9790: 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c 20 54 45  5;   /* BLOB, TE
97a0: 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72 3d 35 20  XT, CLOB -> r=5 
97b0: 20 28 61 70 70 72 6f 78 20 32 30 20 62 79 74 65   (approx 20 byte
97c0: 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  s)*/.      }.   
97d0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
97e0: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  aff;.}../*.** Th
97f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9800: 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73  lled by the pars
9810: 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20  er while in the 
9820: 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72  middle of.** par
9830: 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41  sing a CREATE TA
9840: 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  BLE statement.  
9850: 54 68 65 20 70 46 69 72 73 74 20 74 6f 6b 65 6e  The pFirst token
9860: 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
9870: 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 73 65   token in the se
9880: 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b 65 6e 73  quence of tokens
9890: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 74   that describe t
98a0: 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 0a 2a  he type of the.*
98b0: 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e 74  * column current
98c0: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
98d0: 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73 74 20 69  ction.   pLast i
98e0: 73 20 74 68 65 20 6c 61 73 74 20 74 6f 6b 65 6e  s the last token
98f0: 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65 71 75 65  .** in the seque
9900: 6e 63 65 2e 20 20 55 73 65 20 74 68 69 73 20 69  nce.  Use this i
9910: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 63 6f  nformation to co
9920: 6e 73 74 72 75 63 74 20 61 20 73 74 72 69 6e 67  nstruct a string
9930: 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  .** that contain
9940: 73 20 74 68 65 20 74 79 70 65 6e 61 6d 65 20 6f  s the typename o
9950: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e 64  f the column and
9960: 20 73 74 6f 72 65 20 74 68 61 74 20 73 74 72 69   store that stri
9970: 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 2e 0a  ng.** in zType..
9980: 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
9990: 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 50 61  AddColumnType(Pa
99a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b  rse *pParse, Tok
99b0: 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20 20 54 61  en *pType){.  Ta
99c0: 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c 75 6d 6e  ble *p;.  Column
99d0: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20 3d 20 70   *pCol;..  p = p
99e0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
99f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
9a00: 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c 31 29  NEVER(p->nCol<1)
9a10: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 6f   ) return;.  pCo
9a20: 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b 70 2d 3e  l = &p->aCol[p->
9a30: 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73 73 65 72  nCol-1];.  asser
9a40: 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3d 3d  t( pCol->zType==
9a50: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
9a60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
9a70: 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
9a80: 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 70  Col->zType);.  p
9a90: 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20 73 71 6c  Col->zType = sql
9aa0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
9ab0: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54  n(pParse->db, pT
9ac0: 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d 3e 61 66  ype);.  pCol->af
9ad0: 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33  finity = sqlite3
9ae0: 41 66 66 69 6e 69 74 79 54 79 70 65 28 70 43 6f  AffinityType(pCo
9af0: 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43 6f 6c 2d  l->zType, &pCol-
9b00: 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >szEst);.}../*.*
9b10: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
9b20: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
9b30: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 6d 6f  value for the mo
9b40: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
9b50: 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f 66 20 74  d column.** of t
9b60: 68 65 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  he table current
9b70: 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  ly under constru
9b80: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 44 65 66  ction..**.** Def
9b90: 61 75 6c 74 20 76 61 6c 75 65 20 65 78 70 72 65  ault value expre
9ba0: 73 73 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 63  ssions must be c
9bb0: 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69 73 65 20  onstant.  Raise 
9bc0: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
9bd0: 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f 74 20 74  this.** is not t
9be0: 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  he case..**.** T
9bf0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
9c00: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61 72  alled by the par
9c10: 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65  ser while in the
9c20: 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61   middle of.** pa
9c30: 72 73 69 6e 67 20 61 20 43 52 45 41 54 45 20 54  rsing a CREATE T
9c40: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
9c50: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41  */.void sqlite3A
9c60: 64 64 44 65 66 61 75 6c 74 56 61 6c 75 65 28 50  ddDefaultValue(P
9c70: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
9c80: 70 72 53 70 61 6e 20 2a 70 53 70 61 6e 29 7b 0a  prSpan *pSpan){.
9c90: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f    Table *p;.  Co
9ca0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71  lumn *pCol;.  sq
9cb0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
9cc0: 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d 20 70 50  se->db;.  p = pP
9cd0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b  arse->pNewTable;
9ce0: 0a 20 20 69 66 28 20 70 21 3d 30 20 29 7b 0a 20  .  if( p!=0 ){. 
9cf0: 20 20 20 70 43 6f 6c 20 3d 20 26 28 70 2d 3e 61     pCol = &(p->a
9d00: 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31 5d 29 3b  Col[p->nCol-1]);
9d10: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
9d20: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4f  3ExprIsConstantO
9d30: 72 46 75 6e 63 74 69 6f 6e 28 70 53 70 61 6e 2d  rFunction(pSpan-
9d40: 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69 6e 69 74  >pExpr, db->init
9d50: 2e 62 75 73 79 29 20 29 7b 0a 20 20 20 20 20 20  .busy) ){.      
9d60: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9d70: 70 50 61 72 73 65 2c 20 22 64 65 66 61 75 6c 74  pParse, "default
9d80: 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c 75 6d 6e   value of column
9d90: 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20 63 6f 6e   [%s] is not con
9da0: 73 74 61 6e 74 22 2c 0a 20 20 20 20 20 20 20 20  stant",.        
9db0: 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a    pCol->zName);.
9dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9dd0: 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 45   /* A copy of pE
9de0: 78 70 72 20 69 73 20 75 73 65 64 20 69 6e 73 74  xpr is used inst
9df0: 65 61 64 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ead of the origi
9e00: 6e 61 6c 2c 20 61 73 20 70 45 78 70 72 20 63 6f  nal, as pExpr co
9e10: 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
9e20: 74 6f 6b 65 6e 73 20 74 68 61 74 20 70 6f 69 6e  tokens that poin
9e30: 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65 20 6d 65  t to volatile me
9e40: 6d 6f 72 79 2e 20 54 68 65 20 27 73 70 61 6e 27  mory. The 'span'
9e50: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
9e60: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72  on.      ** is r
9e70: 65 71 75 69 72 65 64 20 62 79 20 70 72 61 67 6d  equired by pragm
9e80: 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e 0a 20 20  a table_info..  
9e90: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
9ea0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
9eb0: 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b  b, pCol->pDflt);
9ec0: 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 44 66  .      pCol->pDf
9ed0: 6c 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  lt = sqlite3Expr
9ee0: 44 75 70 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70  Dup(db, pSpan->p
9ef0: 45 78 70 72 2c 20 45 58 50 52 44 55 50 5f 52 45  Expr, EXPRDUP_RE
9f00: 44 55 43 45 29 3b 0a 20 20 20 20 20 20 73 71 6c  DUCE);.      sql
9f10: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
9f20: 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a 20 20 20  Col->zDflt);.   
9f30: 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 20 3d     pCol->zDflt =
9f40: 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75   sqlite3DbStrNDu
9f50: 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53 70  p(db, (char*)pSp
9f60: 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20 20  an->zStart,.    
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
9fa0: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
9fb0: 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rt));.    }.  }.
9fc0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
9fd0: 65 74 65 28 64 62 2c 20 70 53 70 61 6e 2d 3e 70  ete(db, pSpan->p
9fe0: 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
9ff0: 42 61 63 6b 77 61 72 64 73 20 43 6f 6d 70 61 74  Backwards Compat
a000: 69 62 69 6c 69 74 79 20 48 61 63 6b 3a 0a 2a 2a  ibility Hack:.**
a010: 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 20   .** Historical 
a020: 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
a030: 74 65 20 61 63 63 65 70 74 65 64 20 73 74 72 69  te accepted stri
a040: 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e 20 6e 61  ngs as column na
a050: 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64 65 78 65  mes in.** indexe
a060: 73 20 61 6e 64 20 50 52 49 4d 41 52 59 20 4b 45  s and PRIMARY KE
a070: 59 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e  Y constraints an
a080: 64 20 69 6e 20 55 4e 49 51 55 45 20 63 6f 6e 73  d in UNIQUE cons
a090: 74 72 61 69 6e 74 73 2e 20 20 45 78 61 6d 70 6c  traints.  Exampl
a0a0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 43 52 45  e:.**.**     CRE
a0b0: 41 54 45 20 54 41 42 4c 45 20 78 79 7a 28 61 2c  ATE TABLE xyz(a,
a0c0: 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41 52 59 20  b,c,d,e,PRIMARY 
a0d0: 4b 45 59 28 27 61 27 29 2c 55 4e 49 51 55 45 28  KEY('a'),UNIQUE(
a0e0: 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41 54 45 20  'b','c' COLLATE 
a0f0: 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20 43 52 45  trim).**     CRE
a100: 41 54 45 20 49 4e 44 45 58 20 61 62 63 20 4f 4e  ATE INDEX abc ON
a110: 20 78 79 7a 28 27 63 27 2c 27 64 27 20 44 45 53   xyz('c','d' DES
a120: 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45 20 6e 6f  C,'e' COLLATE no
a130: 63 61 73 65 20 44 45 53 43 29 3b 0a 2a 2a 0a 2a  case DESC);.**.*
a140: 2a 20 54 68 69 73 20 69 73 20 67 6f 6f 66 79 2e  * This is goofy.
a150: 20 20 42 75 74 20 74 6f 20 70 72 65 73 65 72 76    But to preserv
a160: 65 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  e backwards comp
a170: 61 74 69 62 69 6c 69 74 79 20 77 65 20 63 6f 6e  atibility we con
a180: 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61 63 63 65  tinue to.** acce
a190: 70 74 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75  pt it.  This rou
a1a0: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 6e 65  tine does the ne
a1b0: 63 65 73 73 61 72 79 20 63 6f 6e 76 65 72 73 69  cessary conversi
a1c0: 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65 72 74 73  on.  It converts
a1d0: 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69  .** the expressi
a1e0: 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69 74 73 20  on given in its 
a1f0: 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d 20 61 20  argument from a 
a200: 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74 6f 20 61  TK_STRING into a
a210: 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20 74 68 65   TK_ID.** if the
a220: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6a   expression is j
a230: 75 73 74 20 61 20 54 4b 5f 53 54 52 49 4e 47 20  ust a TK_STRING 
a240: 77 69 74 68 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  with an optional
a250: 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65 2e   COLLATE clause.
a260: 0a 2a 2a 20 49 66 20 74 68 65 20 65 70 78 72 65  .** If the epxre
a270: 73 73 69 6f 6e 20 69 73 20 61 6e 79 74 68 69 6e  ssion is anythin
a280: 67 20 6f 74 68 65 72 20 74 68 61 6e 20 54 4b 5f  g other than TK_
a290: 53 54 52 49 4e 47 2c 20 74 68 65 20 65 78 70 72  STRING, the expr
a2a0: 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 75 6e 63  ession is.** unc
a2b0: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  hanged..*/.stati
a2c0: 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74  c void sqlite3St
a2d0: 72 69 6e 67 54 6f 49 64 28 45 78 70 72 20 2a 70  ringToId(Expr *p
a2e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  ){.  if( p->op==
a2f0: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
a300: 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49 44 3b 0a   p->op = TK_ID;.
a310: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6f    }else if( p->o
a320: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26 26  p==TK_COLLATE &&
a330: 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   p->pLeft->op==T
a340: 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20  K_STRING ){.    
a350: 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20 3d 20 54  p->pLeft->op = T
a360: 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  K_ID;.  }.}../*.
a370: 2a 2a 20 44 65 73 69 67 6e 61 74 65 20 74 68 65  ** Designate the
a380: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 66 6f 72   PRIMARY KEY for
a390: 20 74 68 65 20 74 61 62 6c 65 2e 20 20 70 4c 69   the table.  pLi
a3a0: 73 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  st is a list of 
a3b0: 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 63 6f 6c  names .** of col
a3c0: 75 6d 6e 73 20 74 68 61 74 20 66 6f 72 6d 20 74  umns that form t
a3d0: 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20  he primary key. 
a3e0: 20 49 66 20 70 4c 69 73 74 20 69 73 20 4e 55 4c   If pList is NUL
a3f0: 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6d  L, then the.** m
a400: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
a410: 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  ed column of the
a420: 20 74 61 62 6c 65 20 69 73 20 74 68 65 20 70 72   table is the pr
a430: 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  imary key..**.**
a440: 20 41 20 74 61 62 6c 65 20 63 61 6e 20 68 61 76   A table can hav
a450: 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 70 72  e at most one pr
a460: 69 6d 61 72 79 20 6b 65 79 2e 20 20 49 66 20 74  imary key.  If t
a470: 68 65 20 74 61 62 6c 65 20 61 6c 72 65 61 64 79  he table already
a480: 20 68 61 73 0a 2a 2a 20 61 20 70 72 69 6d 61 72   has.** a primar
a490: 79 20 6b 65 79 20 28 61 6e 64 20 74 68 69 73 20  y key (and this 
a4a0: 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 72  is the second pr
a4b0: 69 6d 61 72 79 20 6b 65 79 29 20 74 68 65 6e 20  imary key) then 
a4c0: 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20 65 72 72  create an.** err
a4d0: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  or..**.** If the
a4e0: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69 73 20   PRIMARY KEY is 
a4f0: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63 6f 6c 75  on a single colu
a500: 6d 6e 20 77 68 6f 73 65 20 64 61 74 61 74 79 70  mn whose datatyp
a510: 65 20 69 73 20 49 4e 54 45 47 45 52 2c 0a 2a 2a  e is INTEGER,.**
a520: 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 74 72   then we will tr
a530: 79 20 74 6f 20 75 73 65 20 74 68 61 74 20 63 6f  y to use that co
a540: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 6f 77 69  lumn as the rowi
a550: 64 2e 20 20 53 65 74 20 74 68 65 20 54 61 62 6c  d.  Set the Tabl
a560: 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69 65 6c 64  e.iPKey.** field
a570: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 6e   of the table un
a580: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
a590: 20 74 6f 20 62 65 20 74 68 65 20 69 6e 64 65 78   to be the index
a5a0: 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e 54 45 47   of the.** INTEG
a5b0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
a5c0: 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65 2e 69 50  olumn.  Table.iP
a5d0: 4b 65 79 20 69 73 20 73 65 74 20 74 6f 20 2d 31  Key is set to -1
a5e0: 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
a5f0: 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  no INTEGER PRIMA
a600: 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a 20 49 66  RY KEY..**.** If
a610: 20 74 68 65 20 6b 65 79 20 69 73 20 6e 6f 74 20   the key is not 
a620: 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  an INTEGER PRIMA
a630: 52 59 20 4b 45 59 2c 20 74 68 65 6e 20 63 72 65  RY KEY, then cre
a640: 61 74 65 20 61 20 75 6e 69 71 75 65 0a 2a 2a 20  ate a unique.** 
a650: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6b 65  index for the ke
a660: 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20 69 73 20  y.  No index is 
a670: 63 72 65 61 74 65 64 20 66 6f 72 20 49 4e 54 45  created for INTE
a680: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 73  GER PRIMARY KEYs
a690: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a6a0: 33 41 64 64 50 72 69 6d 61 72 79 4b 65 79 28 0a  3AddPrimaryKey(.
a6b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a6c0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a6d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
a6e0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 2f 2a  List *pList,  /*
a6f0: 20 4c 69 73 74 20 6f 66 20 66 69 65 6c 64 20 6e   List of field n
a700: 61 6d 65 73 20 74 6f 20 62 65 20 69 6e 64 65 78  ames to be index
a710: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72  ed */.  int onEr
a720: 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20 57 68 61  ror,      /* Wha
a730: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 61 20 75  t to do with a u
a740: 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e 66 6c 69  niqueness confli
a750: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61 75 74 6f  ct */.  int auto
a760: 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Inc,      /* Tru
a770: 65 20 69 66 20 74 68 65 20 41 55 54 4f 49 4e 43  e if the AUTOINC
a780: 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72 64 20 69  REMENT keyword i
a790: 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
a7a0: 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 20 20 20  nt sortOrder    
a7b0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f 5f 41 53   /* SQLITE_SO_AS
a7c0: 43 20 6f 72 20 53 51 4c 49 54 45 5f 53 4f 5f 44  C or SQLITE_SO_D
a7d0: 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  ESC */.){.  Tabl
a7e0: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
a7f0: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 63  ->pNewTable;.  c
a800: 68 61 72 20 2a 7a 54 79 70 65 20 3d 20 30 3b 0a  har *zType = 0;.
a810: 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 2c    int iCol = -1,
a820: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   i;.  int nTerm;
a830: 0a 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 7c  .  if( pTab==0 |
a840: 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54 41  | IN_DECLARE_VTA
a850: 42 20 29 20 67 6f 74 6f 20 70 72 69 6d 61 72 79  B ) goto primary
a860: 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20 69 66 28  _key_exit;.  if(
a870: 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
a880: 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72 79 4b  & TF_HasPrimaryK
a890: 65 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ey ){.    sqlite
a8a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a8b0: 2c 20 0a 20 20 20 20 20 20 22 74 61 62 6c 65 20  , .      "table 
a8c0: 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f 72 65 20  \"%s\" has more 
a8d0: 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d 61 72 79  than one primary
a8e0: 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e 7a 4e 61   key", pTab->zNa
a8f0: 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 70 72  me);.    goto pr
a900: 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a  imary_key_exit;.
a910: 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74 61 62 46    }.  pTab->tabF
a920: 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61 73 50 72  lags |= TF_HasPr
a930: 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69 66 28 20  imaryKey;.  if( 
a940: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
a950: 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 6e 43 6f  iCol = pTab->nCo
a960: 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54 61 62 2d  l - 1;.    pTab-
a970: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63 6f 6c 46  >aCol[iCol].colF
a980: 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47 5f  lags |= COLFLAG_
a990: 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20 7a 54 79  PRIMKEY;.    zTy
a9a0: 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  pe = pTab->aCol[
a9b0: 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20  iCol].zType;.   
a9c0: 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20 20 7d 65   nTerm = 1;.  }e
a9d0: 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72 6d 20 3d  lse{.    nTerm =
a9e0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
a9f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54     for(i=0; i<nT
aa00: 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  erm; i++){.     
aa10: 20 45 78 70 72 20 2a 70 43 45 78 70 72 20 3d 20   Expr *pCExpr = 
aa20: 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43  sqlite3ExprSkipC
aa30: 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d 3e 61 5b  ollate(pList->a[
aa40: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
aa50: 20 61 73 73 65 72 74 28 20 70 43 45 78 70 72 21   assert( pCExpr!
aa60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
aa70: 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70 43  te3StringToId(pC
aa80: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66 28  Expr);.      if(
aa90: 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f   pCExpr->op==TK_
aaa0: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ID ){.        co
aab0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e 61 6d 65  nst char *zCName
aac0: 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e 7a 54 6f   = pCExpr->u.zTo
aad0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ken;.        for
aae0: 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54  (iCol=0; iCol<pT
aaf0: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b  ab->nCol; iCol++
ab00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ab10: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
ab20: 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 61 43  zCName, pTab->aC
ab30: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d 65 29 3d  ol[iCol].zName)=
ab40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ab50: 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f    pTab->aCol[iCo
ab60: 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c 3d 20 43  l].colFlags |= C
ab70: 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59 3b 0a  OLFLAG_PRIMKEY;.
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70              zTyp
ab90: 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  e = pTab->aCol[i
aba0: 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20 20 20 20  Col].zType;.    
abb0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
abc0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
abd0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
abe0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 54 65   }.  }.  if( nTe
abf0: 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a 54 79 70  rm==1.   && zTyp
ac00: 65 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  e && sqlite3StrI
ac10: 43 6d 70 28 7a 54 79 70 65 2c 20 22 49 4e 54 45  Cmp(zType, "INTE
ac20: 47 45 52 22 29 3d 3d 30 0a 20 20 20 26 26 20 73  GER")==0.   && s
ac30: 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c 49 54 45  ortOrder!=SQLITE
ac40: 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b 0a 20 20  _SO_DESC.  ){.  
ac50: 20 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20    pTab->iPKey = 
ac60: 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61 62 2d 3e  iCol;.    pTab->
ac70: 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38 29 6f 6e  keyConf = (u8)on
ac80: 45 72 72 6f 72 3b 0a 20 20 20 20 61 73 73 65 72  Error;.    asser
ac90: 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30 20 7c 7c  t( autoInc==0 ||
aca0: 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29 3b 0a 20   autoInc==1 );. 
acb0: 20 20 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67     pTab->tabFlag
acc0: 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a 54 46 5f  s |= autoInc*TF_
acd0: 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 20  Autoincrement;. 
ace0: 20 20 20 69 66 28 20 70 4c 69 73 74 20 29 20 70     if( pList ) p
acf0: 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72 74 4f 72  Parse->iPkSortOr
ad00: 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30  der = pList->a[0
ad10: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d  ].sortOrder;.  }
ad20: 65 6c 73 65 20 69 66 28 20 61 75 74 6f 49 6e 63  else if( autoInc
ad30: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
ad40: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52  TE_OMIT_AUTOINCR
ad50: 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c 69 74 65  EMENT.    sqlite
ad60: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
ad70: 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54  , "AUTOINCREMENT
ad80: 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f 77 65 64   is only allowed
ad90: 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20 20 20 20   on an ".       
ada0: 22 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59  "INTEGER PRIMARY
adb0: 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69 66 0a 20   KEY");.#endif. 
adc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49 6e 64 65   }else{.    Inde
add0: 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d 20 73 71  x *p;.    p = sq
ade0: 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65 78  lite3CreateIndex
adf0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30  (pParse, 0, 0, 0
ae00: 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72 72 6f 72  , pList, onError
ae10: 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
ae20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae30: 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c 20 30 29  0, sortOrder, 0)
ae40: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
ae50: 20 20 20 20 20 70 2d 3e 69 64 78 54 79 70 65 20       p->idxType 
ae60: 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
ae70: 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20  _PRIMARYKEY;.   
ae80: 20 7d 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 30   }.    pList = 0
ae90: 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72 79 5f 6b  ;.  }..primary_k
aea0: 65 79 5f 65 78 69 74 3a 0a 20 20 73 71 6c 69 74  ey_exit:.  sqlit
aeb0: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
aec0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 69  (pParse->db, pLi
aed0: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  st);.  return;.}
aee0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
aef0: 77 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  w CHECK constrai
af00: 6e 74 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  nt to the table 
af10: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20  currently under 
af20: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f  construction..*/
af30: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 41 64 64  .void sqlite3Add
af40: 43 68 65 63 6b 43 6f 6e 73 74 72 61 69 6e 74 28  CheckConstraint(
af50: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
af60: 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20  ,    /* Parsing 
af70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
af80: 72 20 2a 70 43 68 65 63 6b 45 78 70 72 20 20 2f  r *pCheckExpr  /
af90: 2a 20 54 68 65 20 63 68 65 63 6b 20 65 78 70 72  * The check expr
afa0: 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 23 69 66  ession */.){.#if
afb0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
afc0: 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c 65 20 2a  _CHECK.  Table *
afd0: 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70  pTab = pParse->p
afe0: 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73 71 6c 69  NewTable;.  sqli
aff0: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
b000: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 54 61 62  ->db;.  if( pTab
b010: 20 26 26 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f   && !IN_DECLARE_
b020: 56 54 41 42 0a 20 20 20 26 26 20 21 73 71 6c 69  VTAB.   && !sqli
b030: 74 65 33 42 74 72 65 65 49 73 52 65 61 64 6f 6e  te3BtreeIsReadon
b040: 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62 2d 3e 69  ly(db->aDb[db->i
b050: 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29 0a 20 20  nit.iDb].pBt).  
b060: 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e 70 43 68  ){.    pTab->pCh
b070: 65 63 6b 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eck = sqlite3Exp
b080: 72 4c 69 73 74 41 70 70 65 6e 64 28 70 50 61 72  rListAppend(pPar
b090: 73 65 2c 20 70 54 61 62 2d 3e 70 43 68 65 63 6b  se, pTab->pCheck
b0a0: 2c 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20  , pCheckExpr);. 
b0b0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63     if( pParse->c
b0c0: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2e 6e 20  onstraintName.n 
b0d0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
b0e0: 45 78 70 72 4c 69 73 74 53 65 74 4e 61 6d 65 28  ExprListSetName(
b0f0: 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43  pParse, pTab->pC
b100: 68 65 63 6b 2c 20 26 70 50 61 72 73 65 2d 3e 63  heck, &pParse->c
b110: 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65 2c 20 31  onstraintName, 1
b120: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
b130: 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
b140: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
b150: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 43  e(pParse->db, pC
b160: 68 65 63 6b 45 78 70 72 29 3b 0a 20 20 7d 0a 7d  heckExpr);.  }.}
b170: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
b180: 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69  collation functi
b190: 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
b1a0: 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20 74  ecently parsed t
b1b0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 74  able column.** t
b1c0: 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71 20 67 69  o the CollSeq gi
b1d0: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ven..*/.void sql
b1e0: 69 74 65 33 41 64 64 43 6f 6c 6c 61 74 65 54 79  ite3AddCollateTy
b1f0: 70 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  pe(Parse *pParse
b200: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
b210: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
b220: 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  int i;.  char *z
b230: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
b240: 20 20 20 2f 2a 20 44 65 71 75 6f 74 65 64 20 6e     /* Dequoted n
b250: 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69 6f 6e  ame of collation
b260: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 73   sequence */.  s
b270: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69  qlite3 *db;..  i
b280: 66 28 20 28 70 20 3d 20 70 50 61 72 73 65 2d 3e  f( (p = pParse->
b290: 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20 29 20  pNewTable)==0 ) 
b2a0: 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 70 2d  return;.  i = p-
b2b0: 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62 20 3d 20  >nCol-1;.  db = 
b2c0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 7a 43  pParse->db;.  zC
b2d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  oll = sqlite3Nam
b2e0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
b2f0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 21 7a  Token);.  if( !z
b300: 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b 0a 0a  Coll ) return;..
b310: 20 20 69 66 28 20 73 71 6c 69 74 65 33 4c 6f 63    if( sqlite3Loc
b320: 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  ateCollSeq(pPars
b330: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
b340: 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20   Index *pIdx;.  
b350: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
b360: 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  db, p->aCol[i].z
b370: 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 43  Coll);.    p->aC
b380: 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d 20 7a 43  ol[i].zColl = zC
b390: 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  oll;.  .    /* I
b3a0: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20  f the column is 
b3b0: 64 65 63 6c 61 72 65 64 20 61 73 20 22 3c 6e 61  declared as "<na
b3c0: 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b 45 59 20  me> PRIMARY KEY 
b3d0: 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65 3e 22 2c  COLLATE <type>",
b3e0: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 20  .    ** then an 
b3f0: 69 6e 64 65 78 20 6d 61 79 20 68 61 76 65 20 62  index may have b
b400: 65 65 6e 20 63 72 65 61 74 65 64 20 6f 6e 20 74  een created on t
b410: 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65 66 6f 72  his column befor
b420: 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6c  e the.    ** col
b430: 6c 61 74 69 6f 6e 20 74 79 70 65 20 77 61 73 20  lation type was 
b440: 61 64 64 65 64 2e 20 43 6f 72 72 65 63 74 20 74  added. Correct t
b450: 68 69 73 20 69 66 20 69 74 20 69 73 20 74 68 65  his if it is the
b460: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
b470: 20 20 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49    for(pIdx=p->pI
b480: 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78  ndex; pIdx; pIdx
b490: 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pIdx->pNext){. 
b4a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64       assert( pId
b4b0: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 29 3b  x->nKeyCol==1 );
b4c0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
b4d0: 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d 69 20  >aiColumn[0]==i 
b4e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ){.        pIdx-
b4f0: 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20 70 2d 3e  >azColl[0] = p->
b500: 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[i].zColl;. 
b510: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
b520: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
b530: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
b540: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  l);.  }.}../*.**
b550: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
b560: 65 74 75 72 6e 73 20 74 68 65 20 63 6f 6c 6c 61  eturns the colla
b570: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 6f  tion sequence fo
b580: 72 20 64 61 74 61 62 61 73 65 20 6e 61 74 69 76  r database nativ
b590: 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63 6f 64 69  e text.** encodi
b5a0: 6e 67 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ng identified by
b5b0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 4e 61 6d   the string zNam
b5c0: 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61 6d 65 2e  e, length nName.
b5d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
b5e0: 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
b5f0: 6e 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 6f  n sequence is no
b600: 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  t available, or 
b610: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  not available.**
b620: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
b630: 20 6e 61 74 69 76 65 20 65 6e 63 6f 64 69 6e 67   native encoding
b640: 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  , the collation 
b650: 66 61 63 74 6f 72 79 20 69 73 20 69 6e 76 6f 6b  factory is invok
b660: 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75 65 73 74  ed to.** request
b670: 20 69 74 2e 20 49 66 20 74 68 65 20 63 6f 6c 6c   it. If the coll
b680: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 64 6f  ation factory do
b690: 65 73 20 6e 6f 74 20 73 75 70 70 6c 79 20 73 75  es not supply su
b6a0: 63 68 20 61 20 73 65 71 75 65 6e 63 65 2c 0a 2a  ch a sequence,.*
b6b0: 2a 20 61 6e 64 20 74 68 65 20 73 65 71 75 65 6e  * and the sequen
b6c0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ce is available 
b6d0: 69 6e 20 61 6e 6f 74 68 65 72 20 74 65 78 74 20  in another text 
b6e0: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 74  encoding, then t
b6f0: 68 61 74 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  hat is.** return
b700: 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a  ed instead..**.*
b710: 2a 20 49 66 20 6e 6f 20 76 65 72 73 69 6f 6e 73  * If no versions
b720: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 65   of the requeste
b730: 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20 73 65 71  d collations seq
b740: 75 65 6e 63 65 20 61 72 65 20 61 76 61 69 6c 61  uence are availa
b750: 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e 6f 74 68  ble, or.** anoth
b760: 65 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  er error occurs,
b770: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
b780: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d  d and an error m
b790: 65 73 73 61 67 65 20 77 72 69 74 74 65 6e 20 69  essage written i
b7a0: 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65 2e 0a 2a  nto.** pParse..*
b7b0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
b7c0: 65 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  e is a wrapper a
b7d0: 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 46 69 6e  round sqlite3Fin
b7e0: 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20 54 68 69  dCollSeq().  Thi
b7f0: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6e 76  s routine.** inv
b800: 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  okes the collati
b810: 6f 6e 20 66 61 63 74 6f 72 79 20 69 66 20 74 68  on factory if th
b820: 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61 74 69 6f  e named collatio
b830: 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  n cannot be foun
b840: 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  d.** and generat
b850: 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  es an error mess
b860: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  age..**.** See a
b870: 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46 69 6e 64  lso: sqlite3Find
b880: 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71 6c 69 74  CollSeq(), sqlit
b890: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 29 0a 2a  e3GetCollSeq().*
b8a0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
b8b0: 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
b8c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
b8d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
b8e0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
b8f0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b900: 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 64 62   u8 enc = ENC(db
b910: 29 3b 0a 20 20 75 38 20 69 6e 69 74 62 75 73 79  );.  u8 initbusy
b920: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79   = db->init.busy
b930: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
b940: 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ll;..  pColl = s
b950: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
b960: 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e 61 6d 65  q(db, enc, zName
b970: 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a 20 20 69  , initbusy);.  i
b980: 66 28 20 21 69 6e 69 74 62 75 73 79 20 26 26 20  f( !initbusy && 
b990: 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70 43 6f 6c  (!pColl || !pCol
b9a0: 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20 20 20 20  l->xCmp) ){.    
b9b0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47  pColl = sqlite3G
b9c0: 65 74 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  etCollSeq(pParse
b9d0: 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c 20 7a 4e  , enc, pColl, zN
b9e0: 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ame);.  }..  ret
b9f0: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 0a 2f  urn pColl;.}.../
ba00: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
ba10: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 63  de that will inc
ba20: 72 65 6d 65 6e 74 20 74 68 65 20 73 63 68 65 6d  rement the schem
ba30: 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a 2a 2a 20  a cookie..**.** 
ba40: 54 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  The schema cooki
ba50: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
ba60: 65 72 6d 69 6e 65 20 77 68 65 6e 20 74 68 65 20  ermine when the 
ba70: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 0a 2a  schema for the.*
ba80: 2a 20 64 61 74 61 62 61 73 65 20 63 68 61 6e 67  * database chang
ba90: 65 73 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  es.  After each 
baa0: 73 63 68 65 6d 61 20 63 68 61 6e 67 65 2c 20 74  schema change, t
bab0: 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 0a  he cookie value.
bac0: 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 57 68 65  ** changes.  Whe
bad0: 6e 20 61 20 70 72 6f 63 65 73 73 20 66 69 72 73  n a process firs
bae0: 74 20 72 65 61 64 73 20 74 68 65 20 73 63 68 65  t reads the sche
baf0: 6d 61 20 69 74 20 72 65 63 6f 72 64 73 20 74 68  ma it records th
bb00: 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20 20 54 68  e.** cookie.  Th
bb10: 65 72 65 61 66 74 65 72 2c 20 77 68 65 6e 65 76  ereafter, whenev
bb20: 65 72 20 69 74 20 67 6f 65 73 20 74 6f 20 61 63  er it goes to ac
bb30: 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73  cess the databas
bb40: 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63 6b 73 20  e,.** it checks 
bb50: 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 6d 61  the cookie to ma
bb60: 6b 65 20 73 75 72 65 20 74 68 65 20 73 63 68 65  ke sure the sche
bb70: 6d 61 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  ma has not chang
bb80: 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69 74 20 77  ed.** since it w
bb90: 61 73 20 6c 61 73 74 20 72 65 61 64 2e 0a 2a 2a  as last read..**
bba0: 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e 20 69 73  .** This plan is
bbb0: 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   not completely 
bbc0: 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e 20 20 49  bullet-proof.  I
bbd0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
bbe0: 72 0a 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20  r.** the schema 
bbf0: 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c 74 69 70  to change multip
bc00: 6c 65 20 74 69 6d 65 73 20 61 6e 64 20 66 6f 72  le times and for
bc10: 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f 20 62   the cookie to b
bc20: 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b 20 74 6f  e.** set back to
bc30: 20 70 72 69 6f 72 20 76 61 6c 75 65 2e 20 20 42   prior value.  B
bc40: 75 74 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ut schema change
bc50: 73 20 61 72 65 20 69 6e 66 72 65 71 75 65 6e 74  s are infrequent
bc60: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70 72 6f 62  .** and the prob
bc70: 61 62 69 6c 69 74 79 20 6f 66 20 68 69 74 74 69  ability of hitti
bc80: 6e 67 20 74 68 65 20 73 61 6d 65 20 63 6f 6f 6b  ng the same cook
bc90: 69 65 20 76 61 6c 75 65 20 69 73 20 6f 6e 6c 79  ie value is only
bca0: 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20 69 6e 20  .** 1 chance in 
bcb0: 32 5e 33 32 2e 20 20 53 6f 20 77 65 27 72 65 20  2^32.  So we're 
bcc0: 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a 2a 2f 0a  safe enough..*/.
bcd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 43 68 61 6e  void sqlite3Chan
bce0: 67 65 43 6f 6f 6b 69 65 28 50 61 72 73 65 20 2a  geCookie(Parse *
bcf0: 70 50 61 72 73 65 2c 20 69 6e 74 20 69 44 62 29  pParse, int iDb)
bd00: 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73 71 6c  {.  int r1 = sql
bd10: 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
bd20: 50 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65  Parse);.  sqlite
bd30: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
bd40: 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  db;.  Vdbe *v = 
bd50: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
bd60: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bd70: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
bd80: 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20  db, iDb, 0) );. 
bd90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bda0: 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p2(v, OP_Integer
bdb0: 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  , db->aDb[iDb].p
bdc0: 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63  Schema->schema_c
bdd0: 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b 0a 20 20  ookie+1, r1);.  
bde0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bdf0: 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f 6f 6b 69  3(v, OP_SetCooki
be00: 65 2c 20 69 44 62 2c 20 42 54 52 45 45 5f 53 43  e, iDb, BTREE_SC
be10: 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c 20 72 31  HEMA_VERSION, r1
be20: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
be30: 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
be40: 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
be50: 20 4d 65 61 73 75 72 65 20 74 68 65 20 6e 75 6d   Measure the num
be60: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
be70: 73 20 6e 65 65 64 65 64 20 74 6f 20 6f 75 74 70  s needed to outp
be80: 75 74 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  ut the given.** 
be90: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 54 68 65  identifier.  The
bea0: 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e 65 64   number returned
beb0: 20 69 6e 63 6c 75 64 65 73 20 61 6e 79 20 71 75   includes any qu
bec0: 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20 62 75 74  otes used.** but
bed0: 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64   does not includ
bee0: 65 20 74 68 65 20 6e 75 6c 6c 20 74 65 72 6d 69  e the null termi
bef0: 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nator..**.** The
bf00: 20 65 73 74 69 6d 61 74 65 20 69 73 20 63 6f 6e   estimate is con
bf10: 73 65 72 76 61 74 69 76 65 2e 20 20 49 74 20 6d  servative.  It m
bf20: 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
bf30: 68 61 74 20 77 68 61 74 20 69 73 0a 2a 2a 20 72  hat what is.** r
bf40: 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e 0a 2a 2f  eally needed..*/
bf50: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 64 65 6e  .static int iden
bf60: 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63 68  tLength(const ch
bf70: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ar *z){.  int n;
bf80: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a 7a 3b 20  .  for(n=0; *z; 
bf90: 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20 20 20 69  n++, z++){.    i
bfa0: 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b 20 6e 2b  f( *z=='"' ){ n+
bfb0: 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72  +; }.  }.  retur
bfc0: 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  n n + 2;.}../*.*
bfd0: 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
bfe0: 6d 65 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74  meter is a point
bff0: 65 72 20 74 6f 20 61 6e 20 6f 75 74 70 75 74 20  er to an output 
c000: 62 75 66 66 65 72 2e 20 54 68 65 20 73 65 63 6f  buffer. The seco
c010: 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  nd .** parameter
c020: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
c030: 20 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74   an integer that
c040: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6f 66   contains the of
c050: 66 73 65 74 20 61 74 0a 2a 2a 20 77 68 69 63 68  fset at.** which
c060: 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74   to write into t
c070: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
c080: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
c090: 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a 20 6e 75  copies the.** nu
c0a0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l-terminated str
c0b0: 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ing pointed to b
c0c0: 79 20 74 68 65 20 74 68 69 72 64 20 70 61 72 61  y the third para
c0d0: 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65 64 49 64  meter, zSignedId
c0e0: 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68 65 20 73  ent,.** to the s
c0f0: 70 65 63 69 66 69 65 64 20 6f 66 66 73 65 74 20  pecified offset 
c100: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 61 6e  in the buffer an
c110: 64 20 75 70 64 61 74 65 73 20 2a 70 49 64 78 20  d updates *pIdx 
c120: 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74 6f 20 74  to refer.** to t
c130: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 61 66  he first byte af
c140: 74 65 72 20 74 68 65 20 6c 61 73 74 20 62 79 74  ter the last byt
c150: 65 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65  e written before
c160: 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 0a   returning..** .
c170: 2a 2a 20 49 66 20 74 68 65 20 73 74 72 69 6e 67  ** If the string
c180: 20 7a 53 69 67 6e 65 64 49 64 65 6e 74 20 63 6f   zSignedIdent co
c190: 6e 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20  nsists entirely 
c1a0: 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65 72 69 63  of alpha-numeric
c1b0: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 2c 20  .** characters, 
c1c0: 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77  does not begin w
c1d0: 69 74 68 20 61 20 64 69 67 69 74 20 61 6e 64 20  ith a digit and 
c1e0: 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c 20 6b 65  is not an SQL ke
c1f0: 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  yword,.** then i
c200: 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74  t is copied to t
c210: 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
c220: 20 65 78 61 63 74 6c 79 20 61 73 20 69 74 20 69   exactly as it i
c230: 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  s. Otherwise,.**
c240: 20 69 74 20 69 73 20 71 75 6f 74 65 64 20 75 73   it is quoted us
c250: 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  ing double-quote
c260: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
c270: 64 20 69 64 65 6e 74 50 75 74 28 63 68 61 72 20  d identPut(char 
c280: 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78 2c 20 63  *z, int *pIdx, c
c290: 68 61 72 20 2a 7a 53 69 67 6e 65 64 49 64 65 6e  har *zSignedIden
c2a0: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
c2b0: 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d 20 28 75  har *zIdent = (u
c2c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 53  nsigned char*)zS
c2d0: 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20 20 69 6e  ignedIdent;.  in
c2e0: 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51 75 6f 74  t i, j, needQuot
c2f0: 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64 78 3b 0a  e;.  i = *pIdx;.
c300: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65  .  for(j=0; zIde
c310: 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nt[j]; j++){.   
c320: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 73 61   if( !sqlite3Isa
c330: 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a 5d 29 20  lnum(zIdent[j]) 
c340: 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21 3d 27 5f  && zIdent[j]!='_
c350: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  ' ) break;.  }. 
c360: 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 73 71 6c   needQuote = sql
c370: 69 74 65 33 49 73 64 69 67 69 74 28 7a 49 64 65  ite3Isdigit(zIde
c380: 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20 20 20 20  nt[0]).         
c390: 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 4b 65 79     || sqlite3Key
c3a0: 77 6f 72 64 43 6f 64 65 28 7a 49 64 65 6e 74 2c  wordCode(zIdent,
c3b0: 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20 20 20 20   j)!=TK_ID.     
c3c0: 20 20 20 20 20 20 20 7c 7c 20 7a 49 64 65 6e 74         || zIdent
c3d0: 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20 20 20 20  [j]!=0.         
c3e0: 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a 20 20 69     || j==0;..  i
c3f0: 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a  f( needQuote ) z
c400: 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 66  [i++] = '"';.  f
c410: 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e 74 5b 6a  or(j=0; zIdent[j
c420: 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 5b 69  ]; j++){.    z[i
c430: 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b 6a 5d 3b  ++] = zIdent[j];
c440: 0a 20 20 20 20 69 66 28 20 7a 49 64 65 6e 74 5b  .    if( zIdent[
c450: 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69 2b 2b 5d  j]=='"' ) z[i++]
c460: 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20 20 69 66   = '"';.  }.  if
c470: 28 20 6e 65 65 64 51 75 6f 74 65 20 29 20 7a 5b  ( needQuote ) z[
c480: 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7a 5b  i++] = '"';.  z[
c490: 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49 64 78 20  i] = 0;.  *pIdx 
c4a0: 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = i;.}../*.** Ge
c4b0: 6e 65 72 61 74 65 20 61 20 43 52 45 41 54 45 20  nerate a CREATE 
c4c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
c4d0: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
c4e0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 74 61 62  the given.** tab
c4f0: 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74 6f 20 68  le.  Memory to h
c500: 6f 6c 64 20 74 68 65 20 74 65 78 74 20 6f 66 20  old the text of 
c510: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
c520: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f   obtained.** fro
c530: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
c540: 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
c550: 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
c560: 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
c570: 74 61 74 69 63 20 63 68 61 72 20 2a 63 72 65 61  tatic char *crea
c580: 74 65 54 61 62 6c 65 53 74 6d 74 28 73 71 6c 69  teTableStmt(sqli
c590: 74 65 33 20 2a 64 62 2c 20 54 61 62 6c 65 20 2a  te3 *db, Table *
c5a0: 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20  p){.  int i, k, 
c5b0: 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74  n;.  char *zStmt
c5c0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65 70 2c 20  ;.  char *zSep, 
c5d0: 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64 3b 0a 20  *zSep2, *zEnd;. 
c5e0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
c5f0: 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43   n = 0;.  for(pC
c600: 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c 20 69 3d  ol = p->aCol, i=
c610: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b  0; i<p->nCol; i+
c620: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
c630: 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e 67 74 68  n += identLength
c640: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29 20 2b 20  (pCol->zName) + 
c650: 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d 20 69 64  5;.  }.  n += id
c660: 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e 7a 4e 61  entLength(p->zNa
c670: 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c 35 30 20  me);.  if( n<50 
c680: 29 7b 20 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  ){ .    zSep = "
c690: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
c6a0: 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 22  ,";.    zEnd = "
c6b0: 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )";.  }else{.   
c6c0: 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20 22 3b 0a   zSep = "\n  ";.
c6d0: 20 20 20 20 7a 53 65 70 32 20 3d 20 22 2c 5c 6e      zSep2 = ",\n
c6e0: 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20    ";.    zEnd = 
c6f0: 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20 6e 20 2b  "\n)";.  }.  n +
c700: 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e 43 6f 6c  = 35 + 6*p->nCol
c710: 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73 71 6c 69  ;.  zStmt = sqli
c720: 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 30  te3DbMallocRaw(0
c730: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a 53 74 6d  , n);.  if( zStm
c740: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  t==0 ){.    db->
c750: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
c760: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
c770: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
c780: 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74 6d 74 2c  printf(n, zStmt,
c790: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 22   "CREATE TABLE "
c7a0: 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69 74 65 33  );.  k = sqlite3
c7b0: 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d 74 29 3b  Strlen30(zStmt);
c7c0: 0a 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d  .  identPut(zStm
c7d0: 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61 6d 65 29  t, &k, p->zName)
c7e0: 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b 5d 20 3d  ;.  zStmt[k++] =
c7f0: 20 27 28 27 3b 0a 20 20 66 6f 72 28 70 43 6f 6c   '(';.  for(pCol
c800: 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30 3b 20 69  =p->aCol, i=0; i
c810: 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 2c 20 70  <p->nCol; i++, p
c820: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 61 74  Col++){.    stat
c830: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  ic const char * 
c840: 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b 5d 20 3d  const azType[] =
c850: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51   {.        /* SQ
c860: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 20 20  LITE_AFF_BLOB   
c870: 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20 20 20 20   */ "",.        
c880: 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  /* SQLITE_AFF_TE
c890: 58 54 20 20 20 20 2a 2f 20 22 20 54 45 58 54 22  XT    */ " TEXT"
c8a0: 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c  ,.        /* SQL
c8b0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
c8c0: 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20 20 20 20  */ " NUM",.     
c8d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c8e0: 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22 20 49 4e  _INTEGER */ " IN
c8f0: 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  T",.        /* S
c900: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 20  QLITE_AFF_REAL  
c910: 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a 20 20 20    */ " REAL".   
c920: 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b   };.    int len;
c930: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
c940: 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20 73 71 6c  *zType;..    sql
c950: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d  ite3_snprintf(n-
c960: 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c 20 7a 53  k, &zStmt[k], zS
c970: 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d 20 73 71  ep);.    k += sq
c980: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 26 7a  lite3Strlen30(&z
c990: 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20 20 7a 53  Stmt[k]);.    zS
c9a0: 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20 20 20 20  ep = zSep2;.    
c9b0: 69 64 65 6e 74 50 75 74 28 7a 53 74 6d 74 2c 20  identPut(zStmt, 
c9c0: 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  &k, pCol->zName)
c9d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
c9e0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d 53 51 4c  ol->affinity-SQL
c9f0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 3e 3d 20  ITE_AFF_BLOB >= 
ca00: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
ca10: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
ca20: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
ca30: 3c 20 41 72 72 61 79 53 69 7a 65 28 61 7a 54 79  < ArraySize(azTy
ca40: 70 65 29 20 29 3b 0a 20 20 20 20 74 65 73 74 63  pe) );.    testc
ca50: 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e  ase( pCol->affin
ca60: 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ity==SQLITE_AFF_
ca70: 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74 65 73 74  BLOB );.    test
ca80: 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66 69  case( pCol->affi
ca90: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
caa0: 5f 54 45 58 54 20 29 3b 0a 20 20 20 20 74 65 73  _TEXT );.    tes
cab0: 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66 66  tcase( pCol->aff
cac0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
cad0: 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a 20 20 20  F_NUMERIC );.   
cae0: 20 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d   testcase( pCol-
caf0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
cb00: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 3b  E_AFF_INTEGER );
cb10: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
cb20: 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53  Col->affinity==S
cb30: 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 20 29  QLITE_AFF_REAL )
cb40: 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54 79 70 65  ;.    .    zType
cb50: 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f 6c 2d 3e   = azType[pCol->
cb60: 61 66 66 69 6e 69 74 79 20 2d 20 53 51 4c 49 54  affinity - SQLIT
cb70: 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a 20 20 20  E_AFF_BLOB];.   
cb80: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74   len = sqlite3St
cb90: 72 6c 65 6e 33 30 28 7a 54 79 70 65 29 3b 0a 20  rlen30(zType);. 
cba0: 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 2d     assert( pCol-
cbb0: 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  >affinity==SQLIT
cbc0: 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20 20 20 20  E_AFF_BLOB .    
cbd0: 20 20 20 20 20 20 20 20 7c 7c 20 70 43 6f 6c 2d          || pCol-
cbe0: 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71 6c 69 74  >affinity==sqlit
cbf0: 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 7a  e3AffinityType(z
cc00: 54 79 70 65 2c 20 30 29 20 29 3b 0a 20 20 20 20  Type, 0) );.    
cc10: 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74 5b 6b 5d  memcpy(&zStmt[k]
cc20: 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29 3b 0a 20  , zType, len);. 
cc30: 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20     k += len;.   
cc40: 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e 20 29 3b   assert( k<=n );
cc50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
cc60: 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20 26 7a 53  nprintf(n-k, &zS
cc70: 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c 20 7a 45  tmt[k], "%s", zE
cc80: 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 53  nd);.  return zS
cc90: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  tmt;.}../*.** Re
cca0: 73 69 7a 65 20 61 6e 20 49 6e 64 65 78 20 6f 62  size an Index ob
ccb0: 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20 4e 20 63  ject to hold N c
ccc0: 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e 20 20 52  olumns total.  R
ccd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
cce0: 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  ** on success an
ccf0: 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f  d SQLITE_NOMEM o
cd00: 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 0a  n an OOM error..
cd10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
cd20: 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28  sizeIndexObject(
cd30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 6e 64  sqlite3 *db, Ind
cd40: 65 78 20 2a 70 49 64 78 2c 20 69 6e 74 20 4e 29  ex *pIdx, int N)
cd50: 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78 74 72 61  {.  char *zExtra
cd60: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
cd70: 20 69 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75   if( pIdx->nColu
cd80: 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72 6e 20 53  mn>=N ) return S
cd90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
cda0: 72 74 28 20 70 49 64 78 2d 3e 69 73 52 65 73 69  rt( pIdx->isResi
cdb0: 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 42 79 74  zed==0 );.  nByt
cdc0: 65 20 3d 20 28 73 69 7a 65 6f 66 28 63 68 61 72  e = (sizeof(char
cdd0: 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69 31 36 29  *) + sizeof(i16)
cde0: 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45 78 74 72   + 1)*N;.  zExtr
cdf0: 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  a = sqlite3DbMal
ce00: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
ce10: 65 29 3b 0a 20 20 69 66 28 20 7a 45 78 74 72 61  e);.  if( zExtra
ce20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
ce30: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d  ITE_NOMEM;.  mem
ce40: 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64 78  cpy(zExtra, pIdx
ce50: 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a 65 6f 66  ->azColl, sizeof
ce60: 28 63 68 61 72 2a 29 2a 70 49 64 78 2d 3e 6e 43  (char*)*pIdx->nC
ce70: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
ce80: 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74 20  azColl = (const 
ce90: 63 68 61 72 2a 2a 29 7a 45 78 74 72 61 3b 0a 20  char**)zExtra;. 
cea0: 20 7a 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f   zExtra += sizeo
ceb0: 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20 20 6d 65  f(char*)*N;.  me
cec0: 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70 49 64  mcpy(zExtra, pId
ced0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 73 69 7a  x->aiColumn, siz
cee0: 65 6f 66 28 69 31 36 29 2a 70 49 64 78 2d 3e 6e  eof(i16)*pIdx->n
cef0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d  Column);.  pIdx-
cf00: 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28 69 31 36  >aiColumn = (i16
cf10: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a 45 78 74  *)zExtra;.  zExt
cf20: 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 69 31 36  ra += sizeof(i16
cf30: 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 45  )*N;.  memcpy(zE
cf40: 78 74 72 61 2c 20 70 49 64 78 2d 3e 61 53 6f 72  xtra, pIdx->aSor
cf50: 74 4f 72 64 65 72 2c 20 70 49 64 78 2d 3e 6e 43  tOrder, pIdx->nC
cf60: 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64 78 2d 3e  olumn);.  pIdx->
cf70: 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
cf80: 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70 49 64 78  *)zExtra;.  pIdx
cf90: 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e 3b 0a 20  ->nColumn = N;. 
cfa0: 20 70 49 64 78 2d 3e 69 73 52 65 73 69 7a 65 64   pIdx->isResized
cfb0: 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
cfc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cfd0: 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
cfe0: 74 6f 74 61 6c 20 72 6f 77 20 77 69 64 74 68 20  total row width 
cff0: 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a  for a table..*/.
d000: 73 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69  static void esti
d010: 6d 61 74 65 54 61 62 6c 65 57 69 64 74 68 28 54  mateTableWidth(T
d020: 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 75  able *pTab){.  u
d030: 6e 73 69 67 6e 65 64 20 77 54 61 62 6c 65 20 3d  nsigned wTable =
d040: 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 75   0;.  const Colu
d050: 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a 20 20 69  mn *pTabCol;.  i
d060: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 54  nt i;.  for(i=pT
d070: 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61 62 43 6f  ab->nCol, pTabCo
d080: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 69 3e  l=pTab->aCol; i>
d090: 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43 6f 6c 2b  0; i--, pTabCol+
d0a0: 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c 65 20 2b  +){.    wTable +
d0b0: 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a 45 73 74  = pTabCol->szEst
d0c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61 62  ;.  }.  if( pTab
d0d0: 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77 54 61 62  ->iPKey<0 ) wTab
d0e0: 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d 3e 73 7a  le++;.  pTab->sz
d0f0: 54 61 62 52 6f 77 20 3d 20 73 71 6c 69 74 65 33  TabRow = sqlite3
d100: 4c 6f 67 45 73 74 28 77 54 61 62 6c 65 2a 34 29  LogEst(wTable*4)
d110: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d  ;.}../*.** Estim
d120: 61 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20  ate the average 
d130: 73 69 7a 65 20 6f 66 20 61 20 72 6f 77 20 66 6f  size of a row fo
d140: 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73  r an index..*/.s
d150: 74 61 74 69 63 20 76 6f 69 64 20 65 73 74 69 6d  tatic void estim
d160: 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 49 6e  ateIndexWidth(In
d170: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 75 6e  dex *pIdx){.  un
d180: 73 69 67 6e 65 64 20 77 49 6e 64 65 78 20 3d 20  signed wIndex = 
d190: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  0;.  int i;.  co
d1a0: 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f 6c  nst Column *aCol
d1b0: 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d   = pIdx->pTable-
d1c0: 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28 69 3d 30  >aCol;.  for(i=0
d1d0: 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; i<pIdx->nColum
d1e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 31 36  n; i++){.    i16
d1f0: 20 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   x = pIdx->aiCol
d200: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65  umn[i];.    asse
d210: 72 74 28 20 78 3c 70 49 64 78 2d 3e 70 54 61 62  rt( x<pIdx->pTab
d220: 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20  le->nCol );.    
d230: 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30 20 3f 20  wIndex += x<0 ? 
d240: 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78 2d 3e 61  1 : aCol[pIdx->a
d250: 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73 7a 45 73  iColumn[i]].szEs
d260: 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78 2d 3e 73  t;.  }.  pIdx->s
d270: 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c 69 74 65  zIdxRow = sqlite
d280: 33 4c 6f 67 45 73 74 28 77 49 6e 64 65 78 2a 34  3LogEst(wIndex*4
d290: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  );.}../* Return 
d2a0: 74 72 75 65 20 69 66 20 76 61 6c 75 65 20 78 20  true if value x 
d2b0: 69 73 20 66 6f 75 6e 64 20 61 6e 79 20 6f 66 20  is found any of 
d2c0: 74 68 65 20 66 69 72 73 74 20 6e 43 6f 6c 20 65  the first nCol e
d2d0: 6e 74 72 69 65 73 20 6f 66 20 61 69 43 6f 6c 5b  ntries of aiCol[
d2e0: 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ].*/.static int 
d2f0: 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e 73 74 20  hasColumn(const 
d300: 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69 6e 74 20  i16 *aiCol, int 
d310: 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b 0a 20 20  nCol, int x){.  
d320: 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d 20 3e 20  while( nCol-- > 
d330: 30 20 29 20 69 66 28 20 78 3d 3d 2a 28 61 69 43  0 ) if( x==*(aiC
d340: 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72 6e 20 31  ol++) ) return 1
d350: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
d360: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
d370: 69 6e 65 20 72 75 6e 73 20 61 74 20 74 68 65 20  ine runs at the 
d380: 65 6e 64 20 6f 66 20 70 61 72 73 69 6e 67 20 61  end of parsing a
d390: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73 74   CREATE TABLE st
d3a0: 61 74 65 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20  atement that.** 
d3b0: 68 61 73 20 61 20 57 49 54 48 4f 55 54 20 52 4f  has a WITHOUT RO
d3c0: 57 49 44 20 63 6c 61 75 73 65 2e 20 20 54 68 65  WID clause.  The
d3d0: 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75   job of this rou
d3e0: 74 69 6e 65 20 69 73 20 74 6f 20 63 6f 6e 76 65  tine is to conve
d3f0: 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e 74 65 72  rt both.** inter
d400: 6e 61 6c 20 73 63 68 65 6d 61 20 64 61 74 61 20  nal schema data 
d410: 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 74  structures and t
d420: 68 65 20 67 65 6e 65 72 61 74 65 64 20 56 44 42  he generated VDB
d430: 45 20 63 6f 64 65 20 73 6f 20 74 68 61 74 20 74  E code so that t
d440: 68 65 79 0a 2a 2a 20 61 72 65 20 61 70 70 72 6f  hey.** are appro
d450: 70 72 69 61 74 65 20 66 6f 72 20 61 20 57 49 54  priate for a WIT
d460: 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
d470: 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 72 6f   instead of a ro
d480: 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a 20 43 68  wid table..** Ch
d490: 61 6e 67 65 73 20 69 6e 63 6c 75 64 65 3a 0a 2a  anges include:.*
d4a0: 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 43 6f  *.**     (1)  Co
d4b0: 6e 76 65 72 74 20 74 68 65 20 4f 50 5f 43 72 65  nvert the OP_Cre
d4c0: 61 74 65 54 61 62 6c 65 20 69 6e 74 6f 20 61 6e  ateTable into an
d4d0: 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2e   OP_CreateIndex.
d4e0: 20 20 54 68 65 72 65 20 69 73 0a 2a 2a 20 20 20    There is.**   
d4f0: 20 20 20 20 20 20 20 6e 6f 20 72 6f 77 69 64 20         no rowid 
d500: 62 74 72 65 65 20 66 6f 72 20 61 20 57 49 54 48  btree for a WITH
d510: 4f 55 54 20 52 4f 57 49 44 2e 20 20 49 6e 73 74  OUT ROWID.  Inst
d520: 65 61 64 2c 20 74 68 65 20 63 61 6e 6f 6e 69 63  ead, the canonic
d530: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 64  al.**          d
d540: 61 74 61 20 73 74 6f 72 61 67 65 20 69 73 20 61  ata storage is a
d550: 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 20   covering index 
d560: 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20 20 28 32  btree..**     (2
d570: 29 20 20 42 79 70 61 73 73 20 74 68 65 20 63 72  )  Bypass the cr
d580: 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 71  eation of the sq
d590: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
d5a0: 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20 20 20 20  e entry.**      
d5b0: 20 20 20 20 66 6f 72 20 74 68 65 20 50 52 49 4d      for the PRIM
d5c0: 41 52 59 20 4b 45 59 20 61 73 20 74 68 65 20 70  ARY KEY as the p
d5d0: 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65 78  rimary key index
d5e0: 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20 20 20 20   is now.**      
d5f0: 20 20 20 20 69 64 65 6e 74 69 66 69 65 64 20 62      identified b
d600: 79 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  y the sqlite_mas
d610: 74 65 72 20 74 61 62 6c 65 20 65 6e 74 72 79 20  ter table entry 
d620: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  of the table its
d630: 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20  elf..**     (3) 
d640: 20 53 65 74 20 74 68 65 20 49 6e 64 65 78 2e 74   Set the Index.t
d650: 6e 75 6d 20 6f 66 20 74 68 65 20 50 52 49 4d 41  num of the PRIMA
d660: 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a  RY KEY Index obj
d670: 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20  ect in the.**   
d680: 20 20 20 20 20 20 20 73 63 68 65 6d 61 20 74 6f         schema to
d690: 20 74 68 65 20 72 6f 6f 74 70 61 67 65 20 66 72   the rootpage fr
d6a0: 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  om the main tabl
d6b0: 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 53  e..**     (4)  S
d6c0: 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 20 6f  et all columns o
d6d0: 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  f the PRIMARY KE
d6e0: 59 20 73 63 68 65 6d 61 20 6f 62 6a 65 63 74 20  Y schema object 
d6f0: 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c 4c 2e 0a  to be NOT NULL..
d700: 2a 2a 20 20 20 20 20 28 35 29 20 20 41 64 64 20  **     (5)  Add 
d710: 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  all table column
d720: 73 20 74 6f 20 74 68 65 20 50 52 49 4d 41 52 59  s to the PRIMARY
d730: 20 4b 45 59 20 49 6e 64 65 78 20 6f 62 6a 65 63   KEY Index objec
d740: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f  t.**          so
d750: 20 74 68 61 74 20 74 68 65 20 50 52 49 4d 41 52   that the PRIMAR
d760: 59 20 4b 45 59 20 69 73 20 61 20 63 6f 76 65 72  Y KEY is a cover
d770: 69 6e 67 20 69 6e 64 65 78 2e 20 20 54 68 65 20  ing index.  The 
d780: 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20 20 20 20  surplus.**      
d790: 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61 72 65 20      columns are 
d7a0: 70 61 72 74 20 6f 66 20 4b 65 79 49 6e 66 6f 2e  part of KeyInfo.
d7b0: 6e 58 46 69 65 6c 64 20 61 6e 64 20 61 72 65 20  nXField and are 
d7c0: 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  not used for.** 
d7d0: 20 20 20 20 20 20 20 20 20 73 6f 72 74 69 6e 67           sorting
d7e0: 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72 20 75 6e   or lookup or un
d7f0: 69 71 75 65 6e 65 73 73 20 63 68 65 63 6b 73 2e  iqueness checks.
d800: 0a 2a 2a 20 20 20 20 20 28 36 29 20 20 52 65 70  .**     (6)  Rep
d810: 6c 61 63 65 20 74 68 65 20 72 6f 77 69 64 20 74  lace the rowid t
d820: 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75 74 6f 6d  ail on all autom
d830: 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
d840: 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20 20 20 20  ed UNIQUE.**    
d850: 20 20 20 20 20 20 69 6e 64 69 63 65 73 20 77 69        indices wi
d860: 74 68 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  th the PRIMARY K
d870: 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73  EY columns..*/.s
d880: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 6e 76 65  tatic void conve
d890: 72 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64  rtToWithoutRowid
d8a0: 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
d8b0: 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62  rse, Table *pTab
d8c0: 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  ){.  Index *pIdx
d8d0: 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50 6b 3b 0a  ;.  Index *pPk;.
d8e0: 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20 69 6e 74    int nPk;.  int
d8f0: 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33   i, j;.  sqlite3
d900: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
d910: 62 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  b;.  Vdbe *v = p
d920: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
d930: 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
d940: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 6f  OP_CreateTable o
d950: 70 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64  pcode that would
d960: 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65 61 74 65   normally create
d970: 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f 74 2d 70   the.  ** root-p
d980: 61 67 65 20 66 6f 72 20 74 68 65 20 74 61 62 6c  age for the tabl
d990: 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f 43 72 65  e into an OP_Cre
d9a0: 61 74 65 49 6e 64 65 78 20 6f 70 63 6f 64 65 2e  ateIndex opcode.
d9b0: 20 20 54 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a    The index.  **
d9c0: 20 63 72 65 61 74 65 64 20 77 69 6c 6c 20 62 65   created will be
d9d0: 63 6f 6d 65 20 74 68 65 20 50 52 49 4d 41 52 59  come the PRIMARY
d9e0: 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20 20 2a 2f   KEY index..  */
d9f0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61  .  if( pParse->a
da00: 64 64 72 43 72 54 61 62 20 29 7b 0a 20 20 20 20  ddrCrTab ){.    
da10: 61 73 73 65 72 74 28 20 76 20 29 3b 0a 20 20 20  assert( v );.   
da20: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
da30: 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 61 72  geOpcode(v, pPar
da40: 73 65 2d 3e 61 64 64 72 43 72 54 61 62 2c 20 4f  se->addrCrTab, O
da50: 50 5f 43 72 65 61 74 65 49 6e 64 65 78 29 3b 0a  P_CreateIndex);.
da60: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
da70: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
da80: 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20 69 66 20   index.  Or, if 
da90: 74 68 69 73 20 74 61 62 6c 65 20 77 61 73 20 6f  this table was o
daa0: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 61  riginally.  ** a
dab0: 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  n INTEGER PRIMAR
dac0: 59 20 4b 45 59 20 74 61 62 6c 65 2c 20 63 72 65  Y KEY table, cre
dad0: 61 74 65 20 61 20 6e 65 77 20 50 52 49 4d 41 52  ate a new PRIMAR
dae0: 59 20 4b 45 59 20 69 6e 64 65 78 2e 20 0a 20 20  Y KEY index. .  
daf0: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69  */.  if( pTab->i
db00: 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 45  PKey>=0 ){.    E
db10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a  xprList *pList;.
db20: 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b 54 6f 6b      Token ipkTok
db30: 65 6e 3b 0a 20 20 20 20 69 70 6b 54 6f 6b 65 6e  en;.    ipkToken
db40: 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  .z = pTab->aCol[
db50: 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61  pTab->iPKey].zNa
db60: 6d 65 3b 0a 20 20 20 20 69 70 6b 54 6f 6b 65 6e  me;.    ipkToken
db70: 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  .n = sqlite3Strl
db80: 65 6e 33 30 28 69 70 6b 54 6f 6b 65 6e 2e 7a 29  en30(ipkToken.z)
db90: 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  ;.    pList = sq
dba0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
dbb0: 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c 20 0a  end(pParse, 0, .
dbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
dbe0: 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 69  oc(db, TK_ID, &i
dbf0: 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b 0a 20 20  pkToken, 0));.  
dc00: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
dc10: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 69   return;.    pLi
dc20: 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  st->a[0].sortOrd
dc30: 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 69 50 6b  er = pParse->iPk
dc40: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 61  SortOrder;.    a
dc50: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 70  ssert( pParse->p
dc60: 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61 62 20 29  NewTable==pTab )
dc70: 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73 71 6c 69  ;.    pPk = sqli
dc80: 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 70  te3CreateIndex(p
dc90: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 30 2c 20  Parse, 0, 0, 0, 
dca0: 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e 6b 65 79  pList, pTab->key
dcb0: 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Conf, 0, 0, 0, 0
dcc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 50 6b 3d 3d  );.    if( pPk==
dcd0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
dce0: 70 50 6b 2d 3e 69 64 78 54 79 70 65 20 3d 20 53  pPk->idxType = S
dcf0: 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 50 52  QLITE_IDXTYPE_PR
dd00: 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20 20 70 54  IMARYKEY;.    pT
dd10: 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d 31 3b 0a  ab->iPKey = -1;.
dd20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b    }else{.    pPk
dd30: 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
dd40: 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
dd50: 0a 0a 20 20 20 20 2f 2a 20 42 79 70 61 73 73 20  ..    /* Bypass 
dd60: 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
dd70: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
dd80: 62 74 72 65 65 20 61 6e 64 20 74 68 65 20 73 71  btree and the sq
dd90: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 20 20  lite_master.    
dda0: 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20  ** table entry. 
ddb0: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 72 65 71  This is only req
ddc0: 75 69 72 65 64 20 69 66 20 63 75 72 72 65 6e 74  uired if current
ddd0: 6c 79 20 67 65 6e 65 72 61 74 69 6e 67 20 56 44  ly generating VD
dde0: 42 45 0a 20 20 20 20 2a 2a 20 63 6f 64 65 20 66  BE.    ** code f
ddf0: 6f 72 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  or a CREATE TABL
de00: 45 20 28 6e 6f 74 20 77 68 65 6e 20 70 61 72 73  E (not when pars
de10: 69 6e 67 20 6f 6e 65 20 61 73 20 70 61 72 74 20  ing one as part 
de20: 6f 66 20 72 65 61 64 69 6e 67 0a 20 20 20 20 2a  of reading.    *
de30: 2a 20 61 20 64 61 74 61 62 61 73 65 20 73 63 68  * a database sch
de40: 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ema).  */.    if
de50: 28 20 76 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ( v ){.      ass
de60: 65 72 74 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75  ert( db->init.bu
de70: 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  sy==0 );.      s
de80: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
de90: 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b 2d 3e 74  Opcode(v, pPk->t
dea0: 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29 3b 0a 20  num, OP_Goto);. 
deb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
dec0: 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 72   ** Remove all r
ded0: 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
dee0: 20 66 72 6f 6d 20 74 68 65 20 50 52 49 4d 41 52   from the PRIMAR
def0: 59 20 4b 45 59 2e 20 20 46 6f 72 20 65 78 61 6d  Y KEY.  For exam
df00: 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20 20 20 20  ple, change.    
df10: 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b 45 59 28  ** "PRIMARY KEY(
df20: 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63 2c 64 29  a,b,a,b,c,b,c,d)
df30: 22 20 69 6e 74 6f 20 6a 75 73 74 20 22 50 52 49  " into just "PRI
df40: 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c 63 2c 64  MARY KEY(a,b,c,d
df50: 29 22 2e 20 20 4c 61 74 65 72 0a 20 20 20 20 2a  )".  Later.    *
df60: 2a 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  * code assumes t
df70: 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  he PRIMARY KEY c
df80: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65 70 65 61  ontains no repea
df90: 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20  ted columns..   
dfa0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d   */.    for(i=j=
dfb0: 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f  1; i<pPk->nKeyCo
dfc0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  l; i++){.      i
dfd0: 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28 70 50 6b  f( hasColumn(pPk
dfe0: 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a 2c 20 70  ->aiColumn, j, p
dff0: 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 29  Pk->aiColumn[i])
e000: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 6b 2d   ){.        pPk-
e010: 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20 20 20 20  >nColumn--;.    
e020: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e030: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a   pPk->aiColumn[j
e040: 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c  ++] = pPk->aiCol
e050: 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  umn[i];.      }.
e060: 20 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 6e      }.    pPk->n
e070: 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20 20 7d 0a  KeyCol = j;.  }.
e080: 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65 72 69 6e    pPk->isCoverin
e090: 67 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  g = 1;.  assert(
e0a0: 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20 6e 50 6b   pPk!=0 );.  nPk
e0b0: 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   = pPk->nKeyCol;
e0c0: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
e0d0: 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e 20 6f 66   every column of
e0e0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e0f0: 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e 20 20 28   is NOT NULL.  (
e100: 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20 64 6f 20  Except,.  ** do 
e110: 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74 68 69 73  not enforce this
e120: 20 66 6f 72 20 69 6d 70 6f 73 74 65 72 20 74 61   for imposter ta
e130: 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69 66 28 20  bles.) */.  if( 
e140: 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70 6f 73 74  !db->init.impost
e150: 65 72 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  erTable ){.    f
e160: 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b 3b 20 69  or(i=0; i<nPk; i
e170: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54 61 62 2d  ++){.      pTab-
e180: 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69 43 6f 6c  >aCol[pPk->aiCol
e190: 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75 6c 6c 20  umn[i]].notNull 
e1a0: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20  = OE_Abort;.    
e1b0: 7d 0a 20 20 20 20 70 50 6b 2d 3e 75 6e 69 71 4e  }.    pPk->uniqN
e1c0: 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20 20 7d 0a  otNull = 1;.  }.
e1d0: 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70  .  /* The root p
e1e0: 61 67 65 20 6f 66 20 74 68 65 20 50 52 49 4d 41  age of the PRIMA
e1f0: 52 59 20 4b 45 59 20 69 73 20 74 68 65 20 74 61  RY KEY is the ta
e200: 62 6c 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f  ble root page */
e210: 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20 3d 20 70  .  pPk->tnum = p
e220: 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20 20 2f 2a  Tab->tnum;..  /*
e230: 20 55 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   Update the in-m
e240: 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
e250: 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55 4e 49 51  tion of all UNIQ
e260: 55 45 20 69 6e 64 69 63 65 73 20 62 79 20 63 6f  UE indices by co
e270: 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a 20 74 68  nverting.  ** th
e280: 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 63 6f  e final rowid co
e290: 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65 20 6f 72  lumn into one or
e2a0: 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66   more columns of
e2b0: 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
e2c0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 49 64  ..  */.  for(pId
e2d0: 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
e2e0: 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
e2f0: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  >pNext){.    int
e300: 20 6e 3b 0a 20 20 20 20 69 66 28 20 49 73 50 72   n;.    if( IsPr
e310: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 49  imaryKeyIndex(pI
e320: 64 78 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  dx) ) continue;.
e330: 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 69      for(i=n=0; i
e340: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
e350: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
e360: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
e370: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
e380: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e390: 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) ) n++;.    }. 
e3a0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20     if( n==0 ){. 
e3b0: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 6e 64       /* This ind
e3c0: 65 78 20 69 73 20 61 20 73 75 70 65 72 73 65 74  ex is a superset
e3d0: 20 6f 66 20 74 68 65 20 70 72 69 6d 61 72 79 20   of the primary 
e3e0: 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20 70 49 64  key */.      pId
e3f0: 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 49 64  x->nColumn = pId
e400: 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 20 20  x->nKeyCol;.    
e410: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
e420: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 69 7a 65  }.    if( resize
e430: 49 6e 64 65 78 4f 62 6a 65 63 74 28 64 62 2c 20  IndexObject(db, 
e440: 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e 4b 65 79  pIdx, pIdx->nKey
e450: 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75 72 6e 3b  Col+n) ) return;
e460: 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 6a 3d  .    for(i=0, j=
e470: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 20 69  pIdx->nKeyCol; i
e480: 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nPk; i++){.    
e490: 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d 6e    if( !hasColumn
e4a0: 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  (pIdx->aiColumn,
e4b0: 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20   pIdx->nKeyCol, 
e4c0: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d  pPk->aiColumn[i]
e4d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 64  ) ){.        pId
e4e0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 3d  x->aiColumn[j] =
e4f0: 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69   pPk->aiColumn[i
e500: 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  ];.        pIdx-
e510: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20 70 50 6b  >azColl[j] = pPk
e520: 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20  ->azColl[i];.   
e530: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
e540: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
e550: 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  rt( pIdx->nColum
e560: 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c  n>=pIdx->nKeyCol
e570: 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  +n );.    assert
e580: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
e590: 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =j );.  }..  /* 
e5a0: 41 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f  Add all table co
e5b0: 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49  lumns to the PRI
e5c0: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 0a 20  MARY KEY index. 
e5d0: 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b 3c 70 54   */.  if( nPk<pT
e5e0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
e5f0: 69 66 28 20 72 65 73 69 7a 65 49 6e 64 65 78 4f  if( resizeIndexO
e600: 62 6a 65 63 74 28 64 62 2c 20 70 50 6b 2c 20 70  bject(db, pPk, p
e610: 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20 72 65 74  Tab->nCol) ) ret
e620: 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  urn;.    for(i=0
e630: 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54 61 62 2d  , j=nPk; i<pTab-
e640: 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
e650: 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c 75 6d     if( !hasColum
e660: 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c  n(pPk->aiColumn,
e670: 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20 20 20 20   j, i) ){.      
e680: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 50 6b 2d    assert( j<pPk-
e690: 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  >nColumn );.    
e6a0: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
e6b0: 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  n[j] = i;.      
e6c0: 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d    pPk->azColl[j]
e6d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e   = sqlite3StrBIN
e6e0: 41 52 59 3b 0a 20 20 20 20 20 20 20 20 6a 2b 2b  ARY;.        j++
e6f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e700: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 6b 2d      assert( pPk-
e710: 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29 3b 0a 20  >nColumn==j );. 
e720: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
e730: 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20 20 7d 65  >nCol==j );.  }e
e740: 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d 3e 6e 43  lse{.    pPk->nC
e750: 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d 3e 6e 43  olumn = pTab->nC
e760: 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ol;.  }.}../*.**
e770: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
e780: 20 63 61 6c 6c 65 64 20 74 6f 20 72 65 70 6f 72   called to repor
e790: 74 20 74 68 65 20 66 69 6e 61 6c 20 22 29 22 20  t the final ")" 
e7a0: 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 0a  that terminates.
e7b0: 2a 2a 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  ** a CREATE TABL
e7c0: 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
e7d0: 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 73 74 72  ** The table str
e7e0: 75 63 74 75 72 65 20 74 68 61 74 20 6f 74 68 65  ucture that othe
e7f0: 72 20 61 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65  r action routine
e800: 73 20 68 61 76 65 20 62 65 65 6e 20 62 75 69 6c  s have been buil
e810: 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64 64 65 64  ding.** is added
e820: 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   to the internal
e830: 20 68 61 73 68 20 74 61 62 6c 65 73 2c 20 61 73   hash tables, as
e840: 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72 6f 72 73  suming no errors
e850: 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75 72 72 65   have.** occurre
e860: 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 6e 74 72  d..**.** An entr
e870: 79 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  y for the table 
e880: 69 73 20 6d 61 64 65 20 69 6e 20 74 68 65 20 6d  is made in the m
e890: 61 73 74 65 72 20 74 61 62 6c 65 20 6f 6e 20 64  aster table on d
e8a0: 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a 2a 20 74  isk, unless.** t
e8b0: 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f 72 61  his is a tempora
e8c0: 72 79 20 74 61 62 6c 65 20 6f 72 20 64 62 2d 3e  ry table or db->
e8d0: 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e 20 20 57  init.busy==1.  W
e8e0: 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  hen db->init.bus
e8f0: 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65 61 6e 73  y==1.** it means
e900: 20 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20   we are reading 
e910: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e920: 72 20 74 61 62 6c 65 20 62 65 63 61 75 73 65 20  r table because 
e930: 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f 6e 6e 65  we just.** conne
e940: 63 74 65 64 20 74 6f 20 74 68 65 20 64 61 74 61  cted to the data
e950: 62 61 73 65 20 6f 72 20 62 65 63 61 75 73 65 20  base or because 
e960: 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
e970: 72 20 74 61 62 6c 65 20 68 61 73 0a 2a 2a 20 72  r table has.** r
e980: 65 63 65 6e 74 6c 79 20 63 68 61 6e 67 65 64 2c  ecently changed,
e990: 20 73 6f 20 74 68 65 20 65 6e 74 72 79 20 66 6f   so the entry fo
e9a0: 72 20 74 68 69 73 20 74 61 62 6c 65 20 61 6c 72  r this table alr
e9b0: 65 61 64 79 20 65 78 69 73 74 73 20 69 6e 0a 2a  eady exists in.*
e9c0: 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
e9d0: 74 65 72 20 74 61 62 6c 65 2e 20 20 57 65 20 64  ter table.  We d
e9e0: 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f 20 63 72  o not want to cr
e9f0: 65 61 74 65 20 69 74 20 61 67 61 69 6e 2e 0a 2a  eate it again..*
ea00: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 53 65 6c  *.** If the pSel
ea10: 65 63 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ect argument is 
ea20: 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  not NULL, it mea
ea30: 6e 73 20 74 68 61 74 20 74 68 69 73 20 72 6f 75  ns that this rou
ea40: 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63 61 6c 6c  tine.** was call
ea50: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 74  ed to create a t
ea60: 61 62 6c 65 20 67 65 6e 65 72 61 74 65 64 20 66  able generated f
ea70: 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52 45 41 54  rom a .** "CREAT
ea80: 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41 53 20 53  E TABLE ... AS S
ea90: 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74 61 74 65  ELECT ..." state
eaa0: 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f 6c 75 6d  ment.  The colum
eab0: 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  n names of.** th
eac0: 65 20 6e 65 77 20 74 61 62 6c 65 20 77 69 6c 6c  e new table will
ead0: 20 6d 61 74 63 68 20 74 68 65 20 72 65 73 75 6c   match the resul
eae0: 74 20 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c  t set of the SEL
eaf0: 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ECT..*/.void sql
eb00: 69 74 65 33 45 6e 64 54 61 62 6c 65 28 0a 20 20  ite3EndTable(.  
eb10: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
eb20: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
eb30: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f   context */.  To
eb40: 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20 20 20 20  ken *pCons,     
eb50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 27 2c 27        /* The ','
eb60: 20 74 6f 6b 65 6e 20 61 66 74 65 72 20 74 68 65   token after the
eb70: 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 64 65 66   last column def
eb80: 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  n. */.  Token *p
eb90: 45 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  End,            
eba0: 2f 2a 20 54 68 65 20 27 29 27 20 62 65 66 6f 72  /* The ')' befor
ebb0: 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20 74 68 65  e options in the
ebc0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 2a 2f   CREATE TABLE */
ebd0: 0a 20 20 75 38 20 74 61 62 4f 70 74 73 2c 20 20  .  u8 tabOpts,  
ebe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
ebf0: 74 72 61 20 74 61 62 6c 65 20 6f 70 74 69 6f 6e  tra table option
ec00: 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e 20 2a 2f  s. Usually 0. */
ec10: 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
ec20: 63 74 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ct         /* Se
ec30: 6c 65 63 74 20 66 72 6f 6d 20 61 20 22 43 52 45  lect from a "CRE
ec40: 41 54 45 20 2e 2e 2e 20 41 53 20 53 45 4c 45 43  ATE ... AS SELEC
ec50: 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  T" */.){.  Table
ec60: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
ec70: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
ec80: 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74  table */.  sqlit
ec90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
eca0: 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61 74 61  >db; /* The data
ecb0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
ecc0: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20  */.  int iDb;   
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ece0: 2a 20 44 61 74 61 62 61 73 65 20 69 6e 20 77 68  * Database in wh
ecf0: 69 63 68 20 74 68 65 20 74 61 62 6c 65 20 6c 69  ich the table li
ed00: 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ves */.  Index *
ed10: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
ed20: 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c 69 65 64     /* An implied
ed30: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 61   index of the ta
ed40: 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 45  ble */..  if( pE
ed50: 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c 65 63 74  nd==0 && pSelect
ed60: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
ed70: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
ed80: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
ed90: 65 64 20 29 3b 0a 20 20 70 20 3d 20 70 50 61 72  ed );.  p = pPar
eda0: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20  se->pNewTable;. 
edb0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
edc0: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21  rn;..  assert( !
edd0: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 7c 7c  db->init.busy ||
ede0: 20 21 70 53 65 6c 65 63 74 20 29 3b 0a 0a 20 20   !pSelect );..  
edf0: 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 3e 69 6e  /* If the db->in
ee00: 69 74 2e 62 75 73 79 20 69 73 20 31 20 69 74 20  it.busy is 1 it 
ee10: 6d 65 61 6e 73 20 77 65 20 61 72 65 20 72 65 61  means we are rea
ee20: 64 69 6e 67 20 74 68 65 20 53 51 4c 20 6f 66 66  ding the SQL off
ee30: 20 74 68 65 0a 20 20 2a 2a 20 22 73 71 6c 69 74   the.  ** "sqlit
ee40: 65 5f 6d 61 73 74 65 72 22 20 6f 72 20 22 73 71  e_master" or "sq
ee50: 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
ee60: 22 20 74 61 62 6c 65 20 6f 6e 20 74 68 65 20 64  " table on the d
ee70: 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20 64 6f 20  isk..  ** So do 
ee80: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
ee90: 20 64 69 73 6b 20 61 67 61 69 6e 2e 20 20 45 78   disk again.  Ex
eea0: 74 72 61 63 74 20 74 68 65 20 72 6f 6f 74 20 70  tract the root p
eeb0: 61 67 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a 20  age number.  ** 
eec0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 66 72  for the table fr
eed0: 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e 69 74 2e  om the db->init.
eee0: 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64 2e 20 20  newTnum field.  
eef0: 28 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72  (The page number
ef00: 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20 68 61 76  .  ** should hav
ef10: 65 20 62 65 65 6e 20 70 75 74 20 74 68 65 72 65  e been put there
ef20: 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 4f 70   by the sqliteOp
ef30: 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e 29 0a 20  enCb routine.). 
ef40: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
ef50: 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72  root page number
ef60: 20 69 73 20 31 2c 20 74 68 61 74 20 6d 65 61 6e   is 1, that mean
ef70: 73 20 74 68 69 73 20 69 73 20 74 68 65 20 73 71  s this is the sq
ef80: 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a  lite_master.  **
ef90: 20 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 20 20   table itself.  
efa0: 53 6f 20 6d 61 72 6b 20 69 74 20 72 65 61 64 2d  So mark it read-
efb0: 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  only..  */.  if(
efc0: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29   db->init.busy )
efd0: 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d 20 3d 20  {.    p->tnum = 
efe0: 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d  db->init.newTnum
eff0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 74 6e 75  ;.    if( p->tnu
f000: 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62 46 6c 61  m==1 ) p->tabFla
f010: 67 73 20 7c 3d 20 54 46 5f 52 65 61 64 6f 6e 6c  gs |= TF_Readonl
f020: 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 65  y;.  }..  /* Spe
f030: 63 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 20  cial processing 
f040: 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49  for WITHOUT ROWI
f050: 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20 20 69 66  D Tables */.  if
f060: 28 20 74 61 62 4f 70 74 73 20 26 20 54 46 5f 57  ( tabOpts & TF_W
f070: 69 74 68 6f 75 74 52 6f 77 69 64 20 29 7b 0a 20  ithoutRowid ){. 
f080: 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c     if( (p->tabFl
f090: 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
f0a0: 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20 20 20 20  rement) ){.     
f0b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
f0c0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
f0d0: 20 20 20 22 41 55 54 4f 49 4e 43 52 45 4d 45 4e     "AUTOINCREMEN
f0e0: 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 6f 6e  T not allowed on
f0f0: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
f100: 61 62 6c 65 73 22 29 3b 0a 20 20 20 20 20 20 72  ables");.      r
f110: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
f120: 20 69 66 28 20 28 70 2d 3e 74 61 62 46 6c 61 67   if( (p->tabFlag
f130: 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61 72  s & TF_HasPrimar
f140: 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  yKey)==0 ){.    
f150: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
f160: 67 28 70 50 61 72 73 65 2c 20 22 50 52 49 4d 41  g(pParse, "PRIMA
f170: 52 59 20 4b 45 59 20 6d 69 73 73 69 6e 67 20 6f  RY KEY missing o
f180: 6e 20 74 61 62 6c 65 20 25 73 22 2c 20 70 2d 3e  n table %s", p->
f190: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
f1a0: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74 61 62 46  e{.      p->tabF
f1b0: 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69 74 68 6f  lags |= TF_Witho
f1c0: 75 74 52 6f 77 69 64 20 7c 20 54 46 5f 4e 6f 56  utRowid | TF_NoV
f1d0: 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a 20 20 20  isibleRowid;.   
f1e0: 20 20 20 63 6f 6e 76 65 72 74 54 6f 57 69 74 68     convertToWith
f1f0: 6f 75 74 52 6f 77 69 64 54 61 62 6c 65 28 70 50  outRowidTable(pP
f200: 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  arse, p);.    }.
f210: 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20 73 71 6c    }..  iDb = sql
f220: 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
f230: 78 28 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61  x(db, p->pSchema
f240: 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
f250: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
f260: 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  /* Resolve names
f270: 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b 20 63 6f   in all CHECK co
f280: 6e 73 74 72 61 69 6e 74 20 65 78 70 72 65 73 73  nstraint express
f290: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
f2a0: 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b 0a 20 20   p->pCheck ){.  
f2b0: 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65    sqlite3Resolve
f2c0: 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70 50  SelfReference(pP
f2d0: 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49 73 43 68  arse, p, NC_IsCh
f2e0: 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43 68 65 63  eck, 0, p->pChec
f2f0: 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  k);.  }.#endif /
f300: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
f310: 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29 20 2a 2f  E_OMIT_CHECK) */
f320: 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 20  ..  /* Estimate 
f330: 74 68 65 20 61 76 65 72 61 67 65 20 72 6f 77 20  the average row 
f340: 73 69 7a 65 20 66 6f 72 20 74 68 65 20 74 61 62  size for the tab
f350: 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c 6c 20 69  le and for all i
f360: 6d 70 6c 69 65 64 20 69 6e 64 69 63 65 73 20 2a  mplied indices *
f370: 2f 0a 20 20 65 73 74 69 6d 61 74 65 54 61 62 6c  /.  estimateTabl
f380: 65 57 69 64 74 68 28 70 29 3b 0a 20 20 66 6f 72  eWidth(p);.  for
f390: 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64 65 78 3b  (pIdx=p->pIndex;
f3a0: 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78   pIdx; pIdx=pIdx
f3b0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 65 73  ->pNext){.    es
f3c0: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
f3d0: 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  (pIdx);.  }..  /
f3e0: 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74 69 61 6c  * If not initial
f3f0: 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63 72 65 61  izing, then crea
f400: 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f 72 20  te a record for 
f410: 74 68 65 20 6e 65 77 20 74 61 62 6c 65 0a 20 20  the new table.  
f420: 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  ** in the SQLITE
f430: 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 6f 66  _MASTER table of
f440: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
f450: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
f460: 20 69 73 20 61 20 54 45 4d 50 4f 52 41 52 59 20   is a TEMPORARY 
f470: 74 61 62 6c 65 2c 20 77 72 69 74 65 20 74 68 65  table, write the
f480: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
f490: 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 66  auxiliary.  ** f
f4a0: 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ile instead of i
f4b0: 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
f4c0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
f4d0: 0a 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74  .  if( !db->init
f4e0: 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 69 6e 74  .busy ){.    int
f4f0: 20 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b   n;.    Vdbe *v;
f500: 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65  .    char *zType
f510: 3b 20 20 20 20 2f 2a 20 22 76 69 65 77 22 20 6f  ;    /* "view" o
f520: 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a 20 20 20  r "table" */.   
f530: 20 63 68 61 72 20 2a 7a 54 79 70 65 32 3b 20 20   char *zType2;  
f540: 20 2f 2a 20 22 56 49 45 57 22 20 6f 72 20 22 54   /* "VIEW" or "T
f550: 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20 63 68 61  ABLE" */.    cha
f560: 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20 2f 2a 20  r *zStmt;    /* 
f570: 54 65 78 74 20 6f 66 20 74 68 65 20 43 52 45 41  Text of the CREA
f580: 54 45 20 54 41 42 4c 45 20 6f 72 20 43 52 45 41  TE TABLE or CREA
f590: 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
f5a0: 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d 20 73 71  t */..    v = sq
f5b0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
f5c0: 72 73 65 29 3b 0a 20 20 20 20 69 66 28 20 4e 45  rse);.    if( NE
f5d0: 56 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75  VER(v==0) ) retu
f5e0: 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  rn;..    sqlite3
f5f0: 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
f600: 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a 20 20 20  _Close, 0);..   
f610: 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49 6e 69 74   /* .    ** Init
f620: 69 61 6c 69 7a 65 20 7a 54 79 70 65 20 66 6f 72  ialize zType for
f630: 20 74 68 65 20 6e 65 77 20 76 69 65 77 20 6f 72   the new view or
f640: 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20   table..    */. 
f650: 20 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63     if( p->pSelec
f660: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
f670: 20 41 20 72 65 67 75 6c 61 72 20 74 61 62 6c 65   A regular table
f680: 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79 70 65 20   */.      zType 
f690: 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20 20 20 20  = "table";.     
f6a0: 20 7a 54 79 70 65 32 20 3d 20 22 54 41 42 4c 45   zType2 = "TABLE
f6b0: 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ";.#ifndef SQLIT
f6c0: 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 20 20  E_OMIT_VIEW.    
f6d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
f6e0: 41 20 76 69 65 77 20 2a 2f 0a 20 20 20 20 20 20  A view */.      
f6f0: 7a 54 79 70 65 20 3d 20 22 76 69 65 77 22 3b 0a  zType = "view";.
f700: 20 20 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22        zType2 = "
f710: 56 49 45 57 22 3b 0a 23 65 6e 64 69 66 0a 20 20  VIEW";.#endif.  
f720: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
f730: 68 69 73 20 69 73 20 61 20 43 52 45 41 54 45 20  his is a CREATE 
f740: 54 41 42 4c 45 20 78 78 20 41 53 20 53 45 4c 45  TABLE xx AS SELE
f750: 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75 74 65 20  CT ..., execute 
f760: 74 68 65 20 53 45 4c 45 43 54 0a 20 20 20 20 2a  the SELECT.    *
f770: 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 70  * statement to p
f780: 6f 70 75 6c 61 74 65 20 74 68 65 20 6e 65 77 20  opulate the new 
f790: 74 61 62 6c 65 2e 20 54 68 65 20 72 6f 6f 74 2d  table. The root-
f7a0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
f7b0: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 77 20 74  the.    ** new t
f7c0: 61 62 6c 65 20 69 73 20 69 6e 20 72 65 67 69 73  able is in regis
f7d0: 74 65 72 20 70 50 61 72 73 65 2d 3e 72 65 67 52  ter pParse->regR
f7e0: 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oot..    **.    
f7f0: 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53 45 4c 45  ** Once the SELE
f800: 43 54 20 68 61 73 20 62 65 65 6e 20 63 6f 64 65  CT has been code
f810: 64 20 62 79 20 73 71 6c 69 74 65 33 53 65 6c 65  d by sqlite3Sele
f820: 63 74 28 29 2c 20 69 74 20 69 73 20 69 6e 20 61  ct(), it is in a
f830: 0a 20 20 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  .    ** suitable
f840: 20 73 74 61 74 65 20 74 6f 20 71 75 65 72 79 20   state to query 
f850: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
f860: 61 6d 65 73 20 61 6e 64 20 74 79 70 65 73 20 74  ames and types t
f870: 6f 20 62 65 20 75 73 65 64 0a 20 20 20 20 2a 2a  o be used.    **
f880: 20 62 79 20 74 68 65 20 6e 65 77 20 74 61 62 6c   by the new tabl
f890: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
f8a0: 20 41 20 73 68 61 72 65 64 2d 63 61 63 68 65 20   A shared-cache 
f8b0: 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73 20 6e 6f  write-lock is no
f8c0: 74 20 72 65 71 75 69 72 65 64 20 74 6f 20 77 72  t required to wr
f8d0: 69 74 65 20 74 6f 20 74 68 65 20 6e 65 77 20 74  ite to the new t
f8e0: 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 61 73 20  able,.    ** as 
f8f0: 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b 20 6d 75  a schema-lock mu
f900: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
f910: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 74 6f  been obtained to
f920: 20 63 72 65 61 74 65 20 69 74 2e 20 53 69 6e 63   create it. Sinc
f930: 65 0a 20 20 20 20 2a 2a 20 61 20 73 63 68 65 6d  e.    ** a schem
f940: 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64 65 73 20  a-lock excludes 
f950: 61 6c 6c 20 6f 74 68 65 72 20 64 61 74 61 62 61  all other databa
f960: 73 65 20 75 73 65 72 73 2c 20 74 68 65 20 77 72  se users, the wr
f970: 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c 64 0a 20  ite-lock would. 
f980: 20 20 20 2a 2a 20 62 65 20 72 65 64 75 6e 64 61     ** be redunda
f990: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nt..    */.    i
f9a0: 66 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  f( pSelect ){.  
f9b0: 20 20 20 20 53 65 6c 65 63 74 44 65 73 74 20 64      SelectDest d
f9c0: 65 73 74 3b 20 20 20 20 2f 2a 20 57 68 65 72 65  est;    /* Where
f9d0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 68 6f 75   the SELECT shou
f9e0: 6c 64 20 73 74 6f 72 65 20 72 65 73 75 6c 74 73  ld store results
f9f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65   */.      int re
fa00: 67 59 69 65 6c 64 3b 20 20 20 20 20 20 20 2f 2a  gYield;       /*
fa10: 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
fa20: 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20 65 6e 74  g co-routine ent
fa30: 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ry-point */.    
fa40: 20 20 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20    int addrTop;  
fa50: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
fa60: 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e 65 20 2a  the co-routine *
fa70: 2f 0a 20 20 20 20 20 20 69 6e 74 20 72 65 67 52  /.      int regR
fa80: 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ec;         /* A
fa90: 20 72 65 63 6f 72 64 20 74 6f 20 62 65 20 69 6e   record to be in
faa0: 73 65 72 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  sert into the ne
fab0: 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  w table */.     
fac0: 20 69 6e 74 20 72 65 67 52 6f 77 69 64 3b 20 20   int regRowid;  
fad0: 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 6f 66       /* Rowid of
fae0: 20 74 68 65 20 6e 65 78 74 20 72 6f 77 20 74 6f   the next row to
faf0: 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 20   insert */.     
fb00: 20 69 6e 74 20 61 64 64 72 49 6e 73 4c 6f 6f 70   int addrInsLoop
fb10: 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  ;    /* Top of t
fb20: 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69 6e 73 65  he loop for inse
fb30: 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f 0a 20 20  rting rows */.  
fb40: 20 20 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54      Table *pSelT
fb50: 61 62 3b 20 20 20 20 20 2f 2a 20 41 20 74 61 62  ab;     /* A tab
fb60: 6c 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  le that describe
fb70: 73 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 73  s the SELECT res
fb80: 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ults */..      r
fb90: 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70 50 61 72  egYield = ++pPar
fba0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
fbb0: 72 65 67 52 65 63 20 3d 20 2b 2b 70 50 61 72 73  regRec = ++pPars
fbc0: 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72  e->nMem;.      r
fbd0: 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72  egRowid = ++pPar
fbe0: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
fbf0: 61 73 73 65 72 74 28 70 50 61 72 73 65 2d 3e 6e  assert(pParse->n
fc00: 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20 20 20 73  Tab==1);.      s
fc10: 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28 70  qlite3MayAbort(p
fc20: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71  Parse);.      sq
fc30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
fc40: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
fc50: 20 31 2c 20 70 50 61 72 73 65 2d 3e 72 65 67 52   1, pParse->regR
fc60: 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20 20 20 20  oot, iDb);.     
fc70: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fc80: 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 50  geP5(v, OPFLAG_P
fc90: 32 49 53 52 45 47 29 3b 0a 20 20 20 20 20 20 70  2ISREG);.      p
fca0: 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 32 3b  Parse->nTab = 2;
fcb0: 0a 20 20 20 20 20 20 61 64 64 72 54 6f 70 20 3d  .      addrTop =
fcc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
fcd0: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 31 3b 0a  entAddr(v) + 1;.
fce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
fcf0: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
fd00: 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  itCoroutine, reg
fd10: 59 69 65 6c 64 2c 20 30 2c 20 61 64 64 72 54 6f  Yield, 0, addrTo
fd20: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
fd30: 33 53 65 6c 65 63 74 44 65 73 74 49 6e 69 74 28  3SelectDestInit(
fd40: 26 64 65 73 74 2c 20 53 52 54 5f 43 6f 72 6f 75  &dest, SRT_Corou
fd50: 74 69 6e 65 2c 20 72 65 67 59 69 65 6c 64 29 3b  tine, regYield);
fd60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
fd70: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65  lect(pParse, pSe
fd80: 6c 65 63 74 2c 20 26 64 65 73 74 29 3b 0a 20 20  lect, &dest);.  
fd90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fda0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43  ddOp1(v, OP_EndC
fdb0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65  oroutine, regYie
fdc0: 6c 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ld);.      sqlit
fdd0: 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76  e3VdbeJumpHere(v
fde0: 2c 20 61 64 64 72 54 6f 70 20 2d 20 31 29 3b 0a  , addrTop - 1);.
fdf0: 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65        if( pParse
fe00: 2d 3e 6e 45 72 72 20 29 20 72 65 74 75 72 6e 3b  ->nErr ) return;
fe10: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d  .      pSelTab =
fe20: 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
fe30: 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
fe40: 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  , pSelect);.    
fe50: 20 20 69 66 28 20 70 53 65 6c 54 61 62 3d 3d 30    if( pSelTab==0
fe60: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
fe70: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
fe80: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
fe90: 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  nCol = pSelTab->
fea0: 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61  nCol;.      p->a
feb0: 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61  Col = pSelTab->a
fec0: 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53 65 6c 54  Col;.      pSelT
fed0: 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
fee0: 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f      pSelTab->aCo
fef0: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  l = 0;.      sql
ff00: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
ff10: 64 62 2c 20 70 53 65 6c 54 61 62 29 3b 0a 20 20  db, pSelTab);.  
ff20: 20 20 20 20 61 64 64 72 49 6e 73 4c 6f 6f 70 20      addrInsLoop 
ff30: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
ff40: 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65 6c 64 2c  Op1(v, OP_Yield,
ff50: 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b 0a   dest.iSDParm);.
ff60: 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61        VdbeCovera
ff70: 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  ge(v);.      sql
ff80: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
ff90: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
ffa0: 20 64 65 73 74 2e 69 53 64 73 74 2c 20 64 65 73   dest.iSdst, des
ffb0: 74 2e 6e 53 64 73 74 2c 20 72 65 67 52 65 63 29  t.nSdst, regRec)
ffc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  ;.      sqlite3T
ffd0: 61 62 6c 65 41 66 66 69 6e 69 74 79 28 76 2c 20  ableAffinity(v, 
ffe0: 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  p, 0);.      sql
fff0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10000 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64 2c 20 31  , OP_NewRowid, 1
10010 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20  , regRowid);.   
10020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
10030 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e 73 65 72  dOp3(v, OP_Inser
10040 74 2c 20 31 2c 20 72 65 67 52 65 63 2c 20 72 65  t, 1, regRec, re
10050 67 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 73  gRowid);.      s
10060 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28 76  qlite3VdbeGoto(v
10070 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a  , addrInsLoop);.
10080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10090 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
100a0 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20 20 20 20  rInsLoop);.     
100b0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
100c0 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20  p1(v, OP_Close, 
100d0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
100e0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
100f0 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
10100 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
10110 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ent */.    if( p
10120 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
10130 7a 53 74 6d 74 20 3d 20 63 72 65 61 74 65 54 61  zStmt = createTa
10140 62 6c 65 53 74 6d 74 28 64 62 2c 20 70 29 3b 0a  bleStmt(db, p);.
10150 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10160 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32 20 3d 20   Token *pEnd2 = 
10170 74 61 62 4f 70 74 73 20 3f 20 26 70 50 61 72 73  tabOpts ? &pPars
10180 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 20 3a 20  e->sLastToken : 
10190 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e 20 3d 20  pEnd;.      n = 
101a0 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e 7a 20 2d  (int)(pEnd2->z -
101b0 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f   pParse->sNameTo
101c0 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20 20 69 66  ken.z);.      if
101d0 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d 21 3d 27  ( pEnd2->z[0]!='
101e0 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e 64 32 2d  ;' ) n += pEnd2-
101f0 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74 6d 74 20  >n;.      zStmt 
10200 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
10210 28 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20  (db, .          
10220 22 43 52 45 41 54 45 20 25 73 20 25 2e 2a 73 22  "CREATE %s %.*s"
10230 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20 70 50 61  , zType2, n, pPa
10240 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
10250 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  z.      );.    }
10260 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c 6f 74 20  ..    /* A slot 
10270 66 6f 72 20 74 68 65 20 72 65 63 6f 72 64 20 68  for the record h
10280 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
10290 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 68 65  allocated in the
102a0 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f   .    ** SQLITE_
102b0 4d 41 53 54 45 52 20 74 61 62 6c 65 2e 20 20 57  MASTER table.  W
102c0 65 20 6a 75 73 74 20 6e 65 65 64 20 74 6f 20 75  e just need to u
102d0 70 64 61 74 65 20 74 68 61 74 20 73 6c 6f 74 20  pdate that slot 
102e0 77 69 74 68 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  with all.    ** 
102f0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
10300 77 65 27 76 65 20 63 6f 6c 6c 65 63 74 65 64 2e  we've collected.
10310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
10320 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70  te3NestedParse(p
10330 50 61 72 73 65 2c 0a 20 20 20 20 20 20 22 55 50  Parse,.      "UP
10340 44 41 54 45 20 25 51 2e 25 73 20 22 0a 20 20 20  DATE %Q.%s ".   
10350 20 20 20 20 20 20 22 53 45 54 20 74 79 70 65 3d        "SET type=
10360 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51 2c 20 74  '%s', name=%Q, t
10370 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72 6f 6f 74  bl_name=%Q, root
10380 70 61 67 65 3d 23 25 64 2c 20 73 71 6c 3d 25 51  page=#%d, sql=%Q
10390 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52 45   ".       "WHERE
103a0 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a 20 20 20   rowid=#%d",.   
103b0 20 20 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e     db->aDb[iDb].
103c0 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41  zName, SCHEMA_TA
103d0 42 4c 45 28 69 44 62 29 2c 0a 20 20 20 20 20 20  BLE(iDb),.      
103e0 7a 54 79 70 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zType,.      p->
103f0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 2d 3e  zName,.      p->
10400 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 70 50 61  zName,.      pPa
10410 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c 0a 20 20  rse->regRoot,.  
10420 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20 20 20 20      zStmt,.     
10430 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 77 69   pParse->regRowi
10440 64 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  d.    );.    sql
10450 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
10460 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
10470 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70  e3ChangeCookie(p
10480 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 0a 23 69  Parse, iDb);..#i
10490 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
104a0 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a  T_AUTOINCREMENT.
104b0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
104c0 73 65 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  see if we need t
104d0 6f 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  o create an sqli
104e0 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61 62 6c  te_sequence tabl
104f0 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20 6b 65 65  e for.    ** kee
10500 70 69 6e 67 20 74 72 61 63 6b 20 6f 66 20 61 75  ping track of au
10510 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b 65 79 73  toincrement keys
10520 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10530 20 70 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54   p->tabFlags & T
10540 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
10550 29 7b 0a 20 20 20 20 20 20 44 62 20 2a 70 44 62  ){.      Db *pDb
10560 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
10570 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10580 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
10590 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
105a0 30 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  0) );.      if( 
105b0 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 70 53  pDb->pSchema->pS
105c0 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  eqTab==0 ){.    
105d0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
105e0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
105f0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
10600 20 54 41 42 4c 45 20 25 51 2e 73 71 6c 69 74 65   TABLE %Q.sqlite
10610 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d 65 2c 73  _sequence(name,s
10620 65 71 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  eq)",.          
10630 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 20  pDb->zName.     
10640 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
10650 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
10660 2f 2a 20 52 65 70 61 72 73 65 20 65 76 65 72 79  /* Reparse every
10670 74 68 69 6e 67 20 74 6f 20 75 70 64 61 74 65 20  thing to update 
10680 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 64 61 74  our internal dat
10690 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a  a structures */.
106a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
106b0 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
106c0 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  v, iDb,.        
106d0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
106e0 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61 6d 65 3d  f(db, "tbl_name=
106f0 27 25 71 27 20 41 4e 44 20 74 79 70 65 21 3d 27  '%q' AND type!='
10700 74 72 69 67 67 65 72 27 22 2c 20 70 2d 3e 7a 4e  trigger'", p->zN
10710 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  ame));.  }...  /
10720 2a 20 41 64 64 20 74 68 65 20 74 61 62 6c 65 20  * Add the table 
10730 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  to the in-memory
10740 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
10750 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
10760 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10770 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
10780 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b 0a 20 20   Table *pOld;.  
10790 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
107a0 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d 61 3b 0a  a = p->pSchema;.
107b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
107c0 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
107d0 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
107e0 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20 73 71 6c  ;.    pOld = sql
107f0 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
10800 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
10810 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70 29 3b 0a  , p->zName, p);.
10820 20 20 20 20 69 66 28 20 70 4f 6c 64 20 29 7b 0a      if( pOld ){.
10830 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d        assert( p=
10840 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20 4d 61 6c  =pOld );  /* Mal
10850 6c 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61  loc must have fa
10860 69 6c 65 64 20 69 6e 73 69 64 65 20 48 61 73 68  iled inside Hash
10870 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20 20 20 20  Insert() */.    
10880 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
10890 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65  ed = 1;.      re
108a0 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
108b0 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
108c0 65 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 66  e = 0;.    db->f
108d0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
108e0 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 0a 23  nternChanges;..#
108f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
10900 49 54 5f 41 4c 54 45 52 54 41 42 4c 45 0a 20 20  IT_ALTERTABLE.  
10910 20 20 69 66 28 20 21 70 2d 3e 70 53 65 6c 65 63    if( !p->pSelec
10920 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t ){.      const
10930 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28   char *zName = (
10940 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 50 61  const char *)pPa
10950 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b 65 6e 2e  rse->sNameToken.
10960 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 61  z;.      int nNa
10970 6d 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  me;.      assert
10980 28 20 21 70 53 65 6c 65 63 74 20 26 26 20 70 43  ( !pSelect && pC
10990 6f 6e 73 20 26 26 20 70 45 6e 64 20 29 3b 0a 20  ons && pEnd );. 
109a0 20 20 20 20 20 69 66 28 20 70 43 6f 6e 73 2d 3e       if( pCons->
109b0 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  z==0 ){.        
109c0 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b 0a 20 20  pCons = pEnd;.  
109d0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4e 61 6d      }.      nNam
109e0 65 20 3d 20 28 69 6e 74 29 28 28 63 6f 6e 73 74  e = (int)((const
109f0 20 63 68 61 72 20 2a 29 70 43 6f 6e 73 2d 3e 7a   char *)pCons->z
10a00 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20   - zName);.     
10a10 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66 73 65 74   p->addColOffset
10a20 20 3d 20 31 33 20 2b 20 73 71 6c 69 74 65 33 55   = 13 + sqlite3U
10a30 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e 61 6d 65  tf8CharLen(zName
10a40 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  , nName);.    }.
10a50 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 23 69  #endif.  }.}..#i
10a60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10a70 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20 54 68 65  T_VIEW./*.** The
10a80 20 70 61 72 73 65 72 20 63 61 6c 6c 73 20 74 68   parser calls th
10a90 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 6f 72  is routine in or
10aa0 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 61 20  der to create a 
10ab0 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76 6f 69 64  new VIEW.*/.void
10ac0 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 56 69   sqlite3CreateVi
10ad0 65 77 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ew(.  Parse *pPa
10ae0 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rse,     /* The 
10af0 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
10b00 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 42 65 67  */.  Token *pBeg
10b10 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 43  in,     /* The C
10b20 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61 74  REATE token that
10b30 20 62 65 67 69 6e 73 20 74 68 65 20 73 74 61 74   begins the stat
10b40 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e  ement */.  Token
10b50 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
10b60 20 54 68 65 20 74 6f 6b 65 6e 20 74 68 61 74 20   The token that 
10b70 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65 20 6f  holds the name o
10b80 66 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  f the view */.  
10b90 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20  Token *pName2,  
10ba0 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20     /* The token 
10bb0 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e  that holds the n
10bc0 61 6d 65 20 6f 66 20 74 68 65 20 76 69 65 77 20  ame of the view 
10bd0 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10be0 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70 74 69 6f  CNames, /* Optio
10bf0 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76 69 65 77  nal list of view
10c00 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
10c10 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65  .  Select *pSele
10c20 63 74 2c 20 20 20 2f 2a 20 41 20 53 45 4c 45 43  ct,   /* A SELEC
10c30 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
10c40 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
10c50 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a 20 20 69   new view */.  i
10c60 6e 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20  nt isTemp,      
10c70 20 20 2f 2a 20 54 52 55 45 20 66 6f 72 20 61 20    /* TRUE for a 
10c80 54 45 4d 50 4f 52 41 52 59 20 76 69 65 77 20 2a  TEMPORARY view *
10c90 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72 20 20 20  /.  int noErr   
10ca0 20 20 20 20 20 20 20 2f 2a 20 53 75 70 70 72 65         /* Suppre
10cb0 73 73 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ss error message
10cc0 73 20 69 66 20 56 49 45 57 20 61 6c 72 65 61 64  s if VIEW alread
10cd0 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20  y exists */.){. 
10ce0 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 69 6e 74   Table *p;.  int
10cf0 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   n;.  const char
10d00 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20 73 45 6e   *z;.  Token sEn
10d10 64 3b 0a 20 20 44 62 46 69 78 65 72 20 73 46 69  d;.  DbFixer sFi
10d20 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  x;.  Token *pNam
10d30 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 44 62  e = 0;.  int iDb
10d40 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
10d50 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20  = pParse->db;.. 
10d60 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
10d70 72 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  r>0 ){.    sqlit
10d80 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
10d90 65 2c 20 22 70 61 72 61 6d 65 74 65 72 73 20 61  e, "parameters a
10da0 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69  re not allowed i
10db0 6e 20 76 69 65 77 73 22 29 3b 0a 20 20 20 20 67  n views");.    g
10dc0 6f 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f  oto create_view_
10dd0 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  fail;.  }.  sqli
10de0 74 65 33 53 74 61 72 74 54 61 62 6c 65 28 70 50  te3StartTable(pP
10df0 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
10e00 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c 20 31 2c  ame2, isTemp, 1,
10e10 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20 20 70 20   0, noErr);.  p 
10e20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
10e30 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
10e40 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20  || pParse->nErr 
10e50 29 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69  ) goto create_vi
10e60 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71 6c 69 74  ew_fail;.  sqlit
10e70 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50  e3TwoPartName(pP
10e80 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e  arse, pName1, pN
10e90 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20  ame2, &pName);. 
10ea0 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
10eb0 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20  hemaToIndex(db, 
10ec0 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 73  p->pSchema);.  s
10ed0 71 6c 69 74 65 33 46 69 78 49 6e 69 74 28 26 73  qlite3FixInit(&s
10ee0 46 69 78 2c 20 70 50 61 72 73 65 2c 20 69 44 62  Fix, pParse, iDb
10ef0 2c 20 22 76 69 65 77 22 2c 20 70 4e 61 6d 65 29  , "view", pName)
10f00 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ;.  if( sqlite3F
10f10 69 78 53 65 6c 65 63 74 28 26 73 46 69 78 2c 20  ixSelect(&sFix, 
10f20 70 53 65 6c 65 63 74 29 20 29 20 67 6f 74 6f 20  pSelect) ) goto 
10f30 63 72 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c  create_view_fail
10f40 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20 63  ;..  /* Make a c
10f50 6f 70 79 20 6f 66 20 74 68 65 20 65 6e 74 69 72  opy of the entir
10f60 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
10f70 6e 74 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  nt that defines 
10f80 74 68 65 20 76 69 65 77 2e 0a 20 20 2a 2a 20 54  the view..  ** T
10f90 68 69 73 20 77 69 6c 6c 20 66 6f 72 63 65 20 61  his will force a
10fa0 6c 6c 20 74 68 65 20 45 78 70 72 2e 74 6f 6b 65  ll the Expr.toke
10fb0 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f 20 62 65  n.z values to be
10fc0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20 2a   dynamically.  *
10fd0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72 61 74 68  * allocated rath
10fe0 65 72 20 74 68 61 6e 20 70 6f 69 6e 74 20 74 6f  er than point to
10ff0 20 74 68 65 20 69 6e 70 75 74 20 73 74 72 69 6e   the input strin
11000 67 20 2d 20 77 68 69 63 68 20 6d 65 61 6e 73 20  g - which means 
11010 74 68 61 74 0a 20 20 2a 2a 20 74 68 65 79 20 77  that.  ** they w
11020 69 6c 6c 20 70 65 72 73 69 73 74 20 61 66 74 65  ill persist afte
11030 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  r the current sq
11040 6c 69 74 65 33 5f 65 78 65 63 28 29 20 63 61 6c  lite3_exec() cal
11050 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20 2a 2f 0a  l returns..  */.
11060 20 20 70 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73    p->pSelect = s
11070 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
11080 64 62 2c 20 70 53 65 6c 65 63 74 2c 20 45 58 50  db, pSelect, EXP
11090 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20  RDUP_REDUCE);.  
110a0 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73 71 6c 69  p->pCheck = sqli
110b0 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 64  te3ExprListDup(d
110c0 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45 58 50 52  b, pCNames, EXPR
110d0 44 55 50 5f 52 45 44 55 43 45 29 3b 0a 20 20 69  DUP_REDUCE);.  i
110e0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
110f0 6c 65 64 20 29 20 67 6f 74 6f 20 63 72 65 61 74  led ) goto creat
11100 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 0a 20 20  e_view_fail;..  
11110 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 65 6e  /* Locate the en
11120 64 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  d of the CREATE 
11130 56 49 45 57 20 73 74 61 74 65 6d 65 6e 74 2e 20  VIEW statement. 
11140 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f 69 6e 74   Make sEnd point
11150 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 6e 64   to.  ** the end
11160 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64 20 3d 20  ..  */.  sEnd = 
11170 70 50 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b  pParse->sLastTok
11180 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73 45  en;.  assert( sE
11190 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  nd.z[0]!=0 );.  
111a0 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 27  if( sEnd.z[0]!='
111b0 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e 64 2e 7a  ;' ){.    sEnd.z
111c0 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20 20 7d 0a   += sEnd.n;.  }.
111d0 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b 0a 20 20    sEnd.n = 0;.  
111e0 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e 64 2e 7a  n = (int)(sEnd.z
111f0 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29 3b 0a 20   - pBegin->z);. 
11200 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
11210 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d 3e 7a 3b    z = pBegin->z;
11220 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
11230 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d 31 5d 29  3Isspace(z[n-1])
11240 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 73 45 6e   ){ n--; }.  sEn
11250 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d 3b 0a 20  d.z = &z[n-1];. 
11260 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a 0a 20 20   sEnd.n = 1;..  
11270 2f 2a 20 55 73 65 20 73 71 6c 69 74 65 33 45 6e  /* Use sqlite3En
11280 64 54 61 62 6c 65 28 29 20 74 6f 20 61 64 64 20  dTable() to add 
11290 74 68 65 20 76 69 65 77 20 74 6f 20 74 68 65 20  the view to the 
112a0 53 51 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61  SQLITE_MASTER ta
112b0 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ble */.  sqlite3
112c0 45 6e 64 54 61 62 6c 65 28 70 50 61 72 73 65 2c  EndTable(pParse,
112d0 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c 20 30 29   0, &sEnd, 0, 0)
112e0 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65 77 5f 66  ;..create_view_f
112f0 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65 33 53 65  ail:.  sqlite3Se
11300 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
11310 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74  Select);.  sqlit
11320 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
11330 28 64 62 2c 20 70 43 4e 61 6d 65 73 29 3b 0a 20  (db, pCNames);. 
11340 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
11350 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11360 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66 20 21 64  _VIEW */..#if !d
11370 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
11380 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65 66  IT_VIEW) || !def
11390 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
113a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a 2f  _VIRTUALTABLE)./
113b0 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c 65 20 73  *.** The Table s
113c0 74 72 75 63 74 75 72 65 20 70 54 61 62 6c 65 20  tructure pTable 
113d0 69 73 20 72 65 61 6c 6c 79 20 61 20 56 49 45 57  is really a VIEW
113e0 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 6e  .  Fill in the n
113f0 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68 65 20 63  ames of.** the c
11400 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 76 69  olumns of the vi
11410 65 77 20 69 6e 20 74 68 65 20 70 54 61 62 6c 65  ew in the pTable
11420 20 73 74 72 75 63 74 75 72 65 2e 20 20 52 65 74   structure.  Ret
11430 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 0a 2a  urn the number.*
11440 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66  * of errors.  If
11450 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
11460 6e 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  n leave an error
11470 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
11480 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
11490 69 6e 74 20 73 71 6c 69 74 65 33 56 69 65 77 47  int sqlite3ViewG
114a0 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 50 61  etColumnNames(Pa
114b0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62  rse *pParse, Tab
114c0 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20 54  le *pTable){.  T
114d0 61 62 6c 65 20 2a 70 53 65 6c 54 61 62 3b 20 20  able *pSelTab;  
114e0 20 2f 2a 20 41 20 66 61 6b 65 20 74 61 62 6c 65   /* A fake table
114f0 20 66 72 6f 6d 20 77 68 69 63 68 20 77 65 20 67   from which we g
11500 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  et the result se
11510 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  t */.  Select *p
11520 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43 6f 70 79  Sel;     /* Copy
11530 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20 74   of the SELECT t
11540 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
11550 68 65 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e 74  he view */.  int
11560 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20 20 2f   nErr = 0;     /
11570 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  * Number of erro
11580 72 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a  rs encountered *
11590 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
115a0 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61        /* Tempora
115b0 72 69 6c 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rily holds the n
115c0 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
115d0 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a 20 20 73   assigned */.  s
115e0 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
115f0 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
11600 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11610 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65 72 72 6f   for malloc erro
11620 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  rs */.  sqlite3_
11630 78 61 75 74 68 20 78 41 75 74 68 3b 20 20 20 20  xauth xAuth;    
11640 20 20 20 2f 2a 20 53 61 76 65 64 20 78 41 75 74     /* Saved xAut
11650 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 75  h pointer */.  u
11660 38 20 62 45 6e 61 62 6c 65 64 4c 41 3b 20 20 20  8 bEnabledLA;   
11670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76            /* Sav
11680 65 64 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ed db->lookaside
11690 2e 62 45 6e 61 62 6c 65 64 20 73 74 61 74 65 20  .bEnabled state 
116a0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54  */..  assert( pT
116b0 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  able );..#ifndef
116c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
116d0 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
116e0 73 71 6c 69 74 65 33 56 74 61 62 43 61 6c 6c 43  sqlite3VtabCallC
116f0 6f 6e 6e 65 63 74 28 70 50 61 72 73 65 2c 20 70  onnect(pParse, p
11700 54 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  Table) ){.    re
11710 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
11720 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 49 73 56  R;.  }.  if( IsV
11730 69 72 74 75 61 6c 28 70 54 61 62 6c 65 29 20 29  irtual(pTable) )
11740 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
11750 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
11760 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 2f 2a  E_OMIT_VIEW.  /*
11770 20 41 20 70 6f 73 69 74 69 76 65 20 6e 43 6f 6c   A positive nCol
11780 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6c 75 6d   means the colum
11790 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20 74 68 69  ns names for thi
117a0 73 20 76 69 65 77 20 61 72 65 0a 20 20 2a 2a 20  s view are.  ** 
117b0 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e 2e 0a 20  already known.. 
117c0 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 6c 65   */.  if( pTable
117d0 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65 74 75 72  ->nCol>0 ) retur
117e0 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20 6e 65 67  n 0;..  /* A neg
117f0 61 74 69 76 65 20 6e 43 6f 6c 20 69 73 20 61 20  ative nCol is a 
11800 73 70 65 63 69 61 6c 20 6d 61 72 6b 65 72 20 6d  special marker m
11810 65 61 6e 69 6e 67 20 74 68 61 74 20 77 65 20 61  eaning that we a
11820 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a  re currently.  *
11830 2a 20 74 72 79 69 6e 67 20 74 6f 20 63 6f 6d 70  * trying to comp
11840 75 74 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  ute the column n
11850 61 6d 65 73 2e 20 20 49 66 20 77 65 20 65 6e 74  ames.  If we ent
11860 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
11870 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e 65 67 61  with.  ** a nega
11880 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74 20 6d 65  tive nCol, it me
11890 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ans two or more 
118a0 76 69 65 77 73 20 66 6f 72 6d 20 61 20 6c 6f 6f  views form a loo
118b0 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20  p, like this:.  
118c0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  **.  **     CREA
118d0 54 45 20 56 49 45 57 20 6f 6e 65 20 41 53 20 53  TE VIEW one AS S
118e0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 77 6f  ELECT * FROM two
118f0 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54  ;.  **     CREAT
11900 45 20 56 49 45 57 20 74 77 6f 20 41 53 20 53 45  E VIEW two AS SE
11910 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f 6e 65 3b  LECT * FROM one;
11920 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
11930 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f 72 20 61  lly, the error a
11940 62 6f 76 65 20 69 73 20 6e 6f 77 20 63 61 75 67  bove is now caug
11950 68 74 20 70 72 69 6f 72 20 74 6f 20 72 65 61 63  ht prior to reac
11960 68 69 6e 67 20 74 68 69 73 20 70 6f 69 6e 74 2e  hing this point.
11970 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 66 6f  .  ** But the fo
11980 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20 69 73 20  llowing test is 
11990 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61 6e 74 20  still important 
119a0 61 73 20 69 74 20 64 6f 65 73 20 63 6f 6d 65 20  as it does come 
119b0 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 66  up.  ** in the f
119c0 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 20 0a  ollowing:.  ** .
119d0 20 20 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20    **     CREATE 
119e0 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78 31 28 61  TABLE main.ex1(a
119f0 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  );.  **     CREA
11a00 54 45 20 54 45 4d 50 20 56 49 45 57 20 65 78 31  TE TEMP VIEW ex1
11a10 20 41 53 20 53 45 4c 45 43 54 20 61 20 46 52 4f   AS SELECT a FRO
11a20 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20 20 20 20  M ex1;.  **     
11a30 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65  SELECT * FROM te
11a40 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a 20 20 69  mp.ex1;.  */.  i
11a50 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3c  f( pTable->nCol<
11a60 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
11a70 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
11a80 20 22 76 69 65 77 20 25 73 20 69 73 20 63 69 72   "view %s is cir
11a90 63 75 6c 61 72 6c 79 20 64 65 66 69 6e 65 64 22  cularly defined"
11aa0 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
11ab0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
11ac0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 54    }.  assert( pT
11ad0 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30 20 29 3b  able->nCol>=0 );
11ae0 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74  ..  /* If we get
11af0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
11b00 61 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63  ans we need to c
11b10 6f 6d 70 75 74 65 20 74 68 65 20 74 61 62 6c 65  ompute the table
11b20 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20 4e 6f 74   names..  ** Not
11b30 65 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 20  e that the call 
11b40 74 6f 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74  to sqlite3Result
11b50 53 65 74 4f 66 53 65 6c 65 63 74 28 29 20 77 69  SetOfSelect() wi
11b60 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79 0a 20 20  ll expand any.  
11b70 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e 74 73 20  ** "*" elements 
11b80 69 6e 20 74 68 65 20 72 65 73 75 6c 74 73 20 73  in the results s
11b90 65 74 20 6f 66 20 74 68 65 20 76 69 65 77 20 61  et of the view a
11ba0 6e 64 20 77 69 6c 6c 20 61 73 73 69 67 6e 20 63  nd will assign c
11bb0 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74 6f 20 74  ursors.  ** to t
11bc0 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74  he elements of t
11bd0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
11be0 20 42 75 74 20 77 65 20 64 6f 20 6e 6f 74 20 77   But we do not w
11bf0 61 6e 74 20 74 68 65 73 65 20 63 68 61 6e 67 65  ant these change
11c00 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20 70 65 72  s.  ** to be per
11c10 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74 68 65 20  manent.  So the 
11c20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 64  computation is d
11c30 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79 20 6f 66  one on a copy of
11c40 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20 2a 2a   the SELECT.  **
11c50 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20   statement that 
11c60 64 65 66 69 6e 65 73 20 74 68 65 20 76 69 65 77  defines the view
11c70 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11c80 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63 74   pTable->pSelect
11c90 20 29 3b 0a 20 20 62 45 6e 61 62 6c 65 64 4c 41   );.  bEnabledLA
11ca0 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65   = db->lookaside
11cb0 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20 69 66 28  .bEnabled;.  if(
11cc0 20 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 20   pTable->pCheck 
11cd0 29 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  ){.    db->looka
11ce0 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20  side.bEnabled = 
11cf0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  0;.    sqlite3Co
11d00 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72 4c 69 73  lumnsFromExprLis
11d10 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 6c 65  t(pParse, pTable
11d20 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20 20 20 20  ->pCheck, .     
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d40 20 20 20 20 20 20 20 20 20 20 26 70 54 61 62 6c            &pTabl
11d50 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61 62 6c 65  e->nCol, &pTable
11d60 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 65 6c 73 65  ->aCol);.  }else
11d70 7b 0a 20 20 20 20 70 53 65 6c 20 3d 20 73 71 6c  {.    pSel = sql
11d80 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 64 62  ite3SelectDup(db
11d90 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
11da0 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  t, 0);.    if( p
11db0 53 65 6c 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  Sel ){.      n =
11dc0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
11dd0 20 20 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c       sqlite3SrcL
11de0 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f 72 73  istAssignCursors
11df0 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70  (pParse, pSel->p
11e00 53 72 63 29 3b 0a 20 20 20 20 20 20 70 54 61 62  Src);.      pTab
11e10 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31 3b 0a 20  le->nCol = -1;. 
11e20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69       db->lookasi
11e30 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
11e40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11e50 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
11e60 4f 4e 0a 20 20 20 20 20 20 78 41 75 74 68 20 3d  ON.      xAuth =
11e70 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20 20 20 20   db->xAuth;.    
11e80 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 30 3b    db->xAuth = 0;
11e90 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 20 3d  .      pSelTab =
11ea0 20 73 71 6c 69 74 65 33 52 65 73 75 6c 74 53 65   sqlite3ResultSe
11eb0 74 4f 66 53 65 6c 65 63 74 28 70 50 61 72 73 65  tOfSelect(pParse
11ec0 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 20 20 64  , pSel);.      d
11ed0 62 2d 3e 78 41 75 74 68 20 3d 20 78 41 75 74 68  b->xAuth = xAuth
11ee0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 53  ;.#else.      pS
11ef0 65 6c 54 61 62 20 3d 20 73 71 6c 69 74 65 33 52  elTab = sqlite3R
11f00 65 73 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74  esultSetOfSelect
11f10 28 70 50 61 72 73 65 2c 20 70 53 65 6c 29 3b 0a  (pParse, pSel);.
11f20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 50 61  #endif.      pPa
11f30 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e 3b 0a 20  rse->nTab = n;. 
11f40 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
11f50 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
11f60 72 74 28 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  rt( pTable->aCol
11f70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
11f80 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 70 53  Table->nCol = pS
11f90 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20  elTab->nCol;.   
11fa0 20 20 20 20 20 70 54 61 62 6c 65 2d 3e 61 43 6f       pTable->aCo
11fb0 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e 61 43 6f  l = pSelTab->aCo
11fc0 6c 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54  l;.        pSelT
11fd0 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->nCol = 0;.  
11fe0 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e 61        pSelTab->a
11ff0 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Col = 0;.       
12000 20 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61   sqlite3DeleteTa
12010 62 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29  ble(db, pSelTab)
12020 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
12030 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
12040 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20  utexHeld(db, 0, 
12050 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 29  pTable->pSchema)
12060 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
12070 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d  .        pTable-
12080 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20  >nCol = 0;.     
12090 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
120a0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
120b0 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
120c0 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d 20 65 6c   pSel);.    } el
120d0 73 65 20 7b 0a 20 20 20 20 20 20 6e 45 72 72 2b  se {.      nErr+
120e0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  +;.    }.  }.  d
120f0 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
12100 61 62 6c 65 64 20 3d 20 62 45 6e 61 62 6c 65 64  abled = bEnabled
12110 4c 41 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53  LA;.  pTable->pS
12120 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 46 6c 61  chema->schemaFla
12130 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65 73 65 74  gs |= DB_Unreset
12140 56 69 65 77 73 3b 0a 23 65 6e 64 69 66 20 2f 2a  Views;.#endif /*
12150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12160 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 6e 45  W */.  return nE
12170 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f  rr;  .}.#endif /
12180 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
12190 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20  E_OMIT_VIEW) || 
121a0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
121b0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
121c0 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  E) */..#ifndef S
121d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a  QLITE_OMIT_VIEW.
121e0 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
121f0 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 72 6f  column names fro
12200 6d 20 65 76 65 72 79 20 56 49 45 57 20 69 6e 20  m every VIEW in 
12210 64 61 74 61 62 61 73 65 20 69 64 78 2e 0a 2a 2f  database idx..*/
12220 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
12230 69 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28  iteViewResetAll(
12240 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
12250 20 69 64 78 29 7b 0a 20 20 48 61 73 68 45 6c 65   idx){.  HashEle
12260 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72 74 28 20  m *i;.  assert( 
12270 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12280 65 78 48 65 6c 64 28 64 62 2c 20 69 64 78 2c 20  exHeld(db, idx, 
12290 30 29 20 29 3b 0a 20 20 69 66 28 20 21 44 62 48  0) );.  if( !DbH
122a0 61 73 50 72 6f 70 65 72 74 79 28 64 62 2c 20 69  asProperty(db, i
122b0 64 78 2c 20 44 42 5f 55 6e 72 65 73 65 74 56 69  dx, DB_UnresetVi
122c0 65 77 73 29 20 29 20 72 65 74 75 72 6e 3b 0a 20  ews) ) return;. 
122d0 20 66 6f 72 28 69 3d 73 71 6c 69 74 65 48 61 73   for(i=sqliteHas
122e0 68 46 69 72 73 74 28 26 64 62 2d 3e 61 44 62 5b  hFirst(&db->aDb[
122f0 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d 3e 74 62  idx].pSchema->tb
12300 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73 71 6c 69  lHash); i;i=sqli
12310 74 65 48 61 73 68 4e 65 78 74 28 69 29 29 7b 0a  teHashNext(i)){.
12320 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
12330 3d 20 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  = sqliteHashData
12340 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  (i);.    if( pTa
12350 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
12360 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
12370 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 64 62 2c  eColumnNames(db,
12380 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 70 54   pTab);.      pT
12390 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20  ab->aCol = 0;.  
123a0 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f 6c 20 3d      pTab->nCol =
123b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
123c0 44 62 43 6c 65 61 72 50 72 6f 70 65 72 74 79 28  DbClearProperty(
123d0 64 62 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65  db, idx, DB_Unre
123e0 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a 23 65 6c  setViews);.}.#el
123f0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 71 6c 69  se.# define sqli
12400 74 65 56 69 65 77 52 65 73 65 74 41 6c 6c 28 41  teViewResetAll(A
12410 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ,B).#endif /* SQ
12420 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 20 2a  LITE_OMIT_VIEW *
12430 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
12440 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
12450 20 62 79 20 74 68 65 20 56 44 42 45 20 74 6f 20   by the VDBE to 
12460 61 64 6a 75 73 74 20 74 68 65 20 69 6e 74 65 72  adjust the inter
12470 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a 20 75 73  nal schema.** us
12480 65 64 20 62 79 20 53 51 4c 69 74 65 20 77 68 65  ed by SQLite whe
12490 6e 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  n the btree laye
124a0 72 20 6d 6f 76 65 73 20 61 20 74 61 62 6c 65 20  r moves a table 
124b0 72 6f 6f 74 20 70 61 67 65 2e 20 54 68 65 0a 2a  root page. The.*
124c0 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 20 61  * root-page of a
124d0 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
124e0 69 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 20  in database iDb 
124f0 68 61 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d  has changed from
12500 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20 69 54 6f   iFrom.** to iTo
12510 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23  ..**.** Ticket #
12520 31 37 32 38 3a 20 20 54 68 65 20 73 79 6d 62 6f  1728:  The symbo
12530 6c 20 74 61 62 6c 65 20 6d 69 67 68 74 20 73 74  l table might st
12540 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69 6e 66 6f  ill contain info
12550 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e 20 74 61  rmation.** on ta
12560 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69 6e 64 69  bles and/or indi
12570 63 65 73 20 74 68 61 74 20 61 72 65 20 74 68 65  ces that are the
12580 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e   process of bein
12590 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 20 49 66  g deleted..** If
125a0 20 79 6f 75 20 61 72 65 20 75 6e 6c 75 63 6b 79   you are unlucky
125b0 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 64  , one of those d
125c0 65 6c 65 74 65 64 20 69 6e 64 69 63 65 73 20 6f  eleted indices o
125d0 72 20 74 61 62 6c 65 73 20 6d 69 67 68 74 0a 2a  r tables might.*
125e0 2a 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  * have the same 
125f0 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62 65 72 20  rootpage number 
12600 61 73 20 74 68 65 20 72 65 61 6c 20 74 61 62 6c  as the real tabl
12610 65 20 6f 72 20 69 6e 64 65 78 20 74 68 61 74 20  e or index that 
12620 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d 6f 76 65  is.** being move
12630 64 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74  d.  So we cannot
12640 20 73 74 6f 70 20 73 65 61 72 63 68 69 6e 67 20   stop searching 
12650 61 66 74 65 72 20 74 68 65 20 66 69 72 73 74 20  after the first 
12660 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63 61 75 73  match .** becaus
12670 65 20 74 68 65 20 66 69 72 73 74 20 6d 61 74 63  e the first matc
12680 68 20 6d 69 67 68 74 20 62 65 20 66 6f 72 20 6f  h might be for o
12690 6e 65 20 6f 66 20 74 68 65 20 64 65 6c 65 74 65  ne of the delete
126a0 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20 6f 72 20  d indices.** or 
126b0 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f 74 20 74  tables and not t
126c0 68 65 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 74  he table/index t
126d0 68 61 74 20 69 73 20 61 63 74 75 61 6c 6c 79 20  hat is actually 
126e0 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a 2a 2a 20  being moved..** 
126f0 57 65 20 6d 75 73 74 20 63 6f 6e 74 69 6e 75 65  We must continue
12700 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
12710 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64 20 69 6e  ll tables and in
12720 64 69 63 65 73 20 77 69 74 68 0a 2a 2a 20 72 6f  dices with.** ro
12730 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d 20 68 61  otpage==iFrom ha
12740 76 65 20 62 65 65 6e 20 63 6f 6e 76 65 72 74 65  ve been converte
12750 64 20 74 6f 20 68 61 76 65 20 61 20 72 6f 6f 74  d to have a root
12760 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a 2a 20 69  page of iTo.** i
12770 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 65  n order to be ce
12780 72 74 61 69 6e 20 74 68 61 74 20 77 65 20 67 6f  rtain that we go
12790 74 20 74 68 65 20 72 69 67 68 74 20 6f 6e 65 2e  t the right one.
127a0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
127b0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
127c0 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  UM.void sqlite3R
127d0 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28 73 71 6c  ootPageMoved(sql
127e0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44  ite3 *db, int iD
127f0 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69 6e  b, int iFrom, in
12800 74 20 69 54 6f 29 7b 0a 20 20 48 61 73 68 45 6c  t iTo){.  HashEl
12810 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20 48 61 73  em *pElem;.  Has
12820 68 20 2a 70 48 61 73 68 3b 0a 20 20 44 62 20 2a  h *pHash;.  Db *
12830 70 44 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pDb;..  assert( 
12840 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
12850 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
12860 30 29 20 29 3b 0a 20 20 70 44 62 20 3d 20 26 64  0) );.  pDb = &d
12870 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
12880 48 61 73 68 20 3d 20 26 70 44 62 2d 3e 70 53 63  Hash = &pDb->pSc
12890 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 3b 0a 20  hema->tblHash;. 
128a0 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71 6c 69 74   for(pElem=sqlit
128b0 65 48 61 73 68 46 69 72 73 74 28 70 48 61 73 68  eHashFirst(pHash
128c0 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c 65 6d 3d  ); pElem; pElem=
128d0 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70  sqliteHashNext(p
128e0 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54 61 62 6c  Elem)){.    Tabl
128f0 65 20 2a 70 54 61 62 20 3d 20 73 71 6c 69 74 65  e *pTab = sqlite
12900 48 61 73 68 44 61 74 61 28 70 45 6c 65 6d 29 3b  HashData(pElem);
12910 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 74  .    if( pTab->t
12920 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  num==iFrom ){.  
12930 20 20 20 20 70 54 61 62 2d 3e 74 6e 75 6d 20 3d      pTab->tnum =
12940 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   iTo;.    }.  }.
12950 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
12960 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61 73 68  pSchema->idxHash
12970 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
12980 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
12990 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
129a0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
129b0 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 49  t(pElem)){.    I
129c0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 73 71 6c  ndex *pIdx = sql
129d0 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
129e0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  m);.    if( pIdx
129f0 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
12a00 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 74 6e 75  .      pIdx->tnu
12a10 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
12a20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   }.}.#endif../*.
12a30 2a 2a 20 57 72 69 74 65 20 63 6f 64 65 20 74 6f  ** Write code to
12a40 20 65 72 61 73 65 20 74 68 65 20 74 61 62 6c 65   erase the table
12a50 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
12a60 69 54 61 62 6c 65 20 66 72 6f 6d 20 64 61 74 61  iTable from data
12a70 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20 41 6c 73  base iDb..** Als
12a80 6f 20 77 72 69 74 65 20 63 6f 64 65 20 74 6f 20  o write code to 
12a90 6d 6f 64 69 66 79 20 74 68 65 20 73 71 6c 69 74  modify the sqlit
12aa0 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61  e_master table a
12ab0 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63 68 65  nd internal sche
12ac0 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f 6f 74 2d  ma.** if a root-
12ad0 70 61 67 65 20 6f 66 20 61 6e 6f 74 68 65 72 20  page of another 
12ae0 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
12af0 79 20 74 68 65 20 62 74 72 65 65 2d 6c 61 79 65  y the btree-laye
12b00 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65 72 61 73  r whilst.** eras
12b10 69 6e 67 20 69 54 61 62 6c 65 20 28 74 68 69 73  ing iTable (this
12b20 20 63 61 6e 20 68 61 70 70 65 6e 20 77 69 74 68   can happen with
12b30 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
12b40 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f 20 0a 73  database)..*/ .s
12b50 74 61 74 69 63 20 76 6f 69 64 20 64 65 73 74 72  tatic void destr
12b60 6f 79 52 6f 6f 74 50 61 67 65 28 50 61 72 73 65  oyRootPage(Parse
12b70 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
12b80 61 62 6c 65 2c 20 69 6e 74 20 69 44 62 29 7b 0a  able, int iDb){.
12b90 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
12ba0 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
12bb0 65 29 3b 0a 20 20 69 6e 74 20 72 31 20 3d 20 73  e);.  int r1 = s
12bc0 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67  qlite3GetTempReg
12bd0 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73 73 65  (pParse);.  asse
12be0 72 74 28 20 69 54 61 62 6c 65 3e 31 20 29 3b 0a  rt( iTable>1 );.
12bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12c00 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73 74 72 6f  Op3(v, OP_Destro
12c10 79 2c 20 69 54 61 62 6c 65 2c 20 72 31 2c 20 69  y, iTable, r1, i
12c20 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 61  Db);.  sqlite3Ma
12c30 79 41 62 6f 72 74 28 70 50 61 72 73 65 29 3b 0a  yAbort(pParse);.
12c40 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12c50 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
12c60 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f 79 20 73   /* OP_Destroy s
12c70 74 6f 72 65 73 20 61 6e 20 69 6e 20 69 6e 74 65  tores an in inte
12c80 67 65 72 20 72 31 2e 20 49 66 20 74 68 69 73 20  ger r1. If this 
12c90 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20 69 73 20  integer.  ** is 
12ca0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
12cb0 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  t is the root pa
12cc0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 74  ge number of a t
12cd0 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f 0a 20 20  able moved to.  
12ce0 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69 54 61 62  ** location iTab
12cf0 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
12d00 67 20 63 6f 64 65 20 6d 6f 64 69 66 69 65 73 20  g code modifies 
12d10 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
12d20 72 20 74 61 62 6c 65 20 74 6f 0a 20 20 2a 2a 20  r table to.  ** 
12d30 72 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 20 20  reflect this..  
12d40 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22 23 4e 4e  **.  ** The "#NN
12d50 4e 22 20 69 6e 20 74 68 65 20 53 51 4c 20 69 73  N" in the SQL is
12d60 20 61 20 73 70 65 63 69 61 6c 20 63 6f 6e 73 74   a special const
12d70 61 6e 74 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ant that means w
12d80 68 61 74 65 76 65 72 20 76 61 6c 75 65 0a 20 20  hatever value.  
12d90 2a 2a 20 69 73 20 69 6e 20 72 65 67 69 73 74 65  ** is in registe
12da0 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67 72 61 6d  r NNN.  See gram
12db0 6d 61 72 20 72 75 6c 65 73 20 61 73 73 6f 63 69  mar rules associ
12dc0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 54 4b  ated with the TK
12dd0 5f 52 45 47 49 53 54 45 52 0a 20 20 2a 2a 20 74  _REGISTER.  ** t
12de0 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69 74 69 6f  oken for additio
12df0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
12e00 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 4e  .  */.  sqlite3N
12e10 65 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73  estedParse(pPars
12e20 65 2c 20 0a 20 20 20 20 20 22 55 50 44 41 54 45  e, .     "UPDATE
12e30 20 25 51 2e 25 73 20 53 45 54 20 72 6f 6f 74 70   %Q.%s SET rootp
12e40 61 67 65 3d 25 64 20 57 48 45 52 45 20 23 25 64  age=%d WHERE #%d
12e50 20 41 4e 44 20 72 6f 6f 74 70 61 67 65 3d 23 25   AND rootpage=#%
12e60 64 22 2c 0a 20 20 20 20 20 70 50 61 72 73 65 2d  d",.     pParse-
12e70 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
12e80 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  ame, SCHEMA_TABL
12e90 45 28 69 44 62 29 2c 20 69 54 61 62 6c 65 2c 20  E(iDb), iTable, 
12ea0 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64 69 66 0a  r1, r1);.#endif.
12eb0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
12ec0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
12ed0 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  r1);.}../*.** Wr
12ee0 69 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 6f  ite VDBE code to
12ef0 20 65 72 61 73 65 20 74 61 62 6c 65 20 70 54 61   erase table pTa
12f00 62 20 61 6e 64 20 61 6c 6c 20 61 73 73 6f 63 69  b and all associ
12f10 61 74 65 64 20 69 6e 64 69 63 65 73 20 6f 6e 20  ated indices on 
12f20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65 20 74 6f  disk..** Code to
12f30 20 75 70 64 61 74 65 20 74 68 65 20 73 71 6c 69   update the sqli
12f40 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 73  te_master tables
12f50 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73 63   and internal sc
12f60 68 65 6d 61 20 64 65 66 69 6e 69 74 69 6f 6e 73  hema definitions
12f70 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61 20 72 6f  .** in case a ro
12f80 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e 67 69 6e  ot-page belongin
12f90 67 20 74 6f 20 61 6e 6f 74 68 65 72 20 74 61 62  g to another tab
12fa0 6c 65 20 69 73 20 6d 6f 76 65 64 20 62 79 20 74  le is moved by t
12fb0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 0a 2a  he btree layer.*
12fc0 2a 20 69 73 20 61 6c 73 6f 20 61 64 64 65 64 20  * is also added 
12fd0 28 74 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e  (this can happen
12fe0 20 77 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61   with an auto-va
12ff0 63 75 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a  cuum database)..
13000 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
13010 65 73 74 72 6f 79 54 61 62 6c 65 28 50 61 72 73  estroyTable(Pars
13020 65 20 2a 70 50 61 72 73 65 2c 20 54 61 62 6c 65  e *pParse, Table
13030 20 2a 70 54 61 62 29 7b 0a 23 69 66 64 65 66 20   *pTab){.#ifdef 
13040 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13050 56 41 43 55 55 4d 0a 20 20 49 6e 64 65 78 20 2a  VACUUM.  Index *
13060 70 49 64 78 3b 0a 20 20 69 6e 74 20 69 44 62 20  pIdx;.  int iDb 
13070 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54  = sqlite3SchemaT
13080 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64  oIndex(pParse->d
13090 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
130a0 29 3b 0a 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  );.  destroyRoot
130b0 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 54 61  Page(pParse, pTa
130c0 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  b->tnum, iDb);. 
130d0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
130e0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
130f0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
13100 0a 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f 74  .    destroyRoot
13110 50 61 67 65 28 70 50 61 72 73 65 2c 20 70 49 64  Page(pParse, pId
13120 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20  x->tnum, iDb);. 
13130 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 49 66   }.#else.  /* If
13140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61   the database ma
13150 79 20 62 65 20 61 75 74 6f 2d 76 61 63 75 75 6d  y be auto-vacuum
13160 20 63 61 70 61 62 6c 65 20 28 69 66 20 53 51 4c   capable (if SQL
13170 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
13180 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  UUM.  ** is not 
13190 64 65 66 69 6e 65 64 29 2c 20 74 68 65 6e 20 69  defined), then i
131a0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
131b0 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73 74 72 6f  o call OP_Destro
131c0 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 74 61  y on the.  ** ta
131d0 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20 72 6f  ble and index ro
131e0 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f 72 64 65  ot-pages in orde
131f0 72 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68  r, starting with
13200 20 74 68 65 20 6e 75 6d 65 72 69 63 61 6c 6c 79   the numerically
13210 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 72   .  ** largest r
13220 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
13230 20 54 68 69 73 20 67 75 61 72 61 6e 74 65 65 73   This guarantees
13240 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 74 68   that none of th
13250 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a 20 20 2a  e root-pages.  *
13260 2a 20 74 6f 20 62 65 20 64 65 73 74 72 6f 79 65  * to be destroye
13270 64 20 69 73 20 72 65 6c 6f 63 61 74 65 64 20 62  d is relocated b
13280 79 20 61 6e 20 65 61 72 6c 69 65 72 20 4f 50 5f  y an earlier OP_
13290 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e 20 69 66  Destroy. i.e. if
132a0 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77   the.  ** follow
132b0 69 6e 67 20 77 65 72 65 20 63 6f 64 65 64 3a 0a  ing were coded:.
132c0 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f 44 65 73    **.  ** OP_Des
132d0 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a 20 2e 2e  troy 4 0.  ** ..
132e0 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73 74 72 6f  ..  ** OP_Destro
132f0 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20 2a 2a 20  y 5 0.  **.  ** 
13300 61 6e 64 20 72 6f 6f 74 20 70 61 67 65 20 35 20  and root page 5 
13310 68 61 70 70 65 6e 65 64 20 74 6f 20 62 65 20 74  happened to be t
13320 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
13330 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 74  page number in t
13340 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
13350 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70 61 67 65  , then root page
13360 20 35 20 77 6f 75 6c 64 20 62 65 20 6d 6f 76 65   5 would be move
13370 64 20 74 6f 20 70 61 67 65 20 34 20 62 79 20 74  d to page 4 by t
13380 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f 44 65 73  he .  ** "OP_Des
13390 74 72 6f 79 20 34 20 30 22 20 6f 70 63 6f 64 65  troy 4 0" opcode
133a0 2e 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74  . The subsequent
133b0 20 22 4f 50 5f 44 65 73 74 72 6f 79 20 35 20 30   "OP_Destroy 5 0
133c0 22 20 77 6f 75 6c 64 20 68 69 74 0a 20 20 2a 2a  " would hit.  **
133d0 20 61 20 66 72 65 65 2d 6c 69 73 74 20 70 61 67   a free-list pag
133e0 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54  e..  */.  int iT
133f0 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b  ab = pTab->tnum;
13400 0a 20 20 69 6e 74 20 69 44 65 73 74 72 6f 79 65  .  int iDestroye
13410 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28  d = 0;..  while(
13420 20 31 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 20   1 ){.    Index 
13430 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 69  *pIdx;.    int i
13440 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a 0a 20 20  Largest = 0;..  
13450 20 20 69 66 28 20 69 44 65 73 74 72 6f 79 65 64    if( iDestroyed
13460 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69 44 65 73  ==0 || iTab<iDes
13470 74 72 6f 79 65 64 20 29 7b 0a 20 20 20 20 20 20  troyed ){.      
13480 69 4c 61 72 67 65 73 74 20 3d 20 69 54 61 62 3b  iLargest = iTab;
13490 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
134a0 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
134b0 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
134c0 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
134d0 20 69 6e 74 20 69 49 64 78 20 3d 20 70 49 64 78   int iIdx = pIdx
134e0 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20 20 61 73  ->tnum;.      as
134f0 73 65 72 74 28 20 70 49 64 78 2d 3e 70 53 63 68  sert( pIdx->pSch
13500 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
13510 6d 61 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ma );.      if( 
13520 28 69 44 65 73 74 72 6f 79 65 64 3d 3d 30 20 7c  (iDestroyed==0 |
13530 7c 20 28 69 49 64 78 3c 69 44 65 73 74 72 6f 79  | (iIdx<iDestroy
13540 65 64 29 29 20 26 26 20 69 49 64 78 3e 69 4c 61  ed)) && iIdx>iLa
13550 72 67 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20  rgest ){.       
13560 20 69 4c 61 72 67 65 73 74 20 3d 20 69 49 64 78   iLargest = iIdx
13570 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
13580 20 20 20 20 69 66 28 20 69 4c 61 72 67 65 73 74      if( iLargest
13590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
135a0 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  urn;.    }else{.
135b0 20 20 20 20 20 20 69 6e 74 20 69 44 62 20 3d 20        int iDb = 
135c0 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
135d0 6e 64 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c  ndex(pParse->db,
135e0 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b   pTab->pSchema);
135f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
13600 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 70 50 61  Db>=0 && iDb<pPa
13610 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20 29 3b 0a  rse->db->nDb );.
13620 20 20 20 20 20 20 64 65 73 74 72 6f 79 52 6f 6f        destroyRoo
13630 74 50 61 67 65 28 70 50 61 72 73 65 2c 20 69 4c  tPage(pParse, iL
13640 61 72 67 65 73 74 2c 20 69 44 62 29 3b 0a 20 20  argest, iDb);.  
13650 20 20 20 20 69 44 65 73 74 72 6f 79 65 64 20 3d      iDestroyed =
13660 20 69 4c 61 72 67 65 73 74 3b 0a 20 20 20 20 7d   iLargest;.    }
13670 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
13680 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65 6e 74 72  *.** Remove entr
13690 69 65 73 20 66 72 6f 6d 20 74 68 65 20 73 71 6c  ies from the sql
136a0 69 74 65 5f 73 74 61 74 4e 20 74 61 62 6c 65 73  ite_statN tables
136b0 20 28 66 6f 72 20 4e 20 69 6e 20 28 31 2c 32 2c   (for N in (1,2,
136c0 33 29 29 0a 2a 2a 20 61 66 74 65 72 20 61 20 44  3)).** after a D
136d0 52 4f 50 20 49 4e 44 45 58 20 6f 72 20 44 52 4f  ROP INDEX or DRO
136e0 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61 6e 64 2e  P TABLE command.
136f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13700 73 71 6c 69 74 65 33 43 6c 65 61 72 53 74 61 74  sqlite3ClearStat
13710 54 61 62 6c 65 73 28 0a 20 20 50 61 72 73 65 20  Tables(.  Parse 
13720 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13730 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
13740 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
13750 20 69 44 62 2c 20 20 20 20 20 20 20 20 20 20 20   iDb,           
13760 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
13770 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ase number */.  
13780 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
13790 65 2c 20 20 20 20 20 2f 2a 20 22 69 64 78 22 20  e,     /* "idx" 
137a0 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20 20 63 6f  or "tbl" */.  co
137b0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
137c0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
137d0 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 2a  index or table *
137e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
137f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
13800 61 6d 65 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  ame = pParse->db
13810 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65  ->aDb[iDb].zName
13820 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  ;.  for(i=1; i<=
13830 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  4; i++){.    cha
13840 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20 20 20 20  r zTab[24];.    
13850 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
13860 28 73 69 7a 65 6f 66 28 7a 54 61 62 29 2c 7a 54  (sizeof(zTab),zT
13870 61 62 2c 22 73 71 6c 69 74 65 5f 73 74 61 74 25  ab,"sqlite_stat%
13880 64 22 2c 69 29 3b 0a 20 20 20 20 69 66 28 20 73  d",i);.    if( s
13890 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
138a0 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 54 61 62  pParse->db, zTab
138b0 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b 0a 20 20  , zDbName) ){.  
138c0 20 20 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65      sqlite3Neste
138d0 64 50 61 72 73 65 28 70 50 61 72 73 65 2c 0a 20  dParse(pParse,. 
138e0 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46         "DELETE F
138f0 52 4f 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20  ROM %Q.%s WHERE 
13900 25 73 3d 25 51 22 2c 0a 20 20 20 20 20 20 20 20  %s=%Q",.        
13910 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62 2c 20 7a  zDbName, zTab, z
13920 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20 20 20 20  Type, zName.    
13930 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d    );.    }.  }.}
13940 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
13950 20 63 6f 64 65 20 74 6f 20 64 72 6f 70 20 61 20   code to drop a 
13960 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  table..*/.void s
13970 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
13980 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ble(Parse *pPars
13990 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  e, Table *pTab, 
139a0 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 69 73 56  int iDb, int isV
139b0 69 65 77 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b  iew){.  Vdbe *v;
139c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
139d0 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 54   pParse->db;.  T
139e0 72 69 67 67 65 72 20 2a 70 54 72 69 67 67 65 72  rigger *pTrigger
139f0 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64  ;.  Db *pDb = &d
13a00 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a 20 20  b->aDb[iDb];..  
13a10 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
13a20 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 61 73  be(pParse);.  as
13a30 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
13a40 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
13a50 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
13a60 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 23 69 66  e, 1, iDb);..#if
13a70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13a80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
13a90 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
13aa0 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ab) ){.    sqlit
13ab0 65 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20  e3VdbeAddOp0(v, 
13ac0 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20 20 7d 0a  OP_VBegin);.  }.
13ad0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72 6f  #endif..  /* Dro
13ae0 70 20 61 6c 6c 20 74 72 69 67 67 65 72 73 20 61  p all triggers a
13af0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
13b00 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
13b10 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a 20 20 2a  ropped. Code.  *
13b20 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  * is generated t
13b30 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72 69 65 73  o remove entries
13b40 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f 6d 61 73   from sqlite_mas
13b50 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20  ter and/or.  ** 
13b60 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
13b70 65 72 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a  er if required..
13b80 20 20 2a 2f 0a 20 20 70 54 72 69 67 67 65 72 20    */.  pTrigger 
13b90 3d 20 73 71 6c 69 74 65 33 54 72 69 67 67 65 72  = sqlite3Trigger
13ba0 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
13bb0 62 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 54 72  b);.  while( pTr
13bc0 69 67 67 65 72 20 29 7b 0a 20 20 20 20 61 73 73  igger ){.    ass
13bd0 65 72 74 28 20 70 54 72 69 67 67 65 72 2d 3e 70  ert( pTrigger->p
13be0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13bf0 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20 20 20 20  chema || .      
13c00 20 20 70 54 72 69 67 67 65 72 2d 3e 70 53 63 68    pTrigger->pSch
13c10 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e  ema==db->aDb[1].
13c20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 73  pSchema );.    s
13c30 71 6c 69 74 65 33 44 72 6f 70 54 72 69 67 67 65  qlite3DropTrigge
13c40 72 50 74 72 28 70 50 61 72 73 65 2c 20 70 54 72  rPtr(pParse, pTr
13c50 69 67 67 65 72 29 3b 0a 20 20 20 20 70 54 72 69  igger);.    pTri
13c60 67 67 65 72 20 3d 20 70 54 72 69 67 67 65 72 2d  gger = pTrigger-
13c70 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 23 69 66  >pNext;.  }..#if
13c80 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13c90 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 0a 20  _AUTOINCREMENT. 
13ca0 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 65   /* Remove any e
13cb0 6e 74 72 69 65 73 20 6f 66 20 74 68 65 20 73 71  ntries of the sq
13cc0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74 61  lite_sequence ta
13cd0 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ble associated w
13ce0 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 74 61 62  ith.  ** the tab
13cf0 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
13d00 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 62  . This is done b
13d10 65 66 6f 72 65 20 74 68 65 20 74 61 62 6c 65 20  efore the table 
13d20 69 73 20 64 72 6f 70 70 65 64 0a 20 20 2a 2a 20  is dropped.  ** 
13d30 61 74 20 74 68 65 20 62 74 72 65 65 20 6c 65 76  at the btree lev
13d40 65 6c 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20  el, in case the 
13d50 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20  sqlite_sequence 
13d60 74 61 62 6c 65 20 6e 65 65 64 73 20 74 6f 0a 20  table needs to. 
13d70 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61 20 72 65   ** move as a re
13d80 73 75 6c 74 20 6f 66 20 74 68 65 20 64 72 6f 70  sult of the drop
13d90 20 28 63 61 6e 20 68 61 70 70 65 6e 20 69 6e 20   (can happen in 
13da0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
13db0 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  )..  */.  if( pT
13dc0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
13dd0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20  F_Autoincrement 
13de0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4e 65  ){.    sqlite3Ne
13df0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
13e00 2c 0a 20 20 20 20 20 20 22 44 45 4c 45 54 45 20  ,.      "DELETE 
13e10 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74 65 5f 73  FROM %Q.sqlite_s
13e20 65 71 75 65 6e 63 65 20 57 48 45 52 45 20 6e 61  equence WHERE na
13e30 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20 20 70 44  me=%Q",.      pD
13e40 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e  b->zName, pTab->
13e50 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20 7d  zName.    );.  }
13e60 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 72  .#endif..  /* Dr
13e70 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45 5f 4d 41  op all SQLITE_MA
13e80 53 54 45 52 20 74 61 62 6c 65 20 61 6e 64 20 69  STER table and i
13e90 6e 64 65 78 20 65 6e 74 72 69 65 73 20 74 68 61  ndex entries tha
13ea0 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 0a 20  t refer to the. 
13eb0 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68 65 20 70   ** table. The p
13ec0 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c 6f 6f 70  rogram name loop
13ed0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 61  s through the ma
13ee0 73 74 65 72 20 74 61 62 6c 65 20 61 6e 64 20 64  ster table and d
13ef0 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65 76 65 72  eletes.  ** ever
13f00 79 20 72 6f 77 20 74 68 61 74 20 72 65 66 65 72  y row that refer
13f10 73 20 74 6f 20 61 20 74 61 62 6c 65 20 6f 66 20  s to a table of 
13f20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
13f30 20 74 68 65 20 6f 6e 65 20 62 65 69 6e 67 0a 20   the one being. 
13f40 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20 54 72 69   ** dropped. Tri
13f50 67 67 65 72 73 20 61 72 65 20 68 61 6e 64 6c 65  ggers are handle
13f60 64 20 73 65 70 61 72 61 74 65 6c 79 20 62 65 63  d separately bec
13f70 61 75 73 65 20 61 20 74 72 69 67 67 65 72 20 63  ause a trigger c
13f80 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72 65 61 74  an be.  ** creat
13f90 65 64 20 69 6e 20 74 68 65 20 74 65 6d 70 20 64  ed in the temp d
13fa0 61 74 61 62 61 73 65 20 74 68 61 74 20 72 65 66  atabase that ref
13fb0 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20 69  ers to a table i
13fc0 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a 2a 20 64  n another.  ** d
13fd0 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
13fe0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
13ff0 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
14000 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
14010 51 2e 25 73 20 57 48 45 52 45 20 74 62 6c 5f 6e  Q.%s WHERE tbl_n
14020 61 6d 65 3d 25 51 20 61 6e 64 20 74 79 70 65 21  ame=%Q and type!
14030 3d 27 74 72 69 67 67 65 72 27 22 2c 0a 20 20 20  ='trigger'",.   
14040 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 53     pDb->zName, S
14050 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29  CHEMA_TABLE(iDb)
14060 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
14070 20 20 69 66 28 20 21 69 73 56 69 65 77 20 26 26    if( !isView &&
14080 20 21 49 73 56 69 72 74 75 61 6c 28 70 54 61 62   !IsVirtual(pTab
14090 29 20 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79  ) ){.    destroy
140a0 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54  Table(pParse, pT
140b0 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ab);.  }..  /* R
140c0 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20  emove the table 
140d0 65 6e 74 72 79 20 66 72 6f 6d 20 53 51 4c 69 74  entry from SQLit
140e0 65 27 73 20 69 6e 74 65 72 6e 61 6c 20 73 63 68  e's internal sch
140f0 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66 79 0a 20  ema and modify. 
14100 20 2a 2a 20 74 68 65 20 73 63 68 65 6d 61 20 63   ** the schema c
14110 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  ookie..  */.  if
14120 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
14130 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
14140 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
14150 5f 56 44 65 73 74 72 6f 79 2c 20 69 44 62 2c 20  _VDestroy, iDb, 
14160 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  0, 0, pTab->zNam
14170 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  e, 0);.  }.  sql
14180 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
14190 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c 65 2c 20  , OP_DropTable, 
141a0 69 44 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d  iDb, 0, 0, pTab-
141b0 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71  >zName, 0);.  sq
141c0 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
141d0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
141e0 20 20 73 71 6c 69 74 65 56 69 65 77 52 65 73 65    sqliteViewRese
141f0 74 41 6c 6c 28 64 62 2c 20 69 44 62 29 3b 0a 7d  tAll(db, iDb);.}
14200 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14210 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
14220 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 20 6f 66  o do the work of
14230 20 61 20 44 52 4f 50 20 54 41 42 4c 45 20 73 74   a DROP TABLE st
14240 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70 4e 61 6d  atement..** pNam
14250 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
14260 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
14270 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a 76 6f 69   dropped..*/.voi
14280 64 20 73 71 6c 69 74 65 33 44 72 6f 70 54 61 62  d sqlite3DropTab
14290 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  le(Parse *pParse
142a0 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e 61 6d 65  , SrcList *pName
142b0 2c 20 69 6e 74 20 69 73 56 69 65 77 2c 20 69 6e  , int isView, in
142c0 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54 61 62 6c  t noErr){.  Tabl
142d0 65 20 2a 70 54 61 62 3b 0a 20 20 56 64 62 65 20  e *pTab;.  Vdbe 
142e0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
142f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
14300 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 69 66    int iDb;..  if
14310 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14320 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  ed ){.    goto e
14330 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14340 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
14350 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29 3b  arse->nErr==0 );
14360 0a 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65  .  assert( pName
14370 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 69  ->nSrc==1 );.  i
14380 66 28 20 73 71 6c 69 74 65 33 52 65 61 64 53 63  f( sqlite3ReadSc
14390 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 20 67  hema(pParse) ) g
143a0 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61  oto exit_drop_ta
143b0 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  ble;.  if( noErr
143c0 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
143d0 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20 3d 20 73  rr++;.  pTab = s
143e0 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c  qlite3LocateTabl
143f0 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 69 73  eItem(pParse, is
14400 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d 3e 61 5b  View, &pName->a[
14410 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f 45 72 72  0]);.  if( noErr
14420 20 29 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45   ) db->suppressE
14430 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20 70 54 61  rr--;..  if( pTa
14440 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  b==0 ){.    if( 
14450 6e 6f 45 72 72 20 29 20 73 71 6c 69 74 65 33 43  noErr ) sqlite3C
14460 6f 64 65 56 65 72 69 66 79 4e 61 6d 65 64 53 63  odeVerifyNamedSc
14470 68 65 6d 61 28 70 50 61 72 73 65 2c 20 70 4e 61  hema(pParse, pNa
14480 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74 61 62 61  me->a[0].zDataba
14490 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  se);.    goto ex
144a0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
144b0 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74   }.  iDb = sqlit
144c0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
144d0 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
144e0 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44  a);.  assert( iD
144f0 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
14500 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nDb );..  /* If 
14510 70 54 61 62 20 69 73 20 61 20 76 69 72 74 75 61  pTab is a virtua
14520 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c 20 56 69  l table, call Vi
14530 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
14540 28 29 20 74 6f 20 65 6e 73 75 72 65 0a 20 20 2a  () to ensure.  *
14550 2a 20 69 74 20 69 73 20 69 6e 69 74 69 61 6c 69  * it is initiali
14560 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
14570 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
14580 26 26 20 73 71 6c 69 74 65 33 56 69 65 77 47 65  && sqlite3ViewGe
14590 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 70 50 61  tColumnNames(pPa
145a0 72 73 65 2c 20 70 54 61 62 29 20 29 7b 0a 20 20  rse, pTab) ){.  
145b0 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70    goto exit_drop
145c0 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23 69 66 6e  _table;.  }.#ifn
145d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
145e0 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
145f0 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  {.    int code;.
14600 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14610 7a 54 61 62 20 3d 20 53 43 48 45 4d 41 5f 54 41  zTab = SCHEMA_TA
14620 42 4c 45 28 69 44 62 29 3b 0a 20 20 20 20 63 6f  BLE(iDb);.    co
14630 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
14640 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
14650 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  me;.    const ch
14660 61 72 20 2a 7a 41 72 67 32 20 3d 20 30 3b 0a 20  ar *zArg2 = 0;. 
14670 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
14680 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
14690 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 7a  SQLITE_DELETE, z
146a0 54 61 62 2c 20 30 2c 20 7a 44 62 29 29 7b 0a 20  Tab, 0, zDb)){. 
146b0 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64       goto exit_d
146c0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d  rop_table;.    }
146d0 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
146e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d  ){.      if( !OM
146f0 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62  IT_TEMPDB && iDb
14700 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
14710 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
14720 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a 20 20 20  P_TEMP_VIEW;.   
14730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14740 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14750 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20 20 20 20  DROP_VIEW;.     
14760 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
14770 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
14780 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  BLE.    }else if
14790 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62  ( IsVirtual(pTab
147a0 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 64 65 20  ) ){.      code 
147b0 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 56 54  = SQLITE_DROP_VT
147c0 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a 41 72 67  ABLE;.      zArg
147d0 32 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  2 = sqlite3GetVT
147e0 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29 2d 3e  able(db, pTab)->
147f0 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a 23 65 6e  pMod->zName;.#en
14800 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  dif.    }else{. 
14810 20 20 20 20 20 69 66 28 20 21 4f 4d 49 54 5f 54       if( !OMIT_T
14820 45 4d 50 44 42 20 26 26 20 69 44 62 3d 3d 31 20  EMPDB && iDb==1 
14830 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 64 65 20  ){.        code 
14840 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45  = SQLITE_DROP_TE
14850 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20  MP_TABLE;.      
14860 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
14870 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f  ode = SQLITE_DRO
14880 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7d  P_TABLE;.      }
14890 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
148a0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
148b0 70 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 54  pParse, code, pT
148c0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41 72 67 32  ab->zName, zArg2
148d0 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20  , zDb) ){.      
148e0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
148f0 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  able;.    }.    
14900 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68 43  if( sqlite3AuthC
14910 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
14920 49 54 45 5f 44 45 4c 45 54 45 2c 20 70 54 61 62  ITE_DELETE, pTab
14930 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a 44 62 29  ->zName, 0, zDb)
14940 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
14950 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a  xit_drop_table;.
14960 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
14970 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
14980 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e 61  rNICmp(pTab->zNa
14990 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20 37  me, "sqlite_", 7
149a0 29 3d 3d 30 20 0a 20 20 20 20 26 26 20 73 71 6c  )==0 .    && sql
149b0 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61  ite3StrNICmp(pTa
149c0 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74  b->zName, "sqlit
149d0 65 5f 73 74 61 74 22 2c 20 31 31 29 21 3d 30 20  e_stat", 11)!=0 
149e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
149f0 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
14a00 74 61 62 6c 65 20 25 73 20 6d 61 79 20 6e 6f 74  table %s may not
14a10 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20 70 54   be dropped", pT
14a20 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
14a30 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74  goto exit_drop_t
14a40 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  able;.  }..#ifnd
14a50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
14a60 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20  IEW.  /* Ensure 
14a70 44 52 4f 50 20 54 41 42 4c 45 20 69 73 20 6e 6f  DROP TABLE is no
14a80 74 20 75 73 65 64 20 6f 6e 20 61 20 76 69 65 77  t used on a view
14a90 2c 20 61 6e 64 20 44 52 4f 50 20 56 49 45 57 20  , and DROP VIEW 
14aa0 69 73 20 6e 6f 74 20 75 73 65 64 0a 20 20 2a 2a  is not used.  **
14ab0 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a 20 20 2a   on a table..  *
14ac0 2f 0a 20 20 69 66 28 20 69 73 56 69 65 77 20 26  /.  if( isView &
14ad0 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d  & pTab->pSelect=
14ae0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14af0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14b00 2c 20 22 75 73 65 20 44 52 4f 50 20 54 41 42 4c  , "use DROP TABL
14b10 45 20 74 6f 20 64 65 6c 65 74 65 20 74 61 62 6c  E to delete tabl
14b20 65 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  e %s", pTab->zNa
14b30 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14b40 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14b50 20 7d 0a 20 20 69 66 28 20 21 69 73 56 69 65 77   }.  if( !isView
14b60 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   && pTab->pSelec
14b70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
14b80 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
14b90 20 22 75 73 65 20 44 52 4f 50 20 56 49 45 57 20   "use DROP VIEW 
14ba0 74 6f 20 64 65 6c 65 74 65 20 76 69 65 77 20 25  to delete view %
14bb0 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  s", pTab->zName)
14bc0 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
14bd0 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a  drop_table;.  }.
14be0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e  #endif..  /* Gen
14bf0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 72 65  erate code to re
14c00 6d 6f 76 65 20 74 68 65 20 74 61 62 6c 65 20 66  move the table f
14c10 72 6f 6d 20 74 68 65 20 6d 61 73 74 65 72 20 74  rom the master t
14c20 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20 64 69 73  able.  ** on dis
14c30 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d 20 73 71  k..  */.  v = sq
14c40 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
14c50 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  rse);.  if( v ){
14c60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
14c70 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
14c80 70 50 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b  pParse, 1, iDb);
14c90 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6c 65 61  .    sqlite3Clea
14ca0 72 53 74 61 74 54 61 62 6c 65 73 28 70 50 61 72  rStatTables(pPar
14cb0 73 65 2c 20 69 44 62 2c 20 22 74 62 6c 22 2c 20  se, iDb, "tbl", 
14cc0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pTab->zName);.  
14cd0 20 20 73 71 6c 69 74 65 33 46 6b 44 72 6f 70 54    sqlite3FkDropT
14ce0 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 4e 61  able(pParse, pNa
14cf0 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 73  me, pTab);.    s
14d00 71 6c 69 74 65 33 43 6f 64 65 44 72 6f 70 54 61  qlite3CodeDropTa
14d10 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
14d20 2c 20 69 44 62 2c 20 69 73 56 69 65 77 29 3b 0a  , iDb, isView);.
14d30 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 74    }..exit_drop_t
14d40 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74 65 33 53  able:.  sqlite3S
14d50 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
14d60 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
14d70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
14d80 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61  s called to crea
14d90 74 65 20 61 20 6e 65 77 20 66 6f 72 65 69 67 6e  te a new foreign
14da0 20 6b 65 79 20 6f 6e 20 74 68 65 20 74 61 62 6c   key on the tabl
14db0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 75  e.** currently u
14dc0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
14dd0 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20 64 65 74  n.  pFromCol det
14de0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 63 6f  ermines which co
14df0 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74 68 65 20  lumns.** in the 
14e00 63 75 72 72 65 6e 74 20 74 61 62 6c 65 20 70 6f  current table po
14e10 69 6e 74 20 74 6f 20 74 68 65 20 66 6f 72 65 69  int to the forei
14e20 67 6e 20 6b 65 79 2e 20 20 49 66 20 70 46 72 6f  gn key.  If pFro
14e30 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  mCol==0 then.** 
14e40 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b 65 79 20  connect the key 
14e50 74 6f 20 74 68 65 20 6c 61 73 74 20 63 6f 6c 75  to the last colu
14e60 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 70 54  mn inserted.  pT
14e70 6f 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  o is the name of
14e80 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 72 65  .** the table re
14e90 66 65 72 72 65 64 20 74 6f 20 28 61 2e 6b 2e 61  ferred to (a.k.a
14ea0 20 74 68 65 20 22 70 61 72 65 6e 74 22 20 74 61   the "parent" ta
14eb0 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c 20 69 73  ble).  pToCol is
14ec0 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 74 61   a list.** of ta
14ed0 62 6c 65 73 20 69 6e 20 74 68 65 20 70 61 72 65  bles in the pare
14ee0 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e 20 20 66  nt pTo table.  f
14ef0 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73 20 61 6c  lags contains al
14f00 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  l.** information
14f10 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 66 6c   about the confl
14f20 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
14f30 6c 67 6f 72 69 74 68 6d 73 20 73 70 65 63 69 66  lgorithms specif
14f40 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  ied.** in the ON
14f50 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55 50 44 41   DELETE, ON UPDA
14f60 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53 45 52 54  TE and ON INSERT
14f70 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20   clauses..**.** 
14f80 41 6e 20 46 4b 65 79 20 73 74 72 75 63 74 75 72  An FKey structur
14f90 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
14fa0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 74 61   added to the ta
14fb0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ble currently.**
14fc0 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
14fd0 69 6f 6e 20 69 6e 20 74 68 65 20 70 50 61 72 73  ion in the pPars
14fe0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 66 69 65  e->pNewTable fie
14ff0 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ld..**.** The fo
15000 72 65 69 67 6e 20 6b 65 79 20 69 73 20 73 65 74  reign key is set
15010 20 66 6f 72 20 49 4d 4d 45 44 49 41 54 45 20 70   for IMMEDIATE p
15020 72 6f 63 65 73 73 69 6e 67 2e 20 20 41 20 73 75  rocessing.  A su
15030 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a 2a  bsequent call.**
15040 20 74 6f 20 73 71 6c 69 74 65 33 44 65 66 65 72   to sqlite3Defer
15050 46 6f 72 65 69 67 6e 4b 65 79 28 29 20 6d 69 67  ForeignKey() mig
15060 68 74 20 63 68 61 6e 67 65 20 74 68 69 73 20 74  ht change this t
15070 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a 2f 0a 76  o DEFERRED..*/.v
15080 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
15090 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a 20 20 50  eForeignKey(.  P
150a0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
150b0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
150c0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
150d0 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f 6c 2c 20  List *pFromCol, 
150e0 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e 20 74   /* Columns in t
150f0 68 69 73 20 74 61 62 6c 65 20 74 68 61 74 20 70  his table that p
15100 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72 20 74 61  oint to other ta
15110 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ble */.  Token *
15120 70 54 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  pTo,          /*
15130 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 74 68   Name of the oth
15140 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  er table */.  Ex
15150 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f 6c 2c 20  prList *pToCol, 
15160 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69 6e     /* Columns in
15170 20 74 68 65 20 6f 74 68 65 72 20 74 61 62 6c 65   the other table
15180 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
15190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
151a0 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
151b0 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e 20 2a 2f  n algorithms. */
151c0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
151d0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
151e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
151f0 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
15200 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 20 3d 20    FKey *pFKey = 
15210 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e 65 78 74  0;.  FKey *pNext
15220 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a 70 20 3d  To;.  Table *p =
15230 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
15240 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  le;.  int nByte;
15250 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
15260 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nCol;.  char *z;
15270 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 21  ..  assert( pTo!
15280 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  =0 );.  if( p==0
15290 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f 56   || IN_DECLARE_V
152a0 54 41 42 20 29 20 67 6f 74 6f 20 66 6b 5f 65 6e  TAB ) goto fk_en
152b0 64 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 43 6f  d;.  if( pFromCo
152c0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  l==0 ){.    int 
152d0 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f 6c 2d 31  iCol = p->nCol-1
152e0 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52 28  ;.    if( NEVER(
152f0 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74 6f 20 66  iCol<0) ) goto f
15300 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66 28 20 70  k_end;.    if( p
15310 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c 2d  ToCol && pToCol-
15320 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a 20 20 20  >nExpr!=1 ){.   
15330 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15340 73 67 28 70 50 61 72 73 65 2c 20 22 66 6f 72 65  sg(pParse, "fore
15350 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73 22 0a 20  ign key on %s". 
15360 20 20 20 20 20 20 20 20 22 20 73 68 6f 75 6c 64          " should
15370 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 20   reference only 
15380 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61  one column of ta
15390 62 6c 65 20 25 54 22 2c 0a 20 20 20 20 20 20 20  ble %T",.       
153a0 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e    p->aCol[iCol].
153b0 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a 20 20 20  zName, pTo);.   
153c0 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a     goto fk_end;.
153d0 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
153e0 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   1;.  }else if( 
153f0 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43 6f 6c  pToCol && pToCol
15400 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f 6d 43 6f  ->nExpr!=pFromCo
15410 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  l->nExpr ){.    
15420 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
15430 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
15440 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d  "number of colum
15450 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65  ns in foreign ke
15460 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
15470 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
15480 0a 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e  .        "column
15490 73 20 69 6e 20 74 68 65 20 72 65 66 65 72 65 6e  s in the referen
154a0 63 65 64 20 74 61 62 6c 65 22 29 3b 0a 20 20 20  ced table");.   
154b0 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20   goto fk_end;.  
154c0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43 6f 6c 20  }else{.    nCol 
154d0 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e 45 78 70  = pFromCol->nExp
154e0 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  r;.  }.  nByte =
154f0 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65 79 29 20   sizeof(*pFKey) 
15500 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69 7a 65 6f  + (nCol-1)*sizeo
15510 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d  f(pFKey->aCol[0]
15520 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20 31 3b 0a  ) + pTo->n + 1;.
15530 20 20 69 66 28 20 70 54 6f 43 6f 6c 20 29 7b 0a    if( pToCol ){.
15540 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15550 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b 20 69 2b  ToCol->nExpr; i+
15560 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79 74 65 20  +){.      nByte 
15570 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
15580 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  30(pToCol->a[i].
15590 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20  zName) + 1;.    
155a0 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79 20 3d 20  }.  }.  pFKey = 
155b0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
155c0 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 29 3b  ero(db, nByte );
155d0 0a 20 20 69 66 28 20 70 46 4b 65 79 3d 3d 30 20  .  if( pFKey==0 
155e0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  ){.    goto fk_e
155f0 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d  nd;.  }.  pFKey-
15600 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20 20 70 46  >pFrom = p;.  pF
15610 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f 6d 20 3d  Key->pNextFrom =
15620 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20 7a 20 3d   p->pFKey;.  z =
15630 20 28 63 68 61 72 2a 29 26 70 46 4b 65 79 2d 3e   (char*)&pFKey->
15640 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20 20 70 46  aCol[nCol];.  pF
15650 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b 0a 20 20  Key->zTo = z;.  
15660 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f 2d 3e 7a  memcpy(z, pTo->z
15670 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20 7a 5b 70  , pTo->n);.  z[p
15680 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 73 71  To->n] = 0;.  sq
15690 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 29 3b  lite3Dequote(z);
156a0 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e 6e 2b 31  .  z += pTo->n+1
156b0 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43 6f 6c 20  ;.  pFKey->nCol 
156c0 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28 20 70 46  = nCol;.  if( pF
156d0 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  romCol==0 ){.   
156e0 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b 30 5d 2e   pFKey->aCol[0].
156f0 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43 6f 6c 2d  iFrom = p->nCol-
15700 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
15710 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
15720 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
15730 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
15740 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b 20 6a 2b  0; j<p->nCol; j+
15750 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
15760 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
15770 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c  ->aCol[j].zName,
15780 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b 69 5d 2e   pFromCol->a[i].
15790 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
157a0 20 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43         pFKey->aC
157b0 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d 20 6a 3b  ol[i].iFrom = j;
157c0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
157d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
157e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3e    }.      if( j>
157f0 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  =p->nCol ){.    
15800 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
15810 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
15820 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f 77 6e 20         "unknown 
15830 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22 20 69 6e  column \"%s\" in
15840 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 64 65 66   foreign key def
15850 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20 20 20 20  inition", .     
15860 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61       pFromCol->a
15870 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
15880 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15890 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
158a0 20 7d 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20   }.  if( pToCol 
158b0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
158c0 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
158d0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
158e0 74 65 33 53 74 72 6c 65 6e 33 30 28 70 54 6f 43  te3Strlen30(pToC
158f0 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ol->a[i].zName);
15900 0a 20 20 20 20 20 20 70 46 4b 65 79 2d 3e 61 43  .      pFKey->aC
15910 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20 7a 3b 0a  ol[i].zCol = z;.
15920 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 2c 20        memcpy(z, 
15930 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61  pToCol->a[i].zNa
15940 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7a 5b  me, n);.      z[
15950 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 20  n] = 0;.      z 
15960 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  += n+1;.    }.  
15970 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73 44 65 66  }.  pFKey->isDef
15980 65 72 72 65 64 20 3d 20 30 3b 0a 20 20 70 46 4b  erred = 0;.  pFK
15990 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d 20 3d  ey->aAction[0] =
159a0 20 28 75 38 29 28 66 6c 61 67 73 20 26 20 30 78   (u8)(flags & 0x
159b0 66 66 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ff);            
159c0 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20 61 63 74  /* ON DELETE act
159d0 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65 79 2d 3e  ion */.  pFKey->
159e0 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20 28 75 38  aAction[1] = (u8
159f0 29 28 28 66 6c 61 67 73 20 3e 3e 20 38 20 29 20  )((flags >> 8 ) 
15a00 26 20 30 78 66 66 29 3b 20 20 20 20 2f 2a 20 4f  & 0xff);    /* O
15a10 4e 20 55 50 44 41 54 45 20 61 63 74 69 6f 6e 20  N UPDATE action 
15a20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
15a30 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
15a40 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 2d 3e 70  Held(db, 0, p->p
15a50 53 63 68 65 6d 61 29 20 29 3b 0a 20 20 70 4e 65  Schema) );.  pNe
15a60 78 74 54 6f 20 3d 20 28 46 4b 65 79 20 2a 29 73  xtTo = (FKey *)s
15a70 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
15a80 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d 3e 66 6b  (&p->pSchema->fk
15a90 65 79 48 61 73 68 2c 20 0a 20 20 20 20 20 20 70  eyHash, .      p
15aa0 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76 6f 69 64  FKey->zTo, (void
15ab0 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b 0a 20 20   *)pFKey.  );.  
15ac0 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d 70 46 4b  if( pNextTo==pFK
15ad0 65 79 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61  ey ){.    db->ma
15ae0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
15af0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
15b00 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 78 74  .  }.  if( pNext
15b10 54 6f 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  To ){.    assert
15b20 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50 72 65 76  ( pNextTo->pPrev
15b30 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20 70 46 4b  To==0 );.    pFK
15b40 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d 20 70 4e  ey->pNextTo = pN
15b50 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e 65 78 74  extTo;.    pNext
15b60 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d 20 70 46  To->pPrevTo = pF
15b70 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  Key;.  }..  /* L
15b80 69 6e 6b 20 74 68 65 20 66 6f 72 65 69 67 6e 20  ink the foreign 
15b90 6b 65 79 20 74 6f 20 74 68 65 20 74 61 62 6c 65  key to the table
15ba0 20 61 73 20 74 68 65 20 6c 61 73 74 20 73 74 65   as the last ste
15bb0 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 70 46 4b  p..  */.  p->pFK
15bc0 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20 20 70 46  ey = pFKey;.  pF
15bd0 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f 65 6e 64  Key = 0;..fk_end
15be0 3a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  :.  sqlite3DbFre
15bf0 65 28 64 62 2c 20 70 46 4b 65 79 29 3b 0a 23 65  e(db, pFKey);.#e
15c00 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
15c10 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52  (SQLITE_OMIT_FOR
15c20 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a 20 20 73  EIGN_KEY) */.  s
15c30 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
15c40 6c 65 74 65 28 64 62 2c 20 70 46 72 6f 6d 43 6f  lete(db, pFromCo
15c50 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
15c60 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
15c70 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pToCol);.}../*.*
15c80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
15c90 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  s called when an
15ca0 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d 4d 45 44   INITIALLY IMMED
15cb0 49 41 54 45 20 6f 72 20 49 4e 49 54 49 41 4c 4c  IATE or INITIALL
15cc0 59 20 44 45 46 45 52 52 45 44 0a 2a 2a 20 63 6c  Y DEFERRED.** cl
15cd0 61 75 73 65 20 69 73 20 73 65 65 6e 20 61 73 20  ause is seen as 
15ce0 70 61 72 74 20 6f 66 20 61 20 66 6f 72 65 69 67  part of a foreig
15cf0 6e 20 6b 65 79 20 64 65 66 69 6e 69 74 69 6f 6e  n key definition
15d00 2e 20 20 54 68 65 20 69 73 44 65 66 65 72 72 65  .  The isDeferre
15d10 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  d.** parameter i
15d20 73 20 31 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  s 1 for INITIALL
15d30 59 20 44 45 46 45 52 52 45 44 20 61 6e 64 20 30  Y DEFERRED and 0
15d40 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c 59 20 49   for INITIALLY I
15d50 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20 54 68 65  MMEDIATE..** The
15d60 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65   behavior of the
15d70 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63   most recently c
15d80 72 65 61 74 65 64 20 66 6f 72 65 69 67 6e 20 6b  reated foreign k
15d90 65 79 20 69 73 20 61 64 6a 75 73 74 65 64 0a 2a  ey is adjusted.*
15da0 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a  * accordingly..*
15db0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44 65  /.void sqlite3De
15dc0 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 50 61  ferForeignKey(Pa
15dd0 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
15de0 20 69 73 44 65 66 65 72 72 65 64 29 7b 0a 23 69   isDeferred){.#i
15df0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15e00 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
15e10 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 46  Table *pTab;.  F
15e20 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20 20 69 66  Key *pFKey;.  if
15e30 28 20 28 70 54 61 62 20 3d 20 70 50 61 72 73 65  ( (pTab = pParse
15e40 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30 20  ->pNewTable)==0 
15e50 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70 54 61 62  || (pFKey = pTab
15e60 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29 20 72 65  ->pFKey)==0 ) re
15e70 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
15e80 69 73 44 65 66 65 72 72 65 64 3d 3d 30 20 7c 7c  isDeferred==0 ||
15e90 20 69 73 44 65 66 65 72 72 65 64 3d 3d 31 20 29   isDeferred==1 )
15ea0 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 33 32 33  ; /* EV: R-30323
15eb0 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70 46 4b 65  -21917 */.  pFKe
15ec0 79 2d 3e 69 73 44 65 66 65 72 72 65 64 20 3d 20  y->isDeferred = 
15ed0 28 75 38 29 69 73 44 65 66 65 72 72 65 64 3b 0a  (u8)isDeferred;.
15ee0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
15ef0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
15f00 61 74 20 77 69 6c 6c 20 65 72 61 73 65 20 61 6e  at will erase an
15f10 64 20 72 65 66 69 6c 6c 20 69 6e 64 65 78 20 2a  d refill index *
15f20 70 49 64 78 2e 20 20 54 68 69 73 20 69 73 0a 2a  pIdx.  This is.*
15f30 2a 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69 61  * used to initia
15f40 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20 63 72 65  lize a newly cre
15f50 61 74 65 64 20 69 6e 64 65 78 20 6f 72 20 74 6f  ated index or to
15f60 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a   recompute the.*
15f70 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20  * content of an 
15f80 69 6e 64 65 78 20 69 6e 20 72 65 73 70 6f 6e 73  index in respons
15f90 65 20 74 6f 20 61 20 52 45 49 4e 44 45 58 20 63  e to a REINDEX c
15fa0 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 69 66  ommand..**.** if
15fb0 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20 69 73 20   memRootPage is 
15fc0 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c 20 69 74  not negative, it
15fd0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
15fe0 69 6e 64 65 78 20 69 73 20 6e 65 77 6c 79 0a 2a  index is newly.*
15ff0 2a 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20  * created.  The 
16000 72 65 67 69 73 74 65 72 20 73 70 65 63 69 66 69  register specifi
16010 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74 50 61 67  ed by memRootPag
16020 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 0a 2a  e contains the.*
16030 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d 62  * root page numb
16040 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  er of the index.
16050 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65    If memRootPage
16060 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
16070 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  en.** the index 
16080 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
16090 6e 64 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  nd must be clear
160a0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
160b0 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20  refilled and.** 
160c0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  the root page nu
160d0 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64 65  mber of the inde
160e0 78 20 69 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  x is taken from 
160f0 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e 0a 2a 2f  pIndex->tnum..*/
16100 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c  .static void sql
16110 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
16120 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
16130 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 69 6e  ndex *pIndex, in
16140 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65 29 7b 0a  t memRootPage){.
16150 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
16160 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 20  pIndex->pTable; 
16170 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 68   /* The table th
16180 61 74 20 69 73 20 69 6e 64 65 78 65 64 20 2a 2f  at is indexed */
16190 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
161a0 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
161b0 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72 73 6f    /* Btree curso
161c0 72 20 75 73 65 64 20 66 6f 72 20 70 54 61 62 20  r used for pTab 
161d0 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  */.  int iIdx = 
161e0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20  pParse->nTab++; 
161f0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75 72      /* Btree cur
16200 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 49 6e  sor used for pIn
16210 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 53 6f  dex */.  int iSo
16220 72 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  rter;           
16230 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
16240 72 20 6f 70 65 6e 65 64 20 62 79 20 4f 70 65 6e  r opened by Open
16250 53 6f 72 74 65 72 20 28 69 66 20 69 6e 20 75 73  Sorter (if in us
16260 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  e) */.  int addr
16270 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
16280 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
16290 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c 6f 6f 70  s of top of loop
162a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 32 3b   */.  int addr2;
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162c0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
162d0 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f 72 20 6e  to jump to for n
162e0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ext iteration */
162f0 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20 20 20 20  .  int tnum;    
16300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16310 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
16320 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  f index */.  int
16330 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c 3b 20   iPartIdxLabel; 
16340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
16350 75 6d 70 20 74 6f 20 74 68 69 73 20 6c 61 62 65  ump to this labe
16360 6c 20 74 6f 20 73 6b 69 70 20 61 20 72 6f 77 20  l to skip a row 
16370 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20  */.  Vdbe *v;   
16380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16390 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
163a0 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 76  code into this v
163b0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 2a  irtual machine *
163c0 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  /.  KeyInfo *pKe
163d0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
163e0 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f 20 66 6f     /* KeyInfo fo
163f0 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  r index */.  int
16400 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20 20 20   regRecord;     
16410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16420 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
16430 61 73 73 65 6d 62 6c 65 64 20 69 6e 64 65 78 20  assembled index 
16440 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
16450 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
16460 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a 20 54 68  ->db;      /* Th
16470 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
16480 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ction */.  int i
16490 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
164a0 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 49  maToIndex(db, pI
164b0 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  ndex->pSchema);.
164c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
164d0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
164e0 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ON.  if( sqlite3
164f0 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
16500 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e 44 45 58  , SQLITE_REINDEX
16510 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  , pIndex->zName,
16520 20 30 2c 0a 20 20 20 20 20 20 64 62 2d 3e 61 44   0,.      db->aD
16530 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20 29 20 29  b[iDb].zName ) )
16540 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
16550 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52  }.#endif..  /* R
16560 65 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  equire a write-l
16570 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
16580 20 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 69 73   to perform this
16590 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20   operation */.  
165a0 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b  sqlite3TableLock
165b0 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 70 54  (pParse, iDb, pT
165c0 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20 70 54 61  ab->tnum, 1, pTa
165d0 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20 20 76 20  b->zName);..  v 
165e0 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
165f0 28 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20  (pParse);.  if( 
16600 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
16610 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50 61 67 65   if( memRootPage
16620 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e 75 6d 20  >=0 ){.    tnum 
16630 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65 3b 0a 20  = memRootPage;. 
16640 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 6e 75 6d   }else{.    tnum
16650 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 3b   = pIndex->tnum;
16660 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d 20 73 71  .  }.  pKey = sq
16670 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
16680 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
16690 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  ex);..  /* Open 
166a0 74 68 65 20 73 6f 72 74 65 72 20 63 75 72 73 6f  the sorter curso
166b0 72 20 69 66 20 77 65 20 61 72 65 20 74 6f 20 75  r if we are to u
166c0 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 53 6f  se one. */.  iSo
166d0 72 74 65 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  rter = pParse->n
166e0 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Tab++;.  sqlite3
166f0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
16700 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20 69 53 6f  _SorterOpen, iSo
16710 72 74 65 72 2c 20 30 2c 20 70 49 6e 64 65 78 2d  rter, 0, pIndex-
16720 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68 61 72 2a  >nKeyCol, (char*
16730 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
16740 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65 79        sqlite3Key
16750 49 6e 66 6f 52 65 66 28 70 4b 65 79 29 2c 20 50  InfoRef(pKey), P
16760 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 2f  4_KEYINFO);..  /
16770 2a 20 4f 70 65 6e 20 74 68 65 20 74 61 62 6c 65  * Open the table
16780 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  . Loop through a
16790 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74  ll rows of the t
167a0 61 62 6c 65 2c 20 69 6e 73 65 72 74 69 6e 67 20  able, inserting 
167b0 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65 63 6f 72  index.  ** recor
167c0 64 73 20 69 6e 74 6f 20 74 68 65 20 73 6f 72 74  ds into the sort
167d0 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  er. */.  sqlite3
167e0 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65  OpenTable(pParse
167f0 2c 20 69 54 61 62 2c 20 69 44 62 2c 20 70 54 61  , iTab, iDb, pTa
16800 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b  b, OP_OpenRead);
16810 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
16820 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
16830 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62 2c  OP_Rewind, iTab,
16840 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67   0); VdbeCoverag
16850 65 28 76 29 3b 0a 20 20 72 65 67 52 65 63 6f 72  e(v);.  regRecor
16860 64 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  d = sqlite3GetTe
16870 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 0a  mpReg(pParse);..
16880 20 20 73 71 6c 69 74 65 33 47 65 6e 65 72 61 74    sqlite3Generat
16890 65 49 6e 64 65 78 4b 65 79 28 70 50 61 72 73 65  eIndexKey(pParse
168a0 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c 72 65 67  ,pIndex,iTab,reg
168b0 52 65 63 6f 72 64 2c 30 2c 26 69 50 61 72 74 49  Record,0,&iPartI
168c0 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b 0a 20 20  dxLabel,0,0);.  
168d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
168e0 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 49 6e  2(v, OP_SorterIn
168f0 73 65 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 72  sert, iSorter, r
16900 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
16910 69 74 65 33 52 65 73 6f 6c 76 65 50 61 72 74 49  ite3ResolvePartI
16920 64 78 4c 61 62 65 6c 28 70 50 61 72 73 65 2c 20  dxLabel(pParse, 
16930 69 50 61 72 74 49 64 78 4c 61 62 65 6c 29 3b 0a  iPartIdxLabel);.
16940 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16950 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
16960 69 54 61 62 2c 20 61 64 64 72 31 2b 31 29 3b 20  iTab, addr1+1); 
16970 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
16980 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75  .  sqlite3VdbeJu
16990 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29  mpHere(v, addr1)
169a0 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
169b0 61 67 65 3c 30 20 29 20 73 71 6c 69 74 65 33 56  age<0 ) sqlite3V
169c0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
169d0 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20 69 44 62  Clear, tnum, iDb
169e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
169f0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
16a00 6e 57 72 69 74 65 2c 20 69 49 64 78 2c 20 74 6e  nWrite, iIdx, tn
16a10 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20 20 20 20  um, iDb, .      
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
16a30 68 61 72 20 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  har *)pKey, P4_K
16a40 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71 6c 69 74  EYINFO);.  sqlit
16a50 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
16a60 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b 43 53 52  , OPFLAG_BULKCSR
16a70 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67 65 3e 3d  |((memRootPage>=
16a80 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49 53 52 45  0)?OPFLAG_P2ISRE
16a90 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64 72 31 20  G:0));..  addr1 
16aa0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
16ab0 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72  Op2(v, OP_Sorter
16ac0 53 6f 72 74 2c 20 69 53 6f 72 74 65 72 2c 20 30  Sort, iSorter, 0
16ad0 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
16ae0 76 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  v);.  assert( pK
16af0 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  ey!=0 || db->mal
16b00 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 50 61  locFailed || pPa
16b10 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a 20 20 69  rse->nErr );.  i
16b20 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78  f( IsUniqueIndex
16b30 28 70 49 6e 64 65 78 29 20 26 26 20 70 4b 65 79  (pIndex) && pKey
16b40 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  !=0 ){.    int j
16b50 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
16b60 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
16b70 33 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  3;.    sqlite3Vd
16b80 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29 3b 0a 20  beGoto(v, j2);. 
16b90 20 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74     addr2 = sqlit
16ba0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
16bb0 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
16bc0 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76  3VdbeAddOp4Int(v
16bd0 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f 6d 70 61  , OP_SorterCompa
16be0 72 65 2c 20 69 53 6f 72 74 65 72 2c 20 6a 32 2c  re, iSorter, j2,
16bf0 20 72 65 67 52 65 63 6f 72 64 2c 0a 20 20 20 20   regRecord,.    
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 4b 65       pIndex->nKe
16c20 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f 76 65 72  yCol); VdbeCover
16c30 61 67 65 28 76 29 3b 0a 20 20 20 20 73 71 6c 69  age(v);.    sqli
16c40 74 65 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61  te3UniqueConstra
16c50 69 6e 74 28 70 50 61 72 73 65 2c 20 4f 45 5f 41  int(pParse, OE_A
16c60 62 6f 72 74 2c 20 70 49 6e 64 65 78 29 3b 0a 20  bort, pIndex);. 
16c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 64 64 72   }else{.    addr
16c80 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
16c90 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
16ca0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65   }.  sqlite3Vdbe
16cb0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53 6f 72  AddOp3(v, OP_Sor
16cc0 74 65 72 44 61 74 61 2c 20 69 53 6f 72 74 65 72  terData, iSorter
16cd0 2c 20 72 65 67 52 65 63 6f 72 64 2c 20 69 49 64  , regRecord, iId
16ce0 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  x);.  sqlite3Vdb
16cf0 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4c 61  eAddOp3(v, OP_La
16d00 73 74 2c 20 69 49 64 78 2c 20 30 2c 20 2d 31 29  st, iIdx, 0, -1)
16d10 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16d20 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 64 78 49  ddOp3(v, OP_IdxI
16d30 6e 73 65 72 74 2c 20 69 49 64 78 2c 20 72 65 67  nsert, iIdx, reg
16d40 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20 20 73 71  Record, 0);.  sq
16d50 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16d60 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55 53 45 53  5(v, OPFLAG_USES
16d70 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20 20 73 71  EEKRESULT);.  sq
16d80 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
16d90 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 52  Reg(pParse, regR
16da0 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65  ecord);.  sqlite
16db0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16dc0 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c 20 69 53  P_SorterNext, iS
16dd0 6f 72 74 65 72 2c 20 61 64 64 72 32 29 3b 20 56  orter, addr2); V
16de0 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a  dbeCoverage(v);.
16df0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
16e00 70 48 65 72 65 28 76 2c 20 61 64 64 72 31 29 3b  pHere(v, addr1);
16e10 0a 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ..  sqlite3VdbeA
16e20 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
16e30 65 2c 20 69 54 61 62 29 3b 0a 20 20 73 71 6c 69  e, iTab);.  sqli
16e40 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
16e50 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49 64 78 29   OP_Close, iIdx)
16e60 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16e70 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
16e80 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a 7d 0a 0a  e, iSorter);.}..
16e90 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 68  /*.** Allocate h
16ea0 65 61 70 20 73 70 61 63 65 20 74 6f 20 68 6f 6c  eap space to hol
16eb0 64 20 61 6e 20 49 6e 64 65 78 20 6f 62 6a 65 63  d an Index objec
16ec0 74 20 77 69 74 68 20 6e 43 6f 6c 20 63 6f 6c 75  t with nCol colu
16ed0 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 63 72 65  mns..**.** Incre
16ee0 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 69  ase the allocati
16ef0 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72 6f 76 69  on size to provi
16f00 64 65 20 61 6e 20 65 78 74 72 61 20 6e 45 78 74  de an extra nExt
16f10 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 38  ra bytes.** of 8
16f20 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 73 70  -byte aligned sp
16f30 61 63 65 20 61 66 74 65 72 20 74 68 65 20 49 6e  ace after the In
16f40 64 65 78 20 6f 62 6a 65 63 74 20 61 6e 64 20 72  dex object and r
16f50 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
16f60 65 72 20 74 6f 20 74 68 69 73 20 65 78 74 72 61  er to this extra
16f70 20 73 70 61 63 65 20 69 6e 20 2a 70 70 45 78 74   space in *ppExt
16f80 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71  ra..*/.Index *sq
16f90 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64  lite3AllocateInd
16fa0 65 78 4f 62 6a 65 63 74 28 0a 20 20 73 71 6c 69  exObject(.  sqli
16fb0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
16fc0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
16fd0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 31 36  nection */.  i16
16fe0 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   nCol,          
16ff0 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
17000 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
17010 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  the index */.  i
17020 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20  nt nExtra,      
17030 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17040 20 62 79 74 65 73 20 6f 66 20 65 78 74 72 61 20   bytes of extra 
17050 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 20 2a  space to alloc *
17060 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 45 78 74  /.  char **ppExt
17070 72 61 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ra       /* Poin
17080 74 65 72 20 74 6f 20 74 68 65 20 22 65 78 74 72  ter to the "extr
17090 61 22 20 73 70 61 63 65 20 2a 2f 0a 29 7b 0a 20  a" space */.){. 
170a0 20 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20   Index *p;      
170b0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
170c0 65 64 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ed index object 
170d0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
170e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
170f0 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
17100 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2b 20 61  Index object + a
17110 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e 42 79 74  rrays */..  nByt
17120 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
17130 66 28 49 6e 64 65 78 29 29 20 2b 20 20 20 20 20  f(Index)) +     
17140 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
17150 78 20 73 74 72 75 63 74 75 72 65 20 20 2a 2f 0a  x structure  */.
17160 20 20 20 20 20 20 20 20 20 20 52 4f 55 4e 44 38            ROUND8
17170 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
17180 43 6f 6c 29 20 2b 20 20 20 20 20 20 20 20 20 2f  Col) +         /
17190 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c 6c 20 20  * Index.azColl  
171a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
171b0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4c 6f  ROUND8(sizeof(Lo
171c0 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 20 2b  gEst)*(nCol+1) +
171d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69       /* Index.ai
171e0 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a 2f 0a 20  RowLogEst   */. 
171f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17200 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c  sizeof(i16)*nCol
17210 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a   +            /*
17220 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20   Index.aiColumn 
17230 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
17240 20 20 20 20 20 20 73 69 7a 65 6f 66 28 75 38 29        sizeof(u8)
17250 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20 20 20 20  *nCol);         
17260 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f      /* Index.aSo
17270 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20 70 20 3d  rtOrder */.  p =
17280 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
17290 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 20 2b  Zero(db, nByte +
172a0 20 6e 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20   nExtra);.  if( 
172b0 70 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  p ){.    char *p
172c0 45 78 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29  Extra = ((char*)
172d0 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)+ROUND8(sizeof
172e0 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70 2d  (Index));.    p-
172f0 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e 73 74  >azColl = (const
17300 20 63 68 61 72 2a 2a 29 70 45 78 74 72 61 3b 20   char**)pExtra; 
17310 70 45 78 74 72 61 20 2b 3d 20 52 4f 55 4e 44 38  pExtra += ROUND8
17320 28 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 6e  (sizeof(char*)*n
17330 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e 61 69 52  Col);.    p->aiR
17340 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c 6f 67 45  owLogEst = (LogE
17350 73 74 2a 29 70 45 78 74 72 61 3b 20 70 45 78 74  st*)pExtra; pExt
17360 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28 4c 6f 67  ra += sizeof(Log
17370 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29 3b 0a 20  Est)*(nCol+1);. 
17380 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d     p->aiColumn =
17390 20 28 69 31 36 2a 29 70 45 78 74 72 61 3b 20 20   (i16*)pExtra;  
173a0 20 20 20 20 20 70 45 78 74 72 61 20 2b 3d 20 73       pExtra += s
173b0 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43 6f 6c 3b  izeof(i16)*nCol;
173c0 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74 4f 72 64  .    p->aSortOrd
173d0 65 72 20 3d 20 28 75 38 2a 29 70 45 78 74 72 61  er = (u8*)pExtra
173e0 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c 75 6d 6e  ;.    p->nColumn
173f0 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 70 2d 3e   = nCol;.    p->
17400 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f 6c 20 2d  nKeyCol = nCol -
17410 20 31 3b 0a 20 20 20 20 2a 70 70 45 78 74 72 61   1;.    *ppExtra
17420 20 3d 20 28 28 63 68 61 72 2a 29 70 29 20 2b 20   = ((char*)p) + 
17430 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nByte;.  }.  ret
17440 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
17450 43 72 65 61 74 65 20 61 20 6e 65 77 20 69 6e 64  Create a new ind
17460 65 78 20 66 6f 72 20 61 6e 20 53 51 4c 20 74 61  ex for an SQL ta
17470 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e 70 4e 61  ble.  pName1.pNa
17480 6d 65 32 20 69 73 20 74 68 65 20 6e 61 6d 65 20  me2 is the name 
17490 6f 66 20 74 68 65 20 69 6e 64 65 78 20 0a 2a 2a  of the index .**
174a0 20 61 6e 64 20 70 54 62 6c 4c 69 73 74 20 69 73   and pTblList is
174b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
174c0 20 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74   table that is t
174d0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 42  o be indexed.  B
174e0 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20 62 65 20  oth will .** be 
174f0 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72 69 6d 61  NULL for a prima
17500 72 79 20 6b 65 79 20 6f 72 20 61 6e 20 69 6e 64  ry key or an ind
17510 65 78 20 74 68 61 74 20 69 73 20 63 72 65 61 74  ex that is creat
17520 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 61 0a  ed to satisfy a.
17530 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e 73 74 72  ** UNIQUE constr
17540 61 69 6e 74 2e 20 20 49 66 20 70 54 61 62 6c 65  aint.  If pTable
17550 20 61 6e 64 20 70 49 6e 64 65 78 20 61 72 65 20   and pIndex are 
17560 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61 72 73 65  NULL, use pParse
17570 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a 2a 20 61  ->pNewTable.** a
17580 73 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62  s the table to b
17590 65 20 69 6e 64 65 78 65 64 2e 20 20 70 50 61 72  e indexed.  pPar
175a0 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 73  se->pNewTable is
175b0 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 69 73   a table that is
175c0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 62 65  .** currently be
175d0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20  ing constructed 
175e0 62 79 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  by a CREATE TABL
175f0 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 0a  E statement..**.
17600 2a 2a 20 70 4c 69 73 74 20 69 73 20 61 20 6c 69  ** pList is a li
17610 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f  st of columns to
17620 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70 4c   be indexed.  pL
17630 69 73 74 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ist will be NULL
17640 20 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 61   if this.** is a
17650 20 70 72 69 6d 61 72 79 20 6b 65 79 20 6f 72 20   primary key or 
17660 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72 61 69 6e  unique-constrain
17670 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  t on the most re
17680 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65  cent column adde
17690 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74 61 62 6c  d.** to the tabl
176a0 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65  e currently unde
176b0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 20  r construction. 
176c0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69   .**.** If the i
176d0 6e 64 65 78 20 69 73 20 63 72 65 61 74 65 64 20  ndex is created 
176e0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 72 65  successfully, re
176f0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
17700 6f 20 74 68 65 20 6e 65 77 20 49 6e 64 65 78 0a  o the new Index.
17710 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 54 68  ** structure. Th
17720 69 73 20 69 73 20 75 73 65 64 20 62 79 20 73 71  is is used by sq
17730 6c 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b  lite3AddPrimaryK
17740 65 79 28 29 20 74 6f 20 6d 61 72 6b 20 74 68 65  ey() to mark the
17750 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20 74 68 65   index.** as the
17760 20 74 61 62 6c 65 73 20 70 72 69 6d 61 72 79 20   tables primary 
17770 6b 65 79 20 28 49 6e 64 65 78 2e 69 64 78 54 79  key (Index.idxTy
17780 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44 58 54 59  pe==SQLITE_IDXTY
17790 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 29 0a 2a  PE_PRIMARYKEY).*
177a0 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
177b0 43 72 65 61 74 65 49 6e 64 65 78 28 0a 20 20 50  CreateIndex(.  P
177c0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
177d0 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f 72 6d 61    /* All informa
177e0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 69 73 20  tion about this 
177f0 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  parse */.  Token
17800 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20 20 2f 2a   *pName1,     /*
17810 20 46 69 72 73 74 20 70 61 72 74 20 6f 66 20 69   First part of i
17820 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79 20 62  ndex name. May b
17830 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  e NULL */.  Toke
17840 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20 20 20 2f  n *pName2,     /
17850 2a 20 53 65 63 6f 6e 64 20 70 61 72 74 20 6f 66  * Second part of
17860 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61 79   index name. May
17870 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 53 72   be NULL */.  Sr
17880 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61 6d 65 2c  cList *pTblName,
17890 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 69 6e 64   /* Table to ind
178a0 65 78 2e 20 55 73 65 20 70 50 61 72 73 65 2d 3e  ex. Use pParse->
178b0 70 4e 65 77 54 61 62 6c 65 20 69 66 20 30 20 2a  pNewTable if 0 *
178c0 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
178d0 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c 69 73 74  ist,   /* A list
178e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 62   of columns to b
178f0 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20 69  e indexed */.  i
17900 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
17910 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74 2c 20 4f    /* OE_Abort, O
17920 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f 52 65 70  E_Ignore, OE_Rep
17930 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e 6f 6e 65  lace, or OE_None
17940 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 53 74   */.  Token *pSt
17950 61 72 74 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  art,     /* The 
17960 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74 68 61  CREATE token tha
17970 74 20 62 65 67 69 6e 73 20 74 68 69 73 20 73 74  t begins this st
17980 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45 78 70  atement */.  Exp
17990 72 20 2a 70 50 49 57 68 65 72 65 2c 20 20 20 20  r *pPIWhere,    
179a0 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  /* WHERE clause 
179b0 66 6f 72 20 70 61 72 74 69 61 6c 20 69 6e 64 69  for partial indi
179c0 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ces */.  int sor
179d0 74 4f 72 64 65 72 2c 20 20 20 20 20 2f 2a 20 53  tOrder,     /* S
179e0 6f 72 74 20 6f 72 64 65 72 20 6f 66 20 70 72 69  ort order of pri
179f0 6d 61 72 79 20 6b 65 79 20 77 68 65 6e 20 70 4c  mary key when pL
17a00 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a 20 20 69  ist==NULL */.  i
17a10 6e 74 20 69 66 4e 6f 74 45 78 69 73 74 20 20 20  nt ifNotExist   
17a20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72 6f 72 20    /* Omit error 
17a30 69 66 20 69 6e 64 65 78 20 61 6c 72 65 61 64 79  if index already
17a40 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b 0a 20 20   exists */.){.  
17a50 49 6e 64 65 78 20 2a 70 52 65 74 20 3d 20 30 3b  Index *pRet = 0;
17a60 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
17a70 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 54  to return */.  T
17a80 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
17a90 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
17aa0 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20 20  be indexed */.  
17ab0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
17ac0 30 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  0;   /* The inde
17ad0 78 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  x to be created 
17ae0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  */.  char *zName
17af0 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 4e 61 6d   = 0;     /* Nam
17b00 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a  e of the index *
17b10 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
17b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17b30 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
17b40 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 69   in zName */.  i
17b50 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62 46 69 78  nt i, j;.  DbFix
17b60 65 72 20 73 46 69 78 3b 20 20 20 20 20 20 20 20  er sFix;        
17b70 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e 69 6e 67  /* For assigning
17b80 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 73 20   database names 
17b90 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a 20 20 69  to pTable */.  i
17ba0 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d 61 73 6b  nt sortOrderMask
17bb0 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68 6f 6e 6f  ;   /* 1 to hono
17bc0 72 20 44 45 53 43 20 69 6e 20 69 6e 64 65 78 2e  r DESC in index.
17bd0 20 20 30 20 74 6f 20 69 67 6e 6f 72 65 2e 20 2a    0 to ignore. *
17be0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
17bf0 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
17c00 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20 20 20  Db *pDb;        
17c10 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63       /* The spec
17c20 69 66 69 63 20 74 61 62 6c 65 20 63 6f 6e 74 61  ific table conta
17c30 69 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78 65  ining the indexe
17c40 64 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  d database */.  
17c50 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
17c60 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
17c70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
17c80 61 74 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  at is being writ
17c90 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ten */.  Token *
17ca0 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20 20 2f 2a  pName = 0;    /*
17cb0 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d   Unqualified nam
17cc0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 74  e of the index t
17cd0 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20 20 73 74  o create */.  st
17ce0 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
17cf0 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d 3b 20 2f  em *pListItem; /
17d00 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
17d10 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20 20 69 6e  er pList */.  in
17d20 74 20 6e 45 78 74 72 61 20 3d 20 30 3b 20 20 20  t nExtra = 0;   
17d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17d40 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
17d50 64 20 66 6f 72 20 7a 45 78 74 72 61 5b 5d 20 2a  d for zExtra[] *
17d60 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 43 6f  /.  int nExtraCo
17d70 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
17d80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
17d90 66 20 65 78 74 72 61 20 63 6f 6c 75 6d 6e 73 20  f extra columns 
17da0 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63 68 61 72  needed */.  char
17db0 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b 20 20 20   *zExtra = 0;   
17dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17dd0 45 78 74 72 61 20 73 70 61 63 65 20 61 66 74 65  Extra space afte
17de0 72 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65  r the Index obje
17df0 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ct */.  Index *p
17e00 50 6b 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  Pk = 0;      /* 
17e10 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
17e20 78 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52 4f  x for WITHOUT RO
17e30 57 49 44 20 74 61 62 6c 65 73 20 2a 2f 0a 0a 20  WID tables */.. 
17e40 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
17e50 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44 45 43 4c  ailed || IN_DECL
17e60 41 52 45 5f 56 54 41 42 20 7c 7c 20 70 50 61 72  ARE_VTAB || pPar
17e70 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20  se->nErr>0 ){.  
17e80 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
17e90 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  te_index;.  }.  
17ea0 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73  if( SQLITE_OK!=s
17eb0 71 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61  qlite3ReadSchema
17ec0 28 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20  (pParse) ){.    
17ed0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
17ee0 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f  _index;.  }..  /
17ef0 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
17f00 74 61 62 6c 65 20 74 68 61 74 20 69 73 20 74 6f  table that is to
17f10 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 52 65   be indexed.  Re
17f20 74 75 72 6e 20 65 61 72 6c 79 20 69 66 20 6e 6f  turn early if no
17f30 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f 0a 20 20  t found..  */.  
17f40 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20  if( pTblName!=0 
17f50 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 74  ){..    /* Use t
17f60 68 65 20 74 77 6f 2d 70 61 72 74 20 69 6e 64 65  he two-part inde
17f70 78 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  x name to determ
17f80 69 6e 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ine the database
17f90 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73 65 61 72   .    ** to sear
17fa0 63 68 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ch for the table
17fb0 2e 20 27 46 69 78 27 20 74 68 65 20 74 61 62 6c  . 'Fix' the tabl
17fc0 65 20 6e 61 6d 65 20 74 6f 20 74 68 69 73 20 64  e name to this d
17fd0 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20  b.    ** before 
17fe0 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68 65 20 74  looking up the t
17ff0 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  able..    */.   
18000 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 20   assert( pName1 
18010 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a 20 20 20  && pName2 );.   
18020 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 54 77   iDb = sqlite3Tw
18030 6f 50 61 72 74 4e 61 6d 65 28 70 50 61 72 73 65  oPartName(pParse
18040 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61 6d 65 32  , pName1, pName2
18050 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  , &pName);.    i
18060 66 28 20 69 44 62 3c 30 20 29 20 67 6f 74 6f 20  f( iDb<0 ) goto 
18070 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18080 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  x;.    assert( p
18090 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65 2d 3e 7a  Name && pName->z
180a0 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
180b0 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a  ITE_OMIT_TEMPDB.
180c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
180d0 64 65 78 20 6e 61 6d 65 20 77 61 73 20 75 6e 71  dex name was unq
180e0 75 61 6c 69 66 69 65 64 2c 20 63 68 65 63 6b 20  ualified, check 
180f0 69 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  if the table.   
18100 20 2a 2a 20 69 73 20 61 20 74 65 6d 70 20 74 61   ** is a temp ta
18110 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73 65 74 20  ble. If so, set 
18120 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
18130 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20 74 68 69  1. Do not do thi
18140 73 0a 20 20 20 20 2a 2a 20 69 66 20 69 6e 69 74  s.    ** if init
18150 69 61 6c 69 73 69 6e 67 20 61 20 64 61 74 61 62  ialising a datab
18160 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20 20 20  ase schema..    
18170 2a 2f 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  */.    if( !db->
18180 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20  init.busy ){.   
18190 20 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65     pTab = sqlite
181a0 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75 70 28 70  3SrcListLookup(p
181b0 50 61 72 73 65 2c 20 70 54 62 6c 4e 61 6d 65 29  Parse, pTblName)
181c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
181d0 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70 54 61 62  e2->n==0 && pTab
181e0 20 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d   && pTab->pSchem
181f0 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  a==db->aDb[1].pS
18200 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20  chema ){.       
18210 20 69 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20   iDb = 1;.      
18220 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
18230 20 20 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e      sqlite3FixIn
18240 69 74 28 26 73 46 69 78 2c 20 70 50 61 72 73 65  it(&sFix, pParse
18250 2c 20 69 44 62 2c 20 22 69 6e 64 65 78 22 2c 20  , iDb, "index", 
18260 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  pName);.    if( 
18270 73 71 6c 69 74 65 33 46 69 78 53 72 63 4c 69 73  sqlite3FixSrcLis
18280 74 28 26 73 46 69 78 2c 20 70 54 62 6c 4e 61 6d  t(&sFix, pTblNam
18290 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 42  e) ){.      /* B
182a0 65 63 61 75 73 65 20 74 68 65 20 70 61 72 73 65  ecause the parse
182b0 72 20 63 6f 6e 73 74 72 75 63 74 73 20 70 54 62  r constructs pTb
182c0 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20 73 69 6e  lName from a sin
182d0 67 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 0a  gle identifier,.
182e0 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
182f0 46 69 78 53 72 63 4c 69 73 74 20 63 61 6e 20 6e  FixSrcList can n
18300 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f 0a 20 20  ever fail. */.  
18310 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
18320 20 20 20 7d 0a 20 20 20 20 70 54 61 62 20 3d 20     }.    pTab = 
18330 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
18340 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c 20 30  leItem(pParse, 0
18350 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e 61 5b 30  , &pTblName->a[0
18360 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
18370 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
18380 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d 30 20 29  ==0 || pTab==0 )
18390 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ;.    if( pTab==
183a0 30 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72  0 ) goto exit_cr
183b0 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20  eate_index;.    
183c0 69 66 28 20 69 44 62 3d 3d 31 20 26 26 20 64 62  if( iDb==1 && db
183d0 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53 63 68 65  ->aDb[iDb].pSche
183e0 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d  ma!=pTab->pSchem
183f0 61 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  a ){.      sqlit
18400 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18410 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 22  e, .           "
18420 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 61 20  cannot create a 
18430 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e 20 6e 6f  TEMP index on no
18440 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20 5c 22 25  n-TEMP table \"%
18450 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
18460 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
18470 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63       goto exit_c
18480 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20  reate_index;.   
18490 20 7d 0a 20 20 20 20 69 66 28 20 21 48 61 73 52   }.    if( !HasR
184a0 6f 77 69 64 28 70 54 61 62 29 20 29 20 70 50 6b  owid(pTab) ) pPk
184b0 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 72   = sqlite3Primar
184c0 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 3b  yKeyIndex(pTab);
184d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
184e0 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d 30 20 29  sert( pName==0 )
184f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  ;.    assert( pS
18500 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20 20 20 70  tart==0 );.    p
18510 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e  Tab = pParse->pN
18520 65 77 54 61 62 6c 65 3b 0a 20 20 20 20 69 66 28  ewTable;.    if(
18530 20 21 70 54 61 62 20 29 20 67 6f 74 6f 20 65 78   !pTab ) goto ex
18540 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18550 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
18560 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
18570 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
18580 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62 20 3d 20  a);.  }.  pDb = 
18590 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 0a  &db->aDb[iDb];..
185a0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
185b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
185c0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
185d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
185e0 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e 7a 4e  trNICmp(pTab->zN
185f0 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22 2c 20  ame, "sqlite_", 
18600 37 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  7)==0 .       &&
18610 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
18620 30 0a 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45  0.#if SQLITE_USE
18630 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
18640 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
18650 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
18660 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d 3d 30 0a  pTab->zName)==0.
18670 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 26 26  #endif.       &&
18680 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70   sqlite3StrNICmp
18690 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65 5b 37 5d  (&pTab->zName[7]
186a0 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c 39 29 21  ,"altertab_",9)!
186b0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
186c0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
186d0 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
186e0 6e 6f 74 20 62 65 20 69 6e 64 65 78 65 64 22 2c  not be indexed",
186f0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
18700 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
18710 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23  ate_index;.  }.#
18720 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18730 49 54 5f 56 49 45 57 0a 20 20 69 66 28 20 70 54  IT_VIEW.  if( pT
18740 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  ab->pSelect ){. 
18750 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
18760 73 67 28 70 50 61 72 73 65 2c 20 22 76 69 65 77  sg(pParse, "view
18770 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 64  s may not be ind
18780 65 78 65 64 22 29 3b 0a 20 20 20 20 67 6f 74 6f  exed");.    goto
18790 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
187a0 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ex;.  }.#endif.#
187b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
187c0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
187d0 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
187e0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
187f0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
18800 72 73 65 2c 20 22 76 69 72 74 75 61 6c 20 74 61  rse, "virtual ta
18810 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  bles may not be 
18820 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
18830 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18840 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
18850 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  f..  /*.  ** Fin
18860 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  d the name of th
18870 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20 73  e index.  Make s
18880 75 72 65 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ure there is not
18890 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72   already another
188a0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20 74  .  ** index or t
188b0 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 73 61  able with the sa
188c0 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20 2a 2a 0a  me name.  .  **.
188d0 20 20 2a 2a 20 45 78 63 65 70 74 69 6f 6e 3a 20    ** Exception: 
188e0 20 49 66 20 77 65 20 61 72 65 20 72 65 61 64 69   If we are readi
188f0 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ng the names of 
18900 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64 69 63 65  permanent indice
18910 73 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  s from the.  ** 
18920 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
18930 62 6c 65 20 28 62 65 63 61 75 73 65 20 73 6f 6d  ble (because som
18940 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
18950 63 68 61 6e 67 65 64 20 74 68 65 20 73 63 68 65  changed the sche
18960 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20 6f 6e 65  ma) and.  ** one
18970 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 6e 61   of the index na
18980 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20 77 69 74  mes collides wit
18990 68 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  h the name of a 
189a0 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
189b0 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78 2c 20 74  or.  ** index, t
189c0 68 65 6e 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74  hen we will cont
189d0 69 6e 75 65 20 74 6f 20 70 72 6f 63 65 73 73 20  inue to process 
189e0 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 2a 2a  this index..  **
189f0 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d 65 3d 3d  .  ** If pName==
18a00 30 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  0 it means that 
18a10 77 65 20 61 72 65 0a 20 20 2a 2a 20 64 65 61 6c  we are.  ** deal
18a20 69 6e 67 20 77 69 74 68 20 61 20 70 72 69 6d 61  ing with a prima
18a30 72 79 20 6b 65 79 20 6f 72 20 55 4e 49 51 55 45  ry key or UNIQUE
18a40 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 57 65   constraint.  We
18a50 20 68 61 76 65 20 74 6f 20 69 6e 76 65 6e 74 20   have to invent 
18a60 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20 6e 61 6d  our.  ** own nam
18a70 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4e  e..  */.  if( pN
18a80 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e 61 6d 65  ame ){.    zName
18a90 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
18aa0 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d  omToken(db, pNam
18ab0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d  e);.    if( zNam
18ac0 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  e==0 ) goto exit
18ad0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
18ae0 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65     assert( pName
18af0 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  ->z!=0 );.    if
18b00 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
18b10 69 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e  ite3CheckObjectN
18b20 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 4e 61 6d  ame(pParse, zNam
18b30 65 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  e) ){.      goto
18b40 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18b50 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ex;.    }.    if
18b60 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
18b70 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
18b80 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64  lite3FindTable(d
18b90 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21 3d 30 20  b, zName, 0)!=0 
18ba0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
18bb0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
18bc0 65 2c 20 22 74 68 65 72 65 20 69 73 20 61 6c 72  e, "there is alr
18bd0 65 61 64 79 20 61 20 74 61 62 6c 65 20 6e 61 6d  eady a table nam
18be0 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  ed %s", zName);.
18bf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69          goto exi
18c00 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
18c10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18c20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
18c30 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65  dIndex(db, zName
18c40 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 21 3d 30  , pDb->zName)!=0
18c50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69   ){.      if( !i
18c60 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a 20 20 20  fNotExist ){.   
18c70 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
18c80 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e  rMsg(pParse, "in
18c90 64 65 78 20 25 73 20 61 6c 72 65 61 64 79 20 65  dex %s already e
18ca0 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  xists", zName);.
18cb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18cc0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
18cd0 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
18ce0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
18cf0 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
18d00 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20  Parse, iDb);.   
18d10 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
18d20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18d30 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  x;.    }.  }else
18d40 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  {.    int n;.   
18d50 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70 3b 0a 20   Index *pLoop;. 
18d60 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d 70 54 61     for(pLoop=pTa
18d70 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d 31 3b 20  b->pIndex, n=1; 
18d80 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d 70 4c 6f  pLoop; pLoop=pLo
18d90 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b 2b 29 7b  op->pNext, n++){
18da0 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  }.    zName = sq
18db0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
18dc0 20 22 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64   "sqlite_autoind
18dd0 65 78 5f 25 73 5f 25 64 22 2c 20 70 54 61 62 2d  ex_%s_%d", pTab-
18de0 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20  >zName, n);.    
18df0 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
18e00 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
18e10 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18e20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68    }.  }..  /* Ch
18e30 65 63 6b 20 66 6f 72 20 61 75 74 68 6f 72 69 7a  eck for authoriz
18e40 61 74 69 6f 6e 20 74 6f 20 63 72 65 61 74 65 20  ation to create 
18e50 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 23  an index..  */.#
18e60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18e70 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
18e80 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  .  {.    const c
18e90 68 61 72 20 2a 7a 44 62 20 3d 20 70 44 62 2d 3e  har *zDb = pDb->
18ea0 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 73  zName;.    if( s
18eb0 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
18ec0 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 49  pParse, SQLITE_I
18ed0 4e 53 45 52 54 2c 20 53 43 48 45 4d 41 5f 54 41  NSERT, SCHEMA_TA
18ee0 42 4c 45 28 69 44 62 29 2c 20 30 2c 20 7a 44 62  BLE(iDb), 0, zDb
18ef0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
18f00 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18f10 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d  x;.    }.    i =
18f20 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 49   SQLITE_CREATE_I
18f30 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 21 4f  NDEX;.    if( !O
18f40 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
18f50 62 3d 3d 31 20 29 20 69 20 3d 20 53 51 4c 49 54  b==1 ) i = SQLIT
18f60 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e  E_CREATE_TEMP_IN
18f70 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  DEX;.    if( sql
18f80 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
18f90 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d 65 2c 20  arse, i, zName, 
18fa0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62  pTab->zName, zDb
18fb0 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
18fc0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18fd0 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  x;.    }.  }.#en
18fe0 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 69  dif..  /* If pLi
18ff0 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20  st==0, it means 
19000 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
19010 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61 6b 65 20   called to make 
19020 61 20 70 72 69 6d 61 72 79 0a 20 20 2a 2a 20 6b  a primary.  ** k
19030 65 79 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 61  ey out of the la
19040 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64 65 64 20  st column added 
19050 74 6f 20 74 68 65 20 74 61 62 6c 65 20 75 6e 64  to the table und
19060 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
19070 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61 74 65 20  .  ** So create 
19080 61 20 66 61 6b 65 20 6c 69 73 74 20 74 6f 20 73  a fake list to s
19090 69 6d 75 6c 61 74 65 20 74 68 69 73 2e 0a 20 20  imulate this..  
190a0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
190b0 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 70  0 ){.    Token p
190c0 72 65 76 43 6f 6c 3b 0a 20 20 20 20 70 72 65 76  revCol;.    prev
190d0 43 6f 6c 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43  Col.z = pTab->aC
190e0 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c 2d 31 5d  ol[pTab->nCol-1]
190f0 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 72 65 76  .zName;.    prev
19100 43 6f 6c 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  Col.n = sqlite3S
19110 74 72 6c 65 6e 33 30 28 70 72 65 76 43 6f 6c 2e  trlen30(prevCol.
19120 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  z);.    pList = 
19130 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41  sqlite3ExprListA
19140 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30 2c  ppend(pParse, 0,
19150 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
19160 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
19170 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70 72 65 76  db, TK_ID, &prev
19180 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20 20 69 66  Col, 0));.    if
19190 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74  ( pList==0 ) got
191a0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
191b0 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dex;.    assert(
191c0 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 31   pList->nExpr==1
191d0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
191e0 78 70 72 4c 69 73 74 53 65 74 53 6f 72 74 4f 72  xprListSetSortOr
191f0 64 65 72 28 70 4c 69 73 74 2c 20 73 6f 72 74 4f  der(pList, sortO
19200 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  rder);.  }else{.
19210 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
19220 69 73 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 70  istCheckLength(p
19230 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 22 69  Parse, pList, "i
19240 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ndex");.  }..  /
19250 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
19260 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 73   many bytes of s
19270 70 61 63 65 20 61 72 65 20 72 65 71 75 69 72 65  pace are require
19280 64 20 74 6f 20 73 74 6f 72 65 20 65 78 70 6c 69  d to store expli
19290 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70 65 63 69  citly.  ** speci
192a0 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  fied collation s
192b0 65 71 75 65 6e 63 65 20 6e 61 6d 65 73 2e 0a 20  equence names.. 
192c0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
192d0 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
192e0 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
192f0 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Expr = pList->a[
19300 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 61 73  i].pExpr;.    as
19310 73 65 72 74 28 20 70 45 78 70 72 21 3d 30 20 29  sert( pExpr!=0 )
19320 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
19330 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
19340 29 7b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20  ){.      nExtra 
19350 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74 65 33 53  += (1 + sqlite3S
19360 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
19370 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20 20 20 7d  .zToken));.    }
19380 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a  .  }..  /* .  **
19390 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e   Allocate the in
193a0 64 65 78 20 73 74 72 75 63 74 75 72 65 2e 20 0a  dex structure. .
193b0 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d 20 73    */.  nName = s
193c0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
193d0 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74 72 61 43  Name);.  nExtraC
193e0 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50 6b 2d 3e  ol = pPk ? pPk->
193f0 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a 20 20 70  nKeyCol : 1;.  p
19400 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 41  Index = sqlite3A
19410 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f 62 6a 65  llocateIndexObje
19420 63 74 28 64 62 2c 20 70 4c 69 73 74 2d 3e 6e 45  ct(db, pList->nE
19430 78 70 72 20 2b 20 6e 45 78 74 72 61 43 6f 6c 2c  xpr + nExtraCol,
19440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19460 20 20 20 20 20 20 20 6e 4e 61 6d 65 20 2b 20 6e         nName + n
19470 45 78 74 72 61 20 2b 20 31 2c 20 26 7a 45 78 74  Extra + 1, &zExt
19480 72 61 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ra);.  if( db->m
19490 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
194a0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
194b0 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  ate_index;.  }. 
194c0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
194d0 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 49  YTE_ALIGNMENT(pI
194e0 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f 67 45 73  ndex->aiRowLogEs
194f0 74 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  t) );.  assert( 
19500 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
19510 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e 61 7a 43  MENT(pIndex->azC
19520 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e 64 65 78  oll) );.  pIndex
19530 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78 74 72 61  ->zName = zExtra
19540 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 6e 4e  ;.  zExtra += nN
19550 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65 6d 63 70  ame + 1;.  memcp
19560 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c  y(pIndex->zName,
19570 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2b 31 29   zName, nName+1)
19580 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 54 61 62  ;.  pIndex->pTab
19590 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20 70 49 6e  le = pTab;.  pIn
195a0 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 28  dex->onError = (
195b0 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 70 49  u8)onError;.  pI
195c0 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c  ndex->uniqNotNul
195d0 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  l = onError!=OE_
195e0 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65 78 2d 3e  None;.  pIndex->
195f0 69 64 78 54 79 70 65 20 3d 20 70 4e 61 6d 65 20  idxType = pName 
19600 3f 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  ? SQLITE_IDXTYPE
19610 5f 41 50 50 44 45 46 20 3a 20 53 51 4c 49 54 45  _APPDEF : SQLITE
19620 5f 49 44 58 54 59 50 45 5f 55 4e 49 51 55 45 3b  _IDXTYPE_UNIQUE;
19630 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  .  pIndex->pSche
19640 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  ma = db->aDb[iDb
19650 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70 49 6e  ].pSchema;.  pIn
19660 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 70  dex->nKeyCol = p
19670 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 69  List->nExpr;.  i
19680 66 28 20 70 50 49 57 68 65 72 65 20 29 7b 0a 20  f( pPIWhere ){. 
19690 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76     sqlite3Resolv
196a0 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28 70  eSelfReference(p
196b0 50 61 72 73 65 2c 20 70 54 61 62 2c 20 4e 43 5f  Parse, pTab, NC_
196c0 50 61 72 74 49 64 78 2c 20 70 50 49 57 68 65 72  PartIdx, pPIWher
196d0 65 2c 20 30 29 3b 0a 20 20 20 20 70 49 6e 64 65  e, 0);.    pInde
196e0 78 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  x->pPartIdxWhere
196f0 20 3d 20 70 50 49 57 68 65 72 65 3b 0a 20 20 20   = pPIWhere;.   
19700 20 70 50 49 57 68 65 72 65 20 3d 20 30 3b 0a 20   pPIWhere = 0;. 
19710 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c   }.  assert( sql
19720 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48  ite3SchemaMutexH
19730 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20  eld(db, iDb, 0) 
19740 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
19750 6f 20 73 65 65 20 69 66 20 77 65 20 73 68 6f 75  o see if we shou
19760 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43 20 72 65  ld honor DESC re
19770 71 75 65 73 74 73 20 6f 6e 20 69 6e 64 65 78 20  quests on index 
19780 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a 20 20 69  columns.  */.  i
19790 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
197a0 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20  >file_format>=4 
197b0 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72 64 65 72  ){.    sortOrder
197c0 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20 2f 2a 20  Mask = -1;   /* 
197d0 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f 0a 20 20  Honor DESC */.  
197e0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f 72 74 4f  }else{.    sortO
197f0 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b 20 20 20  rderMask = 0;   
19800 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45 53 43 20   /* Ignore DESC 
19810 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61  */.  }..  /* Ana
19820 6c 79 7a 65 20 74 68 65 20 6c 69 73 74 20 6f 66  lyze the list of
19830 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
19840 74 20 66 6f 72 6d 20 74 68 65 20 74 65 72 6d 73  t form the terms
19850 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 61 6e   of the index an
19860 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74 20 61 6e  d.  ** report an
19870 79 20 65 72 72 6f 72 73 2e 20 20 49 6e 20 74 68  y errors.  In th
19880 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
19890 65 72 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ere the expressi
198a0 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 0a 20 20  on is exactly.  
198b0 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f 6c 75 6d  ** a table colum
198c0 6e 2c 20 73 74 6f 72 65 20 74 68 61 74 20 63 6f  n, store that co
198d0 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c 75 6d 6e  lumn in aiColumn
198e0 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65 72 61 6c  [].  For general
198f0 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 20 20   expressions,.  
19900 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70 49 6e 64  ** populate pInd
19910 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20 61 6e 64  ex->aColExpr and
19920 20 73 74 6f 72 65 20 58 4e 5f 45 58 50 52 20 28   store XN_EXPR (
19930 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75 6d 6e 5b  -2) in aiColumn[
19940 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44  ]..  **.  ** TOD
19950 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e 69  O: Issue a warni
19960 6e 67 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ng if two or mor
19970 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
19980 20 69 6e 64 65 78 20 61 72 65 20 69 64 65 6e 74   index are ident
19990 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f 44 4f 3a  ical..  ** TODO:
199a0 20 49 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67   Issue a warning
199b0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 70 72   if the table pr
199c0 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65  imary key is use
199d0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
199e0 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b 65 79 2e  .  ** index key.
199f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
19a00 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c 69 73 74   pListItem=pList
19a10 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  ->a; i<pList->nE
19a20 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69 73 74 49  xpr; i++, pListI
19a30 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
19a40 20 2a 70 43 45 78 70 72 3b 20 20 20 20 20 20 20   *pCExpr;       
19a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19a60 65 20 69 2d 74 68 20 69 6e 64 65 78 20 65 78 70  e i-th index exp
19a70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 69  ression */.    i
19a80 6e 74 20 72 65 71 75 65 73 74 65 64 53 6f 72 74  nt requestedSort
19a90 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a  Order;        /*
19aa0 20 41 53 43 20 6f 72 20 44 45 53 43 20 6f 6e 20   ASC or DESC on 
19ab0 74 68 65 20 69 2d 74 68 20 65 78 70 72 65 73 73  the i-th express
19ac0 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ion */.    const
19ad0 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 20 20   char *zColl;   
19ae0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
19af0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
19b00 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20 73 71 6c  name */..    sql
19b10 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64 28 70  ite3StringToId(p
19b20 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 29  ListItem->pExpr)
19b30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
19b40 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
19b50 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
19b60 4e 43 5f 49 64 78 45 78 70 72 2c 20 70 4c 69 73  NC_IdxExpr, pLis
19b70 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 30 29  tItem->pExpr, 0)
19b80 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
19b90 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f 20 65 78  ->nErr ) goto ex
19ba0 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
19bb0 0a 20 20 20 20 70 43 45 78 70 72 20 3d 20 73 71  .    pCExpr = sq
19bc0 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
19bd0 6c 61 74 65 28 70 4c 69 73 74 49 74 65 6d 2d 3e  late(pListItem->
19be0 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
19bf0 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43  pCExpr->op!=TK_C
19c00 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 69  OLUMN ){.      i
19c10 66 28 20 70 54 61 62 3d 3d 70 50 61 72 73 65 2d  f( pTab==pParse-
19c20 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b 0a 20 20  >pNewTable ){.  
19c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
19c40 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 65  orMsg(pParse, "e
19c50 78 70 72 65 73 73 69 6f 6e 73 20 70 72 6f 68 69  xpressions prohi
19c60 62 69 74 65 64 20 69 6e 20 50 52 49 4d 41 52 59  bited in PRIMARY
19c70 20 4b 45 59 20 61 6e 64 20 22 0a 20 20 20 20 20   KEY and ".     
19c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c90 20 20 20 20 20 20 20 20 20 20 20 22 55 4e 49 51             "UNIQ
19ca0 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 73 22 29  UE constraints")
19cb0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
19cc0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
19cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19ce0 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c  if( pIndex->aCol
19cf0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Expr==0 ){.     
19d00 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 43 6f     ExprList *pCo
19d10 70 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  py = sqlite3Expr
19d20 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4c 69 73  ListDup(db, pLis
19d30 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  t, 0);.        p
19d40 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
19d50 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = pCopy;.       
19d60 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
19d70 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
19d80 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 70      assert( pCop
19d90 79 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  y!=0 );.        
19da0 20 20 70 4c 69 73 74 49 74 65 6d 20 3d 20 26 70    pListItem = &p
19db0 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Copy->a[i];.    
19dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19dd0 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58 50 52 3b      j = XN_EXPR;
19de0 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 61  .      pIndex->a
19df0 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20 58 4e 5f  iColumn[i] = XN_
19e00 45 58 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64  EXPR;.      pInd
19e10 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c 20  ex->uniqNotNull 
19e20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
19e30 20 20 20 20 20 20 6a 20 3d 20 70 43 45 78 70 72        j = pCExpr
19e40 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
19e50 20 61 73 73 65 72 74 28 20 6a 3c 3d 30 78 37 66   assert( j<=0x7f
19e60 66 66 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ff );.      if( 
19e70 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6a  j<0 ){.        j
19e80 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a   = pTab->iPKey;.
19e90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19ea0 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 6e 6f  pTab->aCol[j].no
19eb0 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  tNull==0 ){.    
19ec0 20 20 20 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71      pIndex->uniq
19ed0 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a 20 20 20  NotNull = 0;.   
19ee0 20 20 20 7d 0a 20 20 20 20 20 20 70 49 6e 64 65     }.      pInde
19ef0 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
19f00 20 28 69 31 36 29 6a 3b 0a 20 20 20 20 7d 0a 20   (i16)j;.    }. 
19f10 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20     zColl = 0;.  
19f20 20 20 69 66 28 20 70 4c 69 73 74 49 74 65 6d 2d    if( pListItem-
19f30 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pExpr->op==TK_C
19f40 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20 20 20  OLLATE ){.      
19f50 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 20  int nColl;.     
19f60 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73 74 49 74   zColl = pListIt
19f70 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  em->pExpr->u.zTo
19f80 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43 6f 6c 6c  ken;.      nColl
19f90 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
19fa0 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31 3b 0a 20  30(zColl) + 1;. 
19fb0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78       assert( nEx
19fc0 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b 0a 20 20  tra>=nColl );.  
19fd0 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 78 74 72      memcpy(zExtr
19fe0 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f 6c 6c 29  a, zColl, nColl)
19ff0 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20  ;.      zColl = 
1a000 7a 45 78 74 72 61 3b 0a 20 20 20 20 20 20 7a 45  zExtra;.      zE
1a010 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c 3b 0a 20  xtra += nColl;. 
1a020 20 20 20 20 20 6e 45 78 74 72 61 20 2d 3d 20 6e       nExtra -= n
1a030 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Coll;.    }else 
1a040 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20 20 20 20  if( j>=0 ){.    
1a050 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e    zColl = pTab->
1a060 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c 3b 0a 20  aCol[j].zColl;. 
1a070 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 7a 43     }.    if( !zC
1a080 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d 20 73 71  oll ) zColl = sq
1a090 6c 69 74 65 33 53 74 72 42 49 4e 41 52 59 3b 0a  lite3StrBINARY;.
1a0a0 20 20 20 20 69 66 28 20 21 64 62 2d 3e 69 6e 69      if( !db->ini
1a0b0 74 2e 62 75 73 79 20 26 26 20 21 73 71 6c 69 74  t.busy && !sqlit
1a0c0 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28  e3LocateCollSeq(
1a0d0 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29  pParse, zColl) )
1a0e0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
1a0f0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
1a100 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 64 65 78      }.    pIndex
1a110 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43  ->azColl[i] = zC
1a120 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75 65 73 74  oll;.    request
1a130 65 64 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4c  edSortOrder = pL
1a140 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64  istItem->sortOrd
1a150 65 72 20 26 20 73 6f 72 74 4f 72 64 65 72 4d 61  er & sortOrderMa
1a160 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e  sk;.    pIndex->
1a170 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1a180 28 75 38 29 72 65 71 75 65 73 74 65 64 53 6f 72  (u8)requestedSor
1a190 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 2f  tOrder;.  }..  /
1a1a0 2a 20 41 70 70 65 6e 64 20 74 68 65 20 74 61 62  * Append the tab
1a1b0 6c 65 20 6b 65 79 20 74 6f 20 74 68 65 20 65 6e  le key to the en
1a1c0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20  d of the index. 
1a1d0 20 46 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57   For WITHOUT ROW
1a1e0 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 28  ID.  ** tables (
1a1f0 77 68 65 6e 20 70 50 6b 21 3d 30 29 20 74 68 69  when pPk!=0) thi
1a200 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 64 65  s will be the de
1a210 63 6c 61 72 65 64 20 50 52 49 4d 41 52 59 20 4b  clared PRIMARY K
1a220 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a 20 6e 6f  EY.  For.  ** no
1a230 72 6d 61 6c 20 74 61 62 6c 65 73 20 28 77 68 65  rmal tables (whe
1a240 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69 73 20 77  n pPk==0) this w
1a250 69 6c 6c 20 62 65 20 74 68 65 20 72 6f 77 69 64  ill be the rowid
1a260 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 6b  ..  */.  if( pPk
1a270 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   ){.    for(j=0;
1a280 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43 6f 6c 3b   j<pPk->nKeyCol;
1a290 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   j++){.      int
1a2a0 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75   x = pPk->aiColu
1a2b0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  mn[j];.      ass
1a2c0 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a 20 20 20  ert( x>=0 );.   
1a2d0 20 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e     if( hasColumn
1a2e0 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d  (pIndex->aiColum
1a2f0 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43  n, pIndex->nKeyC
1a300 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20 20 20 20  ol, x) ){.      
1a310 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d    pIndex->nColum
1a320 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d 65 6c 73  n--; .      }els
1a330 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  e{.        pInde
1a340 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d  x->aiColumn[i] =
1a350 20 78 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64   x;.        pInd
1a360 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d 20  ex->azColl[i] = 
1a370 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 3b 0a  pPk->azColl[j];.
1a380 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1a390 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 3d 20  aSortOrder[i] = 
1a3a0 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  pPk->aSortOrder[
1a3b0 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  j];.        i++;
1a3c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a3d0 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d 70 49     assert( i==pI
1a3e0 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b  ndex->nColumn );
1a3f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
1a400 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1a410 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b 0a 20 20  ] = XN_ROWID;.  
1a420 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c    pIndex->azColl
1a430 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [i] = sqlite3Str
1a440 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20 20 73 71  BINARY;.  }.  sq
1a450 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45  lite3DefaultRowE
1a460 73 74 28 70 49 6e 64 65 78 29 3b 0a 20 20 69 66  st(pIndex);.  if
1a470 28 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ( pParse->pNewTa
1a480 62 6c 65 3d 3d 30 20 29 20 65 73 74 69 6d 61 74  ble==0 ) estimat
1a490 65 49 6e 64 65 78 57 69 64 74 68 28 70 49 6e 64  eIndexWidth(pInd
1a4a0 65 78 29 3b 0a 0a 20 20 69 66 28 20 70 54 61 62  ex);..  if( pTab
1a4b0 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  ==pParse->pNewTa
1a4c0 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ble ){.    /* Th
1a4d0 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 62  is routine has b
1a4e0 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f 20 63 72  een called to cr
1a4f0 65 61 74 65 20 61 6e 20 61 75 74 6f 6d 61 74 69  eate an automati
1a500 63 20 69 6e 64 65 78 20 61 73 20 61 0a 20 20 20  c index as a.   
1a510 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66 20 61 20   ** result of a 
1a520 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 55  PRIMARY KEY or U
1a530 4e 49 51 55 45 20 63 6c 61 75 73 65 20 6f 6e 20  NIQUE clause on 
1a540 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74  a column definit
1a550 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  ion, or.    ** a
1a560 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20   PRIMARY KEY or 
1a570 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20 66 6f  UNIQUE clause fo
1a580 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 6f 6c 75  llowing the colu
1a590 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e 73 2e 0a  mn definitions..
1a5a0 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f 6e 65 20      ** i.e. one 
1a5b0 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  of:.    **.    *
1a5c0 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  * CREATE TABLE t
1a5d0 28 78 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  (x PRIMARY KEY, 
1a5e0 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52 45 41 54  y);.    ** CREAT
1a5f0 45 20 54 41 42 4c 45 20 74 28 78 2c 20 79 2c 20  E TABLE t(x, y, 
1a600 55 4e 49 51 55 45 28 78 2c 20 79 29 29 3b 0a 20  UNIQUE(x, y));. 
1a610 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 69 74     **.    ** Eit
1a620 68 65 72 20 77 61 79 2c 20 63 68 65 63 6b 20 74  her way, check t
1a630 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 61 62  o see if the tab
1a640 6c 65 20 61 6c 72 65 61 64 79 20 68 61 73 20 73  le already has s
1a650 75 63 68 20 61 6e 20 69 6e 64 65 78 2e 20 49 66  uch an index. If
1a660 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64 6f 6e 27  .    ** so, don'
1a670 74 20 62 6f 74 68 65 72 20 63 72 65 61 74 69 6e  t bother creatin
1a680 67 20 74 68 69 73 20 6f 6e 65 2e 20 54 68 69 73  g this one. This
1a690 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73 20 74 6f   only applies to
1a6a0 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  .    ** automati
1a6b0 63 61 6c 6c 79 20 63 72 65 61 74 65 64 20 69 6e  cally created in
1a6c0 64 69 63 65 73 2e 20 55 73 65 72 73 20 63 61 6e  dices. Users can
1a6d0 20 64 6f 20 61 73 20 74 68 65 79 20 77 69 73 68   do as they wish
1a6e0 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 65 78 70   with.    ** exp
1a6f0 6c 69 63 69 74 20 69 6e 64 69 63 65 73 2e 0a 20  licit indices.. 
1a700 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 77 6f     **.    ** Two
1a710 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d 41   UNIQUE or PRIMA
1a720 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  RY KEY constrain
1a730 74 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  ts are considere
1a740 64 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  d equivalent.   
1a750 20 2a 2a 20 28 61 6e 64 20 74 68 75 73 20 73 75   ** (and thus su
1a760 70 70 72 65 73 73 69 6e 67 20 74 68 65 20 73 65  ppressing the se
1a770 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65 6e 20 69  cond one) even i
1a780 66 20 74 68 65 79 20 68 61 76 65 20 64 69 66 66  f they have diff
1a790 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20 73 6f 72  erent.    ** sor
1a7a0 74 20 6f 72 64 65 72 73 2e 0a 20 20 20 20 2a 2a  t orders..    **
1a7b0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65  .    ** If there
1a7c0 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 20 63   are different c
1a7d0 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
1a7e0 65 73 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6c  es or if the col
1a7f0 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74  umns of.    ** t
1a800 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 63  he constraint oc
1a810 63 75 72 20 69 6e 20 64 69 66 66 65 72 65 6e 74  cur in different
1a820 20 6f 72 64 65 72 73 2c 20 74 68 65 6e 20 74 68   orders, then th
1a830 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  e constraints ar
1a840 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  e.    ** conside
1a850 72 65 64 20 64 69 73 74 69 6e 63 74 20 61 6e 64  red distinct and
1a860 20 62 6f 74 68 20 72 65 73 75 6c 74 20 69 6e 20   both result in 
1a870 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65 73  separate indices
1a880 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 49 6e 64  ..    */.    Ind
1a890 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 66 6f  ex *pIdx;.    fo
1a8a0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
1a8b0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
1a8c0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
1a8d0 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
1a8e0 20 61 73 73 65 72 74 28 20 49 73 55 6e 69 71 75   assert( IsUniqu
1a8f0 65 49 6e 64 65 78 28 70 49 64 78 29 20 29 3b 0a  eIndex(pIdx) );.
1a900 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1a910 64 78 2d 3e 69 64 78 54 79 70 65 21 3d 53 51 4c  dx->idxType!=SQL
1a920 49 54 45 5f 49 44 58 54 59 50 45 5f 41 50 50 44  ITE_IDXTYPE_APPD
1a930 45 46 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EF );.      asse
1a940 72 74 28 20 49 73 55 6e 69 71 75 65 49 6e 64 65  rt( IsUniqueInde
1a950 78 28 70 49 6e 64 65 78 29 20 29 3b 0a 0a 20 20  x(pIndex) );..  
1a960 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 4b      if( pIdx->nK
1a970 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78 2d 3e 6e  eyCol!=pIndex->n
1a980 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  KeyCol ) continu
1a990 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30  e;.      for(k=0
1a9a0 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  ; k<pIdx->nKeyCo
1a9b0 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; k++){.       
1a9c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 31 3b   const char *z1;
1a9d0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
1a9e0 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20 20 20 20  har *z2;.       
1a9f0 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61   assert( pIdx->a
1aa00 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30 20 29 3b  iColumn[k]>=0 );
1aa10 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64  .        if( pId
1aa20 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 21 3d  x->aiColumn[k]!=
1aa30 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e  pIndex->aiColumn
1aa40 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  [k] ) break;.   
1aa50 20 20 20 20 20 7a 31 20 3d 20 70 49 64 78 2d 3e       z1 = pIdx->
1aa60 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1aa70 20 20 20 7a 32 20 3d 20 70 49 6e 64 65 78 2d 3e     z2 = pIndex->
1aa80 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20 20 20 20  azColl[k];.     
1aa90 20 20 20 69 66 28 20 7a 31 21 3d 7a 32 20 26 26     if( z1!=z2 &&
1aaa0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1aab0 7a 31 2c 20 7a 32 29 20 29 20 62 72 65 61 6b 3b  z1, z2) ) break;
1aac0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1aad0 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e 4b 65 79  f( k==pIdx->nKey
1aae0 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Col ){.        i
1aaf0 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
1ab00 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f  !=pIndex->onErro
1ab10 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  r ){.          /
1ab20 2a 20 54 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  * This constrain
1ab30 74 20 63 72 65 61 74 65 73 20 74 68 65 20 73 61  t creates the sa
1ab40 6d 65 20 69 6e 64 65 78 20 61 73 20 61 20 70 72  me index as a pr
1ab50 65 76 69 6f 75 73 0a 20 20 20 20 20 20 20 20 20  evious.         
1ab60 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 20 73   ** constraint s
1ab70 70 65 63 69 66 69 65 64 20 73 6f 6d 65 77 68 65  pecified somewhe
1ab80 72 65 20 69 6e 20 74 68 65 20 43 52 45 41 54 45  re in the CREATE
1ab90 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
1aba0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 48  ..          ** H
1abb0 6f 77 65 76 65 72 20 74 68 65 20 4f 4e 20 43 4f  owever the ON CO
1abc0 4e 46 4c 49 43 54 20 63 6c 61 75 73 65 73 20 61  NFLICT clauses a
1abd0 72 65 20 64 69 66 66 65 72 65 6e 74 2e 20 49 66  re different. If
1abe0 20 62 6f 74 68 20 74 68 69 73 20 0a 20 20 20 20   both this .    
1abf0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61        ** constra
1ac00 69 6e 74 20 61 6e 64 20 74 68 65 20 70 72 65 76  int and the prev
1ac10 69 6f 75 73 20 65 71 75 69 76 61 6c 65 6e 74 20  ious equivalent 
1ac20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61 76 65 20  constraint have 
1ac30 65 78 70 6c 69 63 69 74 0a 20 20 20 20 20 20 20  explicit.       
1ac40 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46 4c 49 43     ** ON CONFLIC
1ac50 54 20 63 6c 61 75 73 65 73 20 74 68 69 73 20 69  T clauses this i
1ac60 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f 74 68 65  s an error. Othe
1ac70 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 0a 20  rwise, use the. 
1ac80 20 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 6c           ** expl
1ac90 69 63 69 74 6c 79 20 73 70 65 63 69 66 69 65 64  icitly specified
1aca0 20 62 65 68 61 76 69 6f 72 20 66 6f 72 20 74 68   behavior for th
1acb0 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 20  e index..       
1acc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1acd0 69 66 28 20 21 28 70 49 64 78 2d 3e 6f 6e 45 72  if( !(pIdx->onEr
1ace0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1acf0 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72  || pIndex->onErr
1ad00 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 29 20  or==OE_Default) 
1ad10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1ad20 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
1ad30 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20  Parse, .        
1ad40 20 20 20 20 20 20 20 20 22 63 6f 6e 66 6c 69 63          "conflic
1ad50 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c 49 43 54  ting ON CONFLICT
1ad60 20 63 6c 61 75 73 65 73 20 73 70 65 63 69 66 69   clauses specifi
1ad70 65 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ed", 0);.       
1ad80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
1ad90 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
1ada0 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20 29 7b 0a  ==OE_Default ){.
1adb0 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
1adc0 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70 49 6e 64  ->onError = pInd
1add0 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a 20 20 20  ex->onError;.   
1ade0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1adf0 20 7d 0a 20 20 20 20 20 20 20 20 70 52 65 74 20   }.        pRet 
1ae00 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
1ae10 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1ae20 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a  _index;.      }.
1ae30 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1ae40 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20 49 6e 64  Link the new Ind
1ae50 65 78 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ex structure to 
1ae60 69 74 73 20 74 61 62 6c 65 20 61 6e 64 20 74 6f  its table and to
1ae70 20 74 68 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   the other.  ** 
1ae80 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ae90 73 65 20 73 74 72 75 63 74 75 72 65 73 2e 20 0a  se structures. .
1aea0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
1aeb0 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 20 29  Parse->nErr==0 )
1aec0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74  ;.  if( db->init
1aed0 2e 62 75 73 79 20 29 7b 0a 20 20 20 20 49 6e 64  .busy ){.    Ind
1aee0 65 78 20 2a 70 3b 0a 20 20 20 20 61 73 73 65 72  ex *p;.    asser
1aef0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
1af00 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c  MutexHeld(db, 0,
1af10 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
1af20 29 20 29 3b 0a 20 20 20 20 70 20 3d 20 73 71 6c  ) );.    p = sql
1af30 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
1af40 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d  pIndex->pSchema-
1af50 3e 69 64 78 48 61 73 68 2c 20 0a 20 20 20 20 20  >idxHash, .     
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 7a 4e 61       pIndex->zNa
1af80 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 20  me, pIndex);.   
1af90 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
1afa0 61 73 73 65 72 74 28 20 70 3d 3d 70 49 6e 64 65  assert( p==pInde
1afb0 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20  x );  /* Malloc 
1afc0 6d 75 73 74 20 68 61 76 65 20 66 61 69 6c 65 64  must have failed
1afd0 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d 3e 6d 61   */.      db->ma
1afe0 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
1aff0 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f        goto exit_
1b000 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
1b010 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66 6c 61 67    }.    db->flag
1b020 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
1b030 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20 20 20 69  rnChanges;.    i
1b040 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20 29  f( pTblName!=0 )
1b050 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  {.      pIndex->
1b060 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e 69 74 2e  tnum = db->init.
1b070 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20  newTnum;.    }. 
1b080 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
1b090 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
1b0a0 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
1b0b0 74 65 6d 65 6e 74 20 28 6f 72 20 43 52 45 41 54  tement (or CREAT
1b0c0 45 20 54 41 42 4c 45 20 69 66 20 74 68 65 0a 20  E TABLE if the. 
1b0d0 20 2a 2a 20 69 6e 64 65 78 20 69 73 20 61 6e 20   ** index is an 
1b0e0 69 6d 70 6c 69 65 64 20 69 6e 64 65 78 20 66 6f  implied index fo
1b0f0 72 20 61 20 55 4e 49 51 55 45 20 6f 72 20 50 52  r a UNIQUE or PR
1b100 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1b110 61 69 6e 74 29 20 74 68 65 6e 0a 20 20 2a 2a 20  aint) then.  ** 
1b120 65 6d 69 74 20 63 6f 64 65 20 74 6f 20 61 6c 6c  emit code to all
1b130 6f 63 61 74 65 20 74 68 65 20 69 6e 64 65 78 20  ocate the index 
1b140 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64 69 73 6b  rootpage on disk
1b150 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20 65 6e 74   and make an ent
1b160 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20  ry for.  ** the 
1b170 69 6e 64 65 78 20 69 6e 20 74 68 65 20 73 71 6c  index in the sql
1b180 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
1b190 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68   and populate th
1b1a0 65 20 69 6e 64 65 78 20 77 69 74 68 0a 20 20 2a  e index with.  *
1b1b0 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 2c  * content.  But,
1b1c0 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20   do not do this 
1b1d0 69 66 20 77 65 20 61 72 65 20 73 69 6d 70 6c 79  if we are simply
1b1e0 20 72 65 61 64 69 6e 67 20 74 68 65 20 73 71 6c   reading the sql
1b1f0 69 74 65 5f 6d 61 73 74 65 72 0a 20 20 2a 2a 20  ite_master.  ** 
1b200 74 61 62 6c 65 20 74 6f 20 70 61 72 73 65 20 74  table to parse t
1b210 68 65 20 73 63 68 65 6d 61 2c 20 6f 72 20 69 66  he schema, or if
1b220 20 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74   this index is t
1b230 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  he PRIMARY KEY i
1b240 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20 61 20 57  ndex.  ** of a W
1b250 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
1b260 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  le..  **.  ** If
1b270 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20 69 74 20   pTblName==0 it 
1b280 6d 65 61 6e 73 20 74 68 69 73 20 69 6e 64 65 78  means this index
1b290 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 61 73   is generated as
1b2a0 20 61 6e 20 69 6d 70 6c 69 65 64 20 50 52 49 4d   an implied PRIM
1b2b0 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20 6f 72 20  ARY KEY.  ** or 
1b2c0 55 4e 49 51 55 45 20 69 6e 64 65 78 20 69 6e 20  UNIQUE index in 
1b2d0 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  a CREATE TABLE s
1b2e0 74 61 74 65 6d 65 6e 74 2e 20 20 53 69 6e 63 65  tatement.  Since
1b2f0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20   the table.  ** 
1b300 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 63 72  has just been cr
1b310 65 61 74 65 64 2c 20 69 74 20 63 6f 6e 74 61 69  eated, it contai
1b320 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e 64 20 74  ns no data and t
1b330 68 65 20 69 6e 64 65 78 20 69 6e 69 74 69 61 6c  he index initial
1b340 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 73 74 65  ization.  ** ste
1b350 70 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64  p can be skipped
1b360 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
1b370 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 62 29  ( HasRowid(pTab)
1b380 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21 3d 30 20   || pTblName!=0 
1b390 29 7b 0a 20 20 20 20 56 64 62 65 20 2a 76 3b 0a  ){.    Vdbe *v;.
1b3a0 20 20 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 3b      char *zStmt;
1b3b0 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d 20 3d 20  .    int iMem = 
1b3c0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1b3d0 0a 20 20 20 20 76 20 3d 20 73 71 6c 69 74 65 33  .    v = sqlite3
1b3e0 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1b3f0 0a 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20  .    if( v==0 ) 
1b400 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
1b410 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20 73 71 6c  _index;..    sql
1b420 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1b430 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1b440 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20 20 2f 2a  1, iDb);..    /*
1b450 20 43 72 65 61 74 65 20 74 68 65 20 72 6f 6f 74   Create the root
1b460 70 61 67 65 20 66 6f 72 20 74 68 65 20 69 6e 64  page for the ind
1b470 65 78 20 75 73 69 6e 67 20 43 72 65 61 74 65 49  ex using CreateI
1b480 6e 64 65 78 2e 20 42 75 74 20 62 65 66 6f 72 65  ndex. But before
1b490 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 73 6f  .    ** doing so
1b4a0 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70 20 69 6e  , code a Noop in
1b4b0 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20 73 74  struction and st
1b4c0 6f 72 65 20 69 74 73 20 61 64 64 72 65 73 73 20  ore its address 
1b4d0 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e 64 65 78  in .    ** Index
1b4e0 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69 73 20 72  .tnum. This is r
1b4f0 65 71 75 69 72 65 64 20 69 6e 20 63 61 73 65 20  equired in case 
1b500 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 61 63  this index is ac
1b510 74 75 61 6c 6c 79 20 61 20 0a 20 20 20 20 2a 2a  tually a .    **
1b520 20 50 52 49 4d 41 52 59 20 4b 45 59 20 61 6e 64   PRIMARY KEY and
1b530 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 63   the table is ac
1b540 74 75 61 6c 6c 79 20 61 20 57 49 54 48 4f 55 54  tually a WITHOUT
1b550 20 52 4f 57 49 44 20 74 61 62 6c 65 2e 20 49 6e   ROWID table. In
1b560 20 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 63 61   .    ** that ca
1b570 73 65 20 74 68 65 20 63 6f 6e 76 65 72 74 54 6f  se the convertTo
1b580 57 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c  WithoutRowidTabl
1b590 65 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  e() routine will
1b5a0 20 72 65 70 6c 61 63 65 0a 20 20 20 20 2a 2a 20   replace.    ** 
1b5b0 74 68 65 20 4e 6f 6f 70 20 77 69 74 68 20 61 20  the Noop with a 
1b5c0 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20 6f 76 65  Goto to jump ove
1b5d0 72 20 74 68 65 20 56 44 42 45 20 63 6f 64 65 20  r the VDBE code 
1b5e0 67 65 6e 65 72 61 74 65 64 20 62 65 6c 6f 77 2e  generated below.
1b5f0 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e   */.    pIndex->
1b600 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 56 64  tnum = sqlite3Vd
1b610 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f 4e  beAddOp0(v, OP_N
1b620 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oop);.    sqlite
1b630 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1b640 50 5f 43 72 65 61 74 65 49 6e 64 65 78 2c 20 69  P_CreateIndex, i
1b650 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20 20 20 20  Db, iMem);..    
1b660 2f 2a 20 47 61 74 68 65 72 20 74 68 65 20 63 6f  /* Gather the co
1b670 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
1b680 68 65 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  he CREATE INDEX 
1b690 73 74 61 74 65 6d 65 6e 74 20 69 6e 74 6f 0a 20  statement into. 
1b6a0 20 20 20 2a 2a 20 74 68 65 20 7a 53 74 6d 74 20     ** the zStmt 
1b6b0 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a 2f 0a  variable.    */.
1b6c0 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
1b6d0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
1b6e0 28 69 6e 74 29 28 70 50 61 72 73 65 2d 3e 73 4c  (int)(pParse->sL
1b6f0 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20 70 4e 61  astToken.z - pNa
1b700 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72 73 65 2d  me->z) + pParse-
1b710 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e 3b 0a 20  >sLastToken.n;. 
1b720 20 20 20 20 20 69 66 28 20 70 4e 61 6d 65 2d 3e       if( pName->
1b730 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29 20 6e 2d  z[n-1]==';' ) n-
1b740 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41 20 6e 61  -;.      /* A na
1b750 6d 65 64 20 69 6e 64 65 78 20 77 69 74 68 20 61  med index with a
1b760 6e 20 65 78 70 6c 69 63 69 74 20 43 52 45 41 54  n explicit CREAT
1b770 45 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  E INDEX statemen
1b780 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d 74  t */.      zStmt
1b790 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
1b7a0 66 28 64 62 2c 20 22 43 52 45 41 54 45 25 73 20  f(db, "CREATE%s 
1b7b0 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a 20 20 20  INDEX %.*s",.   
1b7c0 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45       onError==OE
1b7d0 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20 22 20 55  _None ? "" : " U
1b7e0 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e 61 6d 65  NIQUE", n, pName
1b7f0 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
1b800 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 75 74  .      /* An aut
1b810 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 63 72 65  omatic index cre
1b820 61 74 65 64 20 62 79 20 61 20 50 52 49 4d 41 52  ated by a PRIMAR
1b830 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45 20  Y KEY or UNIQUE 
1b840 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20  constraint */.  
1b850 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20 3d 20 73      /* zStmt = s
1b860 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 22  qlite3MPrintf(""
1b870 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a 53 74 6d  ); */.      zStm
1b880 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 0;.    }..  
1b890 20 20 2f 2a 20 41 64 64 20 61 6e 20 65 6e 74 72    /* Add an entr
1b8a0 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d 61 73 74  y in sqlite_mast
1b8b0 65 72 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  er for this inde
1b8c0 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  x.    */.    sql
1b8d0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1b8e0 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20  pParse, .       
1b8f0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25 51   "INSERT INTO %Q
1b900 2e 25 73 20 56 41 4c 55 45 53 28 27 69 6e 64 65  .%s VALUES('inde
1b910 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c 25 51 29  x',%Q,%Q,#%d,%Q)
1b920 3b 22 2c 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  ;",.        db->
1b930 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  aDb[iDb].zName, 
1b940 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1b950 29 2c 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ),.        pInde
1b960 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  x->zName,.      
1b970 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 0a 20    pTab->zName,. 
1b980 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a 20 20 20         iMem,.   
1b990 20 20 20 20 20 7a 53 74 6d 74 0a 20 20 20 20 29       zStmt.    )
1b9a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
1b9b0 72 65 65 28 64 62 2c 20 7a 53 74 6d 74 29 3b 0a  ree(db, zStmt);.
1b9c0 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65  .    /* Fill the
1b9d0 20 69 6e 64 65 78 20 77 69 74 68 20 64 61 74 61   index with data
1b9e0 20 61 6e 64 20 72 65 70 61 72 73 65 20 74 68 65   and reparse the
1b9f0 20 73 63 68 65 6d 61 2e 20 43 6f 64 65 20 61 6e   schema. Code an
1ba00 20 4f 50 5f 45 78 70 69 72 65 0a 20 20 20 20 2a   OP_Expire.    *
1ba10 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20  * to invalidate 
1ba20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64  all pre-compiled
1ba30 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20   statements..   
1ba40 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 54 62 6c   */.    if( pTbl
1ba50 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Name ){.      sq
1ba60 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78  lite3RefillIndex
1ba70 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c  (pParse, pIndex,
1ba80 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 73 71   iMem);.      sq
1ba90 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
1baa0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
1bab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1bac0 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f  eAddParseSchemaO
1bad0 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20 20  p(v, iDb,.      
1bae0 20 20 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74     sqlite3MPrint
1baf0 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27 25 71 27  f(db, "name='%q'
1bb00 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
1bb10 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  '", pIndex->zNam
1bb20 65 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e));.      sqlit
1bb30 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
1bb40 4f 50 5f 45 78 70 69 72 65 2c 20 30 29 3b 0a 20  OP_Expire, 0);. 
1bb50 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
1bb60 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
1bb70 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 29 3b 0a   pIndex->tnum);.
1bb80 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 61    }..  /* When a
1bb90 64 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 74  dding an index t
1bba0 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1bbb0 64 69 63 65 73 20 66 6f 72 20 61 20 74 61 62 6c  dices for a tabl
1bbc0 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  e, make.  ** sur
1bbd0 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 61  e all indices la
1bbe0 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c 61 63 65  beled OE_Replace
1bbf0 20 63 6f 6d 65 20 61 66 74 65 72 20 61 6c 6c 20   come after all 
1bc00 74 68 6f 73 65 20 6c 61 62 65 6c 65 64 0a 20 20  those labeled.  
1bc10 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e 20 20 54  ** OE_Ignore.  T
1bc20 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72 79  his is necessary
1bc30 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 63 74   for the correct
1bc40 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 68 65 63   constraint chec
1bc50 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e  k.  ** processin
1bc60 67 20 28 69 6e 20 73 71 6c 69 74 65 33 47 65 6e  g (in sqlite3Gen
1bc70 65 72 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43  erateConstraintC
1bc80 68 65 63 6b 73 28 29 29 20 61 73 20 70 61 72 74  hecks()) as part
1bc90 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41 54 45 20   of.  ** UPDATE 
1bca0 61 6e 64 20 49 4e 53 45 52 54 20 73 74 61 74 65  and INSERT state
1bcb0 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  ments.  .  */.  
1bcc0 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
1bcd0 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 3d 3d 30  y || pTblName==0
1bce0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 6e 45 72   ){.    if( onEr
1bcf0 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61 63 65 20  ror!=OE_Replace 
1bd00 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 3d  || pTab->pIndex=
1bd10 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  =0.         || p
1bd20 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e 6f 6e 45  Tab->pIndex->onE
1bd30 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c 61 63 65  rror==OE_Replace
1bd40 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d  ){.      pIndex-
1bd50 3e 70 4e 65 78 74 20 3d 20 70 54 61 62 2d 3e 70  >pNext = pTab->p
1bd60 49 6e 64 65 78 3b 0a 20 20 20 20 20 20 70 54 61  Index;.      pTa
1bd70 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70 49 6e 64  b->pIndex = pInd
1bd80 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ex;.    }else{. 
1bd90 20 20 20 20 20 49 6e 64 65 78 20 2a 70 4f 74 68       Index *pOth
1bda0 65 72 20 3d 20 70 54 61 62 2d 3e 70 49 6e 64 65  er = pTab->pInde
1bdb0 78 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  x;.      while( 
1bdc0 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 20 26 26  pOther->pNext &&
1bdd0 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74 2d 3e   pOther->pNext->
1bde0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c  onError!=OE_Repl
1bdf0 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ace ){.        p
1be00 4f 74 68 65 72 20 3d 20 70 4f 74 68 65 72 2d 3e  Other = pOther->
1be10 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1be20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 70 4e 65       pIndex->pNe
1be30 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e 70 4e 65  xt = pOther->pNe
1be40 78 74 3b 0a 20 20 20 20 20 20 70 4f 74 68 65 72  xt;.      pOther
1be50 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
1be60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 52 65 74  ;.    }.    pRet
1be70 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20 20 20 70   = pIndex;.    p
1be80 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Index = 0;.  }..
1be90 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 62 65    /* Clean up be
1bea0 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
1beb0 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1bec0 78 3a 0a 20 20 69 66 28 20 70 49 6e 64 65 78 20  x:.  if( pIndex 
1bed0 29 20 66 72 65 65 49 6e 64 65 78 28 64 62 2c 20  ) freeIndex(db, 
1bee0 70 49 6e 64 65 78 29 3b 0a 20 20 73 71 6c 69 74  pIndex);.  sqlit
1bef0 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
1bf00 20 70 50 49 57 68 65 72 65 29 3b 0a 20 20 73 71   pPIWhere);.  sq
1bf10 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1bf20 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1bf30 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74    sqlite3SrcList
1bf40 44 65 6c 65 74 65 28 64 62 2c 20 70 54 62 6c 4e  Delete(db, pTblN
1bf50 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
1bf60 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
1bf70 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
1bf80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 6c 20 74  .}../*.** Fill t
1bf90 68 65 20 49 6e 64 65 78 2e 61 69 52 6f 77 45 73  he Index.aiRowEs
1bfa0 74 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 64  t[] array with d
1bfb0 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d 61 74 69  efault informati
1bfc0 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  on - information
1bfd0 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65 64 20 77  .** to be used w
1bfe0 68 65 6e 20 77 65 20 68 61 76 65 20 6e 6f 74 20  hen we have not 
1bff0 72 75 6e 20 74 68 65 20 41 4e 41 4c 59 5a 45 20  run the ANALYZE 
1c000 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 61  command..**.** a
1c010 69 52 6f 77 45 73 74 5b 30 5d 20 69 73 20 73 75  iRowEst[0] is su
1c020 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e 74 61 69  pposed to contai
1c030 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1c040 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1c050 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e 63 65 20  index..** Since 
1c060 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 2c 20  we do not know, 
1c070 67 75 65 73 73 20 31 20 6d 69 6c 6c 69 6f 6e 2e  guess 1 million.
1c080 20 20 61 69 52 6f 77 45 73 74 5b 31 5d 20 69 73    aiRowEst[1] is
1c090 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
1c0a0 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
1c0b0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
1c0c0 6c 65 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e  le that match an
1c0d0 79 20 70 61 72 74 69 63 75 6c 61 72 20 76 61 6c  y particular val
1c0e0 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 72  ue of the.** fir
1c0f0 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65  st column of the
1c100 20 69 6e 64 65 78 2e 20 20 61 69 52 6f 77 45 73   index.  aiRowEs
1c110 74 5b 32 5d 20 69 73 20 61 6e 20 65 73 74 69 6d  t[2] is an estim
1c120 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
1c130 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20 74 68 61  r.** of rows tha
1c140 74 20 6d 61 74 63 68 20 61 6e 79 20 70 61 72 74  t match any part
1c150 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e 61 74 69  icular combinati
1c160 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
1c170 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 6f 66 20  2 columns.** of 
1c180 74 68 65 20 69 6e 64 65 78 2e 20 20 41 6e 64 20  the index.  And 
1c190 73 6f 20 66 6f 72 74 68 2e 20 20 49 74 20 6d 75  so forth.  It mu
1c1a0 73 74 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  st always be the
1c1b0 20 63 61 73 65 20 74 68 61 74 0a 2a 0a 2a 2a 20   case that.*.** 
1c1c0 20 20 20 20 20 20 20 20 20 20 61 69 52 6f 77 45            aiRowE
1c1d0 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45 73 74 5b  st[N]<=aiRowEst[
1c1e0 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20 20 20 20  N-1].**         
1c1f0 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d 3e 3d 31    aiRowEst[N]>=1
1c200 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20 66 72 6f  .**.** Apart fro
1c210 6d 20 74 68 61 74 2c 20 77 65 20 68 61 76 65 20  m that, we have 
1c220 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20 6f 6e 20  little to go on 
1c230 62 65 73 69 64 65 73 20 69 6e 74 75 69 74 69 6f  besides intuitio
1c240 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f 77 20 61  n as to.** how a
1c250 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f 75 6c 64  iRowEst[] should
1c260 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
1c270 20 20 54 68 65 20 6e 75 6d 62 65 72 73 20 67 65    The numbers ge
1c280 6e 65 72 61 74 65 64 20 68 65 72 65 0a 2a 2a 20  nerated here.** 
1c290 61 72 65 20 62 61 73 65 64 20 6f 6e 20 74 79 70  are based on typ
1c2a0 69 63 61 6c 20 76 61 6c 75 65 73 20 66 6f 75 6e  ical values foun
1c2b0 64 20 69 6e 20 61 63 74 75 61 6c 20 69 6e 64 69  d in actual indi
1c2c0 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ces..*/.void sql
1c2d0 69 74 65 33 44 65 66 61 75 6c 74 52 6f 77 45 73  ite3DefaultRowEs
1c2e0 74 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  t(Index *pIdx){.
1c2f0 20 20 2f 2a 20 20 20 20 20 20 20 20 20 20 20 20    /*            
1c300 20 20 20 20 31 30 2c 20 20 39 2c 20 20 38 2c 20      10,  9,  8, 
1c310 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c 6f 67 45   7,  6 */.  LogE
1c320 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b 20 33 33  st aVal[] = { 33
1c330 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c 20 32 36  , 32, 30, 28, 26
1c340 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20 2a 61 20   };.  LogEst *a 
1c350 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77 4c 6f 67  = pIdx->aiRowLog
1c360 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43 6f 70 79  Est;.  int nCopy
1c370 20 3d 20 4d 49 4e 28 41 72 72 61 79 53 69 7a 65   = MIN(ArraySize
1c380 28 61 56 61 6c 29 2c 20 70 49 64 78 2d 3e 6e 4b  (aVal), pIdx->nK
1c390 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74 20 69 3b  eyCol);.  int i;
1c3a0 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 66  ..  /* Set the f
1c3b0 69 72 73 74 20 65 6e 74 72 79 20 28 6e 75 6d 62  irst entry (numb
1c3c0 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
1c3d0 65 20 69 6e 64 65 78 29 20 74 6f 20 74 68 65 20  e index) to the 
1c3e0 65 73 74 69 6d 61 74 65 64 20 0a 20 20 2a 2a 20  estimated .  ** 
1c3f0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
1c400 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 4f 72 20  n the table. Or 
1c410 31 30 2c 20 69 66 20 74 68 65 20 65 73 74 69 6d  10, if the estim
1c420 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72  ated number of r
1c430 6f 77 73 20 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ows .  ** in the
1c440 20 74 61 62 6c 65 20 69 73 20 6c 65 73 73 20 74   table is less t
1c450 68 61 6e 20 74 68 61 74 2e 20 20 2a 2f 0a 20 20  han that.  */.  
1c460 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e 70 54 61  a[0] = pIdx->pTa
1c470 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45 73 74 3b  ble->nRowLogEst;
1c480 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33 33 20 29  .  if( a[0]<33 )
1c490 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20 20 20 20   a[0] = 33;     
1c4a0 20 20 20 61 73 73 65 72 74 28 20 33 33 3d 3d 73     assert( 33==s
1c4b0 71 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 30 29  qlite3LogEst(10)
1c4c0 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   );..  /* Estima
1c4d0 74 65 20 74 68 61 74 20 61 5b 31 5d 20 69 73 20  te that a[1] is 
1c4e0 31 30 2c 20 61 5b 32 5d 20 69 73 20 39 2c 20 61  10, a[2] is 9, a
1c4f0 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34 5d 20 69  [3] is 8, a[4] i
1c500 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a 20 20 2a  s 7, a[5] is.  *
1c510 2a 20 36 20 61 6e 64 20 65 61 63 68 20 73 75 62  * 6 and each sub
1c520 73 65 71 75 65 6e 74 20 76 61 6c 75 65 20 28 69  sequent value (i
1c530 66 20 61 6e 79 29 20 69 73 20 35 2e 20 20 2a 2f  f any) is 5.  */
1c540 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b 31 5d 2c  .  memcpy(&a[1],
1c550 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a 73 69 7a   aVal, nCopy*siz
1c560 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b 0a 20 20  eof(LogEst));.  
1c570 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31 3b 20 69  for(i=nCopy+1; i
1c580 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  <=pIdx->nKeyCol;
1c590 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b 69 5d 20   i++){.    a[i] 
1c5a0 3d 20 32 33 3b 20 20 20 20 20 20 20 20 20 20 20  = 23;           
1c5b0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1c5c0 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45   23==sqlite3LogE
1c5d0 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  st(5) );.  }..  
1c5e0 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
1c5f0 65 33 4c 6f 67 45 73 74 28 31 29 20 29 3b 0a 20  e3LogEst(1) );. 
1c600 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e 64   if( IsUniqueInd
1c610 65 78 28 70 49 64 78 29 20 29 20 61 5b 70 49 64  ex(pIdx) ) a[pId
1c620 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d 20 30 3b  x->nKeyCol] = 0;
1c630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1c640 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 72 6f 70  outine will drop
1c650 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6e 61 6d   an existing nam
1c660 65 64 20 69 6e 64 65 78 2e 20 20 54 68 69 73 20  ed index.  This 
1c670 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d 70 6c 65  routine.** imple
1c680 6d 65 6e 74 73 20 74 68 65 20 44 52 4f 50 20 49  ments the DROP I
1c690 4e 44 45 58 20 73 74 61 74 65 6d 65 6e 74 2e 0a  NDEX statement..
1c6a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 44  */.void sqlite3D
1c6b0 72 6f 70 49 6e 64 65 78 28 50 61 72 73 65 20 2a  ropIndex(Parse *
1c6c0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1c6d0 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69 66 45 78  *pName, int ifEx
1c6e0 69 73 74 73 29 7b 0a 20 20 49 6e 64 65 78 20 2a  ists){.  Index *
1c6f0 70 49 6e 64 65 78 3b 0a 20 20 56 64 62 65 20 2a  pIndex;.  Vdbe *
1c700 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  v;.  sqlite3 *db
1c710 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
1c720 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20 61 73 73   int iDb;..  ass
1c730 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 45 72  ert( pParse->nEr
1c740 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 4e 65 76  r==0 );   /* Nev
1c750 65 72 20 63 61 6c 6c 65 64 20 77 69 74 68 20 70  er called with p
1c760 72 69 6f 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  rior errors */. 
1c770 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
1c780 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
1c790 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1c7a0 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  x;.  }.  assert(
1c7b0 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20   pName->nSrc==1 
1c7c0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1c7d0 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
1c7e0 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
1c7f0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1c800 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1c810 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74 65   pIndex = sqlite
1c820 33 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 70  3FindIndex(db, p
1c830 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e 61 6d 65  Name->a[0].zName
1c840 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44  , pName->a[0].zD
1c850 61 74 61 62 61 73 65 29 3b 0a 20 20 69 66 28 20  atabase);.  if( 
1c860 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a 20 20 20  pIndex==0 ){.   
1c870 20 69 66 28 20 21 69 66 45 78 69 73 74 73 20 29   if( !ifExists )
1c880 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
1c890 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1c8a0 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20  "no such index: 
1c8b0 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30 29 3b 0a  %S", pName, 0);.
1c8c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c8d0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
1c8e0 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 70 50  fyNamedSchema(pP
1c8f0 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30  arse, pName->a[0
1c900 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ].zDatabase);.  
1c910 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
1c920 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
1c930 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
1c940 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 20  rop_index;.  }. 
1c950 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 69 64 78   if( pIndex->idx
1c960 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 49 44 58  Type!=SQLITE_IDX
1c970 54 59 50 45 5f 41 50 50 44 45 46 20 29 7b 0a 20  TYPE_APPDEF ){. 
1c980 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
1c990 73 67 28 70 50 61 72 73 65 2c 20 22 69 6e 64 65  sg(pParse, "inde
1c9a0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
1c9b0 68 20 55 4e 49 51 55 45 20 22 0a 20 20 20 20 20  h UNIQUE ".     
1c9c0 20 22 6f 72 20 50 52 49 4d 41 52 59 20 4b 45 59   "or PRIMARY KEY
1c9d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 61 6e 6e   constraint cann
1c9e0 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c 20  ot be dropped", 
1c9f0 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69  0);.    goto exi
1ca00 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1ca10 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  }.  iDb = sqlite
1ca20 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
1ca30 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  b, pIndex->pSche
1ca40 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ma);.#ifndef SQL
1ca50 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49  ITE_OMIT_AUTHORI
1ca60 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 69  ZATION.  {.    i
1ca70 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45  nt code = SQLITE
1ca80 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a 20 20 20  _DROP_INDEX;.   
1ca90 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
1caa0 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65 3b 0a 20  Index->pTable;. 
1cab0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1cac0 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62  Db = db->aDb[iDb
1cad0 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  ].zName;.    con
1cae0 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  st char *zTab = 
1caf0 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62  SCHEMA_TABLE(iDb
1cb00 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
1cb10 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1cb20 73 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54  se, SQLITE_DELET
1cb30 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29  E, zTab, 0, zDb)
1cb40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
1cb50 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a  xit_drop_index;.
1cb60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 4f      }.    if( !O
1cb70 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
1cb80 62 20 29 20 63 6f 64 65 20 3d 20 53 51 4c 49 54  b ) code = SQLIT
1cb90 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45  E_DROP_TEMP_INDE
1cba0 58 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  X;.    if( sqlit
1cbb0 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72  e3AuthCheck(pPar
1cbc0 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e 64 65 78  se, code, pIndex
1cbd0 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62 2d 3e 7a  ->zName, pTab->z
1cbe0 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b 0a 20 20  Name, zDb) ){.  
1cbf0 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72      goto exit_dr
1cc00 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a  op_index;.    }.
1cc10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
1cc20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
1cc30 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 64  o remove the ind
1cc40 65 78 20 61 6e 64 20 66 72 6f 6d 20 74 68 65 20  ex and from the 
1cc50 6d 61 73 74 65 72 20 74 61 62 6c 65 20 2a 2f 0a  master table */.
1cc60 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
1cc70 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
1cc80 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73 71 6c  if( v ){.    sql
1cc90 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
1cca0 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
1ccb0 31 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  1, iDb);.    sql
1ccc0 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
1ccd0 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 22  pParse,.       "
1cce0 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 51 2e 25  DELETE FROM %Q.%
1ccf0 73 20 57 48 45 52 45 20 6e 61 6d 65 3d 25 51 20  s WHERE name=%Q 
1cd00 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27  AND type='index'
1cd10 22 2c 0a 20 20 20 20 20 20 20 64 62 2d 3e 61 44  ",.       db->aD
1cd20 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43  b[iDb].zName, SC
1cd30 48 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 2c  HEMA_TABLE(iDb),
1cd40 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 0a 20   pIndex->zName. 
1cd50 20 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65     );.    sqlite
1cd60 33 43 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73  3ClearStatTables
1cd70 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20 22 69  (pParse, iDb, "i
1cd80 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  dx", pIndex->zNa
1cd90 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
1cda0 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28 70 50 61  ChangeCookie(pPa
1cdb0 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 64  rse, iDb);.    d
1cdc0 65 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 70  estroyRootPage(p
1cdd0 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2d 3e 74  Parse, pIndex->t
1cde0 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20 20 20 73  num, iDb);.    s
1cdf0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ce00 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e 64 65 78  (v, OP_DropIndex
1ce10 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 49 6e  , iDb, 0, 0, pIn
1ce20 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a  dex->zName, 0);.
1ce30 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f 70 5f 69    }..exit_drop_i
1ce40 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74 65 33 53  ndex:.  sqlite3S
1ce50 72 63 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  rcListDelete(db,
1ce60 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pName);.}../*.*
1ce70 2a 20 70 41 72 72 61 79 20 69 73 20 61 20 70 6f  * pArray is a po
1ce80 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72 61  inter to an arra
1ce90 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e 20 45 61  y of objects. Ea
1cea0 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1ceb0 0a 2a 2a 20 61 72 72 61 79 20 69 73 20 73 7a 45  .** array is szE
1cec0 6e 74 72 79 20 62 79 74 65 73 20 69 6e 20 73 69  ntry bytes in si
1ced0 7a 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ze. This routine
1cee0 20 75 73 65 73 20 73 71 6c 69 74 65 33 44 62 52   uses sqlite3DbR
1cef0 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74 6f 20 65  ealloc().** to e
1cf00 78 74 65 6e 64 20 74 68 65 20 61 72 72 61 79 20  xtend the array 
1cf10 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
1cf20 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1cf30 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20 65   object at the e
1cf40 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  nd..**.** When t
1cf50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cf60 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e 74 72 79  called, *pnEntry
1cf70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 75   contains the cu
1cf80 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a 2a 2a  rrent size of.**
1cf90 20 74 68 65 20 61 72 72 61 79 20 28 69 6e 20 65   the array (in e
1cfa0 6e 74 72 69 65 73 20 2d 20 73 6f 20 74 68 65 20  ntries - so the 
1cfb0 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 28 28  allocation is ((
1cfc0 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73 7a 45 6e  *pnEntry) * szEn
1cfd0 74 72 79 29 20 62 79 74 65 73 0a 2a 2a 20 69 6e  try) bytes.** in
1cfe0 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49   total)..**.** I
1cff0 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29 20  f the realloc() 
1d000 69 73 20 73 75 63 63 65 73 73 66 75 6c 20 28 69  is successful (i
1d010 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d 20 63 6f  .e. if no OOM co
1d020 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72 73 29 2c  ndition occurs),
1d030 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 61 6c   the.** space al
1d040 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
1d050 6e 65 77 20 6f 62 6a 65 63 74 20 69 73 20 7a 65  new object is ze
1d060 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72 79 20 75  roed, *pnEntry u
1d070 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20 72 65 66  pdated to.** ref
1d080 6c 65 63 74 20 74 68 65 20 6e 65 77 20 73 69 7a  lect the new siz
1d090 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 61  e of the array a
1d0a0 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
1d0b0 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
1d0c0 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  on.** returned. 
1d0d0 2a 70 49 64 78 20 69 73 20 73 65 74 20 74 6f 20  *pIdx is set to 
1d0e0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1d0f0 20 6e 65 77 20 61 72 72 61 79 20 65 6e 74 72 79   new array entry
1d100 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
1d110 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1d120 69 66 20 74 68 65 20 72 65 61 6c 6c 6f 63 28 29  if the realloc()
1d130 20 66 61 69 6c 73 2c 20 2a 70 49 64 78 20 69 73   fails, *pIdx is
1d140 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a 70 6e 45   set to -1, *pnE
1d150 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a 2a 2a 20  ntry remains.** 
1d160 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61 20  unchanged and a 
1d170 63 6f 70 79 20 6f 66 20 70 41 72 72 61 79 20 72  copy of pArray r
1d180 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  eturned..*/.void
1d190 20 2a 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c   *sqlite3ArrayAl
1d1a0 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c 69 74 65  locate(.  sqlite
1d1b0 33 20 2a 64 62 2c 20 20 20 20 20 20 2f 2a 20 43  3 *db,      /* C
1d1c0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74  onnection to not
1d1d0 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63 20 66 61  ify of malloc fa
1d1e0 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76 6f 69 64  ilures */.  void
1d1f0 20 2a 70 41 72 72 61 79 2c 20 20 20 20 20 2f 2a   *pArray,     /*
1d200 20 41 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74   Array of object
1d210 73 2e 20 20 4d 69 67 68 74 20 62 65 20 72 65 61  s.  Might be rea
1d220 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69 6e  llocated */.  in
1d230 74 20 73 7a 45 6e 74 72 79 2c 20 20 20 20 20 20  t szEntry,      
1d240 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61 63 68 20  /* Size of each 
1d250 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 61 72  object in the ar
1d260 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ray */.  int *pn
1d270 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a 20 4e 75  Entry,     /* Nu
1d280 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63 74 73 20  mber of objects 
1d290 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65  currently in use
1d2a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49 64 78 20   */.  int *pIdx 
1d2b0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1d2c0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1d2d0 6e 65 77 20 73 6c 6f 74 20 68 65 72 65 20 2a 2f  new slot here */
1d2e0 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
1d2f0 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45 6e 74 72   int n = *pnEntr
1d300 79 3b 0a 20 20 69 66 28 20 28 6e 20 26 20 28 6e  y;.  if( (n & (n
1d310 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  -1))==0 ){.    i
1d320 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30 29 20 3f  nt sz = (n==0) ?
1d330 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20 20 76 6f   1 : 2*n;.    vo
1d340 69 64 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  id *pNew = sqlit
1d350 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20  e3DbRealloc(db, 
1d360 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a 45 6e 74  pArray, sz*szEnt
1d370 72 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  ry);.    if( pNe
1d380 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  w==0 ){.      *p
1d390 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Idx = -1;.      
1d3a0 72 65 74 75 72 6e 20 70 41 72 72 61 79 3b 0a 20  return pArray;. 
1d3b0 20 20 20 7d 0a 20 20 20 20 70 41 72 72 61 79 20     }.    pArray 
1d3c0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 7a 20  = pNew;.  }.  z 
1d3d0 3d 20 28 63 68 61 72 2a 29 70 41 72 72 61 79 3b  = (char*)pArray;
1d3e0 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b 6e 20 2a  .  memset(&z[n *
1d3f0 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c 20 73 7a   szEntry], 0, sz
1d400 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49 64 78 20  Entry);.  *pIdx 
1d410 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45 6e 74 72  = n;.  ++*pnEntr
1d420 79 3b 0a 20 20 72 65 74 75 72 6e 20 70 41 72 72  y;.  return pArr
1d430 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  ay;.}../*.** App
1d440 65 6e 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  end a new elemen
1d450 74 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 49  t to the given I
1d460 64 4c 69 73 74 2e 20 20 43 72 65 61 74 65 20 61  dList.  Create a
1d470 20 6e 65 77 20 49 64 4c 69 73 74 20 69 66 0a 2a   new IdList if.*
1d480 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a 0a 2a 2a  * need be..**.**
1d490 20 41 20 6e 65 77 20 49 64 4c 69 73 74 20 69 73   A new IdList is
1d4a0 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 4e 55   returned, or NU
1d4b0 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 66  LL if malloc() f
1d4c0 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69 73 74 20  ails..*/.IdList 
1d4d0 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 41 70  *sqlite3IdListAp
1d4e0 70 65 6e 64 28 73 71 6c 69 74 65 33 20 2a 64 62  pend(sqlite3 *db
1d4f0 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69 73 74 2c  , IdList *pList,
1d500 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1d510 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1d520 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
1d530 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 44  pList = sqlite3D
1d540 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
1d550 73 69 7a 65 6f 66 28 49 64 4c 69 73 74 29 20 29  sizeof(IdList) )
1d560 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
1d570 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1d580 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20   }.  pList->a = 
1d590 73 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f  sqlite3ArrayAllo
1d5a0 63 61 74 65 28 0a 20 20 20 20 20 20 64 62 2c 0a  cate(.      db,.
1d5b0 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 61 2c 0a        pList->a,.
1d5c0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c 69        sizeof(pLi
1d5d0 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20 20 20 20  st->a[0]),.     
1d5e0 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c 0a 20 20   &pList->nId,.  
1d5f0 20 20 20 20 26 69 0a 20 20 29 3b 0a 20 20 69 66      &i.  );.  if
1d600 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  ( i<0 ){.    sql
1d610 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1d620 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  (db, pList);.   
1d630 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d640 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61   pList->a[i].zNa
1d650 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
1d660 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54  FromToken(db, pT
1d670 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  oken);.  return 
1d680 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
1d690 44 65 6c 65 74 65 20 61 6e 20 49 64 4c 69 73 74  Delete an IdList
1d6a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1d6b0 33 49 64 4c 69 73 74 44 65 6c 65 74 65 28 73 71  3IdListDelete(sq
1d6c0 6c 69 74 65 33 20 2a 64 62 2c 20 49 64 4c 69 73  lite3 *db, IdLis
1d6d0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1d6e0 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
1d6f0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
1d700 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
1d710 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nId; i++){.    
1d720 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1d730 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  , pList->a[i].zN
1d740 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
1d750 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c  te3DbFree(db, pL
1d760 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
1d770 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4c 69  e3DbFree(db, pLi
1d780 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  st);.}../*.** Re
1d790 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
1d7a0 6e 20 70 4c 69 73 74 20 6f 66 20 74 68 65 20 69  n pList of the i
1d7b0 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 64 20  dentifier named 
1d7c0 7a 49 64 2e 20 20 52 65 74 75 72 6e 20 2d 31 0a  zId.  Return -1.
1d7d0 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  ** if not found.
1d7e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49  .*/.int sqlite3I
1d7f0 64 4c 69 73 74 49 6e 64 65 78 28 49 64 4c 69 73  dListIndex(IdLis
1d800 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e 73 74 20  t *pList, const 
1d810 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
1d820 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1d830 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d  st==0 ) return -
1d840 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
1d850 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29  pList->nId; i++)
1d860 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1d870 33 53 74 72 49 43 6d 70 28 70 4c 69 73 74 2d 3e  3StrICmp(pList->
1d880 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  a[i].zName, zNam
1d890 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69  e)==0 ) return i
1d8a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d  ;.  }.  return -
1d8b0 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 61  1;.}../*.** Expa
1d8c0 6e 64 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  nd the space all
1d8d0 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20 67  ocated for the g
1d8e0 69 76 65 6e 20 53 72 63 4c 69 73 74 20 6f 62 6a  iven SrcList obj
1d8f0 65 63 74 20 62 79 0a 2a 2a 20 63 72 65 61 74 69  ect by.** creati
1d900 6e 67 20 6e 45 78 74 72 61 20 6e 65 77 20 73 6c  ng nExtra new sl
1d910 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ots beginning at
1d920 20 69 53 74 61 72 74 2e 20 20 69 53 74 61 72 74   iStart.  iStart
1d930 20 69 73 20 7a 65 72 6f 20 62 61 73 65 64 2e 0a   is zero based..
1d940 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20 61 72 65  ** New slots are
1d950 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 46   zeroed..**.** F
1d960 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73 75 70 70  or example, supp
1d970 6f 73 65 20 61 20 53 72 63 4c 69 73 74 20 69 6e  ose a SrcList in
1d980 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 73  itially contains
1d990 20 74 77 6f 20 65 6e 74 72 69 65 73 3a 20 41 2c   two entries: A,
1d9a0 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65 6e 64 20  B..** To append 
1d9b0 33 20 6e 65 77 20 65 6e 74 72 69 65 73 20 6f 6e  3 new entries on
1d9c0 74 6f 20 74 68 65 20 65 6e 64 2c 20 64 6f 20 74  to the end, do t
1d9d0 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 73 71  his:.**.**    sq
1d9e0 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1d9f0 72 67 65 28 64 62 2c 20 70 53 72 63 6c 69 73 74  rge(db, pSrclist
1da00 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a 2a 20 41  , 3, 2);.**.** A
1da10 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 61 62  fter the call ab
1da20 6f 76 65 20 69 74 20 77 6f 75 6c 64 20 63 6f 6e  ove it would con
1da30 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20 6e 69 6c  tain:  A, B, nil
1da40 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a 2a 20 49  , nil, nil..** I
1da50 66 20 74 68 65 20 69 53 74 61 72 74 20 61 72 67  f the iStart arg
1da60 75 6d 65 6e 74 20 68 61 64 20 62 65 65 6e 20 31  ument had been 1
1da70 20 69 6e 73 74 65 61 64 20 6f 66 20 32 2c 20 74   instead of 2, t
1da80 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  hen the result.*
1da90 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  * would have bee
1daa0 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  n:  A, nil, nil,
1dab0 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20 70 72 65   nil, B.  To pre
1dac0 70 65 6e 64 20 74 68 65 20 6e 65 77 20 73 6c 6f  pend the new slo
1dad0 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53 74 61 72  ts,.** the iStar
1dae0 74 20 76 61 6c 75 65 20 77 6f 75 6c 64 20 62 65  t value would be
1daf0 20 30 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20   0.  The result 
1db00 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a 20 62 65  then would.** be
1db10 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2c  : nil, nil, nil,
1db20 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   A, B..**.** If 
1db30 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
1db40 69 6f 6e 20 66 61 69 6c 73 20 74 68 65 20 53 72  ion fails the Sr
1db50 63 4c 69 73 74 20 69 73 20 75 6e 63 68 61 6e 67  cList is unchang
1db60 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64 62 2d 3e  ed.  The.** db->
1db70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
1db80 67 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  g will be set to
1db90 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63 4c 69 73   true..*/.SrcLis
1dba0 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73  t *sqlite3SrcLis
1dbb0 74 45 6e 6c 61 72 67 65 28 0a 20 20 73 71 6c 69  tEnlarge(.  sqli
1dbc0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f  te3 *db,       /
1dbd0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
1dbe0 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69 66 79 20  ction to notify 
1dbf0 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73 20 2a 2f  of OOM errors */
1dc00 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
1dc10 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 53 72 63  ,     /* The Src
1dc20 4c 69 73 74 20 74 6f 20 62 65 20 65 6e 6c 61 72  List to be enlar
1dc30 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ged */.  int nEx
1dc40 74 72 61 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  tra,        /* N
1dc50 75 6d 62 65 72 20 6f 66 20 6e 65 77 20 73 6c 6f  umber of new slo
1dc60 74 73 20 74 6f 20 61 64 64 20 74 6f 20 70 53 72  ts to add to pSr
1dc70 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  c->a[] */.  int 
1dc80 69 53 74 61 72 74 20 20 20 20 20 20 20 20 20 2f  iStart         /
1dc90 2a 20 49 6e 64 65 78 20 69 6e 20 70 53 72 63 2d  * Index in pSrc-
1dca0 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74 20 6e 65  >a[] of first ne
1dcb0 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a 20 20 69  w slot */.){.  i
1dcc0 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69  nt i;..  /* Sani
1dcd0 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 63  ty checking on c
1dce0 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65 74 65 72  alling parameter
1dcf0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
1dd00 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20 20 61 73  Start>=0 );.  as
1dd10 73 65 72 74 28 20 6e 45 78 74 72 61 3e 3d 31 20  sert( nExtra>=1 
1dd20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
1dd30 63 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  c!=0 );.  assert
1dd40 28 20 69 53 74 61 72 74 3c 3d 70 53 72 63 2d 3e  ( iStart<=pSrc->
1dd50 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  nSrc );..  /* Al
1dd60 6c 6f 63 61 74 65 20 61 64 64 69 74 69 6f 6e 61  locate additiona
1dd70 6c 20 73 70 61 63 65 20 69 66 20 6e 65 65 64 65  l space if neede
1dd80 64 20 2a 2f 0a 20 20 69 66 28 20 28 75 33 32 29  d */.  if( (u32)
1dd90 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45 78 74 72  pSrc->nSrc+nExtr
1dda0 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 29  a>pSrc->nAlloc )
1ddb0 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
1ddc0 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e 41 6c  New;.    int nAl
1ddd0 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e 53 72 63  loc = pSrc->nSrc
1dde0 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 6e 74  +nExtra;.    int
1ddf0 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e 65 77 20   nGot;.    pNew 
1de00 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c  = sqlite3DbReall
1de10 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a 20 20 20  oc(db, pSrc,.   
1de20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
1de30 6f 66 28 2a 70 53 72 63 29 20 2b 20 28 6e 41 6c  of(*pSrc) + (nAl
1de40 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66 28 70 53  loc-1)*sizeof(pS
1de50 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 20  rc->a[0]) );.   
1de60 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1de70 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
1de80 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1de90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1dea0 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  Src;.    }.    p
1deb0 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  Src = pNew;.    
1dec0 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 44  nGot = (sqlite3D
1ded0 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64 62 2c 20  bMallocSize(db, 
1dee0 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f 66 28 2a  pNew) - sizeof(*
1def0 70 53 72 63 29 29 2f 73 69 7a 65 6f 66 28 70 53  pSrc))/sizeof(pS
1df00 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a 20 20 20  rc->a[0])+1;.   
1df10 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pSrc->nAlloc = 
1df20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nGot;.  }..  /* 
1df30 4d 6f 76 65 20 65 78 69 73 74 69 6e 67 20 73 6c  Move existing sl
1df40 6f 74 73 20 74 68 61 74 20 63 6f 6d 65 20 61 66  ots that come af
1df50 74 65 72 20 74 68 65 20 6e 65 77 6c 79 20 69 6e  ter the newly in
1df60 73 65 72 74 65 64 20 73 6c 6f 74 73 0a 20 20 2a  serted slots.  *
1df70 2a 20 6f 75 74 20 6f 66 20 74 68 65 20 77 61 79  * out of the way
1df80 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 53 72 63   */.  for(i=pSrc
1df90 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 69 53 74  ->nSrc-1; i>=iSt
1dfa0 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70  art; i--){.    p
1dfb0 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74 72 61 5d  Src->a[i+nExtra]
1dfc0 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20   = pSrc->a[i];. 
1dfd0 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53 72 63 20   }.  pSrc->nSrc 
1dfe0 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20 20 2f 2a  += nExtra;..  /*
1dff0 20 5a 65 72 6f 20 74 68 65 20 6e 65 77 6c 79 20   Zero the newly 
1e000 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f 74 73 20  allocated slots 
1e010 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 72  */.  memset(&pSr
1e020 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c  c->a[iStart], 0,
1e030 20 73 69 7a 65 6f 66 28 70 53 72 63 2d 3e 61 5b   sizeof(pSrc->a[
1e040 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a 20 20 66  0])*nExtra);.  f
1e050 6f 72 28 69 3d 69 53 74 61 72 74 3b 20 69 3c 69  or(i=iStart; i<i
1e060 53 74 61 72 74 2b 6e 45 78 74 72 61 3b 20 69 2b  Start+nExtra; i+
1e070 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d 3e 61 5b  +){.    pSrc->a[
1e080 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b  i].iCursor = -1;
1e090 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 74 75 72  .  }..  /* Retur
1e0a0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1e0b0 68 65 20 65 6e 6c 61 72 67 65 64 20 53 72 63 4c  he enlarged SrcL
1e0c0 69 73 74 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ist */.  return 
1e0d0 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pSrc;.}.../*.** 
1e0e0 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 61 62  Append a new tab
1e0f0 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 65 20 67  le name to the g
1e100 69 76 65 6e 20 53 72 63 4c 69 73 74 2e 20 20 43  iven SrcList.  C
1e110 72 65 61 74 65 20 61 20 6e 65 77 20 53 72 63 4c  reate a new SrcL
1e120 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65 64 20 62  ist if.** need b
1e130 65 2e 20 20 41 20 6e 65 77 20 65 6e 74 72 79 20  e.  A new entry 
1e140 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  is created in th
1e150 65 20 53 72 63 4c 69 73 74 20 65 76 65 6e 20 69  e SrcList even i
1e160 66 20 70 54 61 62 6c 65 20 69 73 20 4e 55 4c 4c  f pTable is NULL
1e170 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63 4c 69 73  ..**.** A SrcLis
1e180 74 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f  t is returned, o
1e190 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 72 65 20  r NULL if there 
1e1a0 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e  is an OOM error.
1e1b0 20 20 54 68 65 20 72 65 74 75 72 6e 65 64 0a 2a    The returned.*
1e1c0 2a 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  * SrcList might 
1e1d0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
1e1e0 68 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20  he SrcList that 
1e1f0 77 61 73 20 69 6e 70 75 74 20 6f 72 20 69 74 20  was input or it 
1e200 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 6e 65  might be.** a ne
1e210 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e 20 4f 4f  w one.  If an OO
1e220 4d 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  M error does occ
1e230 75 72 73 2c 20 74 68 65 6e 20 74 68 65 20 70 72  urs, then the pr
1e240 69 6f 72 20 76 61 6c 75 65 20 6f 66 20 70 4c 69  ior value of pLi
1e250 73 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 69 6e  st.** that is in
1e260 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74  put to this rout
1e270 69 6e 65 20 69 73 20 61 75 74 6f 6d 61 74 69 63  ine is automatic
1e280 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a  ally freed..**.*
1e290 2a 20 49 66 20 70 44 61 74 61 62 61 73 65 20 69  * If pDatabase i
1e2a0 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69 74 20 6d  s not null, it m
1e2b0 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 74 61  eans that the ta
1e2c0 62 6c 65 20 68 61 73 20 61 6e 20 6f 70 74 69 6f  ble has an optio
1e2d0 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  nal.** database 
1e2e0 6e 61 6d 65 20 70 72 65 66 69 78 2e 20 20 4c 69  name prefix.  Li
1e2f0 6b 65 20 74 68 69 73 3a 20 20 22 64 61 74 61 62  ke this:  "datab
1e300 61 73 65 2e 74 61 62 6c 65 22 2e 20 20 54 68 65  ase.table".  The
1e310 20 70 44 61 74 61 62 61 73 65 0a 2a 2a 20 70 6f   pDatabase.** po
1e320 69 6e 74 73 20 74 6f 20 74 68 65 20 74 61 62 6c  ints to the tabl
1e330 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 70  e name and the p
1e340 54 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20  Table points to 
1e350 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
1e360 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63 4c 69 73  e..** The SrcLis
1e370 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66 69 65 6c  t.a[].zName fiel
1e380 64 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68  d is filled with
1e390 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20   the table name 
1e3a0 77 68 69 63 68 20 6d 69 67 68 74 0a 2a 2a 20 63  which might.** c
1e3b0 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c 65 20  ome from pTable 
1e3c0 28 69 66 20 70 44 61 74 61 62 61 73 65 20 69 73  (if pDatabase is
1e3d0 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f 6d 20 70   NULL) or from p
1e3e0 44 61 74 61 62 61 73 65 2e 20 20 0a 2a 2a 20 53  Database.  .** S
1e3f0 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44 61 74 61  rcList.a[].zData
1e400 62 61 73 65 20 69 73 20 66 69 6c 6c 65 64 20 77  base is filled w
1e410 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
1e420 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54 61 62 6c   name from pTabl
1e430 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68 20 4e 55  e,.** or with NU
1e440 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61 62 61 73  LL if no databas
1e450 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  e is specified..
1e460 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
1e470 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c 20 6c 69  ords, if call li
1e480 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
1e490 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1e4a0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1e4b0 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  B,0);.**.** Then
1e4c0 20 42 20 69 73 20 61 20 74 61 62 6c 65 20 6e 61   B is a table na
1e4d0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  me and the datab
1e4e0 61 73 65 20 6e 61 6d 65 20 69 73 20 75 6e 73 70  ase name is unsp
1e4f0 65 63 69 66 69 65 64 2e 20 20 49 66 20 63 61 6c  ecified.  If cal
1e500 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74 68 69 73  led.** like this
1e510 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
1e520 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 70  sqlite3SrcListAp
1e530 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29 3b 0a 2a  pend(D,A,B,C);.*
1e540 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69 73 20 74  *.** Then C is t
1e550 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  he table name an
1e560 64 20 42 20 69 73 20 74 68 65 20 64 61 74 61 62  d B is the datab
1e570 61 73 65 20 6e 61 6d 65 2e 20 20 49 66 20 43 20  ase name.  If C 
1e580 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a 20 74 68  is defined.** th
1e590 65 6e 20 73 6f 20 69 73 20 42 2e 20 20 49 6e 20  en so is B.  In 
1e5a0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 65 20  other words, we 
1e5b0 6e 65 76 65 72 20 68 61 76 65 20 61 20 63 61 73  never have a cas
1e5c0 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  e where:.**.**  
1e5d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1e5e0 63 4c 69 73 74 41 70 70 65 6e 64 28 44 2c 41 2c  cListAppend(D,A,
1e5f0 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42 6f 74 68  0,C);.**.** Both
1e600 20 70 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74   pTable and pDat
1e610 61 62 61 73 65 20 61 72 65 20 61 73 73 75 6d 65  abase are assume
1e620 64 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2e 20  d to be quoted. 
1e630 20 54 68 65 79 20 61 72 65 20 64 65 71 75 6f 74   They are dequot
1e640 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20 62 65 69  ed.** before bei
1e650 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ng added to the 
1e660 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53 72 63 4c  SrcList..*/.SrcL
1e670 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
1e680 69 73 74 41 70 70 65 6e 64 28 0a 20 20 73 71 6c  istAppend(.  sql
1e690 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1e6a0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74   /* Connection t
1e6b0 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c  o notify of mall
1e6c0 6f 63 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20  oc failures */. 
1e6d0 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c   SrcList *pList,
1e6e0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74       /* Append t
1e6f0 6f 20 74 68 69 73 20 53 72 63 4c 69 73 74 2e 20  o this SrcList. 
1e700 4e 55 4c 4c 20 63 72 65 61 74 65 73 20 61 20 6e  NULL creates a n
1e710 65 77 20 53 72 63 4c 69 73 74 20 2a 2f 0a 20 20  ew SrcList */.  
1e720 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20  Token *pTable,  
1e730 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20      /* Table to 
1e740 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54 6f 6b 65  append */.  Toke
1e750 6e 20 2a 70 44 61 74 61 62 61 73 65 20 20 20 20  n *pDatabase    
1e760 2f 2a 20 44 61 74 61 62 61 73 65 20 6f 66 20 74  /* Database of t
1e770 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  he table */.){. 
1e780 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
1e790 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 61  item *pItem;.  a
1e7a0 73 73 65 72 74 28 20 70 44 61 74 61 62 61 73 65  ssert( pDatabase
1e7b0 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65 21 3d 30  ==0 || pTable!=0
1e7c0 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68   );  /* Cannot h
1e7d0 61 76 65 20 43 20 77 69 74 68 6f 75 74 20 42 20  ave C without B 
1e7e0 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  */.  if( pList==
1e7f0 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d  0 ){.    pList =
1e800 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
1e810 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
1e820 53 72 63 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  SrcList) );.    
1e830 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
1e840 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 4c 69  eturn 0;.    pLi
1e850 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a  st->nAlloc = 1;.
1e860 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 73 71    }.  pList = sq
1e870 6c 69 74 65 33 53 72 63 4c 69 73 74 45 6e 6c 61  lite3SrcListEnla
1e880 72 67 65 28 64 62 2c 20 70 4c 69 73 74 2c 20 31  rge(db, pList, 1
1e890 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63 29 3b 0a  , pList->nSrc);.
1e8a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
1e8b0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
1e8c0 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1e8d0 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20  te(db, pList);. 
1e8e0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1e8f0 0a 20 20 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  .  pItem = &pLis
1e900 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 53 72 63  t->a[pList->nSrc
1e910 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44 61 74 61  -1];.  if( pData
1e920 62 61 73 65 20 26 26 20 70 44 61 74 61 62 61 73  base && pDatabas
1e930 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 70  e->z==0 ){.    p
1e940 44 61 74 61 62 61 73 65 20 3d 20 30 3b 0a 20 20  Database = 0;.  
1e950 7d 0a 20 20 69 66 28 20 70 44 61 74 61 62 61 73  }.  if( pDatabas
1e960 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65 6e 20 2a  e ){.    Token *
1e970 70 54 65 6d 70 20 3d 20 70 44 61 74 61 62 61 73  pTemp = pDatabas
1e980 65 3b 0a 20 20 20 20 70 44 61 74 61 62 61 73 65  e;.    pDatabase
1e990 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20 20 20 70   = pTable;.    p
1e9a0 54 61 62 6c 65 20 3d 20 70 54 65 6d 70 3b 0a 20  Table = pTemp;. 
1e9b0 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d   }.  pItem->zNam
1e9c0 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  e = sqlite3NameF
1e9d0 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 54 61  romToken(db, pTa
1e9e0 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d 2d 3e 7a  ble);.  pItem->z
1e9f0 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
1ea00 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
1ea10 64 62 2c 20 70 44 61 74 61 62 61 73 65 29 3b 0a  db, pDatabase);.
1ea20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
1ea30 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20  }../*.** Assign 
1ea40 56 64 62 65 43 75 72 73 6f 72 20 69 6e 64 65 78  VdbeCursor index
1ea50 20 6e 75 6d 62 65 72 73 20 74 6f 20 61 6c 6c 20   numbers to all 
1ea60 74 61 62 6c 65 73 20 69 6e 20 61 20 53 72 63 4c  tables in a SrcL
1ea70 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ist.*/.void sqli
1ea80 74 65 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e  te3SrcListAssign
1ea90 43 75 72 73 6f 72 73 28 50 61 72 73 65 20 2a 70  Cursors(Parse *p
1eaa0 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a  Parse, SrcList *
1eab0 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
1eac0 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
1ead0 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
1eae0 20 61 73 73 65 72 74 28 70 4c 69 73 74 20 7c 7c   assert(pList ||
1eaf0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1eb00 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
1eb10 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
1eb20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
1eb30 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74  List->a; i<pList
1eb40 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74  ->nSrc; i++, pIt
1eb50 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  em++){.      if(
1eb60 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3e   pItem->iCursor>
1eb70 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1eb80 20 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72    pItem->iCursor
1eb90 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
1eba0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  +;.      if( pIt
1ebb0 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  em->pSelect ){. 
1ebc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 72         sqlite3Sr
1ebd0 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73 6f  cListAssignCurso
1ebe0 72 73 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  rs(pParse, pItem
1ebf0 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 29  ->pSelect->pSrc)
1ec00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ec10 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
1ec20 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 53 72  ete an entire Sr
1ec30 63 4c 69 73 74 20 69 6e 63 6c 75 64 69 6e 67 20  cList including 
1ec40 61 6c 6c 20 69 74 73 20 73 75 62 73 74 72 75 63  all its substruc
1ec50 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ture..*/.void sq
1ec60 6c 69 74 65 33 53 72 63 4c 69 73 74 44 65 6c 65  lite3SrcListDele
1ec70 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  te(sqlite3 *db, 
1ec80 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  SrcList *pList){
1ec90 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1eca0 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
1ecb0 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c  *pItem;.  if( pL
1ecc0 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ist==0 ) return;
1ecd0 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
1ece0 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
1ecf0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1ed00 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
1ed10 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1ed20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  pItem->zDatabase
1ed30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
1ed40 46 72 65 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  Free(db, pItem->
1ed50 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1ed60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
1ed70 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
1ed80 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e    if( pItem->fg.
1ed90 69 73 49 6e 64 65 78 65 64 42 79 20 29 20 73 71  isIndexedBy ) sq
1eda0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1edb0 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78  pItem->u1.zIndex
1edc0 65 64 42 79 29 3b 0a 20 20 20 20 69 66 28 20 70  edBy);.    if( p
1edd0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1ede0 6e 63 20 29 20 73 71 6c 69 74 65 33 45 78 70 72  nc ) sqlite3Expr
1edf0 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1ee00 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72  Item->u1.pFuncAr
1ee10 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
1ee20 65 6c 65 74 65 54 61 62 6c 65 28 64 62 2c 20 70  eleteTable(db, p
1ee30 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20 20  Item->pTab);.   
1ee40 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65   sqlite3SelectDe
1ee50 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
1ee60 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71  pSelect);.    sq
1ee70 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1ee80 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f 6e 29 3b  db, pItem->pOn);
1ee90 0a 20 20 20 20 73 71 6c 69 74 65 33 49 64 4c 69  .    sqlite3IdLi
1eea0 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74  stDelete(db, pIt
1eeb0 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
1eec0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
1eed0 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a 7d 0a 0a  (db, pList);.}..
1eee0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1eef0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  ne is called by 
1ef00 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 61 64  the parser to ad
1ef10 64 20 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20  d a new term to 
1ef20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 61 20  the.** end of a 
1ef30 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20 63 6c 61  growing FROM cla
1ef40 75 73 65 2e 20 20 54 68 65 20 22 70 22 20 70 61  use.  The "p" pa
1ef50 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 70  rameter is the p
1ef60 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 46 52  art of.** the FR
1ef70 4f 4d 20 63 6c 61 75 73 65 20 74 68 61 74 20 68  OM clause that h
1ef80 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1ef90 63 6f 6e 73 74 72 75 63 74 65 64 2e 20 20 22 70  constructed.  "p
1efa0 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  " is NULL.** if 
1efb0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1efc0 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  t term of the FR
1efd0 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70 54 61 62  OM clause.  pTab
1efe0 6c 65 20 61 6e 64 20 70 44 61 74 61 62 61 73 65  le and pDatabase
1eff0 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e 61 6d 65  .** are the name
1f000 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61 6e   of the table an
1f010 64 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  d database named
1f020 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1f030 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20 70 44 61  use term..** pDa
1f040 74 61 62 61 73 65 20 69 73 20 4e 55 4c 4c 20 69  tabase is NULL i
1f050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e  f the database n
1f060 61 6d 65 20 71 75 61 6c 69 66 69 65 72 20 69 73  ame qualifier is
1f070 20 6d 69 73 73 69 6e 67 20 2d 20 74 68 65 0a 2a   missing - the.*
1f080 2a 20 75 73 75 61 6c 20 63 61 73 65 2e 20 20 49  * usual case.  I
1f090 66 20 74 68 65 20 74 65 72 6d 20 68 61 73 20 61  f the term has a
1f0a0 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e 20 70 41  n alias, then pA
1f0b0 6c 69 61 73 20 70 6f 69 6e 74 73 20 74 6f 20 74  lias points to t
1f0c0 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74 6f 6b 65  he.** alias toke
1f0d0 6e 2e 20 20 49 66 20 74 68 65 20 74 65 72 6d 20  n.  If the term 
1f0e0 69 73 20 61 20 73 75 62 71 75 65 72 79 2c 20 74  is a subquery, t
1f0f0 68 65 6e 20 70 53 75 62 71 75 65 72 79 20 69 73  hen pSubquery is
1f100 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43 54 20 73   the.** SELECT s
1f110 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 74 68  tatement that th
1f120 65 20 73 75 62 71 75 65 72 79 20 65 6e 63 6f 64  e subquery encod
1f130 65 73 2e 20 20 54 68 65 20 70 54 61 62 6c 65 20  es.  The pTable 
1f140 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62 61 73 65  and.** pDatabase
1f150 20 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20   parameters are 
1f160 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71 75 65 72  NULL for subquer
1f170 69 65 73 2e 20 20 54 68 65 20 70 4f 6e 20 61 6e  ies.  The pOn an
1f180 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70 61 72 61  d pUsing.** para
1f190 6d 65 74 65 72 73 20 61 72 65 20 74 68 65 20 63  meters are the c
1f1a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 4f 4e  ontent of the ON
1f1b0 20 61 6e 64 20 55 53 49 4e 47 20 63 6c 61 75 73   and USING claus
1f1c0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1f1d0 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 77   a new SrcList w
1f1e0 68 69 63 68 20 65 6e 63 6f 64 65 73 20 69 73 20  hich encodes is 
1f1f0 74 68 65 20 46 52 4f 4d 20 77 69 74 68 20 74 68  the FROM with th
1f200 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d 20 61 64  e new.** term ad
1f210 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69 73 74 20  ded..*/.SrcList 
1f220 2a 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41  *sqlite3SrcListA
1f230 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d 28 0a 20  ppendFromTerm(. 
1f240 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f250 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
1f260 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1f270 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 20 20 20   SrcList *p,    
1f280 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f290 6c 65 66 74 20 70 61 72 74 20 6f 66 20 74 68 65  left part of the
1f2a0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 61 6c 72   FROM clause alr
1f2b0 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a 20 20 54  eady seen */.  T
1f2c0 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c 20 20 20  oken *pTable,   
1f2d0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1f2e0 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 61  f the table to a
1f2f0 64 64 20 74 6f 20 74 68 65 20 46 52 4f 4d 20 63  dd to the FROM c
1f300 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e  lause */.  Token
1f310 20 2a 70 44 61 74 61 62 61 73 65 2c 20 20 20 20   *pDatabase,    
1f320 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1f330 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  e database conta
1f340 69 6e 69 6e 67 20 70 54 61 62 6c 65 20 2a 2f 0a  ining pTable */.
1f350 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69 61 73 2c    Token *pAlias,
1f360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f370 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
1f380 20 6f 66 20 74 68 65 20 41 53 20 73 75 62 65 78   of the AS subex
1f390 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 53 65  pression */.  Se
1f3a0 6c 65 63 74 20 2a 70 53 75 62 71 75 65 72 79 2c  lect *pSubquery,
1f3b0 20 20 20 20 20 20 2f 2a 20 41 20 73 75 62 71 75        /* A subqu
1f3c0 65 72 79 20 75 73 65 64 20 69 6e 20 70 6c 61 63  ery used in plac
1f3d0 65 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d  e of a table nam
1f3e0 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4f 6e  e */.  Expr *pOn
1f3f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1f400 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75 73 65 20  * The ON clause 
1f410 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a 20 20 49  of a join */.  I
1f420 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 20 20 20  dList *pUsing   
1f430 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 55 53         /* The US
1f440 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ING clause of a 
1f450 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  join */.){.  str
1f460 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1f470 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71 6c 69 74   *pItem;.  sqlit
1f480 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1f490 3e 64 62 3b 0a 20 20 69 66 28 20 21 70 20 26 26  >db;.  if( !p &&
1f4a0 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69 6e 67 29   (pOn || pUsing)
1f4b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1f4c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1f4d0 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73 65 20 69  "a JOIN clause i
1f4e0 73 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  s required befor
1f4f0 65 20 25 73 22 2c 20 0a 20 20 20 20 20 20 28 70  e %s", .      (p
1f500 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22 55 53 49  On ? "ON" : "USI
1f510 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  NG").    );.    
1f520 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66 72 6f 6d  goto append_from
1f530 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 20  _error;.  }.  p 
1f540 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  = sqlite3SrcList
1f550 41 70 70 65 6e 64 28 64 62 2c 20 70 2c 20 70 54  Append(db, p, pT
1f560 61 62 6c 65 2c 20 70 44 61 74 61 62 61 73 65 29  able, pDatabase)
1f570 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c 7c 20  ;.  if( p==0 || 
1f580 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63 3d 3d 30  NEVER(p->nSrc==0
1f590 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 61 70  ) ){.    goto ap
1f5a0 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72 3b  pend_from_error;
1f5b0 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26  .  }.  pItem = &
1f5c0 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1f5d0 0a 20 20 61 73 73 65 72 74 28 20 70 41 6c 69 61  .  assert( pAlia
1f5e0 73 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 41  s!=0 );.  if( pA
1f5f0 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20 20 20 70  lias->n ){.    p
1f600 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73  Item->zAlias = s
1f610 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
1f620 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61 73 29 3b  ken(db, pAlias);
1f630 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 70 53  .  }.  pItem->pS
1f640 65 6c 65 63 74 20 3d 20 70 53 75 62 71 75 65 72  elect = pSubquer
1f650 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70 4f 6e 20  y;.  pItem->pOn 
1f660 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65 6d 2d 3e  = pOn;.  pItem->
1f670 70 55 73 69 6e 67 20 3d 20 70 55 73 69 6e 67 3b  pUsing = pUsing;
1f680 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 0a 20 61  .  return p;.. a
1f690 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72 6f 72  ppend_from_error
1f6a0 3a 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  :.  assert( p==0
1f6b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   );.  sqlite3Exp
1f6c0 72 44 65 6c 65 74 65 28 64 62 2c 20 70 4f 6e 29  rDelete(db, pOn)
1f6d0 3b 0a 20 20 73 71 6c 69 74 65 33 49 64 4c 69 73  ;.  sqlite3IdLis
1f6e0 74 44 65 6c 65 74 65 28 64 62 2c 20 70 55 73 69  tDelete(db, pUsi
1f6f0 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  ng);.  sqlite3Se
1f700 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70  lectDelete(db, p
1f710 53 75 62 71 75 65 72 79 29 3b 0a 20 20 72 65 74  Subquery);.  ret
1f720 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1f730 41 64 64 20 61 6e 20 49 4e 44 45 58 45 44 20 42  Add an INDEXED B
1f740 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44  Y or NOT INDEXED
1f750 20 63 6c 61 75 73 65 20 74 6f 20 74 68 65 20 6d   clause to the m
1f760 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
1f770 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e 74 20 6f  ed .** element o
1f780 66 20 74 68 65 20 73 6f 75 72 63 65 2d 6c 69 73  f the source-lis
1f790 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1f7a0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
1f7b0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1f7c0 53 72 63 4c 69 73 74 49 6e 64 65 78 65 64 42 79  SrcListIndexedBy
1f7d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1f7e0 53 72 63 4c 69 73 74 20 2a 70 2c 20 54 6f 6b 65  SrcList *p, Toke
1f7f0 6e 20 2a 70 49 6e 64 65 78 65 64 42 79 29 7b 0a  n *pIndexedBy){.
1f800 20 20 61 73 73 65 72 74 28 20 70 49 6e 64 65 78    assert( pIndex
1f810 65 64 42 79 21 3d 30 20 29 3b 0a 20 20 69 66 28  edBy!=0 );.  if(
1f820 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e   p && ALWAYS(p->
1f830 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20 20 20 73  nSrc>0) ){.    s
1f840 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1f850 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
1f860 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b 0a 20 20  a[p->nSrc-1];.  
1f870 20 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d    assert( pItem-
1f880 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d  >fg.notIndexed==
1f890 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1f8a0 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 49 6e 64   pItem->fg.isInd
1f8b0 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a 20 20 20  exedBy==0 );.   
1f8c0 20 61 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e   assert( pItem->
1f8d0 66 67 2e 69 73 54 61 62 46 75 6e 63 3d 3d 30 20  fg.isTabFunc==0 
1f8e0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65  );.    if( pInde
1f8f0 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26 26 20 21  xedBy->n==1 && !
1f900 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a 20 29 7b  pIndexedBy->z ){
1f910 0a 20 20 20 20 20 20 2f 2a 20 41 20 22 4e 4f 54  .      /* A "NOT
1f920 20 49 4e 44 45 58 45 44 22 20 63 6c 61 75 73 65   INDEXED" clause
1f930 20 77 61 73 20 73 75 70 70 6c 69 65 64 2e 20 53   was supplied. S
1f940 65 65 20 70 61 72 73 65 2e 79 20 0a 20 20 20 20  ee parse.y .    
1f950 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 20 22    ** construct "
1f960 69 6e 64 65 78 65 64 5f 6f 70 74 22 20 66 6f 72  indexed_opt" for
1f970 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20   details. */.   
1f980 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74     pItem->fg.not
1f990 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a 20 20 20  Indexed = 1;.   
1f9a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1f9b0 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65 78 65 64  tem->u1.zIndexed
1f9c0 42 79 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  By = sqlite3Name
1f9d0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
1f9e0 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65 64 42 79  ->db, pIndexedBy
1f9f0 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  );.      pItem->
1fa00 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 3d  fg.isIndexedBy =
1fa10 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64   (pItem->u1.zInd
1fa20 65 78 65 64 42 79 21 3d 30 29 3b 0a 20 20 20 20  exedBy!=0);.    
1fa30 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
1fa40 64 64 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66  dd the list of f
1fa50 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
1fa60 73 20 74 6f 20 74 68 65 20 53 72 63 4c 69 73 74  s to the SrcList
1fa70 20 65 6e 74 72 79 20 66 6f 72 20 61 0a 2a 2a 20   entry for a.** 
1fa80 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
1fa90 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1faa0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 46 75 6e  qlite3SrcListFun
1fab0 63 41 72 67 73 28 50 61 72 73 65 20 2a 70 50 61  cArgs(Parse *pPa
1fac0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c  rse, SrcList *p,
1fad0 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
1fae0 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ){.  if( p ){.  
1faf0 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1fb00 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1fb10 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1fb20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1fb30 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
1fb40 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
1fb50 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
1fb60 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
1fb70 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1fb80 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
1fb90 3d 30 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  =0 );.    pItem-
1fba0 3e 75 31 2e 70 46 75 6e 63 41 72 67 20 3d 20 70  >u1.pFuncArg = p
1fbb0 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 6d 2d  List;.    pItem-
1fbc0 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 20 3d 20  >fg.isTabFunc = 
1fbd0 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1fbe0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1fbf0 65 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62  elete(pParse->db
1fc00 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d 0a 7d 0a  , pList);.  }.}.
1fc10 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62 75 69 6c  ./*.** When buil
1fc20 64 69 6e 67 20 75 70 20 61 20 46 52 4f 4d 20 63  ding up a FROM c
1fc30 6c 61 75 73 65 20 69 6e 20 74 68 65 20 70 61 72  lause in the par
1fc40 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e 20 6f 70  ser, the join op
1fc50 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 69  erator.** is ini
1fc60 74 69 61 6c 6c 79 20 61 74 74 61 63 68 65 64 20  tially attached 
1fc70 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  to the left oper
1fc80 61 6e 64 2e 20 20 42 75 74 20 74 68 65 20 63 6f  and.  But the co
1fc90 64 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20  de generator.** 
1fca0 65 78 70 65 63 74 73 20 74 68 65 20 6a 6f 69 6e  expects the join
1fcb0 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
1fcc0 6f 6e 20 74 68 65 20 72 69 67 68 74 20 6f 70 65  on the right ope
1fcd0 72 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74  rand.  This rout
1fce0 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73 20 61 6c  ine.** Shifts al
1fcf0 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74 6f 72 73  l join operators
1fd00 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 69   from left to ri
1fd10 67 68 74 20 66 6f 72 20 61 6e 20 65 6e 74 69 72  ght for an entir
1fd20 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61 75 73 65  e FROM.** clause
1fd30 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70 6c 65 3a  ..**.** Example:
1fd40 20 53 75 70 70 6f 73 65 20 74 68 65 20 6a 6f 69   Suppose the joi
1fd50 6e 20 69 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a  n is like this:.
1fd60 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1fd70 41 20 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20  A natural cross 
1fd80 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20 54 68 65  join B.**.** The
1fd90 20 6f 70 65 72 61 74 6f 72 20 69 73 20 22 6e 61   operator is "na
1fda0 74 75 72 61 6c 20 63 72 6f 73 73 20 6a 6f 69 6e  tural cross join
1fdb0 22 2e 20 20 54 68 65 20 41 20 61 6e 64 20 42 20  ".  The A and B 
1fdc0 6f 70 65 72 61 6e 64 73 20 61 72 65 20 73 74 6f  operands are sto
1fdd0 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e 61 5b 30  red.** in p->a[0
1fde0 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d 2c 20 72  ] and p->a[1], r
1fdf0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 20 54 68  espectively.  Th
1fe00 65 20 70 61 72 73 65 72 20 69 6e 69 74 69 61 6c  e parser initial
1fe10 6c 79 20 73 74 6f 72 65 73 20 74 68 65 0a 2a 2a  ly stores the.**
1fe20 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 41   operator with A
1fe30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
1fe40 73 68 69 66 74 73 20 74 68 61 74 20 6f 70 65 72  shifts that oper
1fe50 61 74 6f 72 20 6f 76 65 72 20 74 6f 20 42 2e 0a  ator over to B..
1fe60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
1fe70 72 63 4c 69 73 74 53 68 69 66 74 4a 6f 69 6e 54  rcListShiftJoinT
1fe80 79 70 65 28 53 72 63 4c 69 73 74 20 2a 70 29 7b  ype(SrcList *p){
1fe90 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
1fea0 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
1feb0 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 30 3b  =p->nSrc-1; i>0;
1fec0 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e   i--){.      p->
1fed0 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74 79 70 65  a[i].fg.jointype
1fee0 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e 66 67 2e   = p->a[i-1].fg.
1fef0 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 7d 0a  jointype;.    }.
1ff00 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66 67 2e 6a      p->a[0].fg.j
1ff10 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a 20 20 7d  ointype = 0;.  }
1ff20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20  .}../*.** Begin 
1ff30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
1ff40 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67  .void sqlite3Beg
1ff50 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  inTransaction(Pa
1ff60 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
1ff70 20 74 79 70 65 29 7b 0a 20 20 73 71 6c 69 74 65   type){.  sqlite
1ff80 33 20 2a 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  3 *db;.  Vdbe *v
1ff90 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 61 73  ;.  int i;..  as
1ffa0 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30 20  sert( pParse!=0 
1ffb0 29 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  );.  db = pParse
1ffc0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1ffd0 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20 69 66 28  db!=0 );./*  if(
1ffe0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3d   db->aDb[0].pBt=
1fff0 3d 30 20 29 20 72 65 74 75 72 6e 3b 20 2a 2f 0a  =0 ) return; */.
20000 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74    if( sqlite3Aut
20010 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53  hCheck(pParse, S
20020 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f  QLITE_TRANSACTIO
20030 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30  N, "BEGIN", 0, 0
20040 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
20050 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
20060 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20070 29 3b 0a 20 20 69 66 28 20 21 76 20 29 20 72 65  );.  if( !v ) re
20080 74 75 72 6e 3b 0a 20 20 69 66 28 20 74 79 70 65  turn;.  if( type
20090 21 3d 54 4b 5f 44 45 46 45 52 52 45 44 20 29 7b  !=TK_DEFERRED ){
200a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
200b0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
200c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
200d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 54 72 61  AddOp2(v, OP_Tra
200e0 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20 28 74 79  nsaction, i, (ty
200f0 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53 49 56 45  pe==TK_EXCLUSIVE
20100 29 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  )+1);.      sqli
20110 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
20120 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  (v, i);.    }.  
20130 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  }.  sqlite3VdbeA
20140 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
20150 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29 3b 0a 7d  Commit, 0, 0);.}
20160 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
20170 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f 0a   transaction.*/.
20180 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6f 6d 6d  void sqlite3Comm
20190 69 74 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  itTransaction(Pa
201a0 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
201b0 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61 73 73 65  Vdbe *v;..  asse
201c0 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
201d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
201e0 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 69 66  e->db!=0 );.  if
201f0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
20200 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
20210 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e 2c 20 22  E_TRANSACTION, "
20220 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 29 20 29  COMMIT", 0, 0) )
20230 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  {.    return;.  
20240 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  }.  v = sqlite3G
20250 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
20260 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 73    if( v ){.    s
20270 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
20280 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69  (v, OP_AutoCommi
20290 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a  t, 1, 0);.  }.}.
202a0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
202b0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2f  a transaction.*/
202c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
202d0 6c 62 61 63 6b 54 72 61 6e 73 61 63 74 69 6f 6e  lbackTransaction
202e0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
202f0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
20300 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
20310 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20320 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
20330 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20340 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20350 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20360 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 30 2c  , "ROLLBACK", 0,
20370 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72   0) ){.    retur
20380 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c  n;.  }.  v = sql
20390 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
203a0 73 65 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  se);.  if( v ){.
203b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
203c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f  ddOp2(v, OP_Auto
203d0 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29 3b 0a 20  Commit, 1, 1);. 
203e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
203f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
20400 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
20410 72 20 77 68 65 6e 20 69 74 20 70 61 72 73 65 73  r when it parses
20420 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 63 72   a command to cr
20430 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65 61 73 65  eate,.** release
20440 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 20   or rollback an 
20450 53 51 4c 20 73 61 76 65 70 6f 69 6e 74 2e 20 0a  SQL savepoint. .
20460 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53  */.void sqlite3S
20470 61 76 65 70 6f 69 6e 74 28 50 61 72 73 65 20 2a  avepoint(Parse *
20480 70 50 61 72 73 65 2c 20 69 6e 74 20 6f 70 2c 20  pParse, int op, 
20490 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
204a0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 73   char *zName = s
204b0 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
204c0 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ken(pParse->db, 
204d0 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e  pName);.  if( zN
204e0 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 20  ame ){.    Vdbe 
204f0 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
20500 64 62 65 28 70 50 61 72 73 65 29 3b 0a 23 69 66  dbe(pParse);.#if
20510 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20520 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20  _AUTHORIZATION. 
20530 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
20540 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 61 7a 5b  char * const az[
20550 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22 2c 20 22  ] = { "BEGIN", "
20560 52 45 4c 45 41 53 45 22 2c 20 22 52 4f 4c 4c 42  RELEASE", "ROLLB
20570 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61 73 73 65  ACK" };.    asse
20580 72 74 28 20 21 53 41 56 45 50 4f 49 4e 54 5f 42  rt( !SAVEPOINT_B
20590 45 47 49 4e 20 26 26 20 53 41 56 45 50 4f 49 4e  EGIN && SAVEPOIN
205a0 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20 26 26 20  T_RELEASE==1 && 
205b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
205c0 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  CK==2 );.#endif.
205d0 20 20 20 20 69 66 28 20 21 76 20 7c 7c 20 73 71      if( !v || sq
205e0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
205f0 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 53 41  Parse, SQLITE_SA
20600 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f 70 5d 2c  VEPOINT, az[op],
20610 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b 0a 20 20   zName, 0) ){.  
20620 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
20630 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 4e  e(pParse->db, zN
20640 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
20650 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  rn;.    }.    sq
20660 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
20670 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 2c  v, OP_Savepoint,
20680 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e 61 6d 65   op, 0, 0, zName
20690 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
206a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
206b0 20 73 75 72 65 20 74 68 65 20 54 45 4d 50 20 64   sure the TEMP d
206c0 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 20  atabase is open 
206d0 61 6e 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  and available fo
206e0 72 20 75 73 65 2e 20 20 52 65 74 75 72 6e 0a 2a  r use.  Return.*
206f0 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
20700 65 72 72 6f 72 73 2e 20 20 4c 65 61 76 65 20 61  errors.  Leave a
20710 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ny error message
20720 73 20 69 6e 20 74 68 65 20 70 50 61 72 73 65 20  s in the pParse 
20730 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 69 6e  structure..*/.in
20740 74 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d  t sqlite3OpenTem
20750 70 44 61 74 61 62 61 73 65 28 50 61 72 73 65 20  pDatabase(Parse 
20760 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69  *pParse){.  sqli
20770 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
20780 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e  ->db;.  if( db->
20790 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30 20 26 26  aDb[1].pBt==0 &&
207a0 20 21 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69   !pParse->explai
207b0 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  n ){.    int rc;
207c0 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 3b  .    Btree *pBt;
207d0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
207e0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 0a 20  t int flags = . 
207f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
20800 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
20810 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
20820 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
20830 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
20840 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
20850 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
20860 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
20870 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
20880 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
20890 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72 63 20 3d  MP_DB;..    rc =
208a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
208b0 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30 2c 20 64  n(db->pVfs, 0, d
208c0 62 2c 20 26 70 42 74 2c 20 30 2c 20 66 6c 61 67  b, &pBt, 0, flag
208d0 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
208e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
208f0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
20900 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 61 62  sg(pParse, "unab
20910 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d  le to open a tem
20920 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
20930 22 0a 20 20 20 20 20 20 20 20 22 66 69 6c 65 20  ".        "file 
20940 66 6f 72 20 73 74 6f 72 69 6e 67 20 74 65 6d 70  for storing temp
20950 6f 72 61 72 79 20 74 61 62 6c 65 73 22 29 3b 0a  orary tables");.
20960 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63        pParse->rc
20970 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
20980 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
20990 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 20   db->aDb[1].pBt 
209a0 3d 20 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  = pBt;.    asser
209b0 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  t( db->aDb[1].pS
209c0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 69 66 28  chema );.    if(
209d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3d 3d 73   SQLITE_NOMEM==s
209e0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61  qlite3BtreeSetPa
209f0 67 65 53 69 7a 65 28 70 42 74 2c 20 64 62 2d 3e  geSize(pBt, db->
20a00 6e 65 78 74 50 61 67 65 73 69 7a 65 2c 20 2d 31  nextPagesize, -1
20a10 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 64 62  , 0) ){.      db
20a20 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
20a30 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
20a40 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
20a50 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
20a60 2a 2a 20 52 65 63 6f 72 64 20 74 68 65 20 66 61  ** Record the fa
20a70 63 74 20 74 68 61 74 20 74 68 65 20 73 63 68 65  ct that the sche
20a80 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c 6c 20 6e  ma cookie will n
20a90 65 65 64 20 74 6f 20 62 65 20 76 65 72 69 66 69  eed to be verifi
20aa0 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74 61 62 61  ed.** for databa
20ab0 73 65 20 69 44 62 2e 20 20 54 68 65 20 63 6f 64  se iDb.  The cod
20ac0 65 20 74 6f 20 61 63 74 75 61 6c 6c 79 20 76 65  e to actually ve
20ad0 72 69 66 79 20 74 68 65 20 73 63 68 65 6d 61 20  rify the schema 
20ae0 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c 6c 20 6f  cookie.** will o
20af0 63 63 75 72 20 61 74 20 74 68 65 20 65 6e 64 20  ccur at the end 
20b00 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c  of the top-level
20b10 20 56 44 42 45 20 61 6e 64 20 77 69 6c 6c 20 62   VDBE and will b
20b20 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 6c  e generated.** l
20b30 61 74 65 72 2c 20 62 79 20 73 71 6c 69 74 65 33  ater, by sqlite3
20b40 46 69 6e 69 73 68 43 6f 64 69 6e 67 28 29 2e 0a  FinishCoding()..
20b50 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
20b60 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
20b70 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
20b80 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72 73 65  nt iDb){.  Parse
20b90 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71   *pToplevel = sq
20ba0 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76  lite3ParseToplev
20bb0 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71  el(pParse);.  sq
20bc0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 54 6f 70  lite3 *db = pTop
20bd0 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20 20 61 73  level->db;..  as
20be0 73 65 72 74 28 20 69 44 62 3e 3d 30 20 26 26 20  sert( iDb>=0 && 
20bf0 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20  iDb<db->nDb );. 
20c00 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 44 62   assert( db->aDb
20c10 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20 7c 7c 20  [iDb].pBt!=0 || 
20c20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  iDb==1 );.  asse
20c30 72 74 28 20 69 44 62 3c 53 51 4c 49 54 45 5f 4d  rt( iDb<SQLITE_M
20c40 41 58 5f 41 54 54 41 43 48 45 44 2b 32 20 29 3b  AX_ATTACHED+2 );
20c50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20c60 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c  e3SchemaMutexHel
20c70 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29 3b  d(db, iDb, 0) );
20c80 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 54 65 73  .  if( DbMaskTes
20c90 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
20ca0 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3d 3d 30  kieMask, iDb)==0
20cb0 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
20cc0 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f 6f  t(pToplevel->coo
20cd0 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20  kieMask, iDb);. 
20ce0 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 63 6f     pToplevel->co
20cf0 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62 5d 20 3d  okieValue[iDb] =
20d00 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
20d10 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61 5f 63 6f  chema->schema_co
20d20 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 21 4f  okie;.    if( !O
20d30 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44  MIT_TEMPDB && iD
20d40 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71  b==1 ){.      sq
20d50 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70 44 61 74  lite3OpenTempDat
20d60 61 62 61 73 65 28 70 54 6f 70 6c 65 76 65 6c 29  abase(pToplevel)
20d70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
20d80 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
20d90 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68   zDb is NULL, th
20da0 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 43  en call sqlite3C
20db0 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28  odeVerifySchema(
20dc0 29 20 66 6f 72 20 65 61 63 68 20 0a 2a 2a 20 61  ) for each .** a
20dd0 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
20de0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e 76  . Otherwise, inv
20df0 6f 6b 65 20 69 74 20 66 6f 72 20 74 68 65 20 64  oke it for the d
20e00 61 74 61 62 61 73 65 20 6e 61 6d 65 64 20 7a 44  atabase named zD
20e10 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  b only..*/.void 
20e20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
20e30 79 4e 61 6d 65 64 53 63 68 65 6d 61 28 50 61 72  yNamedSchema(Par
20e40 73 65 20 2a 70 50 61 72 73 65 2c 20 63 6f 6e 73  se *pParse, cons
20e50 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20  t char *zDb){.  
20e60 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
20e70 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 6e 74 20  arse->db;.  int 
20e80 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
20e90 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
20ea0 20 20 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62     Db *pDb = &db
20eb0 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20 20 69 66  ->aDb[i];.    if
20ec0 28 20 70 44 62 2d 3e 70 42 74 20 26 26 20 28 21  ( pDb->pBt && (!
20ed0 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c 69 74 65  zDb || 0==sqlite
20ee0 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 70 44  3StrICmp(zDb, pD
20ef0 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b 0a 20 20  b->zName)) ){.  
20f00 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
20f10 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
20f20 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  se, i);.    }.  
20f30 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
20f40 61 74 65 20 56 44 42 45 20 63 6f 64 65 20 74 68  ate VDBE code th
20f50 61 74 20 70 72 65 70 61 72 65 73 20 66 6f 72 20  at prepares for 
20f60 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  doing an operati
20f70 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69 67 68 74  on that.** might
20f80 20 63 68 61 6e 67 65 20 74 68 65 20 64 61 74 61   change the data
20f90 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  base..**.** This
20fa0 20 72 6f 75 74 69 6e 65 20 73 74 61 72 74 73 20   routine starts 
20fb0 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
20fc0 6e 20 69 66 20 77 65 20 61 72 65 20 6e 6f 74 20  n if we are not 
20fd0 61 6c 72 65 61 64 79 20 77 69 74 68 69 6e 0a 2a  already within.*
20fe0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  * a transaction.
20ff0 20 20 49 66 20 77 65 20 61 72 65 20 61 6c 72 65    If we are alre
21000 61 64 79 20 77 69 74 68 69 6e 20 61 20 74 72 61  ady within a tra
21010 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 61  nsaction, then a
21020 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 69   checkpoint.** i
21030 73 20 73 65 74 20 69 66 20 74 68 65 20 73 65 74  s set if the set
21040 53 74 61 74 65 6d 65 6e 74 20 70 61 72 61 6d 65  Statement parame
21050 74 65 72 20 69 73 20 74 72 75 65 2e 20 20 41 20  ter is true.  A 
21060 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c  checkpoint shoul
21070 64 0a 2a 2a 20 62 65 20 73 65 74 20 66 6f 72 20  d.** be set for 
21080 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61 74 20  operations that 
21090 6d 69 67 68 74 20 66 61 69 6c 20 28 64 75 65 20  might fail (due 
210a0 74 6f 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 29  to a constraint)
210b0 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20   part of.** the 
210c0 77 61 79 20 74 68 72 6f 75 67 68 20 61 6e 64 20  way through and 
210d0 77 68 69 63 68 20 77 69 6c 6c 20 6e 65 65 64 20  which will need 
210e0 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20 77 72 69  to undo some wri
210f0 74 65 73 20 77 69 74 68 6f 75 74 20 68 61 76 69  tes without havi
21100 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 62 61 63  ng to.** rollbac
21110 6b 20 74 68 65 20 77 68 6f 6c 65 20 74 72 61 6e  k the whole tran
21120 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72 20 6f 70  saction.  For op
21130 65 72 61 74 69 6f 6e 73 20 77 68 65 72 65 20 61  erations where a
21140 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  ll constraints.*
21150 2a 20 63 61 6e 20 62 65 20 63 68 65 63 6b 65 64  * can be checked
21160 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e   before any chan
21170 67 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f 20  ges are made to 
21180 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74  the database, it
21190 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20 6e 65 63   is never.** nec
211a0 65 73 73 61 72 79 20 74 6f 20 75 6e 64 6f 20 61  essary to undo a
211b0 20 77 72 69 74 65 20 61 6e 64 20 74 68 65 20 63   write and the c
211c0 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f 75 6c 64  heckpoint should
211d0 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a 2a 2f 0a   not be set..*/.
211e0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 65 67 69  void sqlite3Begi
211f0 6e 57 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28  nWriteOperation(
21200 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
21210 6e 74 20 73 65 74 53 74 61 74 65 6d 65 6e 74 2c  nt setStatement,
21220 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61 72   int iDb){.  Par
21230 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20  se *pToplevel = 
21240 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70 6c  sqlite3ParseTopl
21250 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20 20  evel(pParse);.  
21260 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
21270 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
21280 69 44 62 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  iDb);.  DbMaskSe
21290 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e 77 72 69  t(pToplevel->wri
212a0 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b 0a 20 20  teMask, iDb);.  
212b0 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c  pToplevel->isMul
212c0 74 69 57 72 69 74 65 20 7c 3d 20 73 65 74 53 74  tiWrite |= setSt
212d0 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  atement;.}../*.*
212e0 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20  * Indicate that 
212f0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 63 75  the statement cu
21300 72 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f  rrently under co
21310 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69 67 68 74  nstruction might
21320 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72 65 20 74   write.** more t
21330 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79 20 28 65  han one entry (e
21340 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74 69 6e 67  xample: deleting
21350 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e 20 69 6e   one row then in
21360 73 65 72 74 69 6e 67 20 61 6e 6f 74 68 65 72 2c  serting another,
21370 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20 6d 75  .** inserting mu
21380 6c 74 69 70 6c 65 20 72 6f 77 73 20 69 6e 20 61  ltiple rows in a
21390 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e 73 65 72   table, or inser
213a0 74 69 6e 67 20 61 20 72 6f 77 20 61 6e 64 20 69  ting a row and i
213b0 6e 64 65 78 20 65 6e 74 72 69 65 73 2e 29 0a 2a  ndex entries.).*
213c0 2a 20 49 66 20 61 6e 20 61 62 6f 72 74 20 6f 63  * If an abort oc
213d0 63 75 72 73 20 61 66 74 65 72 20 73 6f 6d 65 20  curs after some 
213e0 6f 66 20 74 68 65 73 65 20 77 72 69 74 65 73 20  of these writes 
213f0 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 64 2c 20  have completed, 
21400 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a 2a 2a 20  then it will.** 
21410 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  be necessary to 
21420 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70 6c 65 74  undo the complet
21430 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f 0a 76 6f  ed writes..*/.vo
21440 69 64 20 73 71 6c 69 74 65 33 4d 75 6c 74 69 57  id sqlite3MultiW
21450 72 69 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  rite(Parse *pPar
21460 73 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54  se){.  Parse *pT
21470 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65  oplevel = sqlite
21480 33 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70  3ParseToplevel(p
21490 50 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65  Parse);.  pTople
214a0 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74  vel->isMultiWrit
214b0 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  e = 1;.}../* .**
214c0 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   The code genera
214d0 74 6f 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  tor calls this r
214e0 6f 75 74 69 6e 65 20 69 66 20 69 73 20 64 69 73  outine if is dis
214f0 63 6f 76 65 72 73 20 74 68 61 74 20 69 74 20 69  covers that it i
21500 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f  s.** possible to
21510 20 61 62 6f 72 74 20 61 20 73 74 61 74 65 6d 65   abort a stateme
21520 6e 74 20 70 72 69 6f 72 20 74 6f 20 63 6f 6d 70  nt prior to comp
21530 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f 72 64 65  letion.  In orde
21540 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66 6f 72 6d  r to .** perform
21550 20 74 68 69 73 20 61 62 6f 72 74 20 77 69 74 68   this abort with
21560 6f 75 74 20 63 6f 72 72 75 70 74 69 6e 67 20 74  out corrupting t
21570 68 65 20 64 61 74 61 62 61 73 65 2c 20 77 65 20  he database, we 
21580 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  need to make.** 
21590 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 74  sure that the st
215a0 61 74 65 6d 65 6e 74 20 69 73 20 70 72 6f 74 65  atement is prote
215b0 63 74 65 64 20 62 79 20 61 20 73 74 61 74 65 6d  cted by a statem
215c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
215d0 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69 63 61 6c  .**.** Technical
215e0 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e 65 65 64  ly, we only need
215f0 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 79 41   to set the mayA
21600 62 6f 72 74 20 66 6c 61 67 20 69 66 20 74 68 65  bort flag if the
21610 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72 69 74 65  .** isMultiWrite
21620 20 66 6c 61 67 20 77 61 73 20 70 72 65 76 69 6f   flag was previo
21630 75 73 6c 79 20 73 65 74 2e 20 20 54 68 65 72 65  usly set.  There
21640 20 69 73 20 61 20 74 69 6d 65 20 64 65 70 65 6e   is a time depen
21650 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68 20 74 68  dency.** such th
21660 61 74 20 74 68 65 20 61 62 6f 72 74 20 6d 75 73  at the abort mus
21670 74 20 6f 63 63 75 72 20 61 66 74 65 72 20 74 68  t occur after th
21680 65 20 6d 75 6c 74 69 77 72 69 74 65 2e 20 20 54  e multiwrite.  T
21690 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20 73 6f 6d  his makes.** som
216a0 65 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 76  e statements inv
216b0 6f 6c 76 69 6e 67 20 74 68 65 20 52 45 50 4c 41  olving the REPLA
216c0 43 45 20 63 6f 6e 66 6c 69 63 74 20 72 65 73 6f  CE conflict reso
216d0 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d  lution algorithm
216e0 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74 6c 65 20  .** go a little 
216f0 66 61 73 74 65 72 2e 20 20 42 75 74 20 74 61 6b  faster.  But tak
21700 69 6e 67 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ing advantage of
21710 20 74 68 69 73 20 74 69 6d 65 20 64 65 70 65 6e   this time depen
21720 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65 73 20 69  dency.** makes i
21730 74 20 6d 6f 72 65 20 64 69 66 66 69 63 75 6c 74  t more difficult
21740 20 74 6f 20 70 72 6f 76 65 20 74 68 61 74 20 74   to prove that t
21750 68 65 20 63 6f 64 65 20 69 73 20 63 6f 72 72 65  he code is corre
21760 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61 72 74 69  ct (in .** parti
21770 63 75 6c 61 72 2c 20 69 74 20 70 72 65 76 65 6e  cular, it preven
21780 74 73 20 75 73 20 66 72 6f 6d 20 77 72 69 74 69  ts us from writi
21790 6e 67 20 61 6e 20 65 66 66 65 63 74 69 76 65 0a  ng an effective.
217a0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
217b0 6e 20 6f 66 20 73 71 6c 69 74 65 33 41 73 73 65  n of sqlite3Asse
217c0 72 74 4d 61 79 41 62 6f 72 74 28 29 29 20 61 6e  rtMayAbort()) an
217d0 64 20 73 6f 20 77 65 20 68 61 76 65 20 63 68 6f  d so we have cho
217e0 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b 65 20 74  sen.** to take t
217f0 68 65 20 73 61 66 65 20 72 6f 75 74 65 20 61 6e  he safe route an
21800 64 20 73 6b 69 70 20 74 68 65 20 6f 70 74 69 6d  d skip the optim
21810 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ization..*/.void
21820 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74   sqlite3MayAbort
21830 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
21840 0a 20 20 50 61 72 73 65 20 2a 70 54 6f 70 6c 65  .  Parse *pTople
21850 76 65 6c 20 3d 20 73 71 6c 69 74 65 33 50 61 72  vel = sqlite3Par
21860 73 65 54 6f 70 6c 65 76 65 6c 28 70 50 61 72 73  seToplevel(pPars
21870 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d  e);.  pToplevel-
21880 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31 3b 0a 7d  >mayAbort = 1;.}
21890 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
218a0 4f 50 5f 48 61 6c 74 20 74 68 61 74 20 63 61 75  OP_Halt that cau
218b0 73 65 73 20 74 68 65 20 76 64 62 65 20 74 6f 20  ses the vdbe to 
218c0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45  return an SQLITE
218d0 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a 2a 20 65  _CONSTRAINT.** e
218e0 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45 72 72 6f  rror. The onErro
218f0 72 20 70 61 72 61 6d 65 74 65 72 20 64 65 74 65  r parameter dete
21900 72 6d 69 6e 65 73 20 77 68 69 63 68 20 28 69 66  rmines which (if
21910 20 61 6e 79 29 20 6f 66 20 74 68 65 20 73 74 61   any) of the sta
21920 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64 2f 6f 72  tement.** and/or
21930 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
21940 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
21950 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ack..*/.void sql
21960 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
21970 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
21980 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
21990 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
219a0 69 6e 74 20 65 72 72 43 6f 64 65 2c 20 20 20 20  int errCode,    
219b0 20 20 2f 2a 20 65 78 74 65 6e 64 65 64 20 65 72    /* extended er
219c0 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  ror code */.  in
219d0 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20 20  t onError,      
219e0 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74 79  /* Constraint ty
219f0 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 34  pe */.  char *p4
21a00 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72  ,         /* Err
21a10 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20  or message */.  
21a20 69 38 20 70 34 74 79 70 65 2c 20 20 20 20 20 20  i8 p4type,      
21a30 20 20 2f 2a 20 50 34 5f 53 54 41 54 49 43 20 6f    /* P4_STATIC o
21a40 72 20 50 34 5f 54 52 41 4e 53 49 45 4e 54 20 2a  r P4_TRANSIENT *
21a50 2f 0a 20 20 75 38 20 70 35 45 72 72 6d 73 67 20  /.  u8 p5Errmsg 
21a60 20 20 20 20 20 20 2f 2a 20 50 35 5f 45 72 72 4d        /* P5_ErrM
21a70 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  sg type */.){.  
21a80 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
21a90 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
21aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 65 72 72  ;.  assert( (err
21ab0 43 6f 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49  Code&0xff)==SQLI
21ac0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 3b  TE_CONSTRAINT );
21ad0 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f 72 3d 3d  .  if( onError==
21ae0 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20  OE_Abort ){.    
21af0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
21b00 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a 20 20 73  pParse);.  }.  s
21b10 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
21b20 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 65 72 72  (v, OP_Halt, err
21b30 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72 2c 20 30  Code, onError, 0
21b40 2c 20 70 34 2c 20 70 34 74 79 70 65 29 3b 0a 20  , p4, p4type);. 
21b50 20 69 66 28 20 70 35 45 72 72 6d 73 67 20 29 20   if( p5Errmsg ) 
21b60 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
21b70 65 50 35 28 76 2c 20 70 35 45 72 72 6d 73 67 29  eP5(v, p5Errmsg)
21b80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
21b90 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65 20 74  an OP_Halt due t
21ba0 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52 49 4d  o UNIQUE or PRIM
21bb0 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  ARY KEY constrai
21bc0 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 2a 2f  nt violation..*/
21bd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 55 6e 69  .void sqlite3Uni
21be0 71 75 65 43 6f 6e 73 74 72 61 69 6e 74 28 0a 20  queConstraint(. 
21bf0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
21c00 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
21c10 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
21c20 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
21c30 43 6f 6e 73 74 72 61 69 6e 74 20 74 79 70 65 20  Constraint type 
21c40 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
21c50 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
21c60 64 65 78 20 74 68 61 74 20 74 72 69 67 67 65 72  dex that trigger
21c70 73 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  s the constraint
21c80 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
21c90 45 72 72 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  Err;.  int j;.  
21ca0 53 74 72 41 63 63 75 6d 20 65 72 72 4d 73 67 3b  StrAccum errMsg;
21cb0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
21cc0 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 3b 0a 0a   pIdx->pTable;..
21cd0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
21ce0 6d 49 6e 69 74 28 26 65 72 72 4d 73 67 2c 20 70  mInit(&errMsg, p
21cf0 50 61 72 73 65 2d 3e 64 62 2c 20 30 2c 20 30 2c  Parse->db, 0, 0,
21d00 20 32 30 30 29 3b 0a 20 20 69 66 28 20 70 49 64   200);.  if( pId
21d10 78 2d 3e 61 43 6f 6c 45 78 70 72 20 29 7b 0a 20  x->aColExpr ){. 
21d20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
21d30 66 28 26 65 72 72 4d 73 67 2c 20 30 2c 20 22 69  f(&errMsg, 0, "i
21d40 6e 64 65 78 20 27 25 71 27 22 2c 20 70 49 64 78  ndex '%q'", pIdx
21d50 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ->zName);.  }els
21d60 65 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  e{.    for(j=0; 
21d70 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b  j<pIdx->nKeyCol;
21d80 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61   j++){.      cha
21d90 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20 20 20 20 61  r *zCol;.      a
21da0 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 69 43  ssert( pIdx->aiC
21db0 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20 29 3b 0a 20  olumn[j]>=0 );. 
21dc0 20 20 20 20 20 7a 43 6f 6c 20 3d 20 70 54 61 62       zCol = pTab
21dd0 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d 3e 61 69 43  ->aCol[pIdx->aiC
21de0 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 3b  olumn[j]].zName;
21df0 0a 20 20 20 20 20 20 69 66 28 20 6a 20 29 20 73  .      if( j ) s
21e00 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
21e10 70 65 6e 64 28 26 65 72 72 4d 73 67 2c 20 22 2c  pend(&errMsg, ",
21e20 20 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 73 71   ", 2);.      sq
21e30 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 65 72  lite3XPrintf(&er
21e40 72 4d 73 67 2c 20 30 2c 20 22 25 73 2e 25 73 22  rMsg, 0, "%s.%s"
21e50 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a  , pTab->zName, z
21e60 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Col);.    }.  }.
21e70 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
21e80 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
21e90 65 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  errMsg);.  sqlit
21ea0 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74  e3HaltConstraint
21eb0 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 49 73  (pParse, .    Is
21ec0 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28  PrimaryKeyIndex(
21ed0 70 49 64 78 29 20 3f 20 53 51 4c 49 54 45 5f 43  pIdx) ? SQLITE_C
21ee0 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
21ef0 59 4b 45 59 20 0a 20 20 20 20 20 20 20 20 20 20  YKEY .          
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 20 20 3a 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54    : SQLITE_CONST
21f20 52 41 49 4e 54 5f 55 4e 49 51 55 45 2c 0a 20 20  RAINT_UNIQUE,.  
21f30 20 20 6f 6e 45 72 72 6f 72 2c 20 7a 45 72 72 2c    onError, zErr,
21f40 20 50 34 5f 44 59 4e 41 4d 49 43 2c 20 50 35 5f   P4_DYNAMIC, P5_
21f50 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65  ConstraintUnique
21f60 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64  );.}.../*.** Cod
21f70 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64 75 65  e an OP_Halt due
21f80 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72   to non-unique r
21f90 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owid..*/.void sq
21fa0 6c 69 74 65 33 52 6f 77 69 64 43 6f 6e 73 74 72  lite3RowidConstr
21fb0 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70  aint(.  Parse *p
21fc0 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
21fd0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
21fe0 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
21ff0 20 20 20 20 2f 2a 20 43 6f 6e 66 6c 69 63 74 20      /* Conflict 
22000 72 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72  resolution algor
22010 69 74 68 6d 20 2a 2f 0a 20 20 54 61 62 6c 65 20  ithm */.  Table 
22020 2a 70 54 61 62 20 20 20 20 20 20 20 2f 2a 20 54  *pTab       /* T
22030 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
22040 65 20 6e 6f 6e 2d 75 6e 69 71 75 65 20 72 6f 77  e non-unique row
22050 69 64 20 2a 2f 20 0a 29 7b 0a 20 20 63 68 61 72  id */ .){.  char
22060 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e 74 20 72 63   *zMsg;.  int rc
22070 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e 69 50  ;.  if( pTab->iP
22080 4b 65 79 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 4d  Key>=0 ){.    zM
22090 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
220a0 6e 74 66 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ntf(pParse->db, 
220b0 22 25 73 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a  "%s.%s", pTab->z
220c0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220e0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 61 62 2d  pTab->aCol[pTab-
220f0 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d 65 29 3b 0a  >iPKey].zName);.
22100 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22110 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41  CONSTRAINT_PRIMA
22120 52 59 4b 45 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  RYKEY;.  }else{.
22130 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22140 65 33 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65  e3MPrintf(pParse
22150 2d 3e 64 62 2c 20 22 25 73 2e 72 6f 77 69 64 22  ->db, "%s.rowid"
22160 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pTab->zName);.
22170 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22180 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44  CONSTRAINT_ROWID
22190 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
221a0 61 6c 74 43 6f 6e 73 74 72 61 69 6e 74 28 70 50  altConstraint(pP
221b0 61 72 73 65 2c 20 72 63 2c 20 6f 6e 45 72 72 6f  arse, rc, onErro
221c0 72 2c 20 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41  r, zMsg, P4_DYNA
221d0 4d 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 20  MIC,.           
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 35 5f               P5_
221f0 43 6f 6e 73 74 72 61 69 6e 74 55 6e 69 71 75 65  ConstraintUnique
22200 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  );.}../*.** Chec
22210 6b 20 74 6f 20 73 65 65 20 69 66 20 70 49 6e 64  k to see if pInd
22220 65 78 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ex uses the coll
22230 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 70  ating sequence p
22240 43 6f 6c 6c 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  Coll.  Return.**
22250 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73   true if it does
22260 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 69 74   and false if it
22270 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 23 69   does not..*/.#i
22280 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22290 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63  T_REINDEX.static
222a0 20 69 6e 74 20 63 6f 6c 6c 61 74 69 6f 6e 4d 61   int collationMa
222b0 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tch(const char *
222c0 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78 20 2a 70 49  zColl, Index *pI
222d0 6e 64 65 78 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ndex){.  int i;.
222e0 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c 6c 21    assert( zColl!
222f0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
22300 20 69 3c 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75   i<pIndex->nColu
22310 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f  mn; i++){.    co
22320 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 49  nst char *z = pI
22330 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b  ndex->azColl[i];
22340 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 21 3d  .    assert( z!=
22350 30 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 61 69 43  0 || pIndex->aiC
22360 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29 3b 0a 20 20  olumn[i]<0 );.  
22370 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61 69    if( pIndex->ai
22380 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30 20 26 26 20  Column[i]>=0 && 
22390 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
223a0 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  p(z, zColl) ){. 
223b0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
223c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
223d0 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
223e0 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20 61  *.** Recompute a
223f0 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 70 54  ll indices of pT
22400 61 62 20 74 68 61 74 20 75 73 65 20 74 68 65 20  ab that use the 
22410 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22420 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a 20 49 66 20  ce pColl..** If 
22430 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20 72 65  pColl==0 then re
22440 63 6f 6d 70 75 74 65 20 61 6c 6c 20 69 6e 64 69  compute all indi
22450 63 65 73 20 6f 66 20 70 54 61 62 2e 0a 2a 2f 0a  ces of pTab..*/.
22460 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
22470 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74 61 74  MIT_REINDEX.stat
22480 69 63 20 76 6f 69 64 20 72 65 69 6e 64 65 78 54  ic void reindexT
22490 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61 72  able(Parse *pPar
224a0 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  se, Table *pTab,
224b0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
224c0 6c 6c 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70 49  ll){.  Index *pI
224d0 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
224e0 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 61     /* An index a
224f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
22500 54 61 62 20 2a 2f 0a 0a 20 20 66 6f 72 28 70 49  Tab */..  for(pI
22510 6e 64 65 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  ndex=pTab->pInde
22520 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
22530 78 3d 70 49 6e 64 65 78 2d 3e 70 4e 65 78 74 29  x=pIndex->pNext)
22540 7b 0a 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 3d  {.    if( zColl=
22550 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74 69 6f 6e 4d  =0 || collationM
22560 61 74 63 68 28 7a 43 6f 6c 6c 2c 20 70 49 6e 64  atch(zColl, pInd
22570 65 78 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ex) ){.      int
22580 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
22590 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
225a0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
225b0 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 73 71  chema);.      sq
225c0 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f  lite3BeginWriteO
225d0 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c  peration(pParse,
225e0 20 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 20 20   0, iDb);.      
225f0 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
22600 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65  ex(pParse, pInde
22610 78 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20  x, -1);.    }.  
22620 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
22630 2a 20 52 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  * Recompute all 
22640 69 6e 64 69 63 65 73 20 6f 66 20 61 6c 6c 20 74  indices of all t
22650 61 62 6c 65 73 20 69 6e 20 61 6c 6c 20 64 61 74  ables in all dat
22660 61 62 61 73 65 73 20 77 68 65 72 65 20 74 68 65  abases where the
22670 0a 2a 2a 20 69 6e 64 69 63 65 73 20 75 73 65 20  .** indices use 
22680 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
22690 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 20 49  quence pColl.  I
226a0 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65 6e 20  f pColl==0 then 
226b0 72 65 63 6f 6d 70 75 74 65 0a 2a 2a 20 61 6c 6c  recompute.** all
226c0 20 69 6e 64 69 63 65 73 20 65 76 65 72 79 77 68   indices everywh
226d0 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ere..*/.#ifndef 
226e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e  SQLITE_OMIT_REIN
226f0 44 45 58 0a 73 74 61 74 69 63 20 76 6f 69 64 20  DEX.static void 
22700 72 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73  reindexDatabases
22710 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
22720 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
22730 6c 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  l){.  Db *pDb;  
22740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22750 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
22760 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
22770 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
22780 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
22790 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
227a0 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  mber */.  sqlite
227b0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
227c0 64 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74  db;   /* The dat
227d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
227e0 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
227f0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
22800 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
22810 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
22820 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
22830 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
22840 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
22850 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
22860 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
22870 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 41  lite3BtreeHoldsA
22880 6c 6c 4d 75 74 65 78 65 73 28 64 62 29 20 29 3b  llMutexes(db) );
22890 20 20 2f 2a 20 4e 65 65 64 65 64 20 66 6f 72 20    /* Needed for 
228a0 73 63 68 65 6d 61 20 61 63 63 65 73 73 20 2a 2f  schema access */
228b0 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20 70 44  .  for(iDb=0, pD
228c0 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62 3c 64  b=db->aDb; iDb<d
228d0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c 20 70  b->nDb; iDb++, p
228e0 44 62 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72  Db++){.    asser
228f0 74 28 20 70 44 62 21 3d 30 20 29 3b 0a 20 20 20  t( pDb!=0 );.   
22900 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61 73   for(k=sqliteHas
22910 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53 63  hFirst(&pDb->pSc
22920 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
22930 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73 68   k; k=sqliteHash
22940 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20 20  Next(k)){.      
22950 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29 73  pTab = (Table*)s
22960 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b 29  qliteHashData(k)
22970 3b 0a 20 20 20 20 20 20 72 65 69 6e 64 65 78 54  ;.      reindexT
22980 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61  able(pParse, pTa
22990 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 7d  b, zColl);.    }
229a0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  .  }.}.#endif../
229b0 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
229c0 64 65 20 66 6f 72 20 74 68 65 20 52 45 49 4e 44  de for the REIND
229d0 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  EX command..**.*
229e0 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44 45 58  *        REINDEX
229f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a00 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 31              -- 1
22a10 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49 4e 44  .**        REIND
22a20 45 58 20 20 3c 63 6f 6c 6c 61 74 69 6f 6e 3e 20  EX  <collation> 
22a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
22a40 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49   2.**        REI
22a50 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61 73 65  NDEX  ?<database
22a60 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d 65 3e 20 20  >.?<tablename>  
22a70 2d 2d 20 33 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 3.**        R
22a80 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61 62 61  EINDEX  ?<databa
22a90 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e 61 6d 65 3e  se>.?<indexname>
22aa0 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a 20 46 6f 72    -- 4.**.** For
22ab0 6d 20 31 20 63 61 75 73 65 73 20 61 6c 6c 20 69  m 1 causes all i
22ac0 6e 64 69 63 65 73 20 69 6e 20 61 6c 6c 20 61 74  ndices in all at
22ad0 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
22ae0 20 74 6f 20 62 65 20 72 65 62 75 69 6c 74 2e 0a   to be rebuilt..
22af0 2a 2a 20 46 6f 72 6d 20 32 20 72 65 62 75 69 6c  ** Form 2 rebuil
22b00 64 73 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 69  ds all indices i
22b10 6e 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  n all databases 
22b20 74 68 61 74 20 75 73 65 20 74 68 65 20 6e 61 6d  that use the nam
22b30 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74 69 6e 67 20  ed.** collating 
22b40 66 75 6e 63 74 69 6f 6e 2e 20 20 46 6f 72 6d 73  function.  Forms
22b50 20 33 20 61 6e 64 20 34 20 72 65 62 75 69 6c 64   3 and 4 rebuild
22b60 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
22b70 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69 6e 64 69 63   or all.** indic
22b80 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
22b90 74 68 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  th the named tab
22ba0 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  le..*/.#ifndef S
22bb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44  QLITE_OMIT_REIND
22bc0 45 58 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  EX.void sqlite3R
22bd0 65 69 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  eindex(Parse *pP
22be0 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61  arse, Token *pNa
22bf0 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  me1, Token *pNam
22c00 65 32 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  e2){.  CollSeq *
22c10 70 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pColl;          
22c20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20     /* Collating 
22c30 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20 72  sequence to be r
22c40 65 69 6e 64 65 78 65 64 2c 20 6f 72 20 4e 55 4c  eindexed, or NUL
22c50 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20  L */.  char *z; 
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
22c80 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 2a  table or index *
22c90 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22ca0 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
22cb0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
22cc0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 54 61 62  atabase */.  Tab
22cd0 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
22ce0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
22cf0 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
22d00 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
22d10 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20  pIndex;         
22d20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78       /* An index
22d30 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22d40 20 70 54 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69   pTab */.  int i
22d50 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
22d60 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
22d70 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75 6d  tabase index num
22d80 62 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ber */.  sqlite3
22d90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
22da0 62 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  b;   /* The data
22db0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
22dc0 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4f 62 6a  */.  Token *pObj
22dd0 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
22de0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
22df0 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74  table or index t
22e00 6f 20 62 65 20 72 65 69 6e 64 65 78 65 64 20 2a  o be reindexed *
22e10 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  /..  /* Read the
22e20 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
22e30 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
22e40 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20 65  curs, leave an e
22e50 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 20 2a  rror message.  *
22e60 2a 20 61 6e 64 20 63 6f 64 65 20 69 6e 20 70 50  * and code in pP
22e70 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
22e80 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69 66 28 20 53  NULL. */.  if( S
22e90 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
22ea0 33 52 65 61 64 53 63 68 65 6d 61 28 70 50 61 72  3ReadSchema(pPar
22eb0 73 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  se) ){.    retur
22ec0 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  n;.  }..  if( pN
22ed0 61 6d 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ame1==0 ){.    r
22ee0 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
22ef0 70 50 61 72 73 65 2c 20 30 29 3b 0a 20 20 20 20  pParse, 0);.    
22f00 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
22f10 69 66 28 20 4e 45 56 45 52 28 70 4e 61 6d 65 32  if( NEVER(pName2
22f20 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d 65 32 2d 3e  ==0) || pName2->
22f30 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  z==0 ){.    char
22f40 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20 20 61 73 73   *zColl;.    ass
22f50 65 72 74 28 20 70 4e 61 6d 65 31 2d 3e 7a 20 29  ert( pName1->z )
22f60 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 73 71  ;.    zColl = sq
22f70 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
22f80 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  en(pParse->db, p
22f90 4e 61 6d 65 31 29 3b 0a 20 20 20 20 69 66 28 20  Name1);.    if( 
22fa0 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e 3b  !zColl ) return;
22fb0 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
22fc0 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
22fd0 64 62 2c 20 45 4e 43 28 64 62 29 2c 20 7a 43 6f  db, ENC(db), zCo
22fe0 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ll, 0);.    if( 
22ff0 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
23000 65 69 6e 64 65 78 44 61 74 61 62 61 73 65 73 28  eindexDatabases(
23010 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a  pParse, zColl);.
23020 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
23030 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29 3b 0a  ree(db, zColl);.
23040 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
23050 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
23060 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c 6c 29  bFree(db, zColl)
23070 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
23080 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
23090 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
230a0 20 70 4e 61 6d 65 32 2c 20 26 70 4f 62 6a 4e 61   pName2, &pObjNa
230b0 6d 65 29 3b 0a 20 20 69 66 28 20 69 44 62 3c 30  me);.  if( iDb<0
230c0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 20 3d   ) return;.  z =
230d0 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
230e0 54 6f 6b 65 6e 28 64 62 2c 20 70 4f 62 6a 4e 61  Token(db, pObjNa
230f0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  me);.  if( z==0 
23100 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 44 62 20  ) return;.  zDb 
23110 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a  = db->aDb[iDb].z
23120 4e 61 6d 65 3b 0a 20 20 70 54 61 62 20 3d 20 73  Name;.  pTab = s
23130 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
23140 64 62 2c 20 7a 2c 20 7a 44 62 29 3b 0a 20 20 69  db, z, zDb);.  i
23150 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20 20 72  f( pTab ){.    r
23160 65 69 6e 64 65 78 54 61 62 6c 65 28 70 50 61 72  eindexTable(pPar
23170 73 65 2c 20 70 54 61 62 2c 20 30 29 3b 0a 20 20  se, pTab, 0);.  
23180 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23190 64 62 2c 20 7a 29 3b 0a 20 20 20 20 72 65 74 75  db, z);.    retu
231a0 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 6e 64 65 78  rn;.  }.  pIndex
231b0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49 6e   = sqlite3FindIn
231c0 64 65 78 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  dex(db, z, zDb);
231d0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
231e0 28 64 62 2c 20 7a 29 3b 0a 20 20 69 66 28 20 70  (db, z);.  if( p
231f0 49 6e 64 65 78 20 29 7b 0a 20 20 20 20 73 71 6c  Index ){.    sql
23200 69 74 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70  ite3BeginWriteOp
23210 65 72 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20  eration(pParse, 
23220 30 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  0, iDb);.    sql
23230 69 74 65 33 52 65 66 69 6c 6c 49 6e 64 65 78 28  ite3RefillIndex(
23240 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78 2c 20  pParse, pIndex, 
23250 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
23260 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72  .  }.  sqlite3Er
23270 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
23280 75 6e 61 62 6c 65 20 74 6f 20 69 64 65 6e 74 69  unable to identi
23290 66 79 20 74 68 65 20 6f 62 6a 65 63 74 20 74 6f  fy the object to
232a0 20 62 65 20 72 65 69 6e 64 65 78 65 64 22 29 3b   be reindexed");
232b0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
232c0 20 52 65 74 75 72 6e 20 61 20 4b 65 79 49 6e 66   Return a KeyInf
232d0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
232e0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
232f0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 49 6e  for the given In
23300 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4b  dex..**.** The K
23310 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
23320 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 20 69 73   for an index is
23330 20 63 61 63 68 65 64 20 69 6e 20 74 68 65 20 49   cached in the I
23340 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20  ndex object..** 
23350 53 6f 20 74 68 65 72 65 20 6d 69 67 68 74 20 62  So there might b
23360 65 20 6d 75 6c 74 69 70 6c 65 20 72 65 66 65 72  e multiple refer
23370 65 6e 63 65 73 20 74 6f 20 74 68 65 20 72 65 74  ences to the ret
23380 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 2e 20 20  urned pointer.  
23390 54 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  The.** caller sh
233a0 6f 75 6c 64 20 6e 6f 74 20 74 72 79 20 74 6f 20  ould not try to 
233b0 6d 6f 64 69 66 79 20 74 68 65 20 4b 65 79 49 6e  modify the KeyIn
233c0 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  fo object..**.**
233d0 20 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75   The caller shou
233e0 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65  ld invoke sqlite
233f0 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 29 20  3KeyInfoUnref() 
23400 6f 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  on the returned 
23410 6f 62 6a 65 63 74 0a 2a 2a 20 77 68 65 6e 20 69  object.** when i
23420 74 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 75  t has finished u
23430 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a 4b 65 79 49  sing it..*/.KeyI
23440 6e 66 6f 20 2a 73 71 6c 69 74 65 33 4b 65 79 49  nfo *sqlite3KeyI
23450 6e 66 6f 4f 66 49 6e 64 65 78 28 50 61 72 73 65  nfoOfIndex(Parse
23460 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
23470 2a 70 49 64 78 29 7b 0a 20 20 69 6e 74 20 69 3b  *pIdx){.  int i;
23480 0a 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 49  .  int nCol = pI
23490 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 69  dx->nColumn;.  i
234a0 6e 74 20 6e 4b 65 79 20 3d 20 70 49 64 78 2d 3e  nt nKey = pIdx->
234b0 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b 65 79 49 6e  nKeyCol;.  KeyIn
234c0 66 6f 20 2a 70 4b 65 79 3b 0a 20 20 69 66 28 20  fo *pKey;.  if( 
234d0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 20 72  pParse->nErr ) r
234e0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
234f0 49 64 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75 6c 6c  Idx->uniqNotNull
23500 20 29 7b 0a 20 20 20 20 70 4b 65 79 20 3d 20 73   ){.    pKey = s
23510 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 41 6c 6c  qlite3KeyInfoAll
23520 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e  oc(pParse->db, n
23530 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b 65 79 29 3b  Key, nCol-nKey);
23540 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4b  .  }else{.    pK
23550 65 79 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49  ey = sqlite3KeyI
23560 6e 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d  nfoAlloc(pParse-
23570 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30 29 3b 0a 20  >db, nCol, 0);. 
23580 20 7d 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b   }.  if( pKey ){
23590 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
235a0 69 74 65 33 4b 65 79 49 6e 66 6f 49 73 57 72 69  ite3KeyInfoIsWri
235b0 74 65 61 62 6c 65 28 70 4b 65 79 29 20 29 3b 0a  teable(pKey) );.
235c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
235d0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
235e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
235f0 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
23600 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 4b 65 79  l[i];.      pKey
23610 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d 20 7a 43 6f  ->aColl[i] = zCo
23620 6c 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 42 49  ll==sqlite3StrBI
23630 4e 41 52 59 20 3f 20 30 20 3a 0a 20 20 20 20 20  NARY ? 0 :.     
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23650 20 20 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65     sqlite3Locate
23660 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
23670 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 70 4b  zColl);.      pK
23680 65 79 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  ey->aSortOrder[i
23690 5d 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  ] = pIdx->aSortO
236a0 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  rder[i];.    }. 
236b0 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
236c0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Err ){.      sql
236d0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
236e0 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 70 4b  (pKey);.      pK
236f0 65 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ey = 0;.    }.  
23700 7d 0a 20 20 72 65 74 75 72 6e 20 70 4b 65 79 3b  }.  return pKey;
23710 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
23720 54 45 5f 4f 4d 49 54 5f 43 54 45 0a 2f 2a 20 0a  TE_OMIT_CTE./* .
23730 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23740 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 63 65 20  is invoked once 
23750 70 65 72 20 43 54 45 20 62 79 20 74 68 65 20 70  per CTE by the p
23760 61 72 73 65 72 20 77 68 69 6c 65 20 70 61 72 73  arser while pars
23770 69 6e 67 20 61 20 0a 2a 2a 20 57 49 54 48 20 63  ing a .** WITH c
23780 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57 69 74 68 20  lause. .*/.With 
23790 2a 73 71 6c 69 74 65 33 57 69 74 68 41 64 64 28  *sqlite3WithAdd(
237a0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
237b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
237c0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
237d0 0a 20 20 57 69 74 68 20 2a 70 57 69 74 68 2c 20  .  With *pWith, 
237e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
237f0 69 73 74 69 6e 67 20 57 49 54 48 20 63 6c 61 75  isting WITH clau
23800 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
23810 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20   Token *pName,  
23820 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
23830 20 6f 66 20 74 68 65 20 63 6f 6d 6d 6f 6e 2d 74   of the common-t
23840 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
23850 73 74 20 2a 70 41 72 67 6c 69 73 74 2c 20 20 20  st *pArglist,   
23860 20 20 2f 2a 20 4f 70 74 69 6f 6e 61 6c 20 63 6f    /* Optional co
23870 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69 73 74 20 66  lumn name list f
23880 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
23890 20 20 53 65 6c 65 63 74 20 2a 70 51 75 65 72 79    Select *pQuery
238a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
238b0 72 79 20 75 73 65 64 20 74 6f 20 69 6e 69 74 69  ry used to initi
238c0 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20  alize the table 
238d0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
238e0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
238f0 3b 0a 20 20 57 69 74 68 20 2a 70 4e 65 77 3b 0a  ;.  With *pNew;.
23900 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a    char *zName;..
23910 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
23920 74 68 65 20 43 54 45 20 6e 61 6d 65 20 69 73 20  the CTE name is 
23930 75 6e 69 71 75 65 20 77 69 74 68 69 6e 20 74 68  unique within th
23940 69 73 20 57 49 54 48 20 63 6c 61 75 73 65 2e 20  is WITH clause. 
23950 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c 20 73 74 6f  If.  ** not, sto
23960 72 65 20 61 6e 20 65 72 72 6f 72 20 69 6e 20 74  re an error in t
23970 68 65 20 50 61 72 73 65 20 73 74 72 75 63 74 75  he Parse structu
23980 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  re. */.  zName =
23990 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
239a0 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62  Token(pParse->db
239b0 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , pName);.  if( 
239c0 7a 4e 61 6d 65 20 26 26 20 70 57 69 74 68 20 29  zName && pWith )
239d0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
239e0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 69 74   for(i=0; i<pWit
239f0 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b 29 7b 0a 20  h->nCte; i++){. 
23a00 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23a10 53 74 72 49 43 6d 70 28 7a 4e 61 6d 65 2c 20 70  StrICmp(zName, p
23a20 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  With->a[i].zName
23a30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
23a40 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
23a50 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69 63 61  pParse, "duplica
23a60 74 65 20 57 49 54 48 20 74 61 62 6c 65 20 6e 61  te WITH table na
23a70 6d 65 3a 20 25 73 22 2c 20 7a 4e 61 6d 65 29 3b  me: %s", zName);
23a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23a90 20 7d 0a 0a 20 20 69 66 28 20 70 57 69 74 68 20   }..  if( pWith 
23aa0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
23ab0 20 3d 20 73 69 7a 65 6f 66 28 2a 70 57 69 74 68   = sizeof(*pWith
23ac0 29 20 2b 20 28 73 69 7a 65 6f 66 28 70 57 69 74  ) + (sizeof(pWit
23ad0 68 2d 3e 61 5b 31 5d 29 20 2a 20 70 57 69 74 68  h->a[1]) * pWith
23ae0 2d 3e 6e 43 74 65 29 3b 0a 20 20 20 20 70 4e 65  ->nCte);.    pNe
23af0 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  w = sqlite3DbRea
23b00 6c 6c 6f 63 28 64 62 2c 20 70 57 69 74 68 2c 20  lloc(db, pWith, 
23b10 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
23b20 0a 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  .    pNew = sqli
23b30 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
23b40 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 57 69 74  db, sizeof(*pWit
23b50 68 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  h));.  }.  asser
23b60 74 28 20 7a 4e 61 6d 65 21 3d 30 20 7c 7c 20 70  t( zName!=0 || p
23b70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  New==0 );.  asse
23b80 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  rt( db->mallocFa
23b90 69 6c 65 64 3d 3d 30 20 7c 7c 20 70 4e 65 77 3d  iled==0 || pNew=
23ba0 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 4e 65  =0 );..  if( pNe
23bb0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  w==0 ){.    sqli
23bc0 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
23bd0 65 28 64 62 2c 20 70 41 72 67 6c 69 73 74 29 3b  e(db, pArglist);
23be0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
23bf0 63 74 44 65 6c 65 74 65 28 64 62 2c 20 70 51 75  ctDelete(db, pQu
23c00 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
23c10 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d  3DbFree(db, zNam
23c20 65 29 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 70  e);.    pNew = p
23c30 57 69 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  With;.  }else{. 
23c40 20 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d     pNew->a[pNew-
23c50 3e 6e 43 74 65 5d 2e 70 53 65 6c 65 63 74 20 3d  >nCte].pSelect =
23c60 20 70 51 75 65 72 79 3b 0a 20 20 20 20 70 4e 65   pQuery;.    pNe
23c70 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d  w->a[pNew->nCte]
23c80 2e 70 43 6f 6c 73 20 3d 20 70 41 72 67 6c 69 73  .pCols = pArglis
23c90 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  t;.    pNew->a[p
23ca0 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a 4e 61 6d 65  New->nCte].zName
23cb0 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 4e   = zName;.    pN
23cc0 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65  ew->a[pNew->nCte
23cd0 5d 2e 7a 43 74 65 45 72 72 20 3d 20 30 3b 0a 20  ].zCteErr = 0;. 
23ce0 20 20 20 70 4e 65 77 2d 3e 6e 43 74 65 2b 2b 3b     pNew->nCte++;
23cf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
23d00 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  New;.}../*.** Fr
23d10 65 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ee the contents 
23d20 6f 66 20 74 68 65 20 57 69 74 68 20 6f 62 6a 65  of the With obje
23d30 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ct passed as the
23d40 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23d50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
23d60 33 57 69 74 68 44 65 6c 65 74 65 28 73 71 6c 69  3WithDelete(sqli
23d70 74 65 33 20 2a 64 62 2c 20 57 69 74 68 20 2a 70  te3 *db, With *p
23d80 57 69 74 68 29 7b 0a 20 20 69 66 28 20 70 57 69  With){.  if( pWi
23d90 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
23da0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23db0 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
23dc0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
23dd0 43 74 65 20 2a 70 43 74 65 20 3d 20 26 70 57 69  Cte *pCte = &pWi
23de0 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  th->a[i];.      
23df0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23e00 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
23e10 70 43 6f 6c 73 29 3b 0a 20 20 20 20 20 20 73 71  pCols);.      sq
23e20 6c 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74  lite3SelectDelet
23e30 65 28 64 62 2c 20 70 43 74 65 2d 3e 70 53 65 6c  e(db, pCte->pSel
23e40 65 63 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ect);.      sqli
23e50 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
23e60 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  te->zName);.    
23e70 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
23e80 72 65 65 28 64 62 2c 20 70 57 69 74 68 29 3b 0a  ree(db, pWith);.
23e90 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
23ea0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
23eb0 4f 4d 49 54 5f 43 54 45 29 20 2a 2f 0a           OMIT_CTE) */.