/ Hex Artifact Content
Login

Artifact 59783188d873daf92150cc1a1caad55496839e8f:


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 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 72   }else{.    pPar
1d10: 73 65 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f  se->rc = SQLITE_
1d20: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
1d30: 20 57 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74   We are done wit
1d40: 68 20 74 68 69 73 20 50 61 72 73 65 20 6f 62 6a  h this Parse obj
1d50: 65 63 74 2e 20 54 68 65 72 65 20 69 73 20 6e 6f  ect. There is no
1d60: 20 6e 65 65 64 20 74 6f 20 64 65 2d 69 6e 69 74   need to de-init
1d70: 69 61 6c 69 7a 65 20 69 74 20 2a 2f 0a 23 69 66  ialize it */.#if
1d80: 20 30 0a 20 20 70 50 61 72 73 65 2d 3e 63 6f 6c   0.  pParse->col
1d90: 4e 61 6d 65 73 53 65 74 20 3d 20 30 3b 0a 20 20  NamesSet = 0;.  
1da0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 30  pParse->nTab = 0
1db0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  ;.  pParse->nMem
1dc0: 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e   = 0;.  pParse->
1dd0: 6e 53 65 74 20 3d 20 30 3b 0a 20 20 70 50 61 72  nSet = 0;.  pPar
1de0: 73 65 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a 20 20  se->nVar = 0;.  
1df0: 44 62 4d 61 73 6b 5a 65 72 6f 28 70 50 61 72 73  DbMaskZero(pPars
1e00: 65 2d 3e 63 6f 6f 6b 69 65 4d 61 73 6b 29 3b 0a  e->cookieMask);.
1e10: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
1e20: 52 75 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  Run the parser a
1e30: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  nd code generato
1e40: 72 20 72 65 63 75 72 73 69 76 65 6c 79 20 69 6e  r recursively in
1e50: 20 6f 72 64 65 72 20 74 6f 20 67 65 6e 65 72 61   order to genera
1e60: 74 65 0a 2a 2a 20 63 6f 64 65 20 66 6f 72 20 74  te.** code for t
1e70: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1e80: 20 67 69 76 65 6e 20 6f 6e 74 6f 20 74 68 65 20   given onto the 
1e90: 65 6e 64 20 6f 66 20 74 68 65 20 70 50 61 72 73  end of the pPars
1ea0: 65 20 63 6f 6e 74 65 78 74 0a 2a 2a 20 63 75 72  e context.** cur
1eb0: 72 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e  rently under con
1ec0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 57 68 65 6e  struction.  When
1ed0: 20 74 68 65 20 70 61 72 73 65 72 20 69 73 20 72   the parser is r
1ee0: 75 6e 20 72 65 63 75 72 73 69 76 65 6c 79 0a 2a  un recursively.*
1ef0: 2a 20 74 68 69 73 20 77 61 79 2c 20 74 68 65 20  * this way, the 
1f00: 66 69 6e 61 6c 20 4f 50 5f 48 61 6c 74 20 69 73  final OP_Halt is
1f10: 20 6e 6f 74 20 61 70 70 65 6e 64 65 64 20 61 6e   not appended an
1f20: 64 20 6f 74 68 65 72 20 69 6e 69 74 69 61 6c 69  d other initiali
1f30: 7a 61 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 66 69  zation.** and fi
1f40: 6e 61 6c 69 7a 61 74 69 6f 6e 20 73 74 65 70 73  nalization steps
1f50: 20 61 72 65 20 6f 6d 69 74 74 65 64 20 62 65 63   are omitted bec
1f60: 61 75 73 65 20 74 68 6f 73 65 20 61 72 65 20 68  ause those are h
1f70: 61 6e 64 6c 69 6e 67 20 62 79 20 74 68 65 0a 2a  andling by the.*
1f80: 2a 20 6f 75 74 65 72 6d 6f 73 74 20 70 61 72 73  * outermost pars
1f90: 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76  er..**.** Not ev
1fa0: 65 72 79 74 68 69 6e 67 20 69 73 20 6e 65 73 74  erything is nest
1fb0: 61 62 6c 65 2e 20 20 54 68 69 73 20 66 61 63 69  able.  This faci
1fc0: 6c 69 74 79 20 69 73 20 64 65 73 69 67 6e 65 64  lity is designed
1fd0: 20 74 6f 20 70 65 72 6d 69 74 0a 2a 2a 20 49 4e   to permit.** IN
1fe0: 53 45 52 54 2c 20 55 50 44 41 54 45 2c 20 61 6e  SERT, UPDATE, an
1ff0: 64 20 44 45 4c 45 54 45 20 6f 70 65 72 61 74 69  d DELETE operati
2000: 6f 6e 73 20 61 67 61 69 6e 73 74 20 53 51 4c 49  ons against SQLI
2010: 54 45 5f 4d 41 53 54 45 52 2e 20 20 55 73 65 0a  TE_MASTER.  Use.
2020: 2a 2a 20 63 61 72 65 20 69 66 20 79 6f 75 20 64  ** care if you d
2030: 65 63 69 64 65 20 74 6f 20 74 72 79 20 74 6f 20  ecide to try to 
2040: 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  use this routine
2050: 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
2060: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69  purposes..*/.voi
2070: 64 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50  d sqlite3NestedP
2080: 61 72 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  arse(Parse *pPar
2090: 73 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  se, const char *
20a0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
20b0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
20c0: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
20d0: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
20e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
20f0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 23 20 64 65  pParse->db;.# de
2100: 66 69 6e 65 20 53 41 56 45 5f 53 5a 20 20 28 73  fine SAVE_SZ  (s
2110: 69 7a 65 6f 66 28 50 61 72 73 65 29 20 2d 20 6f  izeof(Parse) - o
2120: 66 66 73 65 74 6f 66 28 50 61 72 73 65 2c 6e 56  ffsetof(Parse,nV
2130: 61 72 29 29 0a 20 20 63 68 61 72 20 73 61 76 65  ar)).  char save
2140: 42 75 66 5b 53 41 56 45 5f 53 5a 5d 3b 0a 0a 20  Buf[SAVE_SZ];.. 
2150: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72   if( pParse->nEr
2160: 72 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  r ) return;.  as
2170: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 6e 65  sert( pParse->ne
2180: 73 74 65 64 3c 31 30 20 29 3b 20 20 2f 2a 20 4e  sted<10 );  /* N
2190: 65 73 74 69 6e 67 20 73 68 6f 75 6c 64 20 6f 6e  esting should on
21a0: 6c 79 20 62 65 20 6f 66 20 6c 69 6d 69 74 65 64  ly be of limited
21b0: 20 64 65 70 74 68 20 2a 2f 0a 20 20 76 61 5f 73   depth */.  va_s
21c0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
21d0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
21e0: 74 65 33 56 4d 50 72 69 6e 74 66 28 64 62 2c 20  te3VMPrintf(db, 
21f0: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
2200: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66  va_end(ap);.  if
2210: 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2220: 20 72 65 74 75 72 6e 3b 20 20 20 2f 2a 20 41 20   return;   /* A 
2230: 6d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  malloc must have
2240: 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20   failed */.  }. 
2250: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 2b   pParse->nested+
2260: 2b 3b 0a 20 20 6d 65 6d 63 70 79 28 73 61 76 65  +;.  memcpy(save
2270: 42 75 66 2c 20 26 70 50 61 72 73 65 2d 3e 6e 56  Buf, &pParse->nV
2280: 61 72 2c 20 53 41 56 45 5f 53 5a 29 3b 0a 20 20  ar, SAVE_SZ);.  
2290: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
22a0: 6e 56 61 72 2c 20 30 2c 20 53 41 56 45 5f 53 5a  nVar, 0, SAVE_SZ
22b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 75 6e 50  );.  sqlite3RunP
22c0: 61 72 73 65 72 28 70 50 61 72 73 65 2c 20 7a 53  arser(pParse, zS
22d0: 71 6c 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ql, &zErrMsg);. 
22e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22f0: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b, zErrMsg);.  s
2300: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
2310: 20 7a 53 71 6c 29 3b 0a 20 20 6d 65 6d 63 70 79   zSql);.  memcpy
2320: 28 26 70 50 61 72 73 65 2d 3e 6e 56 61 72 2c 20  (&pParse->nVar, 
2330: 73 61 76 65 42 75 66 2c 20 53 41 56 45 5f 53 5a  saveBuf, SAVE_SZ
2340: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 65 73  );.  pParse->nes
2350: 74 65 64 2d 2d 3b 0a 7d 0a 0a 23 69 66 20 53 51  ted--;.}..#if SQ
2360: 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
2370: 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 52  TICATION./*.** R
2380: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 7a 54  eturn TRUE if zT
2390: 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65  able is the name
23a0: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 74   of the system t
23b0: 61 62 6c 65 20 74 68 61 74 20 73 74 6f 72 65 73  able that stores
23c0: 20 74 68 65 0a 2a 2a 20 6c 69 73 74 20 6f 66 20   the.** list of 
23d0: 75 73 65 72 73 20 61 6e 64 20 74 68 65 69 72 20  users and their 
23e0: 61 63 63 65 73 73 20 63 72 65 64 65 6e 74 69 61  access credentia
23f0: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2400: 65 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28  e3UserAuthTable(
2410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2420: 6c 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  le){.  return sq
2430: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 54  lite3_stricmp(zT
2440: 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f 75 73  able, "sqlite_us
2450: 65 72 22 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69  er")==0;.}.#endi
2460: 66 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  f../*.** Locate 
2470: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 73 74  the in-memory st
2480: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 73  ructure that des
2490: 63 72 69 62 65 73 20 61 20 70 61 72 74 69 63 75  cribes a particu
24a0: 6c 61 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  lar database.** 
24b0: 74 61 62 6c 65 20 67 69 76 65 6e 20 74 68 65 20  table given the 
24c0: 6e 61 6d 65 20 6f 66 20 74 68 61 74 20 74 61 62  name of that tab
24d0: 6c 65 20 61 6e 64 20 28 6f 70 74 69 6f 6e 61 6c  le and (optional
24e0: 6c 79 29 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ly) the name of 
24f0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2500: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74  containing the t
2510: 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  able.  Return NU
2520: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
2530: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 44 61 74 61 62  .**.** If zDatab
2540: 61 73 65 20 69 73 20 30 2c 20 61 6c 6c 20 64 61  ase is 0, all da
2550: 74 61 62 61 73 65 73 20 61 72 65 20 73 65 61 72  tabases are sear
2560: 63 68 65 64 20 66 6f 72 20 74 68 65 20 74 61 62  ched for the tab
2570: 6c 65 20 61 6e 64 20 74 68 65 0a 2a 2a 20 66 69  le and the.** fi
2580: 72 73 74 20 6d 61 74 63 68 69 6e 67 20 74 61 62  rst matching tab
2590: 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  le is returned. 
25a0: 20 28 4e 6f 20 63 68 65 63 6b 69 6e 67 20 66 6f   (No checking fo
25b0: 72 20 64 75 70 6c 69 63 61 74 65 20 74 61 62 6c  r duplicate tabl
25c0: 65 0a 2a 2a 20 6e 61 6d 65 73 20 69 73 20 64 6f  e.** names is do
25d0: 6e 65 2e 29 20 20 54 68 65 20 73 65 61 72 63 68  ne.)  The search
25e0: 20 6f 72 64 65 72 20 69 73 20 54 45 4d 50 20 66   order is TEMP f
25f0: 69 72 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c  irst, then MAIN,
2600: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 61 75 78   then any.** aux
2610: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 73  iliary databases
2620: 20 61 64 64 65 64 20 75 73 69 6e 67 20 74 68 65   added using the
2630: 20 41 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e   ATTACH command.
2640: 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
2650: 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62  sqlite3LocateTab
2660: 6c 65 28 29 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a  le()..*/.Table *
2670: 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65  sqlite3FindTable
2680: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
2690: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
26a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61   const char *zDa
26b0: 74 61 62 61 73 65 29 7b 0a 20 20 54 61 62 6c 65  tabase){.  Table
26c0: 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   *p = 0;.  int i
26d0: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75 74 65  ;..  /* All mute
26e0: 78 65 73 20 61 72 65 20 72 65 71 75 69 72 65 64  xes are required
26f0: 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65   for schema acce
2700: 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 77  ss.  Make sure w
2710: 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a 2f 0a  e hold them. */.
2720: 20 20 61 73 73 65 72 74 28 20 7a 44 61 74 61 62    assert( zDatab
2730: 61 73 65 21 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase!=0 || sqlite
2740: 33 42 74 72 65 65 48 6f 6c 64 73 41 6c 6c 4d 75  3BtreeHoldsAllMu
2750: 74 65 78 65 73 28 64 62 29 20 29 3b 0a 23 69 66  texes(db) );.#if
2760: 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54   SQLITE_USER_AUT
2770: 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20 2f 2a  HENTICATION.  /*
2780: 20 4f 6e 6c 79 20 74 68 65 20 61 64 6d 69 6e 20   Only the admin 
2790: 75 73 65 72 20 69 73 20 61 6c 6c 6f 77 65 64 20  user is allowed 
27a0: 74 6f 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  to know that the
27b0: 20 73 71 6c 69 74 65 5f 75 73 65 72 20 74 61 62   sqlite_user tab
27c0: 6c 65 0a 20 20 2a 2a 20 65 78 69 73 74 73 20 2a  le.  ** exists *
27d0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 68  /.  if( db->auth
27e0: 2e 61 75 74 68 4c 65 76 65 6c 3c 55 41 55 54 48  .authLevel<UAUTH
27f0: 5f 41 64 6d 69 6e 20 26 26 20 73 71 6c 69 74 65  _Admin && sqlite
2800: 33 55 73 65 72 41 75 74 68 54 61 62 6c 65 28 7a  3UserAuthTable(z
2810: 4e 61 6d 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  Name)!=0 ){.    
2820: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
2830: 6e 64 69 66 0a 20 20 66 6f 72 28 69 3d 4f 4d 49  ndif.  for(i=OMI
2840: 54 5f 54 45 4d 50 44 42 3b 20 69 3c 64 62 2d 3e  T_TEMPDB; i<db->
2850: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
2860: 6e 74 20 6a 20 3d 20 28 69 3c 32 29 20 3f 20 69  nt j = (i<2) ? i
2870: 5e 31 20 3a 20 69 3b 20 20 20 2f 2a 20 53 65 61  ^1 : i;   /* Sea
2880: 72 63 68 20 54 45 4d 50 20 62 65 66 6f 72 65 20  rch TEMP before 
2890: 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 69 66 28 20  MAIN */.    if( 
28a0: 7a 44 61 74 61 62 61 73 65 21 3d 30 20 26 26 20  zDatabase!=0 && 
28b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
28c0: 44 61 74 61 62 61 73 65 2c 20 64 62 2d 3e 61 44  Database, db->aD
28d0: 62 5b 6a 5d 2e 7a 4e 61 6d 65 29 20 29 20 63 6f  b[j].zName) ) co
28e0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
28f0: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
2900: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 6a  aMutexHeld(db, j
2910: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  , 0) );.    p = 
2920: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
2930: 26 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68  &db->aDb[j].pSch
2940: 65 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 4e  ema->tblHash, zN
2950: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 70 20  ame);.    if( p 
2960: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  ) break;.  }.  r
2970: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
2980: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69 6e 2d  * Locate the in-
2990: 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
29a0: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
29b0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74  a particular dat
29c0: 61 62 61 73 65 0a 2a 2a 20 74 61 62 6c 65 20 67  abase.** table g
29d0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
29e0: 20 74 68 61 74 20 74 61 62 6c 65 20 61 6e 64 20   that table and 
29f0: 28 6f 70 74 69 6f 6e 61 6c 6c 79 29 20 74 68 65  (optionally) the
2a00: 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
2a10: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
2a20: 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20  ing the table.  
2a30: 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
2a40: 6f 74 20 66 6f 75 6e 64 2e 20 20 41 6c 73 6f 20  ot found.  Also 
2a50: 6c 65 61 76 65 20 61 6e 0a 2a 2a 20 65 72 72 6f  leave an.** erro
2a60: 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61  r message in pPa
2a70: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  rse->zErrMsg..**
2a80: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2a90: 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
2aa0: 72 6f 75 74 69 6e 65 20 61 6e 64 20 73 71 6c 69  routine and sqli
2ab0: 74 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 69  te3FindTable() i
2ac0: 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 72  s that this.** r
2ad0: 6f 75 74 69 6e 65 20 6c 65 61 76 65 73 20 61 6e  outine leaves an
2ae0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2af0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
2b00: 67 20 77 68 65 72 65 0a 2a 2a 20 73 71 6c 69 74  g where.** sqlit
2b10: 65 33 46 69 6e 64 54 61 62 6c 65 28 29 20 64 6f  e3FindTable() do
2b20: 65 73 20 6e 6f 74 2e 0a 2a 2f 0a 54 61 62 6c 65  es not..*/.Table
2b30: 20 2a 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54   *sqlite3LocateT
2b40: 61 62 6c 65 28 0a 20 20 50 61 72 73 65 20 2a 70  able(.  Parse *p
2b50: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
2b60: 2a 20 63 6f 6e 74 65 78 74 20 69 6e 20 77 68 69  * context in whi
2b70: 63 68 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72  ch to report err
2b80: 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 56  ors */.  int isV
2b90: 69 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20  iew,            
2ba0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 6f 6f 6b 69  /* True if looki
2bb0: 6e 67 20 66 6f 72 20 61 20 56 49 45 57 20 72 61  ng for a VIEW ra
2bc0: 74 68 65 72 20 74 68 61 6e 20 61 20 54 41 42 4c  ther than a TABL
2bd0: 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  E */.  const cha
2be0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 2f 2a  r *zName,     /*
2bf0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62   Name of the tab
2c00: 6c 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  le we are lookin
2c10: 67 20 66 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  g for */.  const
2c20: 20 63 68 61 72 20 2a 7a 44 62 61 73 65 20 20 20   char *zDbase   
2c30: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2c40: 20 64 61 74 61 62 61 73 65 2e 20 20 4d 69 67 68   database.  Migh
2c50: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a  t be NULL */.){.
2c60: 20 20 54 61 62 6c 65 20 2a 70 3b 0a 0a 20 20 2f    Table *p;..  /
2c70: 2a 20 52 65 61 64 20 74 68 65 20 64 61 74 61 62  * Read the datab
2c80: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 61  ase schema. If a
2c90: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2ca0: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  leave an error m
2cb0: 65 73 73 61 67 65 0a 20 20 2a 2a 20 61 6e 64 20  essage.  ** and 
2cc0: 63 6f 64 65 20 69 6e 20 70 50 61 72 73 65 20 61  code in pParse a
2cd0: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20  nd return NULL. 
2ce0: 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  */.  if( SQLITE_
2cf0: 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53  OK!=sqlite3ReadS
2d00: 63 68 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b  chema(pParse) ){
2d10: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2d20: 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   }..  p = sqlite
2d30: 33 46 69 6e 64 54 61 62 6c 65 28 70 50 61 72 73  3FindTable(pPars
2d40: 65 2d 3e 64 62 2c 20 7a 4e 61 6d 65 2c 20 7a 44  e->db, zName, zD
2d50: 62 61 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d  base);.  if( p==
2d60: 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  0 ){.    const c
2d70: 68 61 72 20 2a 7a 4d 73 67 20 3d 20 69 73 56 69  har *zMsg = isVi
2d80: 65 77 20 3f 20 22 6e 6f 20 73 75 63 68 20 76 69  ew ? "no such vi
2d90: 65 77 22 20 3a 20 22 6e 6f 20 73 75 63 68 20 74  ew" : "no such t
2da0: 61 62 6c 65 22 3b 0a 23 69 66 6e 64 65 66 20 53  able";.#ifndef S
2db0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2dc0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20  ALTABLE.    if( 
2dd0: 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d  sqlite3FindDbNam
2de0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 44  e(pParse->db, zD
2df0: 62 61 73 65 29 3c 31 20 29 7b 0a 20 20 20 20 20  base)<1 ){.     
2e00: 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20   /* If zName is 
2e10: 74 68 65 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65  the not the name
2e20: 20 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 74   of a table in t
2e30: 68 65 20 73 63 68 65 6d 61 20 63 72 65 61 74 65  he schema create
2e40: 64 20 75 73 69 6e 67 0a 20 20 20 20 20 20 2a 2a  d using.      **
2e50: 20 43 52 45 41 54 45 2c 20 74 68 65 6e 20 63 68   CREATE, then ch
2e60: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2e70: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2e80: 61 6e 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  an virtual table
2e90: 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63   that.      ** c
2ea0: 61 6e 20 62 65 20 61 6e 20 65 70 6f 6e 79 6d 6f  an be an eponymo
2eb0: 75 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  us virtual table
2ec0: 2e 20 2a 2f 0a 20 20 20 20 20 20 4d 6f 64 75 6c  . */.      Modul
2ed0: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
2ee0: 65 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  e*)sqlite3HashFi
2ef0: 6e 64 28 26 70 50 61 72 73 65 2d 3e 64 62 2d 3e  nd(&pParse->db->
2f00: 61 4d 6f 64 75 6c 65 2c 20 7a 4e 61 6d 65 29 3b  aModule, zName);
2f10: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 6f 64 20  .      if( pMod 
2f20: 26 26 20 73 71 6c 69 74 65 33 56 74 61 62 45 70  && sqlite3VtabEp
2f30: 6f 6e 79 6d 6f 75 73 54 61 62 6c 65 49 6e 69 74  onymousTableInit
2f40: 28 70 50 61 72 73 65 2c 20 70 4d 6f 64 29 20 29  (pParse, pMod) )
2f50: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2f60: 20 70 4d 6f 64 2d 3e 70 45 70 6f 54 61 62 3b 0a   pMod->pEpoTab;.
2f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
2f80: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 7a 44 62  ndif.    if( zDb
2f90: 61 73 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ase ){.      sql
2fa0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
2fb0: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
2fc0: 2c 20 7a 4d 73 67 2c 20 7a 44 62 61 73 65 2c 20  , zMsg, zDbase, 
2fd0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73  zName);.    }els
2fe0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2ff0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
3000: 20 22 25 73 3a 20 25 73 22 2c 20 7a 4d 73 67 2c   "%s: %s", zMsg,
3010: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20   zName);.    }. 
3020: 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63 6b     pParse->check
3030: 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 7d 0a  Schema = 1;.  }.
3040: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3050: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65  /*.** Locate the
3060: 20 74 61 62 6c 65 20 69 64 65 6e 74 69 66 69 65   table identifie
3070: 64 20 62 79 20 2a 70 2e 0a 2a 2a 0a 2a 2a 20 54  d by *p..**.** T
3080: 68 69 73 20 69 73 20 61 20 77 72 61 70 70 65 72  his is a wrapper
3090: 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 4c   around sqlite3L
30a0: 6f 63 61 74 65 54 61 62 6c 65 28 29 2e 20 54 68  ocateTable(). Th
30b0: 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
30c0: 77 65 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 4c  ween.** sqlite3L
30d0: 6f 63 61 74 65 54 61 62 6c 65 28 29 20 61 6e 64  ocateTable() and
30e0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
30f0: 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
3100: 74 69 6f 6e 20 72 65 73 74 72 69 63 74 73 0a 2a  tion restricts.*
3110: 2a 20 74 68 65 20 73 65 61 72 63 68 20 74 6f 20  * the search to 
3120: 73 63 68 65 6d 61 20 28 70 2d 3e 70 53 63 68 65  schema (p->pSche
3130: 6d 61 29 20 69 66 20 69 74 20 69 73 20 6e 6f 74  ma) if it is not
3140: 20 4e 55 4c 4c 2e 20 70 2d 3e 70 53 63 68 65 6d   NULL. p->pSchem
3150: 61 20 6d 61 79 20 62 65 0a 2a 2a 20 6e 6f 6e 2d  a may be.** non-
3160: 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 20 70 61  NULL if it is pa
3170: 72 74 20 6f 66 20 61 20 76 69 65 77 20 6f 72 20  rt of a view or 
3180: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 20  trigger program 
3190: 64 65 66 69 6e 69 74 69 6f 6e 2e 20 53 65 65 0a  definition. See.
31a0: 2a 2a 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  ** sqlite3FixSrc
31b0: 4c 69 73 74 28 29 20 66 6f 72 20 64 65 74 61 69  List() for detai
31c0: 6c 73 2e 0a 2a 2f 0a 54 61 62 6c 65 20 2a 73 71  ls..*/.Table *sq
31d0: 6c 69 74 65 33 4c 6f 63 61 74 65 54 61 62 6c 65  lite3LocateTable
31e0: 49 74 65 6d 28 0a 20 20 50 61 72 73 65 20 2a 70  Item(.  Parse *p
31f0: 50 61 72 73 65 2c 20 0a 20 20 69 6e 74 20 69 73  Parse, .  int is
3200: 56 69 65 77 2c 20 0a 20 20 73 74 72 75 63 74 20  View, .  struct 
3210: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 0a  SrcList_item *p.
3220: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
3230: 2a 7a 44 62 3b 0a 20 20 61 73 73 65 72 74 28 20  *zDb;.  assert( 
3240: 70 2d 3e 70 53 63 68 65 6d 61 3d 3d 30 20 7c 7c  p->pSchema==0 ||
3250: 20 70 2d 3e 7a 44 61 74 61 62 61 73 65 3d 3d 30   p->zDatabase==0
3260: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 53 63   );.  if( p->pSc
3270: 68 65 6d 61 20 29 7b 0a 20 20 20 20 69 6e 74 20  hema ){.    int 
3280: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
3290: 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73  emaToIndex(pPars
32a0: 65 2d 3e 64 62 2c 20 70 2d 3e 70 53 63 68 65 6d  e->db, p->pSchem
32b0: 61 29 3b 0a 20 20 20 20 7a 44 62 20 3d 20 70 50  a);.    zDb = pP
32c0: 61 72 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44  arse->db->aDb[iD
32d0: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 65 6c 73  b].zName;.  }els
32e0: 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20 70 2d 3e  e{.    zDb = p->
32f0: 7a 44 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  zDatabase;.  }. 
3300: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4c   return sqlite3L
3310: 6f 63 61 74 65 54 61 62 6c 65 28 70 50 61 72 73  ocateTable(pPars
3320: 65 2c 20 69 73 56 69 65 77 2c 20 70 2d 3e 7a 4e  e, isView, p->zN
3330: 61 6d 65 2c 20 7a 44 62 29 3b 0a 7d 0a 0a 2f 2a  ame, zDb);.}../*
3340: 0a 2a 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 69  .** Locate the i
3350: 6e 2d 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75  n-memory structu
3360: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
3370: 73 20 0a 2a 2a 20 61 20 70 61 72 74 69 63 75 6c  s .** a particul
3380: 61 72 20 69 6e 64 65 78 20 67 69 76 65 6e 20 74  ar index given t
3390: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 61 74 20  he name of that 
33a0: 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20 74 68 65  index.** and the
33b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
33c0: 61 62 61 73 65 20 74 68 61 74 20 63 6f 6e 74 61  abase that conta
33d0: 69 6e 73 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a  ins the index..*
33e0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
33f0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2a 0a 2a   not found..**.*
3400: 2a 20 49 66 20 7a 44 61 74 61 62 61 73 65 20 69  * If zDatabase i
3410: 73 20 30 2c 20 61 6c 6c 20 64 61 74 61 62 61 73  s 0, all databas
3420: 65 73 20 61 72 65 20 73 65 61 72 63 68 65 64 20  es are searched 
3430: 66 6f 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  for the.** table
3440: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 6d   and the first m
3450: 61 74 63 68 69 6e 67 20 69 6e 64 65 78 20 69 73  atching index is
3460: 20 72 65 74 75 72 6e 65 64 2e 20 20 28 4e 6f 20   returned.  (No 
3470: 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 66 6f 72 20  checking.** for 
3480: 64 75 70 6c 69 63 61 74 65 20 69 6e 64 65 78 20  duplicate index 
3490: 6e 61 6d 65 73 20 69 73 20 64 6f 6e 65 2e 29 20  names is done.) 
34a0: 20 54 68 65 20 73 65 61 72 63 68 20 6f 72 64 65   The search orde
34b0: 72 20 69 73 0a 2a 2a 20 54 45 4d 50 20 66 69 72  r is.** TEMP fir
34c0: 73 74 2c 20 74 68 65 6e 20 4d 41 49 4e 2c 20 74  st, then MAIN, t
34d0: 68 65 6e 20 61 6e 79 20 61 75 78 69 6c 69 61 72  hen any auxiliar
34e0: 79 20 64 61 74 61 62 61 73 65 73 20 61 64 64 65  y databases adde
34f0: 64 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41  d.** using the A
3500: 54 54 41 43 48 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  TTACH command..*
3510: 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33  /.Index *sqlite3
3520: 46 69 6e 64 49 6e 64 65 78 28 73 71 6c 69 74 65  FindIndex(sqlite
3530: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
3540: 72 20 2a 7a 4e 61 6d 65 2c 20 63 6f 6e 73 74 20  r *zName, const 
3550: 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 49 6e  char *zDb){.  In
3560: 64 65 78 20 2a 70 20 3d 20 30 3b 0a 20 20 69 6e  dex *p = 0;.  in
3570: 74 20 69 3b 0a 20 20 2f 2a 20 41 6c 6c 20 6d 75  t i;.  /* All mu
3580: 74 65 78 65 73 20 61 72 65 20 72 65 71 75 69 72  texes are requir
3590: 65 64 20 66 6f 72 20 73 63 68 65 6d 61 20 61 63  ed for schema ac
35a0: 63 65 73 73 2e 20 20 4d 61 6b 65 20 73 75 72 65  cess.  Make sure
35b0: 20 77 65 20 68 6f 6c 64 20 74 68 65 6d 2e 20 2a   we hold them. *
35c0: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 44 62 21  /.  assert( zDb!
35d0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72  =0 || sqlite3Btr
35e0: 65 65 48 6f 6c 64 73 41 6c 6c 4d 75 74 65 78 65  eeHoldsAllMutexe
35f0: 73 28 64 62 29 20 29 3b 0a 20 20 66 6f 72 28 69  s(db) );.  for(i
3600: 3d 4f 4d 49 54 5f 54 45 4d 50 44 42 3b 20 69 3c  =OMIT_TEMPDB; i<
3610: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
3620: 20 20 20 69 6e 74 20 6a 20 3d 20 28 69 3c 32 29     int j = (i<2)
3630: 20 3f 20 69 5e 31 20 3a 20 69 3b 20 20 2f 2a 20   ? i^1 : i;  /* 
3640: 53 65 61 72 63 68 20 54 45 4d 50 20 62 65 66 6f  Search TEMP befo
3650: 72 65 20 4d 41 49 4e 20 2a 2f 0a 20 20 20 20 53  re MAIN */.    S
3660: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
3670: 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 53 63 68   db->aDb[j].pSch
3680: 65 6d 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ema;.    assert(
3690: 20 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20   pSchema );.    
36a0: 69 66 28 20 7a 44 62 20 26 26 20 73 71 6c 69 74  if( zDb && sqlit
36b0: 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c 20 64  e3StrICmp(zDb, d
36c0: 62 2d 3e 61 44 62 5b 6a 5d 2e 7a 4e 61 6d 65 29  b->aDb[j].zName)
36d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
36e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
36f0: 53 63 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28  SchemaMutexHeld(
3700: 64 62 2c 20 6a 2c 20 30 29 20 29 3b 0a 20 20 20  db, j, 0) );.   
3710: 20 70 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68   p = sqlite3Hash
3720: 46 69 6e 64 28 26 70 53 63 68 65 6d 61 2d 3e 69  Find(&pSchema->i
3730: 64 78 48 61 73 68 2c 20 7a 4e 61 6d 65 29 3b 0a  dxHash, zName);.
3740: 20 20 20 20 69 66 28 20 70 20 29 20 62 72 65 61      if( p ) brea
3750: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
3760: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6c  p;.}../*.** Recl
3770: 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 75  aim the memory u
3780: 73 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 0a  sed by an index.
3790: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
37a0: 72 65 65 49 6e 64 65 78 28 73 71 6c 69 74 65 33  reeIndex(sqlite3
37b0: 20 2a 64 62 2c 20 49 6e 64 65 78 20 2a 70 29 7b   *db, Index *p){
37c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
37d0: 4f 4d 49 54 5f 41 4e 41 4c 59 5a 45 0a 20 20 73  OMIT_ANALYZE.  s
37e0: 71 6c 69 74 65 33 44 65 6c 65 74 65 49 6e 64 65  qlite3DeleteInde
37f0: 78 53 61 6d 70 6c 65 73 28 64 62 2c 20 70 29 3b  xSamples(db, p);
3800: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
3810: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
3820: 70 2d 3e 70 50 61 72 74 49 64 78 57 68 65 72 65  p->pPartIdxWhere
3830: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
3840: 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
3850: 2d 3e 61 43 6f 6c 45 78 70 72 29 3b 0a 20 20 73  ->aColExpr);.  s
3860: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3870: 20 70 2d 3e 7a 43 6f 6c 41 66 66 29 3b 0a 20 20   p->zColAff);.  
3880: 69 66 28 20 70 2d 3e 69 73 52 65 73 69 7a 65 64  if( p->isResized
3890: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
38a0: 28 64 62 2c 20 28 76 6f 69 64 20 2a 29 70 2d 3e  (db, (void *)p->
38b0: 61 7a 43 6f 6c 6c 29 3b 0a 23 69 66 64 65 66 20  azColl);.#ifdef 
38c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
38d0: 41 54 33 5f 4f 52 5f 53 54 41 54 34 0a 20 20 73  AT3_OR_STAT4.  s
38e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
38f0: 69 52 6f 77 45 73 74 29 3b 0a 23 65 6e 64 69 66  iRowEst);.#endif
3900: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
3910: 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (db, p);.}../*.*
3920: 2a 20 46 6f 72 20 74 68 65 20 69 6e 64 65 78 20  * For the index 
3930: 63 61 6c 6c 65 64 20 7a 49 64 78 4e 61 6d 65 20  called zIdxName 
3940: 77 68 69 63 68 20 69 73 20 66 6f 75 6e 64 20 69  which is found i
3950: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  n the database i
3960: 44 62 2c 0a 2a 2a 20 75 6e 6c 69 6b 65 20 74 68  Db,.** unlike th
3970: 61 74 20 69 6e 64 65 78 20 66 72 6f 6d 20 69 74  at index from it
3980: 73 20 54 61 62 6c 65 20 74 68 65 6e 20 72 65 6d  s Table then rem
3990: 6f 76 65 20 74 68 65 20 69 6e 64 65 78 20 66 72  ove the index fr
39a0: 6f 6d 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20  om.** the index 
39b0: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 66  hash table and f
39c0: 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 73  ree all memory s
39d0: 74 72 75 63 74 75 72 65 73 20 61 73 73 6f 63 69  tructures associ
39e0: 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
39f0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
3a00: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
3a10: 44 65 6c 65 74 65 49 6e 64 65 78 28 73 71 6c 69  DeleteIndex(sqli
3a20: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
3a30: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49  , const char *zI
3a40: 64 78 4e 61 6d 65 29 7b 0a 20 20 49 6e 64 65 78  dxName){.  Index
3a50: 20 2a 70 49 6e 64 65 78 3b 0a 20 20 48 61 73 68   *pIndex;.  Hash
3a60: 20 2a 70 48 61 73 68 3b 0a 0a 20 20 61 73 73 65   *pHash;..  asse
3a70: 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d  rt( sqlite3Schem
3a80: 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69  aMutexHeld(db, i
3a90: 44 62 2c 20 30 29 20 29 3b 0a 20 20 70 48 61 73  Db, 0) );.  pHas
3aa0: 68 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62  h = &db->aDb[iDb
3ab0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48 61  ].pSchema->idxHa
3ac0: 73 68 3b 0a 20 20 70 49 6e 64 65 78 20 3d 20 73  sh;.  pIndex = s
3ad0: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
3ae0: 28 70 48 61 73 68 2c 20 7a 49 64 78 4e 61 6d 65  (pHash, zIdxName
3af0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  , 0);.  if( ALWA
3b00: 59 53 28 70 49 6e 64 65 78 29 20 29 7b 0a 20 20  YS(pIndex) ){.  
3b10: 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 70 54    if( pIndex->pT
3b20: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3d 3d 70 49  able->pIndex==pI
3b30: 6e 64 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49  ndex ){.      pI
3b40: 6e 64 65 78 2d 3e 70 54 61 62 6c 65 2d 3e 70 49  ndex->pTable->pI
3b50: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 2d 3e 70  ndex = pIndex->p
3b60: 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
3b70: 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 3b  .      Index *p;
3b80: 0a 20 20 20 20 20 20 2f 2a 20 4a 75 73 74 69 66  .      /* Justif
3b90: 69 63 61 74 69 6f 6e 20 6f 66 20 41 4c 57 41 59  ication of ALWAY
3ba0: 53 28 29 3b 20 20 54 68 65 20 69 6e 64 65 78 20  S();  The index 
3bb0: 6d 75 73 74 20 62 65 20 6f 6e 20 74 68 65 20 6c  must be on the l
3bc0: 69 73 74 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20  ist of.      ** 
3bd0: 69 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20  indices. */.    
3be0: 20 20 70 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54    p = pIndex->pT
3bf0: 61 62 6c 65 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  able->pIndex;.  
3c00: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
3c10: 53 28 70 29 20 26 26 20 70 2d 3e 70 4e 65 78 74  S(p) && p->pNext
3c20: 21 3d 70 49 6e 64 65 78 20 29 7b 20 70 20 3d 20  !=pIndex ){ p = 
3c30: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
3c40: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 20 26    if( ALWAYS(p &
3c50: 26 20 70 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 64  & p->pNext==pInd
3c60: 65 78 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ex) ){.        p
3c70: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 64 65 78  ->pNext = pIndex
3c80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
3c90: 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 49  .    }.    freeI
3ca0: 6e 64 65 78 28 64 62 2c 20 70 49 6e 64 65 78 29  ndex(db, pIndex)
3cb0: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 66 6c 61 67  ;.  }.  db->flag
3cc0: 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e 74 65  s |= SQLITE_Inte
3cd0: 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a 2f 2a  rnChanges;.}../*
3ce0: 0a 2a 2a 20 4c 6f 6f 6b 20 74 68 72 6f 75 67 68  .** Look through
3cf0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 6f 70 65   the list of ope
3d00: 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  n database files
3d10: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 61 6e   in db->aDb[] an
3d20: 64 20 69 66 0a 2a 2a 20 61 6e 79 20 68 61 76 65  d if.** any have
3d30: 20 62 65 65 6e 20 63 6c 6f 73 65 64 2c 20 72 65   been closed, re
3d40: 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 20 74  move them from t
3d50: 68 65 20 6c 69 73 74 2e 20 20 52 65 61 6c 6c 6f  he list.  Reallo
3d60: 63 61 74 65 20 74 68 65 0a 2a 2a 20 64 62 2d 3e  cate the.** db->
3d70: 61 44 62 5b 5d 20 73 74 72 75 63 74 75 72 65 20  aDb[] structure 
3d80: 74 6f 20 61 20 73 6d 61 6c 6c 65 72 20 73 69 7a  to a smaller siz
3d90: 65 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a  e, if possible..
3da0: 2a 2a 0a 2a 2a 20 45 6e 74 72 79 20 30 20 28 74  **.** Entry 0 (t
3db0: 68 65 20 22 6d 61 69 6e 22 20 64 61 74 61 62 61  he "main" databa
3dc0: 73 65 29 20 61 6e 64 20 65 6e 74 72 79 20 31 20  se) and entry 1 
3dd0: 28 74 68 65 20 22 74 65 6d 70 22 20 64 61 74 61  (the "temp" data
3de0: 62 61 73 65 29 0a 2a 2a 20 61 72 65 20 6e 65 76  base).** are nev
3df0: 65 72 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f  er candidates fo
3e00: 72 20 62 65 69 6e 67 20 63 6f 6c 6c 61 70 73 65  r being collapse
3e10: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
3e20: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
3e30: 73 65 41 72 72 61 79 28 73 71 6c 69 74 65 33 20  seArray(sqlite3 
3e40: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  *db){.  int i, j
3e50: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 32 3b 20 69  ;.  for(i=j=2; i
3e60: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
3e70: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
3e80: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 5d  Db = &db->aDb[i]
3e90: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
3ea0: 42 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Bt==0 ){.      s
3eb0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
3ec0: 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20   pDb->zName);.  
3ed0: 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 20 3d      pDb->zName =
3ee0: 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
3ef0: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
3f00: 28 20 6a 3c 69 20 29 7b 0a 20 20 20 20 20 20 64  ( j<i ){.      d
3f10: 62 2d 3e 61 44 62 5b 6a 5d 20 3d 20 64 62 2d 3e  b->aDb[j] = db->
3f20: 61 44 62 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  aDb[i];.    }.  
3f30: 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20 64 62 2d    j++;.  }.  db-
3f40: 3e 6e 44 62 20 3d 20 6a 3b 0a 20 20 69 66 28 20  >nDb = j;.  if( 
3f50: 64 62 2d 3e 6e 44 62 3c 3d 32 20 26 26 20 64 62  db->nDb<=2 && db
3f60: 2d 3e 61 44 62 21 3d 64 62 2d 3e 61 44 62 53 74  ->aDb!=db->aDbSt
3f70: 61 74 69 63 20 29 7b 0a 20 20 20 20 6d 65 6d 63  atic ){.    memc
3f80: 70 79 28 64 62 2d 3e 61 44 62 53 74 61 74 69 63  py(db->aDbStatic
3f90: 2c 20 64 62 2d 3e 61 44 62 2c 20 32 2a 73 69 7a  , db->aDb, 2*siz
3fa0: 65 6f 66 28 64 62 2d 3e 61 44 62 5b 30 5d 29 29  eof(db->aDb[0]))
3fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
3fc0: 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44 62 29  ree(db, db->aDb)
3fd0: 3b 0a 20 20 20 20 64 62 2d 3e 61 44 62 20 3d 20  ;.    db->aDb = 
3fe0: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 20  db->aDbStatic;. 
3ff0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 65   }.}../*.** Rese
4000: 74 20 74 68 65 20 73 63 68 65 6d 61 20 66 6f 72  t the schema for
4010: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74   the database at
4020: 20 69 6e 64 65 78 20 69 44 62 2e 20 20 41 6c 73   index iDb.  Als
4030: 6f 20 72 65 73 65 74 20 74 68 65 0a 2a 2a 20 54  o reset the.** T
4040: 45 4d 50 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 76  EMP schema..*/.v
4050: 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73 65 74  oid sqlite3Reset
4060: 4f 6e 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65  OneSchema(sqlite
4070: 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 29 7b  3 *db, int iDb){
4080: 0a 20 20 44 62 20 2a 70 44 62 3b 0a 20 20 61 73  .  Db *pDb;.  as
4090: 73 65 72 74 28 20 69 44 62 3c 64 62 2d 3e 6e 44  sert( iDb<db->nD
40a0: 62 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 73 65 20  b );..  /* Case 
40b0: 31 3a 20 20 52 65 73 65 74 20 74 68 65 20 73 69  1:  Reset the si
40c0: 6e 67 6c 65 20 73 63 68 65 6d 61 20 69 64 65 6e  ngle schema iden
40d0: 74 69 66 69 65 64 20 62 79 20 69 44 62 20 2a 2f  tified by iDb */
40e0: 0a 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44  .  pDb = &db->aD
40f0: 62 5b 69 44 62 5d 3b 0a 20 20 61 73 73 65 72 74  b[iDb];.  assert
4100: 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d  ( sqlite3SchemaM
4110: 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62  utexHeld(db, iDb
4120: 2c 20 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  , 0) );.  assert
4130: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d  ( pDb->pSchema!=
4140: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63  0 );.  sqlite3Sc
4150: 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d 3e 70  hemaClear(pDb->p
4160: 53 63 68 65 6d 61 29 3b 0a 0a 20 20 2f 2a 20 49  Schema);..  /* I
4170: 66 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 6f  f any database o
4180: 74 68 65 72 20 74 68 61 6e 20 54 45 4d 50 20 69  ther than TEMP i
4190: 73 20 72 65 73 65 74 2c 20 74 68 65 6e 20 61 6c  s reset, then al
41a0: 73 6f 20 72 65 73 65 74 20 54 45 4d 50 0a 20 20  so reset TEMP.  
41b0: 2a 2a 20 73 69 6e 63 65 20 54 45 4d 50 20 6d 69  ** since TEMP mi
41c0: 67 68 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 74  ght be holding t
41d0: 72 69 67 67 65 72 73 20 74 68 61 74 20 72 65 66  riggers that ref
41e0: 65 72 65 6e 63 65 20 74 61 62 6c 65 73 20 69 6e  erence tables in
41f0: 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20   the.  ** other 
4200: 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20  database..  */. 
4210: 20 69 66 28 20 69 44 62 21 3d 31 20 29 7b 0a 20   if( iDb!=1 ){. 
4220: 20 20 20 70 44 62 20 3d 20 26 64 62 2d 3e 61 44     pDb = &db->aD
4230: 62 5b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  b[1];.    assert
4240: 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 21 3d  ( pDb->pSchema!=
4250: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
4260: 53 63 68 65 6d 61 43 6c 65 61 72 28 70 44 62 2d  SchemaClear(pDb-
4270: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  >pSchema);.  }. 
4280: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a   return;.}../*.*
4290: 2a 20 45 72 61 73 65 20 61 6c 6c 20 73 63 68 65  * Erase all sche
42a0: 6d 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ma information f
42b0: 72 6f 6d 20 61 6c 6c 20 61 74 74 61 63 68 65 64  rom all attached
42c0: 20 64 61 74 61 62 61 73 65 73 20 28 69 6e 63 6c   databases (incl
42d0: 75 64 69 6e 67 0a 2a 2a 20 22 6d 61 69 6e 22 20  uding.** "main" 
42e0: 61 6e 64 20 22 74 65 6d 70 22 29 20 66 6f 72 20  and "temp") for 
42f0: 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
4300: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
4310: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65 73  .void sqlite3Res
4320: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
4330: 6e 6e 65 63 74 69 6f 6e 28 73 71 6c 69 74 65 33  nnection(sqlite3
4340: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *db){.  int i;.
4350: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
4360: 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f  terAll(db);.  fo
4370: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
4380: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 44 62 20 2a  ; i++){.    Db *
4390: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
43a0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
43b0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
43c0: 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c   sqlite3SchemaCl
43d0: 65 61 72 28 70 44 62 2d 3e 70 53 63 68 65 6d 61  ear(pDb->pSchema
43e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 64  );.    }.  }.  d
43f0: 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c  b->flags &= ~SQL
4400: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
4410: 73 3b 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62  s;.  sqlite3Vtab
4420: 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a  UnlockList(db);.
4430: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
4440: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71  aveAll(db);.  sq
4450: 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74  lite3CollapseDat
4460: 61 62 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a  abaseArray(db);.
4470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
4480: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
4490: 77 68 65 6e 20 61 20 63 6f 6d 6d 69 74 20 6f 63  when a commit oc
44a0: 63 75 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  curs..*/.void sq
44b0: 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72  lite3CommitInter
44c0: 6e 61 6c 43 68 61 6e 67 65 73 28 73 71 6c 69 74  nalChanges(sqlit
44d0: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 66  e3 *db){.  db->f
44e0: 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
44f0: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d  InternChanges;.}
4500: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 6d  ../*.** Delete m
4510: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
4520: 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  for the column n
4530: 61 6d 65 73 20 6f 66 20 61 20 74 61 62 6c 65 20  ames of a table 
4540: 6f 72 20 76 69 65 77 20 28 74 68 65 0a 2a 2a 20  or view (the.** 
4550: 54 61 62 6c 65 2e 61 43 6f 6c 5b 5d 20 61 72 72  Table.aCol[] arr
4560: 61 79 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ay)..*/.void sql
4570: 69 74 65 33 44 65 6c 65 74 65 43 6f 6c 75 6d 6e  ite3DeleteColumn
4580: 4e 61 6d 65 73 28 73 71 6c 69 74 65 33 20 2a 64  Names(sqlite3 *d
4590: 62 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 6c 65  b, Table *pTable
45a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 43 6f  ){.  int i;.  Co
45b0: 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 61 73  lumn *pCol;.  as
45c0: 73 65 72 74 28 20 70 54 61 62 6c 65 21 3d 30 20  sert( pTable!=0 
45d0: 29 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c 20 3d  );.  if( (pCol =
45e0: 20 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 29 21 3d   pTable->aCol)!=
45f0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
4600: 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
4610: 3b 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; i++, pCol++){.
4620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4630: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 4e  ree(db, pCol->zN
4640: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
4650: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
4660: 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c 74 29 3b 0a  , pCol->pDflt);.
4670: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
4680: 72 65 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 7a 44  ree(db, pCol->zD
4690: 66 6c 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  flt);.      sqli
46a0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 43  te3DbFree(db, pC
46b0: 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a 20 20 20 20  ol->zType);.    
46c0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
46d0: 64 62 2c 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 29  db, pCol->zColl)
46e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
46f0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
4700: 61 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d  able->aCol);.  }
4710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
4720: 20 74 68 65 20 6d 65 6d 6f 72 79 20 64 61 74 61   the memory data
4730: 20 73 74 72 75 63 74 75 72 65 73 20 61 73 73 6f   structures asso
4740: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4750: 67 69 76 65 6e 0a 2a 2a 20 54 61 62 6c 65 2e 20  given.** Table. 
4760: 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
4770: 6d 61 64 65 20 74 6f 20 64 69 73 6b 20 62 79 20  made to disk by 
4780: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a  this routine..**
4790: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
47a0: 20 6a 75 73 74 20 64 65 6c 65 74 65 73 20 74 68   just deletes th
47b0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
47c0: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 75  .  It does not u
47d0: 6e 6c 69 6e 6b 0a 2a 2a 20 74 68 65 20 74 61 62  nlink.** the tab
47e0: 6c 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  le data structur
47f0: 65 20 66 72 6f 6d 20 74 68 65 20 68 61 73 68 20  e from the hash 
4800: 74 61 62 6c 65 2e 20 20 42 75 74 20 69 74 20 64  table.  But it d
4810: 6f 65 73 20 64 65 73 74 72 6f 79 0a 2a 2a 20 6d  oes destroy.** m
4820: 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65 73  emory structures
4830: 20 6f 66 20 74 68 65 20 69 6e 64 69 63 65 73 20   of the indices 
4840: 61 6e 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  and foreign keys
4850: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4860: 20 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 2e 0a   .** the table..
4870: 2a 2a 0a 2a 2a 20 54 68 65 20 64 62 20 70 61 72  **.** The db par
4880: 61 6d 65 74 65 72 20 69 73 20 6f 70 74 69 6f 6e  ameter is option
4890: 61 6c 2e 20 20 49 74 20 69 73 20 6e 65 65 64 65  al.  It is neede
48a0: 64 20 69 66 20 74 68 65 20 54 61 62 6c 65 20 6f  d if the Table o
48b0: 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 6e 74 61 69  bject .** contai
48c0: 6e 73 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  ns lookaside mem
48d0: 6f 72 79 2e 20 20 28 54 61 62 6c 65 20 6f 62 6a  ory.  (Table obj
48e0: 65 63 74 73 20 69 6e 20 74 68 65 20 73 63 68 65  ects in the sche
48f0: 6d 61 20 64 6f 20 6e 6f 74 20 75 73 65 0a 2a 2a  ma do not use.**
4900: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4910: 79 2c 20 62 75 74 20 73 6f 6d 65 20 65 70 68 65  y, but some ephe
4920: 6d 65 72 61 6c 20 54 61 62 6c 65 20 6f 62 6a 65  meral Table obje
4930: 63 74 73 20 64 6f 2e 29 20 20 4f 72 20 74 68 65  cts do.)  Or the
4940: 0a 2a 2a 20 64 62 20 70 61 72 61 6d 65 74 65 72  .** db parameter
4950: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 69 74   can be used wit
4960: 68 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  h db->pnBytesFre
4970: 65 64 20 74 6f 20 6d 65 61 73 75 72 65 20 74 68  ed to measure th
4980: 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 75 73 65 64  e memory.** used
4990: 20 62 79 20 74 68 65 20 54 61 62 6c 65 20 6f 62   by the Table ob
49a0: 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ject..*/.void sq
49b0: 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65  lite3DeleteTable
49c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61  (sqlite3 *db, Ta
49d0: 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a 20 20  ble *pTable){.  
49e0: 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c 20 2a  Index *pIndex, *
49f0: 70 4e 65 78 74 3b 0a 20 20 54 45 53 54 4f 4e 4c  pNext;.  TESTONL
4a00: 59 28 20 69 6e 74 20 6e 4c 6f 6f 6b 61 73 69 64  Y( int nLookasid
4a10: 65 3b 20 29 20 2f 2a 20 55 73 65 64 20 74 6f 20  e; ) /* Used to 
4a20: 76 65 72 69 66 79 20 6c 6f 6f 6b 61 73 69 64 65  verify lookaside
4a30: 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 20 73 63   not used for sc
4a40: 68 65 6d 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72  hema */..  asser
4a50: 74 28 20 21 70 54 61 62 6c 65 20 7c 7c 20 70 54  t( !pTable || pT
4a60: 61 62 6c 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  able->nRef>0 );.
4a70: 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 65 6c  .  /* Do not del
4a80: 65 74 65 20 74 68 65 20 74 61 62 6c 65 20 75 6e  ete the table un
4a90: 74 69 6c 20 74 68 65 20 72 65 66 65 72 65 6e 63  til the referenc
4aa0: 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  e count reaches 
4ab0: 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 21  zero. */.  if( !
4ac0: 70 54 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b  pTable ) return;
4ad0: 0a 20 20 69 66 28 20 28 28 21 64 62 20 7c 7c 20  .  if( ((!db || 
4ae0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64  db->pnBytesFreed
4af0: 3d 3d 30 29 20 26 26 20 28 2d 2d 70 54 61 62 6c  ==0) && (--pTabl
4b00: 65 2d 3e 6e 52 65 66 29 3e 30 29 20 29 20 72 65  e->nRef)>0) ) re
4b10: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 52 65 63 6f  turn;..  /* Reco
4b20: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rd the number of
4b30: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 6f   outstanding loo
4b40: 6b 61 73 69 64 65 20 61 6c 6c 6f 63 61 74 69 6f  kaside allocatio
4b50: 6e 73 20 69 6e 20 73 63 68 65 6d 61 20 54 61 62  ns in schema Tab
4b60: 6c 65 73 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  les.  ** prior t
4b70: 6f 20 64 6f 69 6e 67 20 61 6e 79 20 66 72 65 65  o doing any free
4b80: 28 29 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 20  () operations.  
4b90: 53 69 6e 63 65 20 73 63 68 65 6d 61 20 54 61 62  Since schema Tab
4ba0: 6c 65 73 20 64 6f 20 6e 6f 74 20 75 73 65 0a 20  les do not use. 
4bb0: 20 2a 2a 20 6c 6f 6f 6b 61 73 69 64 65 2c 20 74   ** lookaside, t
4bc0: 68 69 73 20 6e 75 6d 62 65 72 20 73 68 6f 75 6c  his number shoul
4bd0: 64 20 6e 6f 74 20 63 68 61 6e 67 65 2e 20 2a 2f  d not change. */
4be0: 0a 20 20 54 45 53 54 4f 4e 4c 59 28 20 6e 4c 6f  .  TESTONLY( nLo
4bf0: 6f 6b 61 73 69 64 65 20 3d 20 28 64 62 20 26 26  okaside = (db &&
4c00: 20 28 70 54 61 62 6c 65 2d 3e 74 61 62 46 6c 61   (pTable->tabFla
4c10: 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61  gs & TF_Ephemera
4c20: 6c 29 3d 3d 30 29 20 3f 0a 20 20 20 20 20 20 20  l)==0) ?.       
4c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c40: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4c50: 6e 4f 75 74 20 3a 20 30 20 29 3b 0a 0a 20 20 2f  nOut : 0 );..  /
4c60: 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 64  * Delete all ind
4c70: 69 63 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ices associated 
4c80: 77 69 74 68 20 74 68 69 73 20 74 61 62 6c 65 2e  with this table.
4c90: 20 2a 2f 0a 20 20 66 6f 72 28 70 49 6e 64 65 78   */.  for(pIndex
4ca0: 20 3d 20 70 54 61 62 6c 65 2d 3e 70 49 6e 64 65   = pTable->pInde
4cb0: 78 3b 20 70 49 6e 64 65 78 3b 20 70 49 6e 64 65  x; pIndex; pInde
4cc0: 78 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  x=pNext){.    pN
4cd0: 65 78 74 20 3d 20 70 49 6e 64 65 78 2d 3e 70 4e  ext = pIndex->pN
4ce0: 65 78 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ext;.    assert(
4cf0: 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
4d00: 3d 3d 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d  ==pTable->pSchem
4d10: 61 20 29 3b 0a 20 20 20 20 69 66 28 20 21 64 62  a );.    if( !db
4d20: 20 7c 7c 20 64 62 2d 3e 70 6e 42 79 74 65 73 46   || db->pnBytesF
4d30: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
4d40: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 70   char *zName = p
4d50: 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 3b 20 0a 20  Index->zName; . 
4d60: 20 20 20 20 20 54 45 53 54 4f 4e 4c 59 20 28 20       TESTONLY ( 
4d70: 49 6e 64 65 78 20 2a 70 4f 6c 64 20 3d 20 29 20  Index *pOld = ) 
4d80: 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
4d90: 74 28 0a 20 20 20 20 20 20 20 20 20 26 70 49 6e  t(.         &pIn
4da0: 64 65 78 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64  dex->pSchema->id
4db0: 78 48 61 73 68 2c 20 7a 4e 61 6d 65 2c 20 30 0a  xHash, zName, 0.
4dc0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61        );.      a
4dd0: 73 73 65 72 74 28 20 64 62 3d 3d 30 20 7c 7c 20  ssert( db==0 || 
4de0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
4df0: 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70 49  exHeld(db, 0, pI
4e00: 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61 29 20 29  ndex->pSchema) )
4e10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4e20: 70 4f 6c 64 3d 3d 70 49 6e 64 65 78 20 7c 7c 20  pOld==pIndex || 
4e30: 70 4f 6c 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  pOld==0 );.    }
4e40: 0a 20 20 20 20 66 72 65 65 49 6e 64 65 78 28 64  .    freeIndex(d
4e50: 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a  b, pIndex);.  }.
4e60: 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79  .  /* Delete any
4e70: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 61 74   foreign keys at
4e80: 74 61 63 68 65 64 20 74 6f 20 74 68 69 73 20 74  tached to this t
4e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  able. */.  sqlit
4ea0: 65 33 46 6b 44 65 6c 65 74 65 28 64 62 2c 20 70  e3FkDelete(db, p
4eb0: 54 61 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 44 65  Table);..  /* De
4ec0: 6c 65 74 65 20 74 68 65 20 54 61 62 6c 65 20 73  lete the Table s
4ed0: 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2e  tructure itself.
4ee0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
4ef0: 65 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73  eleteColumnNames
4f00: 28 64 62 2c 20 70 54 61 62 6c 65 29 3b 0a 20 20  (db, pTable);.  
4f10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4f20: 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29  , pTable->zName)
4f30: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
4f40: 65 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 7a 43  e(db, pTable->zC
4f50: 6f 6c 41 66 66 29 3b 0a 20 20 73 71 6c 69 74 65  olAff);.  sqlite
4f60: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
4f70: 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c 65 63  , pTable->pSelec
4f80: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
4f90: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
4fa0: 70 54 61 62 6c 65 2d 3e 70 43 68 65 63 6b 29 3b  pTable->pCheck);
4fb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4fc0: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4fd0: 45 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 43  E.  sqlite3VtabC
4fe0: 6c 65 61 72 28 64 62 2c 20 70 54 61 62 6c 65 29  lear(db, pTable)
4ff0: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
5000: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54 61  e3DbFree(db, pTa
5010: 62 6c 65 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  ble);..  /* Veri
5020: 66 79 20 74 68 61 74 20 6e 6f 20 6c 6f 6f 6b 61  fy that no looka
5030: 73 69 64 65 20 6d 65 6d 6f 72 79 20 77 61 73 20  side memory was 
5040: 75 73 65 64 20 62 79 20 73 63 68 65 6d 61 20 74  used by schema t
5050: 61 62 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  ables */.  asser
5060: 74 28 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d 30  t( nLookaside==0
5070: 20 7c 7c 20 6e 4c 6f 6f 6b 61 73 69 64 65 3d 3d   || nLookaside==
5080: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
5090: 75 74 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  ut );.}../*.** U
50a0: 6e 6c 69 6e 6b 20 74 68 65 20 67 69 76 65 6e 20  nlink the given 
50b0: 74 61 62 6c 65 20 66 72 6f 6d 20 74 68 65 20 68  table from the h
50c0: 61 73 68 20 74 61 62 6c 65 73 20 61 6e 64 20 74  ash tables and t
50d0: 68 65 20 64 65 6c 65 74 65 20 74 68 65 0a 2a 2a  he delete the.**
50e0: 20 74 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   table structure
50f0: 20 77 69 74 68 20 61 6c 6c 20 69 74 73 20 69 6e   with all its in
5100: 64 69 63 65 73 20 61 6e 64 20 66 6f 72 65 69 67  dices and foreig
5110: 6e 20 6b 65 79 73 2e 0a 2a 2f 0a 76 6f 69 64 20  n keys..*/.void 
5120: 73 71 6c 69 74 65 33 55 6e 6c 69 6e 6b 41 6e 64  sqlite3UnlinkAnd
5130: 44 65 6c 65 74 65 54 61 62 6c 65 28 73 71 6c 69  DeleteTable(sqli
5140: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62  te3 *db, int iDb
5150: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
5160: 61 62 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  abName){.  Table
5170: 20 2a 70 3b 0a 20 20 44 62 20 2a 70 44 62 3b 0a   *p;.  Db *pDb;.
5180: 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
5190: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 44   );.  assert( iD
51a0: 62 3e 3d 30 20 26 26 20 69 44 62 3c 64 62 2d 3e  b>=0 && iDb<db->
51b0: 6e 44 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nDb );.  assert(
51c0: 20 7a 54 61 62 4e 61 6d 65 20 29 3b 0a 20 20 61   zTabName );.  a
51d0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63  ssert( sqlite3Sc
51e0: 68 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62  hemaMutexHeld(db
51f0: 2c 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 74  , iDb, 0) );.  t
5200: 65 73 74 63 61 73 65 28 20 7a 54 61 62 4e 61 6d  estcase( zTabNam
5210: 65 5b 30 5d 3d 3d 30 20 29 3b 20 20 2f 2a 20 5a  e[0]==0 );  /* Z
5220: 65 72 6f 2d 6c 65 6e 67 74 68 20 74 61 62 6c 65  ero-length table
5230: 20 6e 61 6d 65 73 20 61 72 65 20 61 6c 6c 6f 77   names are allow
5240: 65 64 20 2a 2f 0a 20 20 70 44 62 20 3d 20 26 64  ed */.  pDb = &d
5250: 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a 20 20 70  b->aDb[iDb];.  p
5260: 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e   = sqlite3HashIn
5270: 73 65 72 74 28 26 70 44 62 2d 3e 70 53 63 68 65  sert(&pDb->pSche
5280: 6d 61 2d 3e 74 62 6c 48 61 73 68 2c 20 7a 54 61  ma->tblHash, zTa
5290: 62 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 73 71 6c  bName, 0);.  sql
52a0: 69 74 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28  ite3DeleteTable(
52b0: 64 62 2c 20 70 29 3b 0a 20 20 64 62 2d 3e 66 6c  db, p);.  db->fl
52c0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 6e  ags |= SQLITE_In
52d0: 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 7d 0a 0a  ternChanges;.}..
52e0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 74 6f  /*.** Given a to
52f0: 6b 65 6e 2c 20 72 65 74 75 72 6e 20 61 20 73 74  ken, return a st
5300: 72 69 6e 67 20 74 68 61 74 20 63 6f 6e 73 69 73  ring that consis
5310: 74 73 20 6f 66 20 74 68 65 20 74 65 78 74 20 6f  ts of the text o
5320: 66 20 74 68 61 74 0a 2a 2a 20 74 6f 6b 65 6e 2e  f that.** token.
5330: 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
5340: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
5350: 69 6e 67 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ing.** is obtain
5360: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61  ed from sqliteMa
5370: 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
5380: 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
5390: 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
53a0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 71  ion..**.** Any q
53b0: 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 28  uotation marks (
53c0: 65 78 3a 20 20 22 6e 61 6d 65 22 2c 20 27 6e 61  ex:  "name", 'na
53d0: 6d 65 27 2c 20 5b 6e 61 6d 65 5d 2c 20 6f 72 20  me', [name], or 
53e0: 60 6e 61 6d 65 60 29 20 74 68 61 74 0a 2a 2a 20  `name`) that.** 
53f0: 73 75 72 72 6f 75 6e 64 20 74 68 65 20 62 6f 64  surround the bod
5400: 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 61  y of the token a
5410: 72 65 20 72 65 6d 6f 76 65 64 2e 0a 2a 2a 0a 2a  re removed..**.*
5420: 2a 20 54 6f 6b 65 6e 73 20 61 72 65 20 6f 66 74  * Tokens are oft
5430: 65 6e 20 6a 75 73 74 20 70 6f 69 6e 74 65 72 73  en just pointers
5440: 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
5450: 61 6c 20 53 51 4c 20 74 65 78 74 20 61 6e 64 20  al SQL text and 
5460: 73 6f 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 5c 30  so.** are not \0
5470: 30 30 20 74 65 72 6d 69 6e 61 74 65 64 20 61 6e  00 terminated an
5480: 64 20 61 72 65 20 6e 6f 74 20 70 65 72 73 69 73  d are not persis
5490: 74 65 6e 74 2e 20 20 54 68 65 20 72 65 74 75 72  tent.  The retur
54a0: 6e 65 64 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73  ned string.** is
54b0: 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 65 64   \000 terminated
54c0: 20 61 6e 64 20 69 73 20 70 65 72 73 69 73 74 65   and is persiste
54d0: 6e 74 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  nt..*/.char *sql
54e0: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
54f0: 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 54  n(sqlite3 *db, T
5500: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
5510: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69  char *zName;.  i
5520: 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( pName ){.    
5530: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44  zName = sqlite3D
5540: 62 53 74 72 4e 44 75 70 28 64 62 2c 20 28 63 68  bStrNDup(db, (ch
5550: 61 72 2a 29 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  ar*)pName->z, pN
5560: 61 6d 65 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c  ame->n);.    sql
5570: 69 74 65 33 44 65 71 75 6f 74 65 28 7a 4e 61 6d  ite3Dequote(zNam
5580: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
5590: 20 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a   zName = 0;.  }.
55a0: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
55b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  }../*.** Open th
55c0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
55d0: 74 61 62 6c 65 20 73 74 6f 72 65 64 20 69 6e 20  table stored in 
55e0: 64 61 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20  database number 
55f0: 69 44 62 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69  iDb for.** writi
5600: 6e 67 2e 20 54 68 65 20 74 61 62 6c 65 20 69 73  ng. The table is
5610: 20 6f 70 65 6e 65 64 20 75 73 69 6e 67 20 63 75   opened using cu
5620: 72 73 6f 72 20 30 2e 0a 2a 2f 0a 76 6f 69 64 20  rsor 0..*/.void 
5630: 73 71 6c 69 74 65 33 4f 70 65 6e 4d 61 73 74 65  sqlite3OpenMaste
5640: 72 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 2c  rTable(Parse *p,
5650: 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 56 64 62   int iDb){.  Vdb
5660: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
5670: 74 56 64 62 65 28 70 29 3b 0a 20 20 73 71 6c 69  tVdbe(p);.  sqli
5680: 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  te3TableLock(p, 
5690: 69 44 62 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  iDb, MASTER_ROOT
56a0: 2c 20 31 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c  , 1, SCHEMA_TABL
56b0: 45 28 69 44 62 29 29 3b 0a 20 20 73 71 6c 69 74  E(iDb));.  sqlit
56c0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
56d0: 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 2c  v, OP_OpenWrite,
56e0: 20 30 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c   0, MASTER_ROOT,
56f0: 20 69 44 62 2c 20 35 29 3b 0a 20 20 69 66 28 20   iDb, 5);.  if( 
5700: 70 2d 3e 6e 54 61 62 3d 3d 30 20 29 7b 0a 20 20  p->nTab==0 ){.  
5710: 20 20 70 2d 3e 6e 54 61 62 20 3d 20 31 3b 0a 20    p->nTab = 1;. 
5720: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61   }.}../*.** Para
5730: 6d 65 74 65 72 20 7a 4e 61 6d 65 20 70 6f 69 6e  meter zName poin
5740: 74 73 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  ts to a nul-term
5750: 69 6e 61 74 65 64 20 62 75 66 66 65 72 20 63 6f  inated buffer co
5760: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
5770: 65 0a 2a 2a 20 6f 66 20 61 20 64 61 74 61 62 61  e.** of a databa
5780: 73 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  se ("main", "tem
5790: 70 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f  p" or the name o
57a0: 66 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62  f an attached db
57b0: 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ). This.** funct
57c0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
57d0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d  index of the nam
57e0: 65 64 20 64 61 74 61 62 61 73 65 20 69 6e 20 64  ed database in d
57f0: 62 2d 3e 61 44 62 5b 5d 2c 20 6f 72 0a 2a 2a 20  b->aDb[], or.** 
5800: 2d 31 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  -1 if the named 
5810: 64 62 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  db cannot be fou
5820: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
5830: 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 73 71 6c  e3FindDbName(sql
5840: 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
5850: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
5860: 69 6e 74 20 69 20 3d 20 2d 31 3b 20 20 20 20 20  int i = -1;     
5870: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
5880: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 66 28 20  number */.  if( 
5890: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 44 62 20  zName ){.    Db 
58a0: 2a 70 44 62 3b 0a 20 20 20 20 69 6e 74 20 6e 20  *pDb;.    int n 
58b0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
58c0: 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f  0(zName);.    fo
58d0: 72 28 69 3d 28 64 62 2d 3e 6e 44 62 2d 31 29 2c  r(i=(db->nDb-1),
58e0: 20 70 44 62 3d 26 64 62 2d 3e 61 44 62 5b 69 5d   pDb=&db->aDb[i]
58f0: 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 44 62  ; i>=0; i--, pDb
5900: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
5910: 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 7c 7c 20  !OMIT_TEMPDB || 
5920: 69 21 3d 31 20 29 20 26 26 20 6e 3d 3d 73 71 6c  i!=1 ) && n==sql
5930: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
5940: 2d 3e 7a 4e 61 6d 65 29 20 26 26 20 0a 20 20 20  ->zName) && .   
5950: 20 20 20 20 20 20 20 30 3d 3d 73 71 6c 69 74 65         0==sqlite
5960: 33 53 74 72 49 43 6d 70 28 70 44 62 2d 3e 7a 4e  3StrICmp(pDb->zN
5970: 61 6d 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a 20  ame, zName) ){. 
5980: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
59a0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
59b0: 2a 0a 2a 2a 20 54 68 65 20 74 6f 6b 65 6e 20 2a  *.** The token *
59c0: 70 4e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 74  pName contains t
59d0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74  he name of a dat
59e0: 61 62 61 73 65 20 28 65 69 74 68 65 72 20 22 6d  abase (either "m
59f0: 61 69 6e 22 20 6f 72 0a 2a 2a 20 22 74 65 6d 70  ain" or.** "temp
5a00: 22 20 6f 72 20 74 68 65 20 6e 61 6d 65 20 6f 66  " or the name of
5a10: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 62 29   an attached db)
5a20: 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  . This routine r
5a30: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 69 6e  eturns the.** in
5a40: 64 65 78 20 6f 66 20 74 68 65 20 6e 61 6d 65 64  dex of the named
5a50: 20 64 61 74 61 62 61 73 65 20 69 6e 20 64 62 2d   database in db-
5a60: 3e 61 44 62 5b 5d 2c 20 6f 72 20 2d 31 20 69 66  >aDb[], or -1 if
5a70: 20 74 68 65 20 6e 61 6d 65 64 20 64 62 20 0a 2a   the named db .*
5a80: 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  * does not exist
5a90: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5aa0: 46 69 6e 64 44 62 28 73 71 6c 69 74 65 33 20 2a  FindDb(sqlite3 *
5ab0: 64 62 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65  db, Token *pName
5ac0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
5ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5af0: 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  abase number */.
5b00: 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20    char *zName;  
5b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 77         /* Name w
5b30: 65 20 61 72 65 20 73 65 61 72 63 68 69 6e 67 20  e are searching 
5b40: 66 6f 72 20 2a 2f 0a 20 20 7a 4e 61 6d 65 20 3d  for */.  zName =
5b50: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
5b60: 54 6f 6b 65 6e 28 64 62 2c 20 70 4e 61 6d 65 29  Token(db, pName)
5b70: 3b 0a 20 20 69 20 3d 20 73 71 6c 69 74 65 33 46  ;.  i = sqlite3F
5b80: 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20 7a 4e  indDbName(db, zN
5b90: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  ame);.  sqlite3D
5ba0: 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 29  bFree(db, zName)
5bb0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a  ;.  return i;.}.
5bc0: 0a 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6f 72  ./* The table or
5bd0: 20 76 69 65 77 20 6f 72 20 74 72 69 67 67 65 72   view or trigger
5be0: 20 6e 61 6d 65 20 69 73 20 70 61 73 73 65 64 20   name is passed 
5bf0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
5c00: 76 69 61 20 74 6f 6b 65 6e 73 0a 2a 2a 20 70 4e  via tokens.** pN
5c10: 61 6d 65 31 20 61 6e 64 20 70 4e 61 6d 65 32 2e  ame1 and pName2.
5c20: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 6e 61   If the table na
5c30: 6d 65 20 77 61 73 20 66 75 6c 6c 79 20 71 75 61  me was fully qua
5c40: 6c 69 66 69 65 64 2c 20 66 6f 72 20 65 78 61 6d  lified, for exam
5c50: 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ple:.**.** CREAT
5c60: 45 20 54 41 42 4c 45 20 78 78 78 2e 79 79 79 20  E TABLE xxx.yyy 
5c70: 28 2e 2e 2e 29 3b 0a 2a 2a 20 0a 2a 2a 20 54 68  (...);.** .** Th
5c80: 65 6e 20 70 4e 61 6d 65 31 20 69 73 20 73 65 74  en pName1 is set
5c90: 20 74 6f 20 22 78 78 78 22 20 61 6e 64 20 70 4e   to "xxx" and pN
5ca0: 61 6d 65 32 20 22 79 79 79 22 2e 20 4f 6e 20 74  ame2 "yyy". On t
5cb0: 68 65 20 6f 74 68 65 72 20 68 61 6e 64 20 69 66  he other hand if
5cc0: 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 6e 61  .** the table na
5cd0: 6d 65 20 69 73 20 6e 6f 74 20 66 75 6c 6c 79 20  me is not fully 
5ce0: 71 75 61 6c 69 66 69 65 64 2c 20 69 2e 65 2e 3a  qualified, i.e.:
5cf0: 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41  .**.** CREATE TA
5d00: 42 4c 45 20 79 79 79 28 2e 2e 2e 29 3b 0a 2a 2a  BLE yyy(...);.**
5d10: 0a 2a 2a 20 54 68 65 6e 20 70 4e 61 6d 65 31 20  .** Then pName1 
5d20: 69 73 20 73 65 74 20 74 6f 20 22 79 79 79 22 20  is set to "yyy" 
5d30: 61 6e 64 20 70 4e 61 6d 65 32 20 69 73 20 22 22  and pName2 is ""
5d40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5d50: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 2a 70  tine sets the *p
5d60: 70 55 6e 71 75 61 6c 20 70 6f 69 6e 74 65 72 20  pUnqual pointer 
5d70: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
5d80: 74 6f 6b 65 6e 20 28 70 4e 61 6d 65 31 20 6f 72  token (pName1 or
5d90: 0a 2a 2a 20 70 4e 61 6d 65 32 29 20 74 68 61 74  .** pName2) that
5da0: 20 73 74 6f 72 65 73 20 74 68 65 20 75 6e 71 75   stores the unqu
5db0: 61 6c 69 66 69 65 64 20 74 61 62 6c 65 20 6e 61  alified table na
5dc0: 6d 65 2e 20 20 54 68 65 20 69 6e 64 65 78 20 6f  me.  The index o
5dd0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
5de0: 65 20 22 78 78 78 22 20 69 73 20 72 65 74 75 72  e "xxx" is retur
5df0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
5e00: 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 0a  te3TwoPartName(.
5e10: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5e20: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
5e30: 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61   and code genera
5e40: 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
5e50: 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c    Token *pName1,
5e60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 78 78        /* The "xx
5e70: 78 22 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 22  x" in the name "
5e80: 78 78 78 2e 79 79 79 22 20 6f 72 20 22 78 78 78  xxx.yyy" or "xxx
5e90: 22 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  " */.  Token *pN
5ea0: 61 6d 65 32 2c 20 20 20 20 20 20 2f 2a 20 54 68  ame2,      /* Th
5eb0: 65 20 22 79 79 79 22 20 69 6e 20 74 68 65 20 6e  e "yyy" in the n
5ec0: 61 6d 65 20 22 78 78 78 2e 79 79 79 22 20 2a 2f  ame "xxx.yyy" */
5ed0: 0a 20 20 54 6f 6b 65 6e 20 2a 2a 70 55 6e 71 75  .  Token **pUnqu
5ee0: 61 6c 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  al     /* Write 
5ef0: 74 68 65 20 75 6e 71 75 61 6c 69 66 69 65 64 20  the unqualified 
5f00: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 68 65 72 65  object name here
5f10: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 44 62   */.){.  int iDb
5f20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5f30: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
5f40: 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 6f 62 6a   holding the obj
5f50: 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
5f60: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5f70: 62 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  b;..  assert( pN
5f80: 61 6d 65 32 21 3d 30 20 29 3b 0a 20 20 69 66 28  ame2!=0 );.  if(
5f90: 20 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 29 7b 0a   pName2->n>0 ){.
5fa0: 20 20 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74      if( db->init
5fb0: 2e 62 75 73 79 20 29 20 7b 0a 20 20 20 20 20 20  .busy ) {.      
5fc0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5fd0: 70 50 61 72 73 65 2c 20 22 63 6f 72 72 75 70 74  pParse, "corrupt
5fe0: 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 20   database");.   
5ff0: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
6000: 20 20 7d 0a 20 20 20 20 2a 70 55 6e 71 75 61 6c    }.    *pUnqual
6010: 20 3d 20 70 4e 61 6d 65 32 3b 0a 20 20 20 20 69   = pName2;.    i
6020: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
6030: 44 62 28 64 62 2c 20 70 4e 61 6d 65 31 29 3b 0a  Db(db, pName1);.
6040: 20 20 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b      if( iDb<0 ){
6050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
6060: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
6070: 75 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65  unknown database
6080: 20 25 54 22 2c 20 70 4e 61 6d 65 31 29 3b 0a 20   %T", pName1);. 
6090: 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
60a0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
60b0: 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 69     assert( db->i
60c0: 6e 69 74 2e 69 44 62 3d 3d 30 20 7c 7c 20 64 62  nit.iDb==0 || db
60d0: 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 3b 0a 20  ->init.busy );. 
60e0: 20 20 20 69 44 62 20 3d 20 64 62 2d 3e 69 6e 69     iDb = db->ini
60f0: 74 2e 69 44 62 3b 0a 20 20 20 20 2a 70 55 6e 71  t.iDb;.    *pUnq
6100: 75 61 6c 20 3d 20 70 4e 61 6d 65 31 3b 0a 20 20  ual = pName1;.  
6110: 7d 0a 20 20 72 65 74 75 72 6e 20 69 44 62 3b 0a  }.  return iDb;.
6120: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6130: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
6140: 20 63 68 65 63 6b 20 69 66 20 74 68 65 20 55 54   check if the UT
6150: 46 2d 38 20 73 74 72 69 6e 67 20 7a 4e 61 6d 65  F-8 string zName
6160: 20 69 73 20 61 20 6c 65 67 61 6c 0a 2a 2a 20 75   is a legal.** u
6170: 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20  nqualified name 
6180: 66 6f 72 20 61 20 6e 65 77 20 73 63 68 65 6d 61  for a new schema
6190: 20 6f 62 6a 65 63 74 20 28 74 61 62 6c 65 2c 20   object (table, 
61a0: 69 6e 64 65 78 2c 20 76 69 65 77 20 6f 72 0a 2a  index, view or.*
61b0: 2a 20 74 72 69 67 67 65 72 29 2e 20 41 6c 6c 20  * trigger). All 
61c0: 6e 61 6d 65 73 20 61 72 65 20 6c 65 67 61 6c 20  names are legal 
61d0: 65 78 63 65 70 74 20 74 68 6f 73 65 20 74 68 61  except those tha
61e0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  t begin with the
61f0: 20 73 74 72 69 6e 67 0a 2a 2a 20 22 73 71 6c 69   string.** "sqli
6200: 74 65 5f 22 20 28 69 6e 20 75 70 70 65 72 2c 20  te_" (in upper, 
6210: 6c 6f 77 65 72 20 6f 72 20 6d 69 78 65 64 20 63  lower or mixed c
6220: 61 73 65 29 2e 20 54 68 69 73 20 70 6f 72 74 69  ase). This porti
6230: 6f 6e 20 6f 66 20 74 68 65 20 6e 61 6d 65 73 70  on of the namesp
6240: 61 63 65 0a 2a 2a 20 69 73 20 72 65 73 65 72 76  ace.** is reserv
6250: 65 64 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ed for internal 
6260: 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
6270: 74 65 33 43 68 65 63 6b 4f 62 6a 65 63 74 4e 61  te3CheckObjectNa
6280: 6d 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  me(Parse *pParse
6290: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
62a0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 21 70 50 61  ame){.  if( !pPa
62b0: 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  rse->db->init.bu
62c0: 73 79 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65  sy && pParse->ne
62d0: 73 74 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20  sted==0 .       
62e0: 20 20 20 26 26 20 28 70 50 61 72 73 65 2d 3e 64     && (pParse->d
62f0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
6300: 45 5f 57 72 69 74 65 53 63 68 65 6d 61 29 3d 3d  E_WriteSchema)==
6310: 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 30  0.          && 0
6320: 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ==sqlite3StrNICm
6330: 70 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65  p(zName, "sqlite
6340: 5f 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 73 71  _", 7) ){.    sq
6350: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6360: 61 72 73 65 2c 20 22 6f 62 6a 65 63 74 20 6e 61  arse, "object na
6370: 6d 65 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  me reserved for 
6380: 69 6e 74 65 72 6e 61 6c 20 75 73 65 3a 20 25 73  internal use: %s
6390: 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  ", zName);.    r
63a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
63b0: 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
63c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
63d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
63e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
63f0: 78 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2f 0a  x of a table.*/.
6400: 49 6e 64 65 78 20 2a 73 71 6c 69 74 65 33 50 72  Index *sqlite3Pr
6410: 69 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 54 61  imaryKeyIndex(Ta
6420: 62 6c 65 20 2a 70 54 61 62 29 7b 0a 20 20 49 6e  ble *pTab){.  In
6430: 64 65 78 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  dex *p;.  for(p=
6440: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 20  pTab->pIndex; p 
6450: 26 26 20 21 49 73 50 72 69 6d 61 72 79 4b 65 79  && !IsPrimaryKey
6460: 49 6e 64 65 78 28 70 29 3b 20 70 3d 70 2d 3e 70  Index(p); p=p->p
6470: 4e 65 78 74 29 7b 7d 0a 20 20 72 65 74 75 72 6e  Next){}.  return
6480: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
6490: 75 72 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  urn the column o
64a0: 66 20 69 6e 64 65 78 20 70 49 64 78 20 74 68 61  f index pIdx tha
64b0: 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
64c0: 20 74 61 62 6c 65 0a 2a 2a 20 63 6f 6c 75 6d 6e   table.** column
64d0: 20 69 43 6f 6c 2e 20 20 52 65 74 75 72 6e 20 2d   iCol.  Return -
64e0: 31 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  1 if not found..
64f0: 2a 2f 0a 69 31 36 20 73 71 6c 69 74 65 33 43 6f  */.i16 sqlite3Co
6500: 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 49 6e 64 65  lumnOfIndex(Inde
6510: 78 20 2a 70 49 64 78 2c 20 69 31 36 20 69 43 6f  x *pIdx, i16 iCo
6520: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  l){.  int i;.  f
6530: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e  or(i=0; i<pIdx->
6540: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
6550: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 49 64     if( iCol==pId
6560: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 29  x->aiColumn[i] )
6570: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
6580: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
6590: 2a 0a 2a 2a 20 42 65 67 69 6e 20 63 6f 6e 73 74  *.** Begin const
65a0: 72 75 63 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ructing a new ta
65b0: 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
65c0: 6f 6e 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54  on in memory.  T
65d0: 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66 69  his is.** the fi
65e0: 72 73 74 20 6f 66 20 73 65 76 65 72 61 6c 20 61  rst of several a
65f0: 63 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 74  ction routines t
6600: 68 61 74 20 67 65 74 20 63 61 6c 6c 65 64 20 69  hat get called i
6610: 6e 20 72 65 73 70 6f 6e 73 65 0a 2a 2a 20 74 6f  n response.** to
6620: 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45 20   a CREATE TABLE 
6630: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 6e 20 70  statement.  In p
6640: 61 72 74 69 63 75 6c 61 72 2c 20 74 68 69 73 20  articular, this 
6650: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
6660: 64 0a 2a 2a 20 61 66 74 65 72 20 73 65 65 69 6e  d.** after seein
6670: 67 20 74 6f 6b 65 6e 73 20 22 43 52 45 41 54 45  g tokens "CREATE
6680: 22 20 61 6e 64 20 22 54 41 42 4c 45 22 20 61 6e  " and "TABLE" an
6690: 64 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  d the table name
66a0: 2e 20 54 68 65 20 69 73 54 65 6d 70 0a 2a 2a 20  . The isTemp.** 
66b0: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
66c0: 74 68 65 20 74 61 62 6c 65 20 73 68 6f 75 6c 64  the table should
66d0: 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68   be stored in th
66e0: 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
66f0: 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 6e 73  base.** file ins
6700: 74 65 61 64 20 6f 66 20 69 6e 20 74 68 65 20 6d  tead of in the m
6710: 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
6720: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
6730: 61 6c 6c 79 20 74 68 65 20 63 61 73 65 0a 2a 2a  ally the case.**
6740: 20 77 68 65 6e 20 74 68 65 20 22 54 45 4d 50 22   when the "TEMP"
6750: 20 6f 72 20 22 54 45 4d 50 4f 52 41 52 59 22 20   or "TEMPORARY" 
6760: 6b 65 79 77 6f 72 64 20 6f 63 63 75 72 73 20 69  keyword occurs i
6770: 6e 20 62 65 74 77 65 65 6e 0a 2a 2a 20 43 52 45  n between.** CRE
6780: 41 54 45 20 61 6e 64 20 54 41 42 4c 45 2e 0a 2a  ATE and TABLE..*
6790: 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 74 61 62  *.** The new tab
67a0: 6c 65 20 72 65 63 6f 72 64 20 69 73 20 69 6e 69  le record is ini
67b0: 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 70 75 74  tialized and put
67c0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 70 4e 65 77   in pParse->pNew
67d0: 54 61 62 6c 65 2e 0a 2a 2a 20 41 73 20 6d 6f 72  Table..** As mor
67e0: 65 20 6f 66 20 74 68 65 20 43 52 45 41 54 45 20  e of the CREATE 
67f0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 20  TABLE statement 
6800: 69 73 20 70 61 72 73 65 64 2c 20 61 64 64 69 74  is parsed, addit
6810: 69 6f 6e 61 6c 20 61 63 74 69 6f 6e 0a 2a 2a 20  ional action.** 
6820: 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 62 65  routines will be
6830: 20 63 61 6c 6c 65 64 20 74 6f 20 61 64 64 20 6d   called to add m
6840: 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
6850: 74 6f 20 74 68 69 73 20 72 65 63 6f 72 64 2e 0a  to this record..
6860: 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
6870: 20 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c   the CREATE TABL
6880: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
6890: 20 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65   sqlite3EndTable
68a0: 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  () routine.** is
68b0: 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c   called to compl
68c0: 65 74 65 20 74 68 65 20 63 6f 6e 73 74 72 75 63  ete the construc
68d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
68e0: 74 61 62 6c 65 20 72 65 63 6f 72 64 2e 0a 2a 2f  table record..*/
68f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 53 74 61  .void sqlite3Sta
6900: 72 74 54 61 62 6c 65 28 0a 20 20 50 61 72 73 65  rtTable(.  Parse
6910: 20 2a 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50   *pParse,   /* P
6920: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
6930: 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 31  .  Token *pName1
6940: 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 72  ,   /* First par
6950: 74 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 6f 66  t of the name of
6960: 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 76 69   the table or vi
6970: 65 77 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  ew */.  Token *p
6980: 4e 61 6d 65 32 2c 20 20 20 2f 2a 20 53 65 63 6f  Name2,   /* Seco
6990: 6e 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6e  nd part of the n
69a0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
69b0: 20 6f 72 20 76 69 65 77 20 2a 2f 0a 20 20 69 6e   or view */.  in
69c0: 74 20 69 73 54 65 6d 70 2c 20 20 20 20 20 20 2f  t isTemp,      /
69d0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69  * True if this i
69e0: 73 20 61 20 54 45 4d 50 20 74 61 62 6c 65 20 2a  s a TEMP table *
69f0: 2f 0a 20 20 69 6e 74 20 69 73 56 69 65 77 2c 20  /.  int isView, 
6a00: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6a10: 74 68 69 73 20 69 73 20 61 20 56 49 45 57 20 2a  this is a VIEW *
6a20: 2f 0a 20 20 69 6e 74 20 69 73 56 69 72 74 75 61  /.  int isVirtua
6a30: 6c 2c 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  l,   /* True if 
6a40: 74 68 69 73 20 69 73 20 61 20 56 49 52 54 55 41  this is a VIRTUA
6a50: 4c 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  L table */.  int
6a60: 20 6e 6f 45 72 72 20 20 20 20 20 20 20 20 2f 2a   noErr        /*
6a70: 20 44 6f 20 6e 6f 74 68 69 6e 67 20 69 66 20 74   Do nothing if t
6a80: 61 62 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  able already exi
6a90: 73 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c  sts */.){.  Tabl
6aa0: 65 20 2a 70 54 61 62 6c 65 3b 0a 20 20 63 68 61  e *pTable;.  cha
6ab0: 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 20 2f 2a  r *zName = 0; /*
6ac0: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
6ad0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
6ae0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
6af0: 61 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65  arse->db;.  Vdbe
6b00: 20 2a 76 3b 0a 20 20 69 6e 74 20 69 44 62 3b 20   *v;.  int iDb; 
6b10: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
6b20: 61 73 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 72  ase number to cr
6b30: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  eate the table i
6b40: 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e  n */.  Token *pN
6b50: 61 6d 65 3b 20 20 20 20 2f 2a 20 55 6e 71 75 61  ame;    /* Unqua
6b60: 6c 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74  lified name of t
6b70: 68 65 20 74 61 62 6c 65 20 74 6f 20 63 72 65 61  he table to crea
6b80: 74 65 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  te */..  if( db-
6b90: 3e 69 6e 69 74 2e 62 75 73 79 20 26 26 20 64 62  >init.busy && db
6ba0: 2d 3e 69 6e 69 74 2e 6e 65 77 54 6e 75 6d 3d 3d  ->init.newTnum==
6bb0: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 53 70 65 63  1 ){.    /* Spec
6bc0: 69 61 6c 20 63 61 73 65 3a 20 20 50 61 72 73 69  ial case:  Parsi
6bd0: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
6be0: 73 74 65 72 20 6f 72 20 73 71 6c 69 74 65 5f 74  ster or sqlite_t
6bf0: 65 6d 70 5f 6d 61 73 74 65 72 20 73 63 68 65 6d  emp_master schem
6c00: 61 20 2a 2f 0a 20 20 20 20 69 44 62 20 3d 20 64  a */.    iDb = d
6c10: 62 2d 3e 69 6e 69 74 2e 69 44 62 3b 0a 20 20 20  b->init.iDb;.   
6c20: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6c30: 44 62 53 74 72 44 75 70 28 64 62 2c 20 53 43 48  DbStrDup(db, SCH
6c40: 45 4d 41 5f 54 41 42 4c 45 28 69 44 62 29 29 3b  EMA_TABLE(iDb));
6c50: 0a 20 20 20 20 70 4e 61 6d 65 20 3d 20 70 4e 61  .    pName = pNa
6c60: 6d 65 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  me1;.  }else{.  
6c70: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
6c80: 63 61 73 65 20 2a 2f 0a 20 20 20 20 69 44 62 20  case */.    iDb 
6c90: 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
6ca0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
6cb0: 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4e  me1, pName2, &pN
6cc0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69 44  ame);.    if( iD
6cd0: 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  b<0 ) return;.  
6ce0: 20 20 69 66 28 20 21 4f 4d 49 54 5f 54 45 4d 50    if( !OMIT_TEMP
6cf0: 44 42 20 26 26 20 69 73 54 65 6d 70 20 26 26 20  DB && isTemp && 
6d00: 70 4e 61 6d 65 32 2d 3e 6e 3e 30 20 26 26 20 69  pName2->n>0 && i
6d10: 44 62 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f  Db!=1 ){.      /
6d20: 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
6d30: 74 65 6d 70 20 74 61 62 6c 65 2c 20 74 68 65 20  temp table, the 
6d40: 6e 61 6d 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  name may not be 
6d50: 71 75 61 6c 69 66 69 65 64 2e 20 55 6e 6c 65 73  qualified. Unles
6d60: 73 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  s .      ** the 
6d70: 64 61 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73  database name is
6d80: 20 22 74 65 6d 70 22 20 61 6e 79 77 61 79 2e 20   "temp" anyway. 
6d90: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
6da0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
6db0: 2c 20 22 74 65 6d 70 6f 72 61 72 79 20 74 61 62  , "temporary tab
6dc0: 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
6dd0: 75 6e 71 75 61 6c 69 66 69 65 64 22 29 3b 0a 20  unqualified");. 
6de0: 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
6df0: 20 7d 0a 20 20 20 20 69 66 28 20 21 4f 4d 49 54   }.    if( !OMIT
6e00: 5f 54 45 4d 50 44 42 20 26 26 20 69 73 54 65 6d  _TEMPDB && isTem
6e10: 70 20 29 20 69 44 62 20 3d 20 31 3b 0a 20 20 20  p ) iDb = 1;.   
6e20: 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
6e30: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
6e40: 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  , pName);.  }.  
6e50: 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
6e60: 65 6e 20 3d 20 2a 70 4e 61 6d 65 3b 0a 20 20 69  en = *pName;.  i
6e70: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  f( zName==0 ) re
6e80: 74 75 72 6e 3b 0a 20 20 69 66 28 20 53 51 4c 49  turn;.  if( SQLI
6e90: 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 43 68  TE_OK!=sqlite3Ch
6ea0: 65 63 6b 4f 62 6a 65 63 74 4e 61 6d 65 28 70 50  eckObjectName(pP
6eb0: 61 72 73 65 2c 20 7a 4e 61 6d 65 29 20 29 7b 0a  arse, zName) ){.
6ec0: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
6ed0: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  able_error;.  }.
6ee0: 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 69    if( db->init.i
6ef0: 44 62 3d 3d 31 20 29 20 69 73 54 65 6d 70 20 3d  Db==1 ) isTemp =
6f00: 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
6f10: 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
6f20: 41 54 49 4f 4e 0a 20 20 61 73 73 65 72 74 28 20  ATION.  assert( 
6f30: 69 73 54 65 6d 70 3d 3d 30 20 7c 7c 20 69 73 54  isTemp==0 || isT
6f40: 65 6d 70 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  emp==1 );.  asse
6f50: 72 74 28 20 69 73 56 69 65 77 3d 3d 30 20 7c 7c  rt( isView==0 ||
6f60: 20 69 73 56 69 65 77 3d 3d 31 20 29 3b 0a 20 20   isView==1 );.  
6f70: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
6f80: 73 74 20 75 38 20 61 43 6f 64 65 5b 5d 20 3d 20  st u8 aCode[] = 
6f90: 7b 0a 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  {.       SQLITE_
6fa0: 43 52 45 41 54 45 5f 54 41 42 4c 45 2c 0a 20 20  CREATE_TABLE,.  
6fb0: 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45 41       SQLITE_CREA
6fc0: 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 2c 0a 20  TE_TEMP_TABLE,. 
6fd0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 52 45        SQLITE_CRE
6fe0: 41 54 45 5f 56 49 45 57 2c 0a 20 20 20 20 20 20  ATE_VIEW,.      
6ff0: 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f 54   SQLITE_CREATE_T
7000: 45 4d 50 5f 56 49 45 57 0a 20 20 20 20 7d 3b 0a  EMP_VIEW.    };.
7010: 20 20 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20      char *zDb = 
7020: 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61  db->aDb[iDb].zNa
7030: 6d 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  me;.    if( sqli
7040: 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
7050: 72 73 65 2c 20 53 51 4c 49 54 45 5f 49 4e 53 45  rse, SQLITE_INSE
7060: 52 54 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45  RT, SCHEMA_TABLE
7070: 28 69 73 54 65 6d 70 29 2c 20 30 2c 20 7a 44 62  (isTemp), 0, zDb
7080: 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
7090: 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f  begin_table_erro
70a0: 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  r;.    }.    if(
70b0: 20 21 69 73 56 69 72 74 75 61 6c 20 26 26 20 73   !isVirtual && s
70c0: 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28  qlite3AuthCheck(
70d0: 70 50 61 72 73 65 2c 20 28 69 6e 74 29 61 43 6f  pParse, (int)aCo
70e0: 64 65 5b 69 73 54 65 6d 70 2b 32 2a 69 73 56 69  de[isTemp+2*isVi
70f0: 65 77 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ew],.           
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
7120: 65 2c 20 30 2c 20 7a 44 62 29 20 29 7b 0a 20 20  e, 0, zDb) ){.  
7130: 20 20 20 20 67 6f 74 6f 20 62 65 67 69 6e 5f 74      goto begin_t
7140: 61 62 6c 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  able_error;.    
7150: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
7160: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
7170: 20 6e 65 77 20 74 61 62 6c 65 20 6e 61 6d 65 20   new table name 
7180: 64 6f 65 73 20 6e 6f 74 20 63 6f 6c 6c 69 64 65  does not collide
7190: 20 77 69 74 68 20 61 6e 20 65 78 69 73 74 69 6e   with an existin
71a0: 67 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f 72 20  g.  ** index or 
71b0: 74 61 62 6c 65 20 6e 61 6d 65 20 69 6e 20 74 68  table name in th
71c0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 2e  e same database.
71d0: 20 20 49 73 73 75 65 20 61 6e 20 65 72 72 6f 72    Issue an error
71e0: 20 6d 65 73 73 61 67 65 20 69 66 0a 20 20 2a 2a   message if.  **
71f0: 20 69 74 20 64 6f 65 73 2e 20 54 68 65 20 65 78   it does. The ex
7200: 63 65 70 74 69 6f 6e 20 69 73 20 69 66 20 74 68  ception is if th
7210: 65 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e  e statement bein
7220: 67 20 70 61 72 73 65 64 20 77 61 73 20 70 61 73  g parsed was pas
7230: 73 65 64 0a 20 20 2a 2a 20 74 6f 20 61 6e 20 73  sed.  ** to an s
7240: 71 6c 69 74 65 33 5f 64 65 63 6c 61 72 65 5f 76  qlite3_declare_v
7250: 74 61 62 28 29 20 63 61 6c 6c 2e 20 49 6e 20 74  tab() call. In t
7260: 68 61 74 20 63 61 73 65 20 6f 6e 6c 79 20 74 68  hat case only th
7270: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 0a 20  e column names. 
7280: 20 2a 2a 20 61 6e 64 20 74 79 70 65 73 20 77 69   ** and types wi
7290: 6c 6c 20 62 65 20 75 73 65 64 2c 20 73 6f 20 74  ll be used, so t
72a0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
72b0: 74 6f 20 74 65 73 74 20 66 6f 72 20 6e 61 6d 65  to test for name
72c0: 73 70 61 63 65 0a 20 20 2a 2a 20 63 6f 6c 6c 69  space.  ** colli
72d0: 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  sions..  */.  if
72e0: 28 20 21 49 4e 5f 44 45 43 4c 41 52 45 5f 56 54  ( !IN_DECLARE_VT
72f0: 41 42 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  AB ){.    char *
7300: 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
7310: 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b].zName;.    if
7320: 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c  ( SQLITE_OK!=sql
7330: 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28 70  ite3ReadSchema(p
7340: 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 20 20  Parse) ){.      
7350: 67 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65  goto begin_table
7360: 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20  _error;.    }.  
7370: 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69 74    pTable = sqlit
7380: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
7390: 7a 4e 61 6d 65 2c 20 7a 44 62 29 3b 0a 20 20 20  zName, zDb);.   
73a0: 20 69 66 28 20 70 54 61 62 6c 65 20 29 7b 0a 20   if( pTable ){. 
73b0: 20 20 20 20 20 69 66 28 20 21 6e 6f 45 72 72 20       if( !noErr 
73c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
73d0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
73e0: 65 2c 20 22 74 61 62 6c 65 20 25 54 20 61 6c 72  e, "table %T alr
73f0: 65 61 64 79 20 65 78 69 73 74 73 22 2c 20 70 4e  eady exists", pN
7400: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
7410: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
7420: 74 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73  t( !db->init.bus
7430: 79 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  y || CORRUPT_DB 
7440: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
7450: 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
7460: 6d 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b  ma(pParse, iDb);
7470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
7480: 6f 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f  oto begin_table_
7490: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
74a0: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
74b0: 49 6e 64 65 78 28 64 62 2c 20 7a 4e 61 6d 65 2c  Index(db, zName,
74c0: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
74d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
74e0: 67 28 70 50 61 72 73 65 2c 20 22 74 68 65 72 65  g(pParse, "there
74f0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 69   is already an i
7500: 6e 64 65 78 20 6e 61 6d 65 64 20 25 73 22 2c 20  ndex named %s", 
7510: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f  zName);.      go
7520: 74 6f 20 62 65 67 69 6e 5f 74 61 62 6c 65 5f 65  to begin_table_e
7530: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
7540: 0a 20 20 70 54 61 62 6c 65 20 3d 20 73 71 6c 69  .  pTable = sqli
7550: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
7560: 64 62 2c 20 73 69 7a 65 6f 66 28 54 61 62 6c 65  db, sizeof(Table
7570: 29 29 3b 0a 20 20 69 66 28 20 70 54 61 62 6c 65  ));.  if( pTable
7580: 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
7590: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
75a0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 72 63 20  .    pParse->rc 
75b0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
75c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
75d0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 62 65 67  ++;.    goto beg
75e0: 69 6e 5f 74 61 62 6c 65 5f 65 72 72 6f 72 3b 0a  in_table_error;.
75f0: 20 20 7d 0a 20 20 70 54 61 62 6c 65 2d 3e 7a 4e    }.  pTable->zN
7600: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 70  ame = zName;.  p
7610: 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 3d 20 2d  Table->iPKey = -
7620: 31 3b 0a 20 20 70 54 61 62 6c 65 2d 3e 70 53 63  1;.  pTable->pSc
7630: 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69  hema = db->aDb[i
7640: 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 70  Db].pSchema;.  p
7650: 54 61 62 6c 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Table->nRef = 1;
7660: 0a 20 20 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c  .  pTable->nRowL
7670: 6f 67 45 73 74 20 3d 20 32 30 30 3b 20 61 73 73  ogEst = 200; ass
7680: 65 72 74 28 20 32 30 30 3d 3d 73 71 6c 69 74 65  ert( 200==sqlite
7690: 33 4c 6f 67 45 73 74 28 31 30 34 38 35 37 36 29  3LogEst(1048576)
76a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
76b0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3d  arse->pNewTable=
76c0: 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  =0 );.  pParse->
76d0: 70 4e 65 77 54 61 62 6c 65 20 3d 20 70 54 61 62  pNewTable = pTab
76e0: 6c 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  le;..  /* If thi
76f0: 73 20 69 73 20 74 68 65 20 6d 61 67 69 63 20 73  s is the magic s
7700: 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
7710: 61 62 6c 65 20 75 73 65 64 20 62 79 20 61 75 74  able used by aut
7720: 6f 69 6e 63 72 65 6d 65 6e 74 2c 0a 20 20 2a 2a  oincrement,.  **
7730: 20 74 68 65 6e 20 72 65 63 6f 72 64 20 61 20 70   then record a p
7740: 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 74  ointer to this t
7750: 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e  able in the main
7760: 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74   database struct
7770: 75 72 65 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ure.  ** so that
7780: 20 49 4e 53 45 52 54 20 63 61 6e 20 66 69 6e 64   INSERT can find
7790: 20 74 68 65 20 74 61 62 6c 65 20 65 61 73 69 6c   the table easil
77a0: 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  y..  */.#ifndef 
77b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
77c0: 49 4e 43 52 45 4d 45 4e 54 0a 20 20 69 66 28 20  INCREMENT.  if( 
77d0: 21 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 20  !pParse->nested 
77e0: 26 26 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  && strcmp(zName,
77f0: 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
7800: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73  e")==0 ){.    as
7810: 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
7820: 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
7830: 20 69 44 62 2c 20 30 29 20 29 3b 0a 20 20 20 20   iDb, 0) );.    
7840: 70 54 61 62 6c 65 2d 3e 70 53 63 68 65 6d 61 2d  pTable->pSchema-
7850: 3e 70 53 65 71 54 61 62 20 3d 20 70 54 61 62 6c  >pSeqTab = pTabl
7860: 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  e;.  }.#endif.. 
7870: 20 2f 2a 20 42 65 67 69 6e 20 67 65 6e 65 72 61   /* Begin genera
7880: 74 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68  ting the code th
7890: 61 74 20 77 69 6c 6c 20 69 6e 73 65 72 74 20 74  at will insert t
78a0: 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  he table record 
78b0: 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 53 51  into.  ** the SQ
78c0: 4c 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c  LITE_MASTER tabl
78d0: 65 2e 20 20 4e 6f 74 65 20 69 6e 20 70 61 72 74  e.  Note in part
78e0: 69 63 75 6c 61 72 20 74 68 61 74 20 77 65 20 6d  icular that we m
78f0: 75 73 74 20 67 6f 20 61 68 65 61 64 0a 20 20 2a  ust go ahead.  *
7900: 2a 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 74  * and allocate t
7910: 68 65 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72  he record number
7920: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 65   for the table e
7930: 6e 74 72 79 20 6e 6f 77 2e 20 20 42 65 66 6f 72  ntry now.  Befor
7940: 65 20 61 6e 79 0a 20 20 2a 2a 20 50 52 49 4d 41  e any.  ** PRIMA
7950: 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51 55 45  RY KEY or UNIQUE
7960: 20 6b 65 79 77 6f 72 64 73 20 61 72 65 20 70 61   keywords are pa
7970: 72 73 65 64 2e 20 20 54 68 6f 73 65 20 6b 65 79  rsed.  Those key
7980: 77 6f 72 64 73 20 77 69 6c 6c 20 63 61 75 73 65  words will cause
7990: 0a 20 20 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f  .  ** indices to
79a0: 20 62 65 20 63 72 65 61 74 65 64 20 61 6e 64 20   be created and 
79b0: 74 68 65 20 74 61 62 6c 65 20 72 65 63 6f 72 64  the table record
79c0: 20 6d 75 73 74 20 63 6f 6d 65 20 62 65 66 6f 72   must come befor
79d0: 65 20 74 68 65 20 0a 20 20 2a 2a 20 69 6e 64 69  e the .  ** indi
79e0: 63 65 73 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  ces.  Hence, the
79f0: 20 72 65 63 6f 72 64 20 6e 75 6d 62 65 72 20 66   record number f
7a00: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6d 75 73  or the table mus
7a10: 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 20  t be allocated. 
7a20: 20 2a 2a 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   ** now..  */.  
7a30: 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75  if( !db->init.bu
7a40: 73 79 20 26 26 20 28 76 20 3d 20 73 71 6c 69 74  sy && (v = sqlit
7a50: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
7a60: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  ))!=0 ){.    int
7a70: 20 61 64 64 72 31 3b 0a 20 20 20 20 69 6e 74 20   addr1;.    int 
7a80: 66 69 6c 65 46 6f 72 6d 61 74 3b 0a 20 20 20 20  fileFormat;.    
7a90: 69 6e 74 20 72 65 67 31 2c 20 72 65 67 32 2c 20  int reg1, reg2, 
7aa0: 72 65 67 33 3b 0a 20 20 20 20 2f 2a 20 6e 75 6c  reg3;.    /* nul
7ab0: 6c 52 6f 77 5b 5d 20 69 73 20 61 6e 20 4f 50 5f  lRow[] is an OP_
7ac0: 52 65 63 6f 72 64 20 65 6e 63 6f 64 69 6e 67 20  Record encoding 
7ad0: 6f 66 20 61 20 72 6f 77 20 63 6f 6e 74 61 69 6e  of a row contain
7ae0: 69 6e 67 20 35 20 4e 55 4c 4c 73 20 2a 2f 0a 20  ing 5 NULLs */. 
7af0: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
7b00: 63 68 61 72 20 6e 75 6c 6c 52 6f 77 5b 5d 20 3d  char nullRow[] =
7b10: 20 7b 20 36 2c 20 30 2c 20 30 2c 20 30 2c 20 30   { 6, 0, 0, 0, 0
7b20: 2c 20 30 20 7d 3b 0a 20 20 20 20 73 71 6c 69 74  , 0 };.    sqlit
7b30: 65 33 42 65 67 69 6e 57 72 69 74 65 4f 70 65 72  e3BeginWriteOper
7b40: 61 74 69 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c  ation(pParse, 1,
7b50: 20 69 44 62 29 3b 0a 0a 23 69 66 6e 64 65 66 20   iDb);..#ifndef 
7b60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7b70: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
7b80: 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a 20 20   isVirtual ){.  
7b90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7ba0: 64 64 4f 70 30 28 76 2c 20 4f 50 5f 56 42 65 67  ddOp0(v, OP_VBeg
7bb0: 69 6e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  in);.    }.#endi
7bc0: 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  f..    /* If the
7bd0: 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64   file format and
7be0: 20 65 6e 63 6f 64 69 6e 67 20 69 6e 20 74 68 65   encoding in the
7bf0: 20 64 61 74 61 62 61 73 65 20 68 61 76 65 20 6e   database have n
7c00: 6f 74 20 62 65 65 6e 20 73 65 74 2c 20 0a 20 20  ot been set, .  
7c10: 20 20 2a 2a 20 73 65 74 20 74 68 65 6d 20 6e 6f    ** set them no
7c20: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  w..    */.    re
7c30: 67 31 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67  g1 = pParse->reg
7c40: 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
7c50: 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 72 65 67 32  ->nMem;.    reg2
7c60: 20 3d 20 70 50 61 72 73 65 2d 3e 72 65 67 52 6f   = pParse->regRo
7c70: 6f 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  ot = ++pParse->n
7c80: 4d 65 6d 3b 0a 20 20 20 20 72 65 67 33 20 3d 20  Mem;.    reg3 = 
7c90: 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
7ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7cb0: 64 64 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 64  ddOp3(v, OP_Read
7cc0: 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 72 65 67  Cookie, iDb, reg
7cd0: 33 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46 4f  3, BTREE_FILE_FO
7ce0: 52 4d 41 54 29 3b 0a 20 20 20 20 73 71 6c 69 74  RMAT);.    sqlit
7cf0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
7d00: 76 2c 20 69 44 62 29 3b 0a 20 20 20 20 61 64 64  v, iDb);.    add
7d10: 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
7d20: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 2c  AddOp1(v, OP_If,
7d30: 20 72 65 67 33 29 3b 20 56 64 62 65 43 6f 76 65   reg3); VdbeCove
7d40: 72 61 67 65 28 76 29 3b 0a 20 20 20 20 66 69 6c  rage(v);.    fil
7d50: 65 46 6f 72 6d 61 74 20 3d 20 28 64 62 2d 3e 66  eFormat = (db->f
7d60: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4c 65  lags & SQLITE_Le
7d70: 67 61 63 79 46 69 6c 65 46 6d 74 29 21 3d 30 20  gacyFileFmt)!=0 
7d80: 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ?.              
7d90: 20 20 20 20 31 20 3a 20 53 51 4c 49 54 45 5f 4d      1 : SQLITE_M
7da0: 41 58 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3b 0a  AX_FILE_FORMAT;.
7db0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7dc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
7dd0: 67 65 72 2c 20 66 69 6c 65 46 6f 72 6d 61 74 2c  ger, fileFormat,
7de0: 20 72 65 67 33 29 3b 0a 20 20 20 20 73 71 6c 69   reg3);.    sqli
7df0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
7e00: 20 4f 50 5f 53 65 74 43 6f 6f 6b 69 65 2c 20 69   OP_SetCookie, i
7e10: 44 62 2c 20 42 54 52 45 45 5f 46 49 4c 45 5f 46  Db, BTREE_FILE_F
7e20: 4f 52 4d 41 54 2c 20 72 65 67 33 29 3b 0a 20 20  ORMAT, reg3);.  
7e30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7e40: 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
7e50: 72 2c 20 45 4e 43 28 64 62 29 2c 20 72 65 67 33  r, ENC(db), reg3
7e60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
7e70: 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 53  beAddOp3(v, OP_S
7e80: 65 74 43 6f 6f 6b 69 65 2c 20 69 44 62 2c 20 42  etCookie, iDb, B
7e90: 54 52 45 45 5f 54 45 58 54 5f 45 4e 43 4f 44 49  TREE_TEXT_ENCODI
7ea0: 4e 47 2c 20 72 65 67 33 29 3b 0a 20 20 20 20 73  NG, reg3);.    s
7eb0: 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
7ec0: 72 65 28 76 2c 20 61 64 64 72 31 29 3b 0a 0a 20  re(v, addr1);.. 
7ed0: 20 20 20 2f 2a 20 54 68 69 73 20 6a 75 73 74 20     /* This just 
7ee0: 63 72 65 61 74 65 73 20 61 20 70 6c 61 63 65 2d  creates a place-
7ef0: 68 6f 6c 64 65 72 20 72 65 63 6f 72 64 20 69 6e  holder record in
7f00: 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
7f10: 65 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  er table..    **
7f20: 20 54 68 65 20 72 65 63 6f 72 64 20 63 72 65 61   The record crea
7f30: 74 65 64 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  ted does not con
7f40: 74 61 69 6e 20 61 6e 79 74 68 69 6e 67 20 79 65  tain anything ye
7f50: 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 72  t.  It will be r
7f60: 65 70 6c 61 63 65 64 0a 20 20 20 20 2a 2a 20 62  eplaced.    ** b
7f70: 79 20 74 68 65 20 72 65 61 6c 20 65 6e 74 72 79  y the real entry
7f80: 20 69 6e 20 63 6f 64 65 20 67 65 6e 65 72 61 74   in code generat
7f90: 65 64 20 61 74 20 73 71 6c 69 74 65 33 45 6e 64  ed at sqlite3End
7fa0: 54 61 62 6c 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Table()..    **.
7fb0: 20 20 20 20 2a 2a 20 54 68 65 20 72 6f 77 69 64      ** The rowid
7fc0: 20 66 6f 72 20 74 68 65 20 6e 65 77 20 65 6e 74   for the new ent
7fd0: 72 79 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65  ry is left in re
7fe0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
7ff0: 65 67 52 6f 77 69 64 2e 0a 20 20 20 20 2a 2a 20  egRowid..    ** 
8000: 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75  The root page nu
8010: 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20  mber of the new 
8020: 74 61 62 6c 65 20 69 73 20 6c 65 66 74 20 69 6e  table is left in
8030: 20 72 65 67 20 70 50 61 72 73 65 2d 3e 72 65 67   reg pParse->reg
8040: 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 65  Root..    ** The
8050: 20 72 6f 77 69 64 20 61 6e 64 20 72 6f 6f 74 20   rowid and root 
8060: 70 61 67 65 20 6e 75 6d 62 65 72 20 76 61 6c 75  page number valu
8070: 65 73 20 61 72 65 20 6e 65 65 64 65 64 20 62 79  es are needed by
8080: 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 0a 20   the code that. 
8090: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 45 6e 64     ** sqlite3End
80a0: 54 61 62 6c 65 20 77 69 6c 6c 20 67 65 6e 65 72  Table will gener
80b0: 61 74 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 20  ate..    */.#if 
80c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
80d0: 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64  OMIT_VIEW) || !d
80e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
80f0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
8100: 0a 20 20 20 20 69 66 28 20 69 73 56 69 65 77 20  .    if( isView 
8110: 7c 7c 20 69 73 56 69 72 74 75 61 6c 20 29 7b 0a  || isVirtual ){.
8120: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8130: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
8140: 74 65 67 65 72 2c 20 30 2c 20 72 65 67 32 29 3b  teger, 0, reg2);
8150: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
8160: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 70 50  f.    {.      pP
8170: 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62 20  arse->addrCrTab 
8180: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
8190: 4f 70 32 28 76 2c 20 4f 50 5f 43 72 65 61 74 65  Op2(v, OP_Create
81a0: 54 61 62 6c 65 2c 20 69 44 62 2c 20 72 65 67 32  Table, iDb, reg2
81b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
81c0: 69 74 65 33 4f 70 65 6e 4d 61 73 74 65 72 54 61  ite3OpenMasterTa
81d0: 62 6c 65 28 70 50 61 72 73 65 2c 20 69 44 62 29  ble(pParse, iDb)
81e0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
81f0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65  eAddOp2(v, OP_Ne
8200: 77 52 6f 77 69 64 2c 20 30 2c 20 72 65 67 31 29  wRowid, 0, reg1)
8210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
8220: 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 42 6c  eAddOp4(v, OP_Bl
8230: 6f 62 2c 20 36 2c 20 72 65 67 33 2c 20 30 2c 20  ob, 6, reg3, 0, 
8240: 6e 75 6c 6c 52 6f 77 2c 20 50 34 5f 53 54 41 54  nullRow, P4_STAT
8250: 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
8260: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
8270: 5f 49 6e 73 65 72 74 2c 20 30 2c 20 72 65 67 33  _Insert, 0, reg3
8280: 2c 20 72 65 67 31 29 3b 0a 20 20 20 20 73 71 6c  , reg1);.    sql
8290: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
82a0: 28 76 2c 20 4f 50 46 4c 41 47 5f 41 50 50 45 4e  (v, OPFLAG_APPEN
82b0: 44 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  D);.    sqlite3V
82c0: 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f 50 5f  dbeAddOp0(v, OP_
82d0: 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Close);.  }..  /
82e0: 2a 20 4e 6f 72 6d 61 6c 20 28 6e 6f 6e 2d 65 72  * Normal (non-er
82f0: 72 6f 72 29 20 72 65 74 75 72 6e 2e 20 2a 2f 0a  ror) return. */.
8300: 20 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20    return;..  /* 
8310: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
8320: 72 73 2c 20 77 65 20 6a 75 6d 70 20 68 65 72 65  rs, we jump here
8330: 20 2a 2f 0a 62 65 67 69 6e 5f 74 61 62 6c 65 5f   */.begin_table_
8340: 65 72 72 6f 72 3a 0a 20 20 73 71 6c 69 74 65 33  error:.  sqlite3
8350: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
8360: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
8370: 2f 2a 20 53 65 74 20 70 72 6f 70 65 72 74 69 65  /* Set propertie
8380: 73 20 6f 66 20 61 20 74 61 62 6c 65 20 63 6f 6c  s of a table col
8390: 75 6d 6e 20 62 61 73 65 64 20 6f 6e 20 74 68 65  umn based on the
83a0: 20 28 6d 61 67 69 63 61 6c 29 0a 2a 2a 20 6e 61   (magical).** na
83b0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
83c0: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
83d0: 45 4e 41 42 4c 45 5f 48 49 44 44 45 4e 5f 43 4f  ENABLE_HIDDEN_CO
83e0: 4c 55 4d 4e 53 0a 76 6f 69 64 20 73 71 6c 69 74  LUMNS.void sqlit
83f0: 65 33 43 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69  e3ColumnProperti
8400: 65 73 46 72 6f 6d 4e 61 6d 65 28 54 61 62 6c 65  esFromName(Table
8410: 20 2a 70 54 61 62 2c 20 43 6f 6c 75 6d 6e 20 2a   *pTab, Column *
8420: 70 43 6f 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c  pCol){.  if( sql
8430: 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 70 43  ite3_strnicmp(pC
8440: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 22 5f 5f 68 69  ol->zName, "__hi
8450: 64 64 65 6e 5f 5f 22 2c 20 31 30 29 3d 3d 30 20  dden__", 10)==0 
8460: 29 7b 0a 20 20 20 20 70 43 6f 6c 2d 3e 63 6f 6c  ){.    pCol->col
8470: 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c 41 47  Flags |= COLFLAG
8480: 5f 48 49 44 44 45 4e 3b 0a 20 20 7d 65 6c 73 65  _HIDDEN;.  }else
8490: 20 69 66 28 20 70 54 61 62 20 26 26 20 70 43 6f   if( pTab && pCo
84a0: 6c 21 3d 70 54 61 62 2d 3e 61 43 6f 6c 20 26 26  l!=pTab->aCol &&
84b0: 20 28 70 43 6f 6c 5b 2d 31 5d 2e 63 6f 6c 46 6c   (pCol[-1].colFl
84c0: 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 48 49  ags & COLFLAG_HI
84d0: 44 44 45 4e 29 20 29 7b 0a 20 20 20 20 70 54 61  DDEN) ){.    pTa
84e0: 62 2d 3e 74 61 62 46 6c 61 67 73 20 7c 3d 20 54  b->tabFlags |= T
84f0: 46 5f 4f 4f 4f 48 69 64 64 65 6e 3b 0a 20 20 7d  F_OOOHidden;.  }
8500: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
8510: 2a 20 41 64 64 20 61 20 6e 65 77 20 63 6f 6c 75  * Add a new colu
8520: 6d 6e 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  mn to the table 
8530: 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
8540: 63 6f 6e 73 74 72 75 63 74 65 64 2e 0a 2a 2a 0a  constructed..**.
8550: 2a 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 61  ** The parser ca
8560: 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
8570: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 63   once for each c
8580: 6f 6c 75 6d 6e 20 64 65 63 6c 61 72 61 74 69 6f  olumn declaratio
8590: 6e 0a 2a 2a 20 69 6e 20 61 20 43 52 45 41 54 45  n.** in a CREATE
85a0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
85b0: 2e 20 20 73 71 6c 69 74 65 33 53 74 61 72 74 54  .  sqlite3StartT
85c0: 61 62 6c 65 28 29 20 67 65 74 73 20 63 61 6c 6c  able() gets call
85d0: 65 64 0a 2a 2a 20 66 69 72 73 74 20 74 6f 20 67  ed.** first to g
85e0: 65 74 20 74 68 69 6e 67 73 20 67 6f 69 6e 67 2e  et things going.
85f0: 20 20 54 68 65 6e 20 74 68 69 73 20 72 6f 75 74    Then this rout
8600: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f  ine is called fo
8610: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6c 75 6d 6e  r each.** column
8620: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8630: 33 41 64 64 43 6f 6c 75 6d 6e 28 50 61 72 73 65  3AddColumn(Parse
8640: 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
8650: 2a 70 4e 61 6d 65 29 7b 0a 20 20 54 61 62 6c 65  *pName){.  Table
8660: 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   *p;.  int i;.  
8670: 63 68 61 72 20 2a 7a 3b 0a 20 20 43 6f 6c 75 6d  char *z;.  Colum
8680: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 73 71 6c 69 74  n *pCol;.  sqlit
8690: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
86a0: 3e 64 62 3b 0a 20 20 69 66 28 20 28 70 20 3d 20  >db;.  if( (p = 
86b0: 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c  pParse->pNewTabl
86c0: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  e)==0 ) return;.
86d0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
86e0: 4f 4c 55 4d 4e 0a 20 20 69 66 28 20 70 2d 3e 6e  OLUMN.  if( p->n
86f0: 43 6f 6c 2b 31 3e 64 62 2d 3e 61 4c 69 6d 69 74  Col+1>db->aLimit
8700: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
8710: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
8720: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8730: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 63  rse, "too many c
8740: 6f 6c 75 6d 6e 73 20 6f 6e 20 25 73 22 2c 20 70  olumns on %s", p
8750: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  ->zName);.    re
8760: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
8770: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61  .  z = sqlite3Na
8780: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
8790: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 3d  pName);.  if( z=
87a0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
87b0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
87c0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
87d0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
87e0: 28 7a 2c 20 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a  (z, p->aCol[i].z
87f0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
8800: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8810: 67 28 70 50 61 72 73 65 2c 20 22 64 75 70 6c 69  g(pParse, "dupli
8820: 63 61 74 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  cate column name
8830: 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
8840: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
8850: 62 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 65 74  b, z);.      ret
8860: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
8870: 20 69 66 28 20 28 70 2d 3e 6e 43 6f 6c 20 26 20   if( (p->nCol & 
8880: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43  0x7)==0 ){.    C
8890: 6f 6c 75 6d 6e 20 2a 61 4e 65 77 3b 0a 20 20 20  olumn *aNew;.   
88a0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   aNew = sqlite3D
88b0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 70 2d 3e 61  bRealloc(db,p->a
88c0: 43 6f 6c 2c 28 70 2d 3e 6e 43 6f 6c 2b 38 29 2a  Col,(p->nCol+8)*
88d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30  sizeof(p->aCol[0
88e0: 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65  ]));.    if( aNe
88f0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  w==0 ){.      sq
8900: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8910: 7a 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  z);.      return
8920: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61  ;.    }.    p->a
8930: 43 6f 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a  Col = aNew;.  }.
8940: 20 20 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f    pCol = &p->aCo
8950: 6c 5b 70 2d 3e 6e 43 6f 6c 5d 3b 0a 20 20 6d 65  l[p->nCol];.  me
8960: 6d 73 65 74 28 70 43 6f 6c 2c 20 30 2c 20 73 69  mset(pCol, 0, si
8970: 7a 65 6f 66 28 70 2d 3e 61 43 6f 6c 5b 30 5d 29  zeof(p->aCol[0])
8980: 29 3b 0a 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  );.  pCol->zName
8990: 20 3d 20 7a 3b 0a 20 20 73 71 6c 69 74 65 33 43   = z;.  sqlite3C
89a0: 6f 6c 75 6d 6e 50 72 6f 70 65 72 74 69 65 73 46  olumnPropertiesF
89b0: 72 6f 6d 4e 61 6d 65 28 70 2c 20 70 43 6f 6c 29  romName(p, pCol)
89c0: 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  ;. .  /* If ther
89d0: 65 20 69 73 20 6e 6f 20 74 79 70 65 20 73 70 65  e is no type spe
89e0: 63 69 66 69 65 64 2c 20 63 6f 6c 75 6d 6e 73 20  cified, columns 
89f0: 68 61 76 65 20 74 68 65 20 64 65 66 61 75 6c 74  have the default
8a00: 20 61 66 66 69 6e 69 74 79 0a 20 20 2a 2a 20 27   affinity.  ** '
8a10: 42 4c 4f 42 27 2e 20 49 66 20 74 68 65 72 65 20  BLOB'. If there 
8a20: 69 73 20 61 20 74 79 70 65 20 73 70 65 63 69 66  is a type specif
8a30: 69 65 64 2c 20 74 68 65 6e 20 73 71 6c 69 74 65  ied, then sqlite
8a40: 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65 28 29  3AddColumnType()
8a50: 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 63 61   will.  ** be ca
8a60: 6c 6c 65 64 20 6e 65 78 74 20 74 6f 20 73 65 74  lled next to set
8a70: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 20   pCol->affinity 
8a80: 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a  correctly..  */.
8a90: 20 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79    pCol->affinity
8aa0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c   = SQLITE_AFF_BL
8ab0: 4f 42 3b 0a 20 20 70 43 6f 6c 2d 3e 73 7a 45 73  OB;.  pCol->szEs
8ac0: 74 20 3d 20 31 3b 0a 20 20 70 2d 3e 6e 43 6f 6c  t = 1;.  p->nCol
8ad0: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ++;.}../*.** Thi
8ae0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8af0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
8b00: 72 20 77 68 69 6c 65 20 69 6e 20 74 68 65 20 6d  r while in the m
8b10: 69 64 64 6c 65 20 6f 66 0a 2a 2a 20 70 61 72 73  iddle of.** pars
8b20: 69 6e 67 20 61 20 43 52 45 41 54 45 20 54 41 42  ing a CREATE TAB
8b30: 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 41  LE statement.  A
8b40: 20 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73   "NOT NULL" cons
8b50: 74 72 61 69 6e 74 20 68 61 73 0a 2a 2a 20 62 65  traint has.** be
8b60: 65 6e 20 73 65 65 6e 20 6f 6e 20 61 20 63 6f 6c  en seen on a col
8b70: 75 6d 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69  umn.  This routi
8b80: 6e 65 20 73 65 74 73 20 74 68 65 20 6e 6f 74 4e  ne sets the notN
8b90: 75 6c 6c 20 66 6c 61 67 20 6f 6e 0a 2a 2a 20 74  ull flag on.** t
8ba0: 68 65 20 63 6f 6c 75 6d 6e 20 63 75 72 72 65 6e  he column curren
8bb0: 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tly under constr
8bc0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
8bd0: 73 71 6c 69 74 65 33 41 64 64 4e 6f 74 4e 75 6c  sqlite3AddNotNul
8be0: 6c 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  l(Parse *pParse,
8bf0: 20 69 6e 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20   int onError){. 
8c00: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 70 20 3d   Table *p;.  p =
8c10: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
8c20: 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 7c  le;.  if( p==0 |
8c30: 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c 3c  | NEVER(p->nCol<
8c40: 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  1) ) return;.  p
8c50: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
8c60: 5d 2e 6e 6f 74 4e 75 6c 6c 20 3d 20 28 75 38 29  ].notNull = (u8)
8c70: 6f 6e 45 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  onError;.}../*.*
8c80: 2a 20 53 63 61 6e 20 74 68 65 20 63 6f 6c 75 6d  * Scan the colum
8c90: 6e 20 74 79 70 65 20 6e 61 6d 65 20 7a 54 79 70  n type name zTyp
8ca0: 65 20 28 6c 65 6e 67 74 68 20 6e 54 79 70 65 29  e (length nType)
8cb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 0a   and return the.
8cc0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 61 66  ** associated af
8cd0: 66 69 6e 69 74 79 20 74 79 70 65 2e 0a 2a 2a 0a  finity type..**.
8ce0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8cf0: 64 6f 65 73 20 61 20 63 61 73 65 2d 69 6e 64 65  does a case-inde
8d00: 70 65 6e 64 65 6e 74 20 73 65 61 72 63 68 20 6f  pendent search o
8d10: 66 20 7a 54 79 70 65 20 66 6f 72 20 74 68 65 20  f zType for the 
8d20: 0a 2a 2a 20 73 75 62 73 74 72 69 6e 67 73 20 69  .** substrings i
8d30: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
8d40: 74 61 62 6c 65 2e 20 49 66 20 6f 6e 65 20 6f 66  table. If one of
8d50: 20 74 68 65 20 73 75 62 73 74 72 69 6e 67 73 20   the substrings 
8d60: 69 73 0a 2a 2a 20 66 6f 75 6e 64 2c 20 74 68 65  is.** found, the
8d70: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 61   corresponding a
8d80: 66 66 69 6e 69 74 79 20 69 73 20 72 65 74 75 72  ffinity is retur
8d90: 6e 65 64 2e 20 49 66 20 7a 54 79 70 65 20 63 6f  ned. If zType co
8da0: 6e 74 61 69 6e 73 0a 2a 2a 20 6d 6f 72 65 20 74  ntains.** more t
8db0: 68 61 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 73  han one of the s
8dc0: 75 62 73 74 72 69 6e 67 73 2c 20 65 6e 74 72 69  ubstrings, entri
8dd0: 65 73 20 74 6f 77 61 72 64 20 74 68 65 20 74 6f  es toward the to
8de0: 70 20 6f 66 20 0a 2a 2a 20 74 68 65 20 74 61 62  p of .** the tab
8df0: 6c 65 20 74 61 6b 65 20 70 72 69 6f 72 69 74 79  le take priority
8e00: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
8e10: 66 20 7a 54 79 70 65 20 69 73 20 27 42 4c 4f 42  f zType is 'BLOB
8e20: 49 4e 54 27 2c 20 0a 2a 2a 20 53 51 4c 49 54 45  INT', .** SQLITE
8e30: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 69 73 20  _AFF_INTEGER is 
8e40: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
8e50: 53 75 62 73 74 72 69 6e 67 20 20 20 20 20 7c 20  Substring     | 
8e60: 41 66 66 69 6e 69 74 79 0a 2a 2a 20 2d 2d 2d 2d  Affinity.** ----
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
8e90: 27 49 4e 54 27 20 20 20 20 20 20 20 20 20 7c 20  'INT'         | 
8ea0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
8eb0: 45 52 0a 2a 2a 20 27 43 48 41 52 27 20 20 20 20  ER.** 'CHAR'    
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 43 4c 4f 42 27 20  _TEXT.** 'CLOB' 
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 54 45 58  AFF_TEXT.** 'TEX
8f00: 54 27 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49  T'        | SQLI
8f10: 54 45 5f 41 46 46 5f 54 45 58 54 0a 2a 2a 20 27  TE_AFF_TEXT.** '
8f20: 42 4c 4f 42 27 20 20 20 20 20 20 20 20 7c 20 53  BLOB'        | S
8f30: 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 0a 2a  QLITE_AFF_BLOB.*
8f40: 2a 20 27 52 45 41 4c 27 20 20 20 20 20 20 20 20  * 'REAL'        
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 46 4c 4f 41 27 20 20 20 20 20  L.** 'FLOA'     
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 20 27 44 4f 55 42 27 20 20  REAL.** 'DOUB'  
8f90: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41        | SQLITE_A
8fa0: 46 46 5f 52 45 41 4c 0a 2a 2a 0a 2a 2a 20 49 66  FF_REAL.**.** If
8fb0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 73 75 62   none of the sub
8fc0: 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20 61  strings in the a
8fd0: 62 6f 76 65 20 74 61 62 6c 65 20 61 72 65 20 66  bove table are f
8fe0: 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
8ff0: 41 46 46 5f 4e 55 4d 45 52 49 43 20 69 73 20 72  AFF_NUMERIC is r
9000: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 63 68 61 72  eturned..*/.char
9010: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
9020: 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
9030: 2a 7a 49 6e 2c 20 75 38 20 2a 70 73 7a 45 73 74  *zIn, u8 *pszEst
9040: 29 7b 0a 20 20 75 33 32 20 68 20 3d 20 30 3b 0a  ){.  u32 h = 0;.
9050: 20 20 63 68 61 72 20 61 66 66 20 3d 20 53 51 4c    char aff = SQL
9060: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
9070: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9080: 43 68 61 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Char = 0;..  if(
9090: 20 7a 49 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e   zIn==0 ) return
90a0: 20 61 66 66 3b 0a 20 20 77 68 69 6c 65 28 20 7a   aff;.  while( z
90b0: 49 6e 5b 30 5d 20 29 7b 0a 20 20 20 20 68 20 3d  In[0] ){.    h =
90c0: 20 28 68 3c 3c 38 29 20 2b 20 73 71 6c 69 74 65   (h<<8) + sqlite
90d0: 33 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 28 2a  3UpperToLower[(*
90e0: 7a 49 6e 29 26 30 78 66 66 5d 3b 0a 20 20 20 20  zIn)&0xff];.    
90f0: 7a 49 6e 2b 2b 3b 0a 20 20 20 20 69 66 28 20 68  zIn++;.    if( h
9100: 3d 3d 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 68  ==(('c'<<24)+('h
9110: 27 3c 3c 31 36 29 2b 28 27 61 27 3c 3c 38 29 2b  '<<16)+('a'<<8)+
9120: 27 72 27 29 20 29 7b 20 20 20 20 20 20 20 20 20  'r') ){         
9130: 20 20 20 20 2f 2a 20 43 48 41 52 20 2a 2f 0a 20      /* CHAR */. 
9140: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9150: 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20 20 20 20  E_AFF_TEXT;.    
9160: 20 20 7a 43 68 61 72 20 3d 20 7a 49 6e 3b 0a 20    zChar = zIn;. 
9170: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d     }else if( h==
9180: 28 28 27 63 27 3c 3c 32 34 29 2b 28 27 6c 27 3c  (('c'<<24)+('l'<
9190: 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b 27 62  <16)+('o'<<8)+'b
91a0: 27 29 20 29 7b 20 20 20 20 20 20 20 2f 2a 20 43  ') ){       /* C
91b0: 4c 4f 42 20 2a 2f 0a 20 20 20 20 20 20 61 66 66  LOB */.      aff
91c0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45   = SQLITE_AFF_TE
91d0: 58 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  XT;.    }else if
91e0: 28 20 68 3d 3d 28 28 27 74 27 3c 3c 32 34 29 2b  ( h==(('t'<<24)+
91f0: 28 27 65 27 3c 3c 31 36 29 2b 28 27 78 27 3c 3c  ('e'<<16)+('x'<<
9200: 38 29 2b 27 74 27 29 20 29 7b 20 20 20 20 20 20  8)+'t') ){      
9210: 20 2f 2a 20 54 45 58 54 20 2a 2f 0a 20 20 20 20   /* TEXT */.    
9220: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
9230: 46 46 5f 54 45 58 54 3b 0a 20 20 20 20 7d 65 6c  FF_TEXT;.    }el
9240: 73 65 20 69 66 28 20 68 3d 3d 28 28 27 62 27 3c  se if( h==(('b'<
9250: 3c 32 34 29 2b 28 27 6c 27 3c 3c 31 36 29 2b 28  <24)+('l'<<16)+(
9260: 27 6f 27 3c 3c 38 29 2b 27 62 27 29 20 20 20 20  'o'<<8)+'b')    
9270: 20 20 20 20 20 20 2f 2a 20 42 4c 4f 42 20 2a 2f        /* BLOB */
9280: 0a 20 20 20 20 20 20 20 20 26 26 20 28 61 66 66  .        && (aff
9290: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
92a0: 45 52 49 43 20 7c 7c 20 61 66 66 3d 3d 53 51 4c  ERIC || aff==SQL
92b0: 49 54 45 5f 41 46 46 5f 52 45 41 4c 29 20 29 7b  ITE_AFF_REAL) ){
92c0: 0a 20 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c  .      aff = SQL
92d0: 49 54 45 5f 41 46 46 5f 42 4c 4f 42 3b 0a 20 20  ITE_AFF_BLOB;.  
92e0: 20 20 20 20 69 66 28 20 7a 49 6e 5b 30 5d 3d 3d      if( zIn[0]==
92f0: 27 28 27 20 29 20 7a 43 68 61 72 20 3d 20 7a 49  '(' ) zChar = zI
9300: 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n;.#ifndef SQLIT
9310: 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
9320: 50 4f 49 4e 54 0a 20 20 20 20 7d 65 6c 73 65 20  POINT.    }else 
9330: 69 66 28 20 68 3d 3d 28 28 27 72 27 3c 3c 32 34  if( h==(('r'<<24
9340: 29 2b 28 27 65 27 3c 3c 31 36 29 2b 28 27 61 27  )+('e'<<16)+('a'
9350: 3c 3c 38 29 2b 27 6c 27 29 20 20 20 20 20 20 20  <<8)+'l')       
9360: 20 20 20 2f 2a 20 52 45 41 4c 20 2a 2f 0a 20 20     /* REAL */.  
9370: 20 20 20 20 20 20 26 26 20 61 66 66 3d 3d 53 51        && aff==SQ
9380: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9390: 20 29 7b 0a 20 20 20 20 20 20 61 66 66 20 3d 20   ){.      aff = 
93a0: 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3b  SQLITE_AFF_REAL;
93b0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68  .    }else if( h
93c0: 3d 3d 28 28 27 66 27 3c 3c 32 34 29 2b 28 27 6c  ==(('f'<<24)+('l
93d0: 27 3c 3c 31 36 29 2b 28 27 6f 27 3c 3c 38 29 2b  '<<16)+('o'<<8)+
93e0: 27 61 27 29 20 20 20 20 20 20 20 20 20 20 2f 2a  'a')          /*
93f0: 20 46 4c 4f 41 20 2a 2f 0a 20 20 20 20 20 20 20   FLOA */.       
9400: 20 26 26 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   && aff==SQLITE_
9410: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
9420: 20 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54       aff = SQLIT
9430: 45 5f 41 46 46 5f 52 45 41 4c 3b 0a 20 20 20 20  E_AFF_REAL;.    
9440: 7d 65 6c 73 65 20 69 66 28 20 68 3d 3d 28 28 27  }else if( h==(('
9450: 64 27 3c 3c 32 34 29 2b 28 27 6f 27 3c 3c 31 36  d'<<24)+('o'<<16
9460: 29 2b 28 27 75 27 3c 3c 38 29 2b 27 62 27 29 20  )+('u'<<8)+'b') 
9470: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 4f 55 42           /* DOUB
9480: 20 2a 2f 0a 20 20 20 20 20 20 20 20 26 26 20 61   */.        && a
9490: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
94a0: 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20  UMERIC ){.      
94b0: 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  aff = SQLITE_AFF
94c0: 5f 52 45 41 4c 3b 0a 23 65 6e 64 69 66 0a 20 20  _REAL;.#endif.  
94d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 28 68 26 30    }else if( (h&0
94e0: 78 30 30 46 46 46 46 46 46 29 3d 3d 28 28 27 69  x00FFFFFF)==(('i
94f0: 27 3c 3c 31 36 29 2b 28 27 6e 27 3c 3c 38 29 2b  '<<16)+('n'<<8)+
9500: 27 74 27 29 20 29 7b 20 20 20 20 2f 2a 20 49 4e  't') ){    /* IN
9510: 54 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 20 3d  T */.      aff =
9520: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
9530: 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  GER;.      break
9540: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
9550: 2a 20 49 66 20 70 73 7a 45 73 74 20 69 73 20 6e  * If pszEst is n
9560: 6f 74 20 4e 55 4c 4c 2c 20 73 74 6f 72 65 20 61  ot NULL, store a
9570: 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
9580: 65 20 66 69 65 6c 64 20 73 69 7a 65 2e 20 20 54  e field size.  T
9590: 68 65 0a 20 20 2a 2a 20 65 73 74 69 6d 61 74 65  he.  ** estimate
95a0: 20 69 73 20 73 63 61 6c 65 64 20 73 6f 20 74 68   is scaled so th
95b0: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  at the size of a
95c0: 6e 20 69 6e 74 65 67 65 72 20 69 73 20 31 2e 20  n integer is 1. 
95d0: 20 2a 2f 0a 20 20 69 66 28 20 70 73 7a 45 73 74   */.  if( pszEst
95e0: 20 29 7b 0a 20 20 20 20 2a 70 73 7a 45 73 74 20   ){.    *pszEst 
95f0: 3d 20 31 3b 20 20 20 2f 2a 20 64 65 66 61 75 6c  = 1;   /* defaul
9600: 74 20 73 69 7a 65 20 69 73 20 61 70 70 72 6f 78  t size is approx
9610: 20 34 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20   4 bytes */.    
9620: 69 66 28 20 61 66 66 3c 53 51 4c 49 54 45 5f 41  if( aff<SQLITE_A
9630: 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20  FF_NUMERIC ){.  
9640: 20 20 20 20 69 66 28 20 7a 43 68 61 72 20 29 7b      if( zChar ){
9650: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
9660: 7a 43 68 61 72 5b 30 5d 20 29 7b 0a 20 20 20 20  zChar[0] ){.    
9670: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9680: 33 49 73 64 69 67 69 74 28 7a 43 68 61 72 5b 30  3Isdigit(zChar[0
9690: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
96a0: 20 20 69 6e 74 20 76 20 3d 20 30 3b 0a 20 20 20    int v = 0;.   
96b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
96c0: 47 65 74 49 6e 74 33 32 28 7a 43 68 61 72 2c 20  GetInt32(zChar, 
96d0: 26 76 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  &v);.           
96e0: 20 76 20 3d 20 76 2f 34 20 2b 20 31 3b 0a 20 20   v = v/4 + 1;.  
96f0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3e            if( v>
9700: 32 35 35 20 29 20 76 20 3d 20 32 35 35 3b 0a 20  255 ) v = 255;. 
9710: 20 20 20 20 20 20 20 20 20 20 20 2a 70 73 7a 45             *pszE
9720: 73 74 20 3d 20 76 3b 20 2f 2a 20 42 4c 4f 42 28  st = v; /* BLOB(
9730: 6b 29 2c 20 56 41 52 43 48 41 52 28 6b 29 2c 20  k), VARCHAR(k), 
9740: 43 48 41 52 28 6b 29 20 2d 3e 20 72 3d 28 6b 2f  CHAR(k) -> r=(k/
9750: 34 2b 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  4+1) */.        
9760: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9780: 20 7a 43 68 61 72 2b 2b 3b 0a 20 20 20 20 20 20   zChar++;.      
9790: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
97a0: 0a 20 20 20 20 20 20 20 20 2a 70 73 7a 45 73 74  .        *pszEst
97b0: 20 3d 20 35 3b 20 20 20 2f 2a 20 42 4c 4f 42 2c   = 5;   /* BLOB,
97c0: 20 54 45 58 54 2c 20 43 4c 4f 42 20 2d 3e 20 72   TEXT, CLOB -> r
97d0: 3d 35 20 20 28 61 70 70 72 6f 78 20 32 30 20 62  =5  (approx 20 b
97e0: 79 74 65 73 29 2a 2f 0a 20 20 20 20 20 20 7d 0a  ytes)*/.      }.
97f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9800: 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn aff;.}../*.**
9810: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
9820: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70   called by the p
9830: 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20 74  arser while in t
9840: 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a 20  he middle of.** 
9850: 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54 45  parsing a CREATE
9860: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
9870: 2e 20 20 54 68 65 20 70 46 69 72 73 74 20 74 6f  .  The pFirst to
9880: 6b 65 6e 20 69 73 20 74 68 65 20 66 69 72 73 74  ken is the first
9890: 0a 2a 2a 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  .** token in the
98a0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 74 6f 6b   sequence of tok
98b0: 65 6e 73 20 74 68 61 74 20 64 65 73 63 72 69 62  ens that describ
98c0: 65 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  e the type of th
98d0: 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 63 75 72 72  e.** column curr
98e0: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
98f0: 74 72 75 63 74 69 6f 6e 2e 20 20 20 70 4c 61 73  truction.   pLas
9900: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 6f  t is the last to
9910: 6b 65 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 73 65  ken.** in the se
9920: 71 75 65 6e 63 65 2e 20 20 55 73 65 20 74 68 69  quence.  Use thi
9930: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  s information to
9940: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 73 74 72   construct a str
9950: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 63 6f 6e 74  ing.** that cont
9960: 61 69 6e 73 20 74 68 65 20 74 79 70 65 6e 61 6d  ains the typenam
9970: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e of the column 
9980: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 73  and store that s
9990: 74 72 69 6e 67 0a 2a 2a 20 69 6e 20 7a 54 79 70  tring.** in zTyp
99a0: 65 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69  e..*/ .void sqli
99b0: 74 65 33 41 64 64 43 6f 6c 75 6d 6e 54 79 70 65  te3AddColumnType
99c0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
99d0: 54 6f 6b 65 6e 20 2a 70 54 79 70 65 29 7b 0a 20  Token *pType){. 
99e0: 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20 43 6f 6c   Table *p;.  Col
99f0: 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 70 20  umn *pCol;..  p 
9a00: 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  = pParse->pNewTa
9a10: 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ble;.  if( p==0 
9a20: 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 43 6f 6c  || NEVER(p->nCol
9a30: 3c 31 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  <1) ) return;.  
9a40: 70 43 6f 6c 20 3d 20 26 70 2d 3e 61 43 6f 6c 5b  pCol = &p->aCol[
9a50: 70 2d 3e 6e 43 6f 6c 2d 31 5d 3b 0a 20 20 61 73  p->nCol-1];.  as
9a60: 73 65 72 74 28 20 70 43 6f 6c 2d 3e 7a 54 79 70  sert( pCol->zTyp
9a70: 65 3d 3d 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f  e==0 || CORRUPT_
9a80: 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  DB );.  sqlite3D
9a90: 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
9aa0: 2c 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 29 3b 0a  , pCol->zType);.
9ab0: 20 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 20 3d 20    pCol->zType = 
9ac0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
9ad0: 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  oken(pParse->db,
9ae0: 20 70 54 79 70 65 29 3b 0a 20 20 70 43 6f 6c 2d   pType);.  pCol-
9af0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69  >affinity = sqli
9b00: 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
9b10: 70 43 6f 6c 2d 3e 7a 54 79 70 65 2c 20 26 70 43  pCol->zType, &pC
9b20: 6f 6c 2d 3e 73 7a 45 73 74 29 3b 0a 7d 0a 0a 2f  ol->szEst);.}../
9b30: 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73  *.** The express
9b40: 69 6f 6e 20 69 73 20 74 68 65 20 64 65 66 61 75  ion is the defau
9b50: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
9b60: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
9b70: 64 64 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6f  dded column.** o
9b80: 66 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 72  f the table curr
9b90: 65 6e 74 6c 79 20 75 6e 64 65 72 20 63 6f 6e 73  ently under cons
9ba0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
9bb0: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 65 78  Default value ex
9bc0: 70 72 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 62  pressions must b
9bd0: 65 20 63 6f 6e 73 74 61 6e 74 2e 20 20 52 61 69  e constant.  Rai
9be0: 73 65 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20  se an exception 
9bf0: 69 66 20 74 68 69 73 0a 2a 2a 20 69 73 20 6e 6f  if this.** is no
9c00: 74 20 74 68 65 20 63 61 73 65 2e 0a 2a 2a 0a 2a  t the case..**.*
9c10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9c20: 73 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20  s called by the 
9c30: 70 61 72 73 65 72 20 77 68 69 6c 65 20 69 6e 20  parser while in 
9c40: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 0a 2a 2a  the middle of.**
9c50: 20 70 61 72 73 69 6e 67 20 61 20 43 52 45 41 54   parsing a CREAT
9c60: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9c70: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
9c80: 65 33 41 64 64 44 65 66 61 75 6c 74 56 61 6c 75  e3AddDefaultValu
9c90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
9ca0: 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70 61 6e   ExprSpan *pSpan
9cb0: 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20  ){.  Table *p;. 
9cc0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20   Column *pCol;. 
9cd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
9ce0: 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 70 20 3d  Parse->db;.  p =
9cf0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
9d00: 6c 65 3b 0a 20 20 69 66 28 20 70 21 3d 30 20 29  le;.  if( p!=0 )
9d10: 7b 0a 20 20 20 20 70 43 6f 6c 20 3d 20 26 28 70  {.    pCol = &(p
9d20: 2d 3e 61 43 6f 6c 5b 70 2d 3e 6e 43 6f 6c 2d 31  ->aCol[p->nCol-1
9d30: 5d 29 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c  ]);.    if( !sql
9d40: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
9d50: 6e 74 4f 72 46 75 6e 63 74 69 6f 6e 28 70 53 70  ntOrFunction(pSp
9d60: 61 6e 2d 3e 70 45 78 70 72 2c 20 64 62 2d 3e 69  an->pExpr, db->i
9d70: 6e 69 74 2e 62 75 73 79 29 20 29 7b 0a 20 20 20  nit.busy) ){.   
9d80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9d90: 73 67 28 70 50 61 72 73 65 2c 20 22 64 65 66 61  sg(pParse, "defa
9da0: 75 6c 74 20 76 61 6c 75 65 20 6f 66 20 63 6f 6c  ult value of col
9db0: 75 6d 6e 20 5b 25 73 5d 20 69 73 20 6e 6f 74 20  umn [%s] is not 
9dc0: 63 6f 6e 73 74 61 6e 74 22 2c 0a 20 20 20 20 20  constant",.     
9dd0: 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 4e 61 6d 65       pCol->zName
9de0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9df0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
9e00: 20 70 45 78 70 72 20 69 73 20 75 73 65 64 20 69   pExpr is used i
9e10: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 6f 72  nstead of the or
9e20: 69 67 69 6e 61 6c 2c 20 61 73 20 70 45 78 70 72  iginal, as pExpr
9e30: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
9e40: 2a 2a 20 74 6f 6b 65 6e 73 20 74 68 61 74 20 70  ** tokens that p
9e50: 6f 69 6e 74 20 74 6f 20 76 6f 6c 61 74 69 6c 65  oint to volatile
9e60: 20 6d 65 6d 6f 72 79 2e 20 54 68 65 20 27 73 70   memory. The 'sp
9e70: 61 6e 27 20 6f 66 20 74 68 65 20 65 78 70 72 65  an' of the expre
9e80: 73 73 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69  ssion.      ** i
9e90: 73 20 72 65 71 75 69 72 65 64 20 62 79 20 70 72  s required by pr
9ea0: 61 67 6d 61 20 74 61 62 6c 65 5f 69 6e 66 6f 2e  agma table_info.
9eb0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9ec0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
9ed0: 65 28 64 62 2c 20 70 43 6f 6c 2d 3e 70 44 66 6c  e(db, pCol->pDfl
9ee0: 74 29 3b 0a 20 20 20 20 20 20 70 43 6f 6c 2d 3e  t);.      pCol->
9ef0: 70 44 66 6c 74 20 3d 20 73 71 6c 69 74 65 33 45  pDflt = sqlite3E
9f00: 78 70 72 44 75 70 28 64 62 2c 20 70 53 70 61 6e  xprDup(db, pSpan
9f10: 2d 3e 70 45 78 70 72 2c 20 45 58 50 52 44 55 50  ->pExpr, EXPRDUP
9f20: 5f 52 45 44 55 43 45 29 3b 0a 20 20 20 20 20 20  _REDUCE);.      
9f30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
9f40: 2c 20 70 43 6f 6c 2d 3e 7a 44 66 6c 74 29 3b 0a  , pCol->zDflt);.
9f50: 20 20 20 20 20 20 70 43 6f 6c 2d 3e 7a 44 66 6c        pCol->zDfl
9f60: 74 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  t = sqlite3DbStr
9f70: 4e 44 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29  NDup(db, (char*)
9f80: 70 53 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20  pSpan->zStart,. 
9f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fb0: 20 20 20 20 28 69 6e 74 29 28 70 53 70 61 6e 2d      (int)(pSpan-
9fc0: 3e 7a 45 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a  >zEnd - pSpan->z
9fd0: 53 74 61 72 74 29 29 3b 0a 20 20 20 20 7d 0a 20  Start));.    }. 
9fe0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72   }.  sqlite3Expr
9ff0: 44 65 6c 65 74 65 28 64 62 2c 20 70 53 70 61 6e  Delete(db, pSpan
a000: 2d 3e 70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pExpr);.}../*.
a010: 2a 2a 20 42 61 63 6b 77 61 72 64 73 20 43 6f 6d  ** Backwards Com
a020: 70 61 74 69 62 69 6c 69 74 79 20 48 61 63 6b 3a  patibility Hack:
a030: 0a 2a 2a 20 0a 2a 2a 20 48 69 73 74 6f 72 69 63  .** .** Historic
a040: 61 6c 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  al versions of S
a050: 51 4c 69 74 65 20 61 63 63 65 70 74 65 64 20 73  QLite accepted s
a060: 74 72 69 6e 67 73 20 61 73 20 63 6f 6c 75 6d 6e  trings as column
a070: 20 6e 61 6d 65 73 20 69 6e 0a 2a 2a 20 69 6e 64   names in.** ind
a080: 65 78 65 73 20 61 6e 64 20 50 52 49 4d 41 52 59  exes and PRIMARY
a090: 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 73   KEY constraints
a0a0: 20 61 6e 64 20 69 6e 20 55 4e 49 51 55 45 20 63   and in UNIQUE c
a0b0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 45 78 61  onstraints.  Exa
a0c0: 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
a0d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 78 79 7a  CREATE TABLE xyz
a0e0: 28 61 2c 62 2c 63 2c 64 2c 65 2c 50 52 49 4d 41  (a,b,c,d,e,PRIMA
a0f0: 52 59 20 4b 45 59 28 27 61 27 29 2c 55 4e 49 51  RY KEY('a'),UNIQ
a100: 55 45 28 27 62 27 2c 27 63 27 20 43 4f 4c 4c 41  UE('b','c' COLLA
a110: 54 45 20 74 72 69 6d 29 0a 2a 2a 20 20 20 20 20  TE trim).**     
a120: 43 52 45 41 54 45 20 49 4e 44 45 58 20 61 62 63  CREATE INDEX abc
a130: 20 4f 4e 20 78 79 7a 28 27 63 27 2c 27 64 27 20   ON xyz('c','d' 
a140: 44 45 53 43 2c 27 65 27 20 43 4f 4c 4c 41 54 45  DESC,'e' COLLATE
a150: 20 6e 6f 63 61 73 65 20 44 45 53 43 29 3b 0a 2a   nocase DESC);.*
a160: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 67 6f 6f  *.** This is goo
a170: 66 79 2e 20 20 42 75 74 20 74 6f 20 70 72 65 73  fy.  But to pres
a180: 65 72 76 65 20 62 61 63 6b 77 61 72 64 73 20 63  erve backwards c
a190: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 65 20  ompatibility we 
a1a0: 63 6f 6e 74 69 6e 75 65 20 74 6f 0a 2a 2a 20 61  continue to.** a
a1b0: 63 63 65 70 74 20 69 74 2e 20 20 54 68 69 73 20  ccept it.  This 
a1c0: 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65  routine does the
a1d0: 20 6e 65 63 65 73 73 61 72 79 20 63 6f 6e 76 65   necessary conve
a1e0: 72 73 69 6f 6e 2e 20 20 49 74 20 63 6f 6e 76 65  rsion.  It conve
a1f0: 72 74 73 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  rts.** the expre
a200: 73 73 69 6f 6e 20 67 69 76 65 6e 20 69 6e 20 69  ssion given in i
a210: 74 73 20 61 72 67 75 6d 65 6e 74 20 66 72 6f 6d  ts argument from
a220: 20 61 20 54 4b 5f 53 54 52 49 4e 47 20 69 6e 74   a TK_STRING int
a230: 6f 20 61 20 54 4b 5f 49 44 0a 2a 2a 20 69 66 20  o a TK_ID.** if 
a240: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
a250: 73 20 6a 75 73 74 20 61 20 54 4b 5f 53 54 52 49  s just a TK_STRI
a260: 4e 47 20 77 69 74 68 20 61 6e 20 6f 70 74 69 6f  NG with an optio
a270: 6e 61 6c 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75  nal COLLATE clau
a280: 73 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 65 70  se..** If the ep
a290: 78 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 79 74  xression is anyt
a2a0: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
a2b0: 54 4b 5f 53 54 52 49 4e 47 2c 20 74 68 65 20 65  TK_STRING, the e
a2c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20  xpression is.** 
a2d0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74  unchanged..*/.st
a2e0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 69 74 65  atic void sqlite
a2f0: 33 53 74 72 69 6e 67 54 6f 49 64 28 45 78 70 72  3StringToId(Expr
a300: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f   *p){.  if( p->o
a310: 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a  p==TK_STRING ){.
a320: 20 20 20 20 70 2d 3e 6f 70 20 3d 20 54 4b 5f 49      p->op = TK_I
a330: 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  D;.  }else if( p
a340: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
a350: 20 26 26 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70   && p->pLeft->op
a360: 3d 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  ==TK_STRING ){. 
a370: 20 20 20 70 2d 3e 70 4c 65 66 74 2d 3e 6f 70 20     p->pLeft->op 
a380: 3d 20 54 4b 5f 49 44 3b 0a 20 20 7d 0a 7d 0a 0a  = TK_ID;.  }.}..
a390: 2f 2a 0a 2a 2a 20 44 65 73 69 67 6e 61 74 65 20  /*.** Designate 
a3a0: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a3b0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2e 20 20  for the table.  
a3c0: 70 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  pList is a list 
a3d0: 6f 66 20 6e 61 6d 65 73 20 0a 2a 2a 20 6f 66 20  of names .** of 
a3e0: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 66 6f 72  columns that for
a3f0: 6d 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  m the primary ke
a400: 79 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 20  y.  If pList is 
a410: 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 0a 2a  NULL, then the.*
a420: 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  * most recently 
a430: 61 64 64 65 64 20 63 6f 6c 75 6d 6e 20 6f 66 20  added column of 
a440: 74 68 65 20 74 61 62 6c 65 20 69 73 20 74 68 65  the table is the
a450: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 0a 2a 2a   primary key..**
a460: 0a 2a 2a 20 41 20 74 61 62 6c 65 20 63 61 6e 20  .** A table can 
a470: 68 61 76 65 20 61 74 20 6d 6f 73 74 20 6f 6e 65  have at most one
a480: 20 70 72 69 6d 61 72 79 20 6b 65 79 2e 20 20 49   primary key.  I
a490: 66 20 74 68 65 20 74 61 62 6c 65 20 61 6c 72 65  f the table alre
a4a0: 61 64 79 20 68 61 73 0a 2a 2a 20 61 20 70 72 69  ady has.** a pri
a4b0: 6d 61 72 79 20 6b 65 79 20 28 61 6e 64 20 74 68  mary key (and th
a4c0: 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
a4d0: 20 70 72 69 6d 61 72 79 20 6b 65 79 29 20 74 68   primary key) th
a4e0: 65 6e 20 63 72 65 61 74 65 20 61 6e 0a 2a 2a 20  en create an.** 
a4f0: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  error..**.** If 
a500: 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  the PRIMARY KEY 
a510: 69 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 63  is on a single c
a520: 6f 6c 75 6d 6e 20 77 68 6f 73 65 20 64 61 74 61  olumn whose data
a530: 74 79 70 65 20 69 73 20 49 4e 54 45 47 45 52 2c  type is INTEGER,
a540: 0a 2a 2a 20 74 68 65 6e 20 77 65 20 77 69 6c 6c  .** then we will
a550: 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 61 74   try to use that
a560: 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72   column as the r
a570: 6f 77 69 64 2e 20 20 53 65 74 20 74 68 65 20 54  owid.  Set the T
a580: 61 62 6c 65 2e 69 50 4b 65 79 0a 2a 2a 20 66 69  able.iPKey.** fi
a590: 65 6c 64 20 6f 66 20 74 68 65 20 74 61 62 6c 65  eld of the table
a5a0: 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74   under construct
a5b0: 69 6f 6e 20 74 6f 20 62 65 20 74 68 65 20 69 6e  ion to be the in
a5c0: 64 65 78 20 6f 66 20 74 68 65 0a 2a 2a 20 49 4e  dex of the.** IN
a5d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
a5e0: 59 20 63 6f 6c 75 6d 6e 2e 20 20 54 61 62 6c 65  Y column.  Table
a5f0: 2e 69 50 4b 65 79 20 69 73 20 73 65 74 20 74 6f  .iPKey is set to
a600: 20 2d 31 20 69 66 20 74 68 65 72 65 20 69 73 0a   -1 if there is.
a610: 2a 2a 20 6e 6f 20 49 4e 54 45 47 45 52 20 50 52  ** no INTEGER PR
a620: 49 4d 41 52 59 20 4b 45 59 2e 0a 2a 2a 0a 2a 2a  IMARY KEY..**.**
a630: 20 49 66 20 74 68 65 20 6b 65 79 20 69 73 20 6e   If the key is n
a640: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
a650: 49 4d 41 52 59 20 4b 45 59 2c 20 74 68 65 6e 20  IMARY KEY, then 
a660: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 0a  create a unique.
a670: 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 65  ** index for the
a680: 20 6b 65 79 2e 20 20 4e 6f 20 69 6e 64 65 78 20   key.  No index 
a690: 69 73 20 63 72 65 61 74 65 64 20 66 6f 72 20 49  is created for I
a6a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
a6b0: 45 59 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  EYs..*/.void sql
a6c0: 69 74 65 33 41 64 64 50 72 69 6d 61 72 79 4b 65  ite3AddPrimaryKe
a6d0: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
a6e0: 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
a6f0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
a700: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
a710: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 69 65 6c   /* List of fiel
a720: 64 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 69 6e  d names to be in
a730: 64 65 78 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  dexed */.  int o
a740: 6e 45 72 72 6f 72 2c 20 20 20 20 20 20 2f 2a 20  nError,      /* 
a750: 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
a760: 61 20 75 6e 69 71 75 65 6e 65 73 73 20 63 6f 6e  a uniqueness con
a770: 66 6c 69 63 74 20 2a 2f 0a 20 20 69 6e 74 20 61  flict */.  int a
a780: 75 74 6f 49 6e 63 2c 20 20 20 20 20 20 2f 2a 20  utoInc,      /* 
a790: 54 72 75 65 20 69 66 20 74 68 65 20 41 55 54 4f  True if the AUTO
a7a0: 49 4e 43 52 45 4d 45 4e 54 20 6b 65 79 77 6f 72  INCREMENT keywor
a7b0: 64 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a  d is present */.
a7c0: 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20    int sortOrder 
a7d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 4f      /* SQLITE_SO
a7e0: 5f 41 53 43 20 6f 72 20 53 51 4c 49 54 45 5f 53  _ASC or SQLITE_S
a7f0: 4f 5f 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 54  O_DESC */.){.  T
a800: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 50 61  able *pTab = pPa
a810: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a  rse->pNewTable;.
a820: 20 20 63 68 61 72 20 2a 7a 54 79 70 65 20 3d 20    char *zType = 
a830: 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20  0;.  int iCol = 
a840: 2d 31 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 54 65  -1, i;.  int nTe
a850: 72 6d 3b 0a 20 20 69 66 28 20 70 54 61 62 3d 3d  rm;.  if( pTab==
a860: 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52 45 5f  0 || IN_DECLARE_
a870: 56 54 41 42 20 29 20 67 6f 74 6f 20 70 72 69 6d  VTAB ) goto prim
a880: 61 72 79 5f 6b 65 79 5f 65 78 69 74 3b 0a 20 20  ary_key_exit;.  
a890: 69 66 28 20 70 54 61 62 2d 3e 74 61 62 46 6c 61  if( pTab->tabFla
a8a0: 67 73 20 26 20 54 46 5f 48 61 73 50 72 69 6d 61  gs & TF_HasPrima
a8b0: 72 79 4b 65 79 20 29 7b 0a 20 20 20 20 73 71 6c  ryKey ){.    sql
a8c0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a8d0: 72 73 65 2c 20 0a 20 20 20 20 20 20 22 74 61 62  rse, .      "tab
a8e0: 6c 65 20 5c 22 25 73 5c 22 20 68 61 73 20 6d 6f  le \"%s\" has mo
a8f0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 72 69 6d  re than one prim
a900: 61 72 79 20 6b 65 79 22 2c 20 70 54 61 62 2d 3e  ary key", pTab->
a910: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
a920: 20 70 72 69 6d 61 72 79 5f 6b 65 79 5f 65 78 69   primary_key_exi
a930: 74 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 74  t;.  }.  pTab->t
a940: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 48 61  abFlags |= TF_Ha
a950: 73 50 72 69 6d 61 72 79 4b 65 79 3b 0a 20 20 69  sPrimaryKey;.  i
a960: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
a970: 20 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e     iCol = pTab->
a980: 6e 43 6f 6c 20 2d 20 31 3b 0a 20 20 20 20 70 54  nCol - 1;.    pT
a990: 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 63  ab->aCol[iCol].c
a9a0: 6f 6c 46 6c 61 67 73 20 7c 3d 20 43 4f 4c 46 4c  olFlags |= COLFL
a9b0: 41 47 5f 50 52 49 4d 4b 45 59 3b 0a 20 20 20 20  AG_PRIMKEY;.    
a9c0: 7a 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43  zType = pTab->aC
a9d0: 6f 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a  ol[iCol].zType;.
a9e0: 20 20 20 20 6e 54 65 72 6d 20 3d 20 31 3b 0a 20      nTerm = 1;. 
a9f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 54 65 72   }else{.    nTer
aa00: 6d 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  m = pList->nExpr
aa10: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
aa20: 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 7b 0a 20 20  <nTerm; i++){.  
aa30: 20 20 20 20 45 78 70 72 20 2a 70 43 45 78 70 72      Expr *pCExpr
aa40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b   = sqlite3ExprSk
aa50: 69 70 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 2d  ipCollate(pList-
aa60: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
aa70: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 45 78      assert( pCEx
aa80: 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  pr!=0 );.      s
aa90: 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49 64  qlite3StringToId
aaa0: 28 70 43 45 78 70 72 29 3b 0a 20 20 20 20 20 20  (pCExpr);.      
aab0: 69 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 3d 3d  if( pCExpr->op==
aac0: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
aad0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 4e   const char *zCN
aae0: 61 6d 65 20 3d 20 70 43 45 78 70 72 2d 3e 75 2e  ame = pCExpr->u.
aaf0: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
ab00: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
ab10: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
ab20: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
ab30: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
ab40: 6d 70 28 7a 43 4e 61 6d 65 2c 20 70 54 61 62 2d  mp(zCName, pTab-
ab50: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 2e 7a 4e 61 6d  >aCol[iCol].zNam
ab60: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
ab70: 20 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b       pTab->aCol[
ab80: 69 43 6f 6c 5d 2e 63 6f 6c 46 6c 61 67 73 20 7c  iCol].colFlags |
ab90: 3d 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  = COLFLAG_PRIMKE
aba0: 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  Y;.            z
abb0: 54 79 70 65 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Type = pTab->aCo
abc0: 6c 5b 69 43 6f 6c 5d 2e 7a 54 79 70 65 3b 0a 20  l[iCol].zType;. 
abd0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
abe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
abf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ac00: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
ac10: 6e 54 65 72 6d 3d 3d 31 0a 20 20 20 26 26 20 7a  nTerm==1.   && z
ac20: 54 79 70 65 20 26 26 20 73 71 6c 69 74 65 33 53  Type && sqlite3S
ac30: 74 72 49 43 6d 70 28 7a 54 79 70 65 2c 20 22 49  trICmp(zType, "I
ac40: 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 26  NTEGER")==0.   &
ac50: 26 20 73 6f 72 74 4f 72 64 65 72 21 3d 53 51 4c  & sortOrder!=SQL
ac60: 49 54 45 5f 53 4f 5f 44 45 53 43 0a 20 20 29 7b  ITE_SO_DESC.  ){
ac70: 0a 20 20 20 20 70 54 61 62 2d 3e 69 50 4b 65 79  .    pTab->iPKey
ac80: 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 70 54 61   = iCol;.    pTa
ac90: 62 2d 3e 6b 65 79 43 6f 6e 66 20 3d 20 28 75 38  b->keyConf = (u8
aca0: 29 6f 6e 45 72 72 6f 72 3b 0a 20 20 20 20 61 73  )onError;.    as
acb0: 73 65 72 74 28 20 61 75 74 6f 49 6e 63 3d 3d 30  sert( autoInc==0
acc0: 20 7c 7c 20 61 75 74 6f 49 6e 63 3d 3d 31 20 29   || autoInc==1 )
acd0: 3b 0a 20 20 20 20 70 54 61 62 2d 3e 74 61 62 46  ;.    pTab->tabF
ace0: 6c 61 67 73 20 7c 3d 20 61 75 74 6f 49 6e 63 2a  lags |= autoInc*
acf0: 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
ad00: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20  ;.    if( pList 
ad10: 29 20 70 50 61 72 73 65 2d 3e 69 50 6b 53 6f 72  ) pParse->iPkSor
ad20: 74 4f 72 64 65 72 20 3d 20 70 4c 69 73 74 2d 3e  tOrder = pList->
ad30: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[0].sortOrder;.
ad40: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 75 74 6f    }else if( auto
ad50: 49 6e 63 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  Inc ){.#ifndef S
ad60: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
ad70: 4e 43 52 45 4d 45 4e 54 0a 20 20 20 20 73 71 6c  NCREMENT.    sql
ad80: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
ad90: 72 73 65 2c 20 22 41 55 54 4f 49 4e 43 52 45 4d  rse, "AUTOINCREM
ada0: 45 4e 54 20 69 73 20 6f 6e 6c 79 20 61 6c 6c 6f  ENT is only allo
adb0: 77 65 64 20 6f 6e 20 61 6e 20 22 0a 20 20 20 20  wed on an ".    
adc0: 20 20 20 22 49 4e 54 45 47 45 52 20 50 52 49 4d     "INTEGER PRIM
add0: 41 52 59 20 4b 45 59 22 29 3b 0a 23 65 6e 64 69  ARY KEY");.#endi
ade0: 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 49  f.  }else{.    I
adf0: 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 70 20 3d  ndex *p;.    p =
ae00: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e   sqlite3CreateIn
ae10: 64 65 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30  dex(pParse, 0, 0
ae20: 2c 20 30 2c 20 70 4c 69 73 74 2c 20 6f 6e 45 72  , 0, pList, onEr
ae30: 72 6f 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  ror, 0,.        
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 30 2c 20 73 6f 72 74 4f 72 64 65 72 2c     0, sortOrder,
ae60: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 20 29   0);.    if( p )
ae70: 7b 0a 20 20 20 20 20 20 70 2d 3e 69 64 78 54 79  {.      p->idxTy
ae80: 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 44 58 54  pe = SQLITE_IDXT
ae90: 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a  YPE_PRIMARYKEY;.
aea0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 20      }.    pList 
aeb0: 3d 20 30 3b 0a 20 20 7d 0a 0a 70 72 69 6d 61 72  = 0;.  }..primar
aec0: 79 5f 6b 65 79 5f 65 78 69 74 3a 0a 20 20 73 71  y_key_exit:.  sq
aed0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
aee0: 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ete(pParse->db, 
aef0: 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  pList);.  return
af00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  ;.}../*.** Add a
af10: 20 6e 65 77 20 43 48 45 43 4b 20 63 6f 6e 73 74   new CHECK const
af20: 72 61 69 6e 74 20 74 6f 20 74 68 65 20 74 61 62  raint to the tab
af30: 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  le currently und
af40: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e  er construction.
af50: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
af60: 41 64 64 43 68 65 63 6b 43 6f 6e 73 74 72 61 69  AddCheckConstrai
af70: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
af80: 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
af90: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
afa0: 45 78 70 72 20 2a 70 43 68 65 63 6b 45 78 70 72  Expr *pCheckExpr
afb0: 20 20 2f 2a 20 54 68 65 20 63 68 65 63 6b 20 65    /* The check e
afc0: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a  xpression */.){.
afd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
afe0: 4d 49 54 5f 43 48 45 43 4b 0a 20 20 54 61 62 6c  MIT_CHECK.  Tabl
aff0: 65 20 2a 70 54 61 62 20 3d 20 70 50 61 72 73 65  e *pTab = pParse
b000: 2d 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 73  ->pNewTable;.  s
b010: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
b020: 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  rse->db;.  if( p
b030: 54 61 62 20 26 26 20 21 49 4e 5f 44 45 43 4c 41  Tab && !IN_DECLA
b040: 52 45 5f 56 54 41 42 0a 20 20 20 26 26 20 21 73  RE_VTAB.   && !s
b050: 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61  qlite3BtreeIsRea
b060: 64 6f 6e 6c 79 28 64 62 2d 3e 61 44 62 5b 64 62  donly(db->aDb[db
b070: 2d 3e 69 6e 69 74 2e 69 44 62 5d 2e 70 42 74 29  ->init.iDb].pBt)
b080: 0a 20 20 29 7b 0a 20 20 20 20 70 54 61 62 2d 3e  .  ){.    pTab->
b090: 70 43 68 65 63 6b 20 3d 20 73 71 6c 69 74 65 33  pCheck = sqlite3
b0a0: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
b0b0: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 70 43 68  Parse, pTab->pCh
b0c0: 65 63 6b 2c 20 70 43 68 65 63 6b 45 78 70 72 29  eck, pCheckExpr)
b0d0: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  ;.    if( pParse
b0e0: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b0f0: 2e 6e 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  .n ){.      sqli
b100: 74 65 33 45 78 70 72 4c 69 73 74 53 65 74 4e 61  te3ExprListSetNa
b110: 6d 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d  me(pParse, pTab-
b120: 3e 70 43 68 65 63 6b 2c 20 26 70 50 61 72 73 65  >pCheck, &pParse
b130: 2d 3e 63 6f 6e 73 74 72 61 69 6e 74 4e 61 6d 65  ->constraintName
b140: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 1);.    }.  }e
b150: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20  lse.#endif.  {. 
b160: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
b170: 6c 65 74 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  lete(pParse->db,
b180: 20 70 43 68 65 63 6b 45 78 70 72 29 3b 0a 20 20   pCheckExpr);.  
b190: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
b1a0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e  he collation fun
b1b0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ction of the mos
b1c0: 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65  t recently parse
b1d0: 64 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 0a 2a  d table column.*
b1e0: 2a 20 74 6f 20 74 68 65 20 43 6f 6c 6c 53 65 71  * to the CollSeq
b1f0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20   given..*/.void 
b200: 73 71 6c 69 74 65 33 41 64 64 43 6f 6c 6c 61 74  sqlite3AddCollat
b210: 65 54 79 70 65 28 50 61 72 73 65 20 2a 70 50 61  eType(Parse *pPa
b220: 72 73 65 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  rse, Token *pTok
b230: 65 6e 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b  en){.  Table *p;
b240: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
b250: 20 2a 7a 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20   *zColl;        
b260: 20 20 20 20 20 20 2f 2a 20 44 65 71 75 6f 74 65        /* Dequote
b270: 64 20 6e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74  d name of collat
b280: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a  ion sequence */.
b290: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
b2a0: 20 20 69 66 28 20 28 70 20 3d 20 70 50 61 72 73    if( (p = pPars
b2b0: 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d 3d 30  e->pNewTable)==0
b2c0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d   ) return;.  i =
b2d0: 20 70 2d 3e 6e 43 6f 6c 2d 31 3b 0a 20 20 64 62   p->nCol-1;.  db
b2e0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
b2f0: 20 7a 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   zColl = sqlite3
b300: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62  NameFromToken(db
b310: 2c 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28  , pToken);.  if(
b320: 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74 75 72 6e   !zColl ) return
b330: 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
b340: 4c 6f 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50  LocateCollSeq(pP
b350: 61 72 73 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a  arse, zColl) ){.
b360: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
b370: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
b380: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 5b 69  ee(db, p->aCol[i
b390: 5d 2e 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 70 2d  ].zColl);.    p-
b3a0: 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c 20 3d  >aCol[i].zColl =
b3b0: 20 7a 43 6f 6c 6c 3b 0a 20 20 0a 20 20 20 20 2f   zColl;.  .    /
b3c0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  * If the column 
b3d0: 69 73 20 64 65 63 6c 61 72 65 64 20 61 73 20 22  is declared as "
b3e0: 3c 6e 61 6d 65 3e 20 50 52 49 4d 41 52 59 20 4b  <name> PRIMARY K
b3f0: 45 59 20 43 4f 4c 4c 41 54 45 20 3c 74 79 70 65  EY COLLATE <type
b400: 3e 22 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  >",.    ** then 
b410: 61 6e 20 69 6e 64 65 78 20 6d 61 79 20 68 61 76  an index may hav
b420: 65 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 6f  e been created o
b430: 6e 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 62 65  n this column be
b440: 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  fore the.    ** 
b450: 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 20 77  collation type w
b460: 61 73 20 61 64 64 65 64 2e 20 43 6f 72 72 65 63  as added. Correc
b470: 74 20 74 68 69 73 20 69 66 20 69 74 20 69 73 20  t this if it is 
b480: 74 68 65 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  the case..    */
b490: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 2d  .    for(pIdx=p-
b4a0: 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70  >pIndex; pIdx; p
b4b0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
b4c0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b4d0: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31  pIdx->nKeyCol==1
b4e0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
b4f0: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d  dx->aiColumn[0]=
b500: 3d 69 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49  =i ){.        pI
b510: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 30 5d 20 3d 20  dx->azColl[0] = 
b520: 70 2d 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 6c  p->aCol[i].zColl
b530: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
b550: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
b560: 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Coll);.  }.}../*
b570: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b580: 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 63 6f  n returns the co
b590: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
b5a0: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 6e 61   for database na
b5b0: 74 69 76 65 20 74 65 78 74 0a 2a 2a 20 65 6e 63  tive text.** enc
b5c0: 6f 64 69 6e 67 20 69 64 65 6e 74 69 66 69 65 64  oding identified
b5d0: 20 62 79 20 74 68 65 20 73 74 72 69 6e 67 20 7a   by the string z
b5e0: 4e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e 4e 61  Name, length nNa
b5f0: 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  me..**.** If the
b600: 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61   requested colla
b610: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 69 73  tion sequence is
b620: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
b630: 6f 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  or not available
b640: 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62  .** in the datab
b650: 61 73 65 20 6e 61 74 69 76 65 20 65 6e 63 6f 64  ase native encod
b660: 69 6e 67 2c 20 74 68 65 20 63 6f 6c 6c 61 74 69  ing, the collati
b670: 6f 6e 20 66 61 63 74 6f 72 79 20 69 73 20 69 6e  on factory is in
b680: 76 6f 6b 65 64 20 74 6f 0a 2a 2a 20 72 65 71 75  voked to.** requ
b690: 65 73 74 20 69 74 2e 20 49 66 20 74 68 65 20 63  est it. If the c
b6a0: 6f 6c 6c 61 74 69 6f 6e 20 66 61 63 74 6f 72 79  ollation factory
b6b0: 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6c 79   does not supply
b6c0: 20 73 75 63 68 20 61 20 73 65 71 75 65 6e 63 65   such a sequence
b6d0: 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 65 71  ,.** and the seq
b6e0: 75 65 6e 63 65 20 69 73 20 61 76 61 69 6c 61 62  uence is availab
b6f0: 6c 65 20 69 6e 20 61 6e 6f 74 68 65 72 20 74 65  le in another te
b700: 78 74 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  xt encoding, the
b710: 6e 20 74 68 61 74 20 69 73 0a 2a 2a 20 72 65 74  n that is.** ret
b720: 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
b730: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 76 65 72 73 69  *.** If no versi
b740: 6f 6e 73 20 6f 66 20 74 68 65 20 72 65 71 75 65  ons of the reque
b750: 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 73 20  sted collations 
b760: 73 65 71 75 65 6e 63 65 20 61 72 65 20 61 76 61  sequence are ava
b770: 69 6c 61 62 6c 65 2c 20 6f 72 0a 2a 2a 20 61 6e  ilable, or.** an
b780: 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63 75  other error occu
b790: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
b7a0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
b7b0: 72 20 6d 65 73 73 61 67 65 20 77 72 69 74 74 65  r message writte
b7c0: 6e 20 69 6e 74 6f 0a 2a 2a 20 70 50 61 72 73 65  n into.** pParse
b7d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b7e0: 74 69 6e 65 20 69 73 20 61 20 77 72 61 70 70 65  tine is a wrappe
b7f0: 72 20 61 72 6f 75 6e 64 20 73 71 6c 69 74 65 33  r around sqlite3
b800: 46 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2e 20 20  FindCollSeq().  
b810: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
b820: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 6f 6c 6c  invokes the coll
b830: 61 74 69 6f 6e 20 66 61 63 74 6f 72 79 20 69 66  ation factory if
b840: 20 74 68 65 20 6e 61 6d 65 64 20 63 6f 6c 6c 61   the named colla
b850: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 66  tion cannot be f
b860: 6f 75 6e 64 0a 2a 2a 20 61 6e 64 20 67 65 6e 65  ound.** and gene
b870: 72 61 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rates an error m
b880: 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 65  essage..**.** Se
b890: 65 20 61 6c 73 6f 3a 20 73 71 6c 69 74 65 33 46  e also: sqlite3F
b8a0: 69 6e 64 43 6f 6c 6c 53 65 71 28 29 2c 20 73 71  indCollSeq(), sq
b8b0: 6c 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28  lite3GetCollSeq(
b8c0: 29 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71  ).*/.CollSeq *sq
b8d0: 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
b8e0: 65 71 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  eq(Parse *pParse
b8f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
b900: 61 6d 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  ame){.  sqlite3 
b910: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
b920: 3b 0a 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43  ;.  u8 enc = ENC
b930: 28 64 62 29 3b 0a 20 20 75 38 20 69 6e 69 74 62  (db);.  u8 initb
b940: 75 73 79 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 62  usy = db->init.b
b950: 75 73 79 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  usy;.  CollSeq *
b960: 70 43 6f 6c 6c 3b 0a 0a 20 20 70 43 6f 6c 6c 20  pColl;..  pColl 
b970: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c  = sqlite3FindCol
b980: 6c 53 65 71 28 64 62 2c 20 65 6e 63 2c 20 7a 4e  lSeq(db, enc, zN
b990: 61 6d 65 2c 20 69 6e 69 74 62 75 73 79 29 3b 0a  ame, initbusy);.
b9a0: 20 20 69 66 28 20 21 69 6e 69 74 62 75 73 79 20    if( !initbusy 
b9b0: 26 26 20 28 21 70 43 6f 6c 6c 20 7c 7c 20 21 70  && (!pColl || !p
b9c0: 43 6f 6c 6c 2d 3e 78 43 6d 70 29 20 29 7b 0a 20  Coll->xCmp) ){. 
b9d0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
b9e0: 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 70 50 61  e3GetCollSeq(pPa
b9f0: 72 73 65 2c 20 65 6e 63 2c 20 70 43 6f 6c 6c 2c  rse, enc, pColl,
ba00: 20 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20   zName);.  }..  
ba10: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
ba20: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ba30: 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20   code that will 
ba40: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 73 63  increment the sc
ba50: 68 65 6d 61 20 63 6f 6f 6b 69 65 2e 0a 2a 2a 0a  hema cookie..**.
ba60: 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 63 6f  ** The schema co
ba70: 6f 6b 69 65 20 69 73 20 75 73 65 64 20 74 6f 20  okie is used to 
ba80: 64 65 74 65 72 6d 69 6e 65 20 77 68 65 6e 20 74  determine when t
ba90: 68 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68  he schema for th
baa0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68  e.** database ch
bab0: 61 6e 67 65 73 2e 20 20 41 66 74 65 72 20 65 61  anges.  After ea
bac0: 63 68 20 73 63 68 65 6d 61 20 63 68 61 6e 67 65  ch schema change
bad0: 2c 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61 6c  , the cookie val
bae0: 75 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  ue.** changes.  
baf0: 57 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 66  When a process f
bb00: 69 72 73 74 20 72 65 61 64 73 20 74 68 65 20 73  irst reads the s
bb10: 63 68 65 6d 61 20 69 74 20 72 65 63 6f 72 64 73  chema it records
bb20: 20 74 68 65 0a 2a 2a 20 63 6f 6f 6b 69 65 2e 20   the.** cookie. 
bb30: 20 54 68 65 72 65 61 66 74 65 72 2c 20 77 68 65   Thereafter, whe
bb40: 6e 65 76 65 72 20 69 74 20 67 6f 65 73 20 74 6f  never it goes to
bb50: 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
bb60: 62 61 73 65 2c 0a 2a 2a 20 69 74 20 63 68 65 63  base,.** it chec
bb70: 6b 73 20 74 68 65 20 63 6f 6f 6b 69 65 20 74 6f  ks the cookie to
bb80: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   make sure the s
bb90: 63 68 65 6d 61 20 68 61 73 20 6e 6f 74 20 63 68  chema has not ch
bba0: 61 6e 67 65 64 0a 2a 2a 20 73 69 6e 63 65 20 69  anged.** since i
bbb0: 74 20 77 61 73 20 6c 61 73 74 20 72 65 61 64 2e  t was last read.
bbc0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 70 6c 61 6e  .**.** This plan
bbd0: 20 69 73 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65   is not complete
bbe0: 6c 79 20 62 75 6c 6c 65 74 2d 70 72 6f 6f 66 2e  ly bullet-proof.
bbf0: 20 20 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65    It is possible
bc00: 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 63 68 65   for.** the sche
bc10: 6d 61 20 74 6f 20 63 68 61 6e 67 65 20 6d 75 6c  ma to change mul
bc20: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 6e 64 20  tiple times and 
bc30: 66 6f 72 20 74 68 65 20 63 6f 6f 6b 69 65 20 74  for the cookie t
bc40: 6f 20 62 65 0a 2a 2a 20 73 65 74 20 62 61 63 6b  o be.** set back
bc50: 20 74 6f 20 70 72 69 6f 72 20 76 61 6c 75 65 2e   to prior value.
bc60: 20 20 42 75 74 20 73 63 68 65 6d 61 20 63 68 61    But schema cha
bc70: 6e 67 65 73 20 61 72 65 20 69 6e 66 72 65 71 75  nges are infrequ
bc80: 65 6e 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 70  ent.** and the p
bc90: 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 68 69  robability of hi
bca0: 74 74 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  tting the same c
bcb0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 69 73 20 6f  ookie value is o
bcc0: 6e 6c 79 0a 2a 2a 20 31 20 63 68 61 6e 63 65 20  nly.** 1 chance 
bcd0: 69 6e 20 32 5e 33 32 2e 20 20 53 6f 20 77 65 27  in 2^32.  So we'
bce0: 72 65 20 73 61 66 65 20 65 6e 6f 75 67 68 2e 0a  re safe enough..
bcf0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
bd00: 68 61 6e 67 65 43 6f 6f 6b 69 65 28 50 61 72 73  hangeCookie(Pars
bd10: 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69  e *pParse, int i
bd20: 44 62 29 7b 0a 20 20 69 6e 74 20 72 31 20 3d 20  Db){.  int r1 = 
bd30: 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
bd40: 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73 71 6c  g(pParse);.  sql
bd50: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
bd60: 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76  e->db;.  Vdbe *v
bd70: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
bd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bd90: 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78 48 65  te3SchemaMutexHe
bda0: 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29 20 29  ld(db, iDb, 0) )
bdb0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
bdc0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
bdd0: 67 65 72 2c 20 64 62 2d 3e 61 44 62 5b 69 44 62  ger, db->aDb[iDb
bde0: 5d 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d  ].pSchema->schem
bdf0: 61 5f 63 6f 6f 6b 69 65 2b 31 2c 20 72 31 29 3b  a_cookie+1, r1);
be00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
be10: 64 4f 70 33 28 76 2c 20 4f 50 5f 53 65 74 43 6f  dOp3(v, OP_SetCo
be20: 6f 6b 69 65 2c 20 69 44 62 2c 20 42 54 52 45 45  okie, iDb, BTREE
be30: 5f 53 43 48 45 4d 41 5f 56 45 52 53 49 4f 4e 2c  _SCHEMA_VERSION,
be40: 20 72 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 52   r1);.  sqlite3R
be50: 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
be60: 61 72 73 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a  arse, r1);.}../*
be70: 0a 2a 2a 20 4d 65 61 73 75 72 65 20 74 68 65 20  .** Measure the 
be80: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
be90: 74 65 72 73 20 6e 65 65 64 65 64 20 74 6f 20 6f  ters needed to o
bea0: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 0a  utput the given.
beb0: 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20 20  ** identifier.  
bec0: 54 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72  The number retur
bed0: 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 61 6e 79  ned includes any
bee0: 20 71 75 6f 74 65 73 20 75 73 65 64 0a 2a 2a 20   quotes used.** 
bef0: 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 69 6e 63  but does not inc
bf00: 6c 75 64 65 20 74 68 65 20 6e 75 6c 6c 20 74 65  lude the null te
bf10: 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  rminator..**.** 
bf20: 54 68 65 20 65 73 74 69 6d 61 74 65 20 69 73 20  The estimate is 
bf30: 63 6f 6e 73 65 72 76 61 74 69 76 65 2e 20 20 49  conservative.  I
bf40: 74 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67 65  t might be large
bf50: 72 20 74 68 61 74 20 77 68 61 74 20 69 73 0a 2a  r that what is.*
bf60: 2a 20 72 65 61 6c 6c 79 20 6e 65 65 64 65 64 2e  * really needed.
bf70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
bf80: 64 65 6e 74 4c 65 6e 67 74 68 28 63 6f 6e 73 74  dentLength(const
bf90: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
bfa0: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 2a   n;.  for(n=0; *
bfb0: 7a 3b 20 6e 2b 2b 2c 20 7a 2b 2b 29 7b 0a 20 20  z; n++, z++){.  
bfc0: 20 20 69 66 28 20 2a 7a 3d 3d 27 22 27 20 29 7b    if( *z=='"' ){
bfd0: 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 72 65   n++; }.  }.  re
bfe0: 74 75 72 6e 20 6e 20 2b 20 32 3b 0a 7d 0a 0a 2f  turn n + 2;.}../
bff0: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
c000: 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 70 6f  arameter is a po
c010: 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 75 74 70  inter to an outp
c020: 75 74 20 62 75 66 66 65 72 2e 20 54 68 65 20 73  ut buffer. The s
c030: 65 63 6f 6e 64 20 0a 2a 2a 20 70 61 72 61 6d 65  econd .** parame
c040: 74 65 72 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ter is a pointer
c050: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 74   to an integer t
c060: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
c070: 20 6f 66 66 73 65 74 20 61 74 0a 2a 2a 20 77 68   offset at.** wh
c080: 69 63 68 20 74 6f 20 77 72 69 74 65 20 69 6e 74  ich to write int
c090: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
c0a0: 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  fer. This functi
c0b0: 6f 6e 20 63 6f 70 69 65 73 20 74 68 65 0a 2a 2a  on copies the.**
c0c0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   nul-terminated 
c0d0: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
c0e0: 6f 20 62 79 20 74 68 65 20 74 68 69 72 64 20 70  o by the third p
c0f0: 61 72 61 6d 65 74 65 72 2c 20 7a 53 69 67 6e 65  arameter, zSigne
c100: 64 49 64 65 6e 74 2c 0a 2a 2a 20 74 6f 20 74 68  dIdent,.** to th
c110: 65 20 73 70 65 63 69 66 69 65 64 20 6f 66 66 73  e specified offs
c120: 65 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72  et in the buffer
c130: 20 61 6e 64 20 75 70 64 61 74 65 73 20 2a 70 49   and updates *pI
c140: 64 78 20 74 6f 20 72 65 66 65 72 0a 2a 2a 20 74  dx to refer.** t
c150: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
c160: 20 61 66 74 65 72 20 74 68 65 20 6c 61 73 74 20   after the last 
c170: 62 79 74 65 20 77 72 69 74 74 65 6e 20 62 65 66  byte written bef
c180: 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
c190: 2a 20 0a 2a 2a 20 49 66 20 74 68 65 20 73 74 72  * .** If the str
c1a0: 69 6e 67 20 7a 53 69 67 6e 65 64 49 64 65 6e 74  ing zSignedIdent
c1b0: 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
c1c0: 6c 79 20 6f 66 20 61 6c 70 68 61 2d 6e 75 6d 65  ly of alpha-nume
c1d0: 72 69 63 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ric.** character
c1e0: 73 2c 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69  s, does not begi
c1f0: 6e 20 77 69 74 68 20 61 20 64 69 67 69 74 20 61  n with a digit a
c200: 6e 64 20 69 73 20 6e 6f 74 20 61 6e 20 53 51 4c  nd is not an SQL
c210: 20 6b 65 79 77 6f 72 64 2c 0a 2a 2a 20 74 68 65   keyword,.** the
c220: 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20 74  n it is copied t
c230: 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
c240: 66 65 72 20 65 78 61 63 74 6c 79 20 61 73 20 69  fer exactly as i
c250: 74 20 69 73 2e 20 4f 74 68 65 72 77 69 73 65 2c  t is. Otherwise,
c260: 0a 2a 2a 20 69 74 20 69 73 20 71 75 6f 74 65 64  .** it is quoted
c270: 20 75 73 69 6e 67 20 64 6f 75 62 6c 65 2d 71 75   using double-qu
c280: 6f 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  otes..*/.static 
c290: 76 6f 69 64 20 69 64 65 6e 74 50 75 74 28 63 68  void identPut(ch
c2a0: 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 49 64 78  ar *z, int *pIdx
c2b0: 2c 20 63 68 61 72 20 2a 7a 53 69 67 6e 65 64 49  , char *zSignedI
c2c0: 64 65 6e 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  dent){.  unsigne
c2d0: 64 20 63 68 61 72 20 2a 7a 49 64 65 6e 74 20 3d  d char *zIdent =
c2e0: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
c2f0: 29 7a 53 69 67 6e 65 64 49 64 65 6e 74 3b 0a 20  )zSignedIdent;. 
c300: 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 65 65 64 51   int i, j, needQ
c310: 75 6f 74 65 3b 0a 20 20 69 20 3d 20 2a 70 49 64  uote;.  i = *pId
c320: 78 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 7a  x;..  for(j=0; z
c330: 49 64 65 6e 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  Ident[j]; j++){.
c340: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
c350: 49 73 61 6c 6e 75 6d 28 7a 49 64 65 6e 74 5b 6a  Isalnum(zIdent[j
c360: 5d 29 20 26 26 20 7a 49 64 65 6e 74 5b 6a 5d 21  ]) && zIdent[j]!
c370: 3d 27 5f 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  ='_' ) break;.  
c380: 7d 0a 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20  }.  needQuote = 
c390: 73 71 6c 69 74 65 33 49 73 64 69 67 69 74 28 7a  sqlite3Isdigit(z
c3a0: 49 64 65 6e 74 5b 30 5d 29 0a 20 20 20 20 20 20  Ident[0]).      
c3b0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
c3c0: 4b 65 79 77 6f 72 64 43 6f 64 65 28 7a 49 64 65  KeywordCode(zIde
c3d0: 6e 74 2c 20 6a 29 21 3d 54 4b 5f 49 44 0a 20 20  nt, j)!=TK_ID.  
c3e0: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 49 64            || zId
c3f0: 65 6e 74 5b 6a 5d 21 3d 30 0a 20 20 20 20 20 20  ent[j]!=0.      
c400: 20 20 20 20 20 20 7c 7c 20 6a 3d 3d 30 3b 0a 0a        || j==0;..
c410: 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20    if( needQuote 
c420: 29 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a  ) z[i++] = '"';.
c430: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 49 64 65 6e    for(j=0; zIden
c440: 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  t[j]; j++){.    
c450: 7a 5b 69 2b 2b 5d 20 3d 20 7a 49 64 65 6e 74 5b  z[i++] = zIdent[
c460: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 7a 49 64 65  j];.    if( zIde
c470: 6e 74 5b 6a 5d 3d 3d 27 22 27 20 29 20 7a 5b 69  nt[j]=='"' ) z[i
c480: 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20 20 7d 0a 20  ++] = '"';.  }. 
c490: 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 20 29   if( needQuote )
c4a0: 20 7a 5b 69 2b 2b 5d 20 3d 20 27 22 27 3b 0a 20   z[i++] = '"';. 
c4b0: 20 7a 5b 69 5d 20 3d 20 30 3b 0a 20 20 2a 70 49   z[i] = 0;.  *pI
c4c0: 64 78 20 3d 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  dx = i;.}../*.**
c4d0: 20 47 65 6e 65 72 61 74 65 20 61 20 43 52 45 41   Generate a CREA
c4e0: 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65  TE TABLE stateme
c4f0: 6e 74 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  nt appropriate f
c500: 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  or the given.** 
c510: 74 61 62 6c 65 2e 20 20 4d 65 6d 6f 72 79 20 74  table.  Memory t
c520: 6f 20 68 6f 6c 64 20 74 68 65 20 74 65 78 74 20  o hold the text 
c530: 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
c540: 20 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20   is obtained.** 
c550: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
c560: 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65 20  c() and must be 
c570: 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
c580: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ling function..*
c590: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
c5a0: 72 65 61 74 65 54 61 62 6c 65 53 74 6d 74 28 73  reateTableStmt(s
c5b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 54 61 62 6c  qlite3 *db, Tabl
c5c0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  e *p){.  int i, 
c5d0: 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 53  k, n;.  char *zS
c5e0: 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 53 65  tmt;.  char *zSe
c5f0: 70 2c 20 2a 7a 53 65 70 32 2c 20 2a 7a 45 6e 64  p, *zSep2, *zEnd
c600: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
c610: 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  ;.  n = 0;.  for
c620: 28 70 43 6f 6c 20 3d 20 70 2d 3e 61 43 6f 6c 2c  (pCol = p->aCol,
c630: 20 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b   i=0; i<p->nCol;
c640: 20 69 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20   i++, pCol++){. 
c650: 20 20 20 6e 20 2b 3d 20 69 64 65 6e 74 4c 65 6e     n += identLen
c660: 67 74 68 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 29  gth(pCol->zName)
c670: 20 2b 20 35 3b 0a 20 20 7d 0a 20 20 6e 20 2b 3d   + 5;.  }.  n +=
c680: 20 69 64 65 6e 74 4c 65 6e 67 74 68 28 70 2d 3e   identLength(p->
c690: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 6e 3c  zName);.  if( n<
c6a0: 35 30 20 29 7b 20 0a 20 20 20 20 7a 53 65 70 20  50 ){ .    zSep 
c6b0: 3d 20 22 22 3b 0a 20 20 20 20 7a 53 65 70 32 20  = "";.    zSep2 
c6c0: 3d 20 22 2c 22 3b 0a 20 20 20 20 7a 45 6e 64 20  = ",";.    zEnd 
c6d0: 3d 20 22 29 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = ")";.  }else{.
c6e0: 20 20 20 20 7a 53 65 70 20 3d 20 22 5c 6e 20 20      zSep = "\n  
c6f0: 22 3b 0a 20 20 20 20 7a 53 65 70 32 20 3d 20 22  ";.    zSep2 = "
c700: 2c 5c 6e 20 20 22 3b 0a 20 20 20 20 7a 45 6e 64  ,\n  ";.    zEnd
c710: 20 3d 20 22 5c 6e 29 22 3b 0a 20 20 7d 0a 20 20   = "\n)";.  }.  
c720: 6e 20 2b 3d 20 33 35 20 2b 20 36 2a 70 2d 3e 6e  n += 35 + 6*p->n
c730: 43 6f 6c 3b 0a 20 20 7a 53 74 6d 74 20 3d 20 73  Col;.  zStmt = s
c740: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
c750: 77 28 30 2c 20 6e 29 3b 0a 20 20 69 66 28 20 7a  w(0, n);.  if( z
c760: 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64  Stmt==0 ){.    d
c770: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c780: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
c790: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
c7a0: 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 53 74  _snprintf(n, zSt
c7b0: 6d 74 2c 20 22 43 52 45 41 54 45 20 54 41 42 4c  mt, "CREATE TABL
c7c0: 45 20 22 29 3b 0a 20 20 6b 20 3d 20 73 71 6c 69  E ");.  k = sqli
c7d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 53 74 6d  te3Strlen30(zStm
c7e0: 74 29 3b 0a 20 20 69 64 65 6e 74 50 75 74 28 7a  t);.  identPut(z
c7f0: 53 74 6d 74 2c 20 26 6b 2c 20 70 2d 3e 7a 4e 61  Stmt, &k, p->zNa
c800: 6d 65 29 3b 0a 20 20 7a 53 74 6d 74 5b 6b 2b 2b  me);.  zStmt[k++
c810: 5d 20 3d 20 27 28 27 3b 0a 20 20 66 6f 72 28 70  ] = '(';.  for(p
c820: 43 6f 6c 3d 70 2d 3e 61 43 6f 6c 2c 20 69 3d 30  Col=p->aCol, i=0
c830: 3b 20 69 3c 70 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  ; i<p->nCol; i++
c840: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 73  , pCol++){.    s
c850: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
c860: 20 2a 20 63 6f 6e 73 74 20 61 7a 54 79 70 65 5b   * const azType[
c870: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
c880: 20 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42   SQLITE_AFF_BLOB
c890: 20 20 20 20 2a 2f 20 22 22 2c 0a 20 20 20 20 20      */ "",.     
c8a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 46 46     /* SQLITE_AFF
c8b0: 5f 54 45 58 54 20 20 20 20 2a 2f 20 22 20 54 45  _TEXT    */ " TE
c8c0: 58 54 22 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  XT",.        /* 
c8d0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
c8e0: 49 43 20 2a 2f 20 22 20 4e 55 4d 22 2c 0a 20 20  IC */ " NUM",.  
c8f0: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
c900: 41 46 46 5f 49 4e 54 45 47 45 52 20 2a 2f 20 22  AFF_INTEGER */ "
c910: 20 49 4e 54 22 2c 0a 20 20 20 20 20 20 20 20 2f   INT",.        /
c920: 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  * SQLITE_AFF_REA
c930: 4c 20 20 20 20 2a 2f 20 22 20 52 45 41 4c 22 0a  L    */ " REAL".
c940: 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6c      };.    int l
c950: 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
c960: 61 72 20 2a 7a 54 79 70 65 3b 0a 0a 20 20 20 20  ar *zType;..    
c970: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c980: 28 6e 2d 6b 2c 20 26 7a 53 74 6d 74 5b 6b 5d 2c  (n-k, &zStmt[k],
c990: 20 7a 53 65 70 29 3b 0a 20 20 20 20 6b 20 2b 3d   zSep);.    k +=
c9a0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c9b0: 28 26 7a 53 74 6d 74 5b 6b 5d 29 3b 0a 20 20 20  (&zStmt[k]);.   
c9c0: 20 7a 53 65 70 20 3d 20 7a 53 65 70 32 3b 0a 20   zSep = zSep2;. 
c9d0: 20 20 20 69 64 65 6e 74 50 75 74 28 7a 53 74 6d     identPut(zStm
c9e0: 74 2c 20 26 6b 2c 20 70 43 6f 6c 2d 3e 7a 4e 61  t, &k, pCol->zNa
c9f0: 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  me);.    assert(
ca00: 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 2d   pCol->affinity-
ca10: 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20  SQLITE_AFF_BLOB 
ca20: 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65  >= 0 );.    asse
ca30: 72 74 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69  rt( pCol->affini
ca40: 74 79 2d 53 51 4c 49 54 45 5f 41 46 46 5f 42 4c  ty-SQLITE_AFF_BL
ca50: 4f 42 20 3c 20 41 72 72 61 79 53 69 7a 65 28 61  OB < ArraySize(a
ca60: 7a 54 79 70 65 29 20 29 3b 0a 20 20 20 20 74 65  zType) );.    te
ca70: 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61 66  stcase( pCol->af
ca80: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
ca90: 46 46 5f 42 4c 4f 42 20 29 3b 0a 20 20 20 20 74  FF_BLOB );.    t
caa0: 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e 61  estcase( pCol->a
cab0: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
cac0: 41 46 46 5f 54 45 58 54 20 29 3b 0a 20 20 20 20  AFF_TEXT );.    
cad0: 74 65 73 74 63 61 73 65 28 20 70 43 6f 6c 2d 3e  testcase( pCol->
cae0: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
caf0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 3b 0a  _AFF_NUMERIC );.
cb00: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
cb10: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cb20: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
cb30: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
cb40: 28 20 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79  ( pCol->affinity
cb50: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52 45 41  ==SQLITE_AFF_REA
cb60: 4c 20 29 3b 0a 20 20 20 20 0a 20 20 20 20 7a 54  L );.    .    zT
cb70: 79 70 65 20 3d 20 61 7a 54 79 70 65 5b 70 43 6f  ype = azType[pCo
cb80: 6c 2d 3e 61 66 66 69 6e 69 74 79 20 2d 20 53 51  l->affinity - SQ
cb90: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 5d 3b 0a  LITE_AFF_BLOB];.
cba0: 20 20 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65      len = sqlite
cbb0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 79 70 65 29  3Strlen30(zType)
cbc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
cbd0: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 53 51  ol->affinity==SQ
cbe0: 4c 49 54 45 5f 41 46 46 5f 42 4c 4f 42 20 0a 20  LITE_AFF_BLOB . 
cbf0: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43             || pC
cc00: 6f 6c 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 73 71  ol->affinity==sq
cc10: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 54 79 70  lite3AffinityTyp
cc20: 65 28 7a 54 79 70 65 2c 20 30 29 20 29 3b 0a 20  e(zType, 0) );. 
cc30: 20 20 20 6d 65 6d 63 70 79 28 26 7a 53 74 6d 74     memcpy(&zStmt
cc40: 5b 6b 5d 2c 20 7a 54 79 70 65 2c 20 6c 65 6e 29  [k], zType, len)
cc50: 3b 0a 20 20 20 20 6b 20 2b 3d 20 6c 65 6e 3b 0a  ;.    k += len;.
cc60: 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 3d 6e      assert( k<=n
cc70: 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
cc80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2d 6b 2c 20  3_snprintf(n-k, 
cc90: 26 7a 53 74 6d 74 5b 6b 5d 2c 20 22 25 73 22 2c  &zStmt[k], "%s",
cca0: 20 7a 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   zEnd);.  return
ccb0: 20 7a 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zStmt;.}../*.**
ccc0: 20 52 65 73 69 7a 65 20 61 6e 20 49 6e 64 65 78   Resize an Index
ccd0: 20 6f 62 6a 65 63 74 20 74 6f 20 68 6f 6c 64 20   object to hold 
cce0: 4e 20 63 6f 6c 75 6d 6e 73 20 74 6f 74 61 6c 2e  N columns total.
ccf0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
cd00: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
cd10: 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e 4f 4d 45   and SQLITE_NOME
cd20: 4d 20 6f 6e 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  M on an OOM erro
cd30: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
cd40: 20 72 65 73 69 7a 65 49 6e 64 65 78 4f 62 6a 65   resizeIndexObje
cd50: 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
cd60: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 69 6e 74  Index *pIdx, int
cd70: 20 4e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 78   N){.  char *zEx
cd80: 74 72 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  tra;.  int nByte
cd90: 3b 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6e 43  ;.  if( pIdx->nC
cda0: 6f 6c 75 6d 6e 3e 3d 4e 20 29 20 72 65 74 75 72  olumn>=N ) retur
cdb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  n SQLITE_OK;.  a
cdc0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 69 73 52  ssert( pIdx->isR
cdd0: 65 73 69 7a 65 64 3d 3d 30 20 29 3b 0a 20 20 6e  esized==0 );.  n
cde0: 42 79 74 65 20 3d 20 28 73 69 7a 65 6f 66 28 63  Byte = (sizeof(c
cdf0: 68 61 72 2a 29 20 2b 20 73 69 7a 65 6f 66 28 69  har*) + sizeof(i
ce00: 31 36 29 20 2b 20 31 29 2a 4e 3b 0a 20 20 7a 45  16) + 1)*N;.  zE
ce10: 78 74 72 61 20 3d 20 73 71 6c 69 74 65 33 44 62  xtra = sqlite3Db
ce20: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e  MallocZero(db, n
ce30: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 7a 45 78  Byte);.  if( zEx
ce40: 74 72 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tra==0 ) return 
ce50: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
ce60: 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20 70  memcpy(zExtra, p
ce70: 49 64 78 2d 3e 61 7a 43 6f 6c 6c 2c 20 73 69 7a  Idx->azColl, siz
ce80: 65 6f 66 28 63 68 61 72 2a 29 2a 70 49 64 78 2d  eof(char*)*pIdx-
ce90: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cea0: 78 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f 6e  x->azColl = (con
ceb0: 73 74 20 63 68 61 72 2a 2a 29 7a 45 78 74 72 61  st char**)zExtra
cec0: 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d 20 73 69  ;.  zExtra += si
ced0: 7a 65 6f 66 28 63 68 61 72 2a 29 2a 4e 3b 0a 20  zeof(char*)*N;. 
cee0: 20 6d 65 6d 63 70 79 28 7a 45 78 74 72 61 2c 20   memcpy(zExtra, 
cef0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20  pIdx->aiColumn, 
cf00: 73 69 7a 65 6f 66 28 69 31 36 29 2a 70 49 64 78  sizeof(i16)*pIdx
cf10: 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49  ->nColumn);.  pI
cf20: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20 28  dx->aiColumn = (
cf30: 69 31 36 2a 29 7a 45 78 74 72 61 3b 0a 20 20 7a  i16*)zExtra;.  z
cf40: 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
cf50: 69 31 36 29 2a 4e 3b 0a 20 20 6d 65 6d 63 70 79  i16)*N;.  memcpy
cf60: 28 7a 45 78 74 72 61 2c 20 70 49 64 78 2d 3e 61  (zExtra, pIdx->a
cf70: 53 6f 72 74 4f 72 64 65 72 2c 20 70 49 64 78 2d  SortOrder, pIdx-
cf80: 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20 70 49 64  >nColumn);.  pId
cf90: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20  x->aSortOrder = 
cfa0: 28 75 38 2a 29 7a 45 78 74 72 61 3b 0a 20 20 70  (u8*)zExtra;.  p
cfb0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 4e  Idx->nColumn = N
cfc0: 3b 0a 20 20 70 49 64 78 2d 3e 69 73 52 65 73 69  ;.  pIdx->isResi
cfd0: 7a 65 64 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  zed = 1;.  retur
cfe0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
cff0: 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65 20 74  /*.** Estimate t
d000: 68 65 20 74 6f 74 61 6c 20 72 6f 77 20 77 69 64  he total row wid
d010: 74 68 20 66 6f 72 20 61 20 74 61 62 6c 65 2e 0a  th for a table..
d020: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
d030: 73 74 69 6d 61 74 65 54 61 62 6c 65 57 69 64 74  stimateTableWidt
d040: 68 28 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  h(Table *pTab){.
d050: 20 20 75 6e 73 69 67 6e 65 64 20 77 54 61 62 6c    unsigned wTabl
d060: 65 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 43  e = 0;.  const C
d070: 6f 6c 75 6d 6e 20 2a 70 54 61 62 43 6f 6c 3b 0a  olumn *pTabCol;.
d080: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
d090: 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2c 20 70 54 61  =pTab->nCol, pTa
d0a0: 62 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  bCol=pTab->aCol;
d0b0: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 54 61 62 43   i>0; i--, pTabC
d0c0: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 77 54 61 62 6c  ol++){.    wTabl
d0d0: 65 20 2b 3d 20 70 54 61 62 43 6f 6c 2d 3e 73 7a  e += pTabCol->sz
d0e0: 45 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  Est;.  }.  if( p
d0f0: 54 61 62 2d 3e 69 50 4b 65 79 3c 30 20 29 20 77  Tab->iPKey<0 ) w
d100: 54 61 62 6c 65 2b 2b 3b 0a 20 20 70 54 61 62 2d  Table++;.  pTab-
d110: 3e 73 7a 54 61 62 52 6f 77 20 3d 20 73 71 6c 69  >szTabRow = sqli
d120: 74 65 33 4c 6f 67 45 73 74 28 77 54 61 62 6c 65  te3LogEst(wTable
d130: 2a 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 73  *4);.}../*.** Es
d140: 74 69 6d 61 74 65 20 74 68 65 20 61 76 65 72 61  timate the avera
d150: 67 65 20 73 69 7a 65 20 6f 66 20 61 20 72 6f 77  ge size of a row
d160: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e 0a 2a   for an index..*
d170: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 73  /.static void es
d180: 74 69 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68  timateIndexWidth
d190: 28 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20  (Index *pIdx){. 
d1a0: 20 75 6e 73 69 67 6e 65 64 20 77 49 6e 64 65 78   unsigned wIndex
d1b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
d1c0: 20 63 6f 6e 73 74 20 43 6f 6c 75 6d 6e 20 2a 61   const Column *a
d1d0: 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  Col = pIdx->pTab
d1e0: 6c 65 2d 3e 61 43 6f 6c 3b 0a 20 20 66 6f 72 28  le->aCol;.  for(
d1f0: 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  i=0; i<pIdx->nCo
d200: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
d210: 69 31 36 20 78 20 3d 20 70 49 64 78 2d 3e 61 69  i16 x = pIdx->ai
d220: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 61  Column[i];.    a
d230: 73 73 65 72 74 28 20 78 3c 70 49 64 78 2d 3e 70  ssert( x<pIdx->p
d240: 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 29 3b 0a 20  Table->nCol );. 
d250: 20 20 20 77 49 6e 64 65 78 20 2b 3d 20 78 3c 30     wIndex += x<0
d260: 20 3f 20 31 20 3a 20 61 43 6f 6c 5b 70 49 64 78   ? 1 : aCol[pIdx
d270: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 73  ->aiColumn[i]].s
d280: 7a 45 73 74 3b 0a 20 20 7d 0a 20 20 70 49 64 78  zEst;.  }.  pIdx
d290: 2d 3e 73 7a 49 64 78 52 6f 77 20 3d 20 73 71 6c  ->szIdxRow = sql
d2a0: 69 74 65 33 4c 6f 67 45 73 74 28 77 49 6e 64 65  ite3LogEst(wInde
d2b0: 78 2a 34 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  x*4);.}../* Retu
d2c0: 72 6e 20 74 72 75 65 20 69 66 20 76 61 6c 75 65  rn true if value
d2d0: 20 78 20 69 73 20 66 6f 75 6e 64 20 61 6e 79 20   x is found any 
d2e0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6e 43 6f  of the first nCo
d2f0: 6c 20 65 6e 74 72 69 65 73 20 6f 66 20 61 69 43  l entries of aiC
d300: 6f 6c 5b 5d 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ol[].*/.static i
d310: 6e 74 20 68 61 73 43 6f 6c 75 6d 6e 28 63 6f 6e  nt hasColumn(con
d320: 73 74 20 69 31 36 20 2a 61 69 43 6f 6c 2c 20 69  st i16 *aiCol, i
d330: 6e 74 20 6e 43 6f 6c 2c 20 69 6e 74 20 78 29 7b  nt nCol, int x){
d340: 0a 20 20 77 68 69 6c 65 28 20 6e 43 6f 6c 2d 2d  .  while( nCol--
d350: 20 3e 20 30 20 29 20 69 66 28 20 78 3d 3d 2a 28   > 0 ) if( x==*(
d360: 61 69 43 6f 6c 2b 2b 29 20 29 20 72 65 74 75 72  aiCol++) ) retur
d370: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
d380: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
d390: 6f 75 74 69 6e 65 20 72 75 6e 73 20 61 74 20 74  outine runs at t
d3a0: 68 65 20 65 6e 64 20 6f 66 20 70 61 72 73 69 6e  he end of parsin
d3b0: 67 20 61 20 43 52 45 41 54 45 20 54 41 42 4c 45  g a CREATE TABLE
d3c0: 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 0a   statement that.
d3d0: 2a 2a 20 68 61 73 20 61 20 57 49 54 48 4f 55 54  ** has a WITHOUT
d3e0: 20 52 4f 57 49 44 20 63 6c 61 75 73 65 2e 20 20   ROWID clause.  
d3f0: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
d400: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 63 6f  routine is to co
d410: 6e 76 65 72 74 20 62 6f 74 68 0a 2a 2a 20 69 6e  nvert both.** in
d420: 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 20 64 61  ternal schema da
d430: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 61 6e  ta structures an
d440: 64 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  d the generated 
d450: 56 44 42 45 20 63 6f 64 65 20 73 6f 20 74 68 61  VDBE code so tha
d460: 74 20 74 68 65 79 0a 2a 2a 20 61 72 65 20 61 70  t they.** are ap
d470: 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 61 20  propriate for a 
d480: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
d490: 62 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20 61  ble instead of a
d4a0: 20 72 6f 77 69 64 20 74 61 62 6c 65 2e 0a 2a 2a   rowid table..**
d4b0: 20 43 68 61 6e 67 65 73 20 69 6e 63 6c 75 64 65   Changes include
d4c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
d4d0: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 50 5f   Convert the OP_
d4e0: 43 72 65 61 74 65 54 61 62 6c 65 20 69 6e 74 6f  CreateTable into
d4f0: 20 61 6e 20 4f 50 5f 43 72 65 61 74 65 49 6e 64   an OP_CreateInd
d500: 65 78 2e 20 20 54 68 65 72 65 20 69 73 0a 2a 2a  ex.  There is.**
d510: 20 20 20 20 20 20 20 20 20 20 6e 6f 20 72 6f 77            no row
d520: 69 64 20 62 74 72 65 65 20 66 6f 72 20 61 20 57  id btree for a W
d530: 49 54 48 4f 55 54 20 52 4f 57 49 44 2e 20 20 49  ITHOUT ROWID.  I
d540: 6e 73 74 65 61 64 2c 20 74 68 65 20 63 61 6e 6f  nstead, the cano
d550: 6e 69 63 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  nical.**        
d560: 20 20 64 61 74 61 20 73 74 6f 72 61 67 65 20 69    data storage i
d570: 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  s a covering ind
d580: 65 78 20 62 74 72 65 65 2e 0a 2a 2a 20 20 20 20  ex btree..**    
d590: 20 28 32 29 20 20 42 79 70 61 73 73 20 74 68 65   (2)  Bypass the
d5a0: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
d5b0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74   sqlite_master t
d5c0: 61 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 20 20  able entry.**   
d5d0: 20 20 20 20 20 20 20 66 6f 72 20 74 68 65 20 50         for the P
d5e0: 52 49 4d 41 52 59 20 4b 45 59 20 61 73 20 74 68  RIMARY KEY as th
d5f0: 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e  e primary key in
d600: 64 65 78 20 69 73 20 6e 6f 77 0a 2a 2a 20 20 20  dex is now.**   
d610: 20 20 20 20 20 20 20 69 64 65 6e 74 69 66 69 65         identifie
d620: 64 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 5f  d by the sqlite_
d630: 6d 61 73 74 65 72 20 74 61 62 6c 65 20 65 6e 74  master table ent
d640: 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ry of the table 
d650: 69 74 73 65 6c 66 2e 0a 2a 2a 20 20 20 20 20 28  itself..**     (
d660: 33 29 20 20 53 65 74 20 74 68 65 20 49 6e 64 65  3)  Set the Inde
d670: 78 2e 74 6e 75 6d 20 6f 66 20 74 68 65 20 50 52  x.tnum of the PR
d680: 49 4d 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20  IMARY KEY Index 
d690: 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 0a 2a 2a  object in the.**
d6a0: 20 20 20 20 20 20 20 20 20 20 73 63 68 65 6d 61            schema
d6b0: 20 74 6f 20 74 68 65 20 72 6f 6f 74 70 61 67 65   to the rootpage
d6c0: 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
d6d0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 28 34 29  able..**     (4)
d6e0: 20 20 53 65 74 20 61 6c 6c 20 63 6f 6c 75 6d 6e    Set all column
d6f0: 73 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59  s of the PRIMARY
d700: 20 4b 45 59 20 73 63 68 65 6d 61 20 6f 62 6a 65   KEY schema obje
d710: 63 74 20 74 6f 20 62 65 20 4e 4f 54 20 4e 55 4c  ct to be NOT NUL
d720: 4c 2e 0a 2a 2a 20 20 20 20 20 28 35 29 20 20 41  L..**     (5)  A
d730: 64 64 20 61 6c 6c 20 74 61 62 6c 65 20 63 6f 6c  dd all table col
d740: 75 6d 6e 73 20 74 6f 20 74 68 65 20 50 52 49 4d  umns to the PRIM
d750: 41 52 59 20 4b 45 59 20 49 6e 64 65 78 20 6f 62  ARY KEY Index ob
d760: 6a 65 63 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ject.**         
d770: 20 73 6f 20 74 68 61 74 20 74 68 65 20 50 52 49   so that the PRI
d780: 4d 41 52 59 20 4b 45 59 20 69 73 20 61 20 63 6f  MARY KEY is a co
d790: 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 54  vering index.  T
d7a0: 68 65 20 73 75 72 70 6c 75 73 0a 2a 2a 20 20 20  he surplus.**   
d7b0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 73 20 61         columns a
d7c0: 72 65 20 70 61 72 74 20 6f 66 20 4b 65 79 49 6e  re part of KeyIn
d7d0: 66 6f 2e 6e 58 46 69 65 6c 64 20 61 6e 64 20 61  fo.nXField and a
d7e0: 72 65 20 6e 6f 74 20 75 73 65 64 20 66 6f 72 0a  re not used for.
d7f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 6f 72 74  **          sort
d800: 69 6e 67 20 6f 72 20 6c 6f 6f 6b 75 70 20 6f 72  ing or lookup or
d810: 20 75 6e 69 71 75 65 6e 65 73 73 20 63 68 65 63   uniqueness chec
d820: 6b 73 2e 0a 2a 2a 20 20 20 20 20 28 36 29 20 20  ks..**     (6)  
d830: 52 65 70 6c 61 63 65 20 74 68 65 20 72 6f 77 69  Replace the rowi
d840: 64 20 74 61 69 6c 20 6f 6e 20 61 6c 6c 20 61 75  d tail on all au
d850: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
d860: 72 61 74 65 64 20 55 4e 49 51 55 45 0a 2a 2a 20  rated UNIQUE.** 
d870: 20 20 20 20 20 20 20 20 20 69 6e 64 69 63 65 73           indices
d880: 20 77 69 74 68 20 74 68 65 20 50 52 49 4d 41 52   with the PRIMAR
d890: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 2e 0a 2a  Y KEY columns..*
d8a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
d8b0: 6e 76 65 72 74 54 6f 57 69 74 68 6f 75 74 52 6f  nvertToWithoutRo
d8c0: 77 69 64 54 61 62 6c 65 28 50 61 72 73 65 20 2a  widTable(Parse *
d8d0: 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
d8e0: 54 61 62 29 7b 0a 20 20 49 6e 64 65 78 20 2a 70  Tab){.  Index *p
d8f0: 49 64 78 3b 0a 20 20 49 6e 64 65 78 20 2a 70 50  Idx;.  Index *pP
d900: 6b 3b 0a 20 20 69 6e 74 20 6e 50 6b 3b 0a 20 20  k;.  int nPk;.  
d910: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 71 6c 69  int i, j;.  sqli
d920: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
d930: 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 76 20  ->db;.  Vdbe *v 
d940: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d950: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
d960: 68 65 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  he OP_CreateTabl
d970: 65 20 6f 70 63 6f 64 65 20 74 68 61 74 20 77 6f  e opcode that wo
d980: 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 63 72 65  uld normally cre
d990: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 72 6f 6f  ate the.  ** roo
d9a0: 74 2d 70 61 67 65 20 66 6f 72 20 74 68 65 20 74  t-page for the t
d9b0: 61 62 6c 65 20 69 6e 74 6f 20 61 6e 20 4f 50 5f  able into an OP_
d9c0: 43 72 65 61 74 65 49 6e 64 65 78 20 6f 70 63 6f  CreateIndex opco
d9d0: 64 65 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 20  de.  The index. 
d9e0: 20 2a 2a 20 63 72 65 61 74 65 64 20 77 69 6c 6c   ** created will
d9f0: 20 62 65 63 6f 6d 65 20 74 68 65 20 50 52 49 4d   become the PRIM
da00: 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 0a 20  ARY KEY index.. 
da10: 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 73 65   */.  if( pParse
da20: 2d 3e 61 64 64 72 43 72 54 61 62 20 29 7b 0a 20  ->addrCrTab ){. 
da30: 20 20 20 61 73 73 65 72 74 28 20 76 20 29 3b 0a     assert( v );.
da40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
da50: 68 61 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70  hangeOpcode(v, p
da60: 50 61 72 73 65 2d 3e 61 64 64 72 43 72 54 61 62  Parse->addrCrTab
da70: 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
da80: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63  );.  }..  /* Loc
da90: 61 74 65 20 74 68 65 20 50 52 49 4d 41 52 59 20  ate the PRIMARY 
daa0: 4b 45 59 20 69 6e 64 65 78 2e 20 20 4f 72 2c 20  KEY index.  Or, 
dab0: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 77 61  if this table wa
dac0: 73 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  s originally.  *
dad0: 2a 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  * an INTEGER PRI
dae0: 4d 41 52 59 20 4b 45 59 20 74 61 62 6c 65 2c 20  MARY KEY table, 
daf0: 63 72 65 61 74 65 20 61 20 6e 65 77 20 50 52 49  create a new PRI
db00: 4d 41 52 59 20 4b 45 59 20 69 6e 64 65 78 2e 20  MARY KEY index. 
db10: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62  .  */.  if( pTab
db20: 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
db30: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
db40: 74 3b 0a 20 20 20 20 54 6f 6b 65 6e 20 69 70 6b  t;.    Token ipk
db50: 54 6f 6b 65 6e 3b 0a 20 20 20 20 69 70 6b 54 6f  Token;.    ipkTo
db60: 6b 65 6e 2e 7a 20 3d 20 70 54 61 62 2d 3e 61 43  ken.z = pTab->aC
db70: 6f 6c 5b 70 54 61 62 2d 3e 69 50 4b 65 79 5d 2e  ol[pTab->iPKey].
db80: 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 70 6b 54 6f  zName;.    ipkTo
db90: 6b 65 6e 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53  ken.n = sqlite3S
dba0: 74 72 6c 65 6e 33 30 28 69 70 6b 54 6f 6b 65 6e  trlen30(ipkToken
dbb0: 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d  .z);.    pList =
dbc0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
dbd0: 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c 20 30  Append(pParse, 0
dbe0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
dbf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
dc00: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c  Alloc(db, TK_ID,
dc10: 20 26 69 70 6b 54 6f 6b 65 6e 2c 20 30 29 29 3b   &ipkToken, 0));
dc20: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
dc30: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
dc40: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 73 6f 72 74  pList->a[0].sort
dc50: 4f 72 64 65 72 20 3d 20 70 50 61 72 73 65 2d 3e  Order = pParse->
dc60: 69 50 6b 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  iPkSortOrder;.  
dc70: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
dc80: 2d 3e 70 4e 65 77 54 61 62 6c 65 3d 3d 70 54 61  ->pNewTable==pTa
dc90: 62 20 29 3b 0a 20 20 20 20 70 50 6b 20 3d 20 73  b );.    pPk = s
dca0: 71 6c 69 74 65 33 43 72 65 61 74 65 49 6e 64 65  qlite3CreateInde
dcb0: 78 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  x(pParse, 0, 0, 
dcc0: 30 2c 20 70 4c 69 73 74 2c 20 70 54 61 62 2d 3e  0, pList, pTab->
dcd0: 6b 65 79 43 6f 6e 66 2c 20 30 2c 20 30 2c 20 30  keyConf, 0, 0, 0
dce0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50  , 0);.    if( pP
dcf0: 6b 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  k==0 ) return;. 
dd00: 20 20 20 70 50 6b 2d 3e 69 64 78 54 79 70 65 20     pPk->idxType 
dd10: 3d 20 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45  = SQLITE_IDXTYPE
dd20: 5f 50 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 20  _PRIMARYKEY;.   
dd30: 20 70 54 61 62 2d 3e 69 50 4b 65 79 20 3d 20 2d   pTab->iPKey = -
dd40: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
dd50: 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
dd60: 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
dd70: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 79 70 61  b);..    /* Bypa
dd80: 73 73 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  ss the creation 
dd90: 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b  of the PRIMARY K
dda0: 45 59 20 62 74 72 65 65 20 61 6e 64 20 74 68 65  EY btree and the
ddb0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
ddc0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 65 6e 74 72     ** table entr
ddd0: 79 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 20  y. This is only 
dde0: 72 65 71 75 69 72 65 64 20 69 66 20 63 75 72 72  required if curr
ddf0: 65 6e 74 6c 79 20 67 65 6e 65 72 61 74 69 6e 67  ently generating
de00: 20 56 44 42 45 0a 20 20 20 20 2a 2a 20 63 6f 64   VDBE.    ** cod
de10: 65 20 66 6f 72 20 61 20 43 52 45 41 54 45 20 54  e for a CREATE T
de20: 41 42 4c 45 20 28 6e 6f 74 20 77 68 65 6e 20 70  ABLE (not when p
de30: 61 72 73 69 6e 67 20 6f 6e 65 20 61 73 20 70 61  arsing one as pa
de40: 72 74 20 6f 66 20 72 65 61 64 69 6e 67 0a 20 20  rt of reading.  
de50: 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20    ** a database 
de60: 73 63 68 65 6d 61 29 2e 20 20 2a 2f 0a 20 20 20  schema).  */.   
de70: 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 20 20   if( v ){.      
de80: 61 73 73 65 72 74 28 20 64 62 2d 3e 69 6e 69 74  assert( db->init
de90: 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20  .busy==0 );.    
dea0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
deb0: 6e 67 65 4f 70 63 6f 64 65 28 76 2c 20 70 50 6b  ngeOpcode(v, pPk
dec0: 2d 3e 74 6e 75 6d 2c 20 4f 50 5f 47 6f 74 6f 29  ->tnum, OP_Goto)
ded0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
dee0: 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 61 6c      ** Remove al
def0: 6c 20 72 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75  l redundant colu
df00: 6d 6e 73 20 66 72 6f 6d 20 74 68 65 20 50 52 49  mns from the PRI
df10: 4d 41 52 59 20 4b 45 59 2e 20 20 46 6f 72 20 65  MARY KEY.  For e
df20: 78 61 6d 70 6c 65 2c 20 63 68 61 6e 67 65 0a 20  xample, change. 
df30: 20 20 20 2a 2a 20 22 50 52 49 4d 41 52 59 20 4b     ** "PRIMARY K
df40: 45 59 28 61 2c 62 2c 61 2c 62 2c 63 2c 62 2c 63  EY(a,b,a,b,c,b,c
df50: 2c 64 29 22 20 69 6e 74 6f 20 6a 75 73 74 20 22  ,d)" into just "
df60: 50 52 49 4d 41 52 59 20 4b 45 59 28 61 2c 62 2c  PRIMARY KEY(a,b,
df70: 63 2c 64 29 22 2e 20 20 4c 61 74 65 72 0a 20 20  c,d)".  Later.  
df80: 20 20 2a 2a 20 63 6f 64 65 20 61 73 73 75 6d 65    ** code assume
df90: 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
dfa0: 59 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 65  Y contains no re
dfb0: 70 65 61 74 65 64 20 63 6f 6c 75 6d 6e 73 2e 0a  peated columns..
dfc0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
dfd0: 3d 6a 3d 31 3b 20 69 3c 70 50 6b 2d 3e 6e 4b 65  =j=1; i<pPk->nKe
dfe0: 79 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  yCol; i++){.    
dff0: 20 20 69 66 28 20 68 61 73 43 6f 6c 75 6d 6e 28    if( hasColumn(
e000: 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 2c 20 6a  pPk->aiColumn, j
e010: 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  , pPk->aiColumn[
e020: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  i]) ){.        p
e030: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 2d 2d 3b 0a 20  Pk->nColumn--;. 
e040: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e050: 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d      pPk->aiColum
e060: 6e 5b 6a 2b 2b 5d 20 3d 20 70 50 6b 2d 3e 61 69  n[j++] = pPk->ai
e070: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
e080: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 6b   }.    }.    pPk
e090: 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6a 3b 0a 20  ->nKeyCol = j;. 
e0a0: 20 7d 0a 20 20 70 50 6b 2d 3e 69 73 43 6f 76 65   }.  pPk->isCove
e0b0: 72 69 6e 67 20 3d 20 31 3b 0a 20 20 61 73 73 65  ring = 1;.  asse
e0c0: 72 74 28 20 70 50 6b 21 3d 30 20 29 3b 0a 20 20  rt( pPk!=0 );.  
e0d0: 6e 50 6b 20 3d 20 70 50 6b 2d 3e 6e 4b 65 79 43  nPk = pPk->nKeyC
e0e0: 6f 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73  ol;..  /* Make s
e0f0: 75 72 65 20 65 76 65 72 79 20 63 6f 6c 75 6d 6e  ure every column
e100: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e110: 4b 45 59 20 69 73 20 4e 4f 54 20 4e 55 4c 4c 2e  KEY is NOT NULL.
e120: 20 20 28 45 78 63 65 70 74 2c 0a 20 20 2a 2a 20    (Except,.  ** 
e130: 64 6f 20 6e 6f 74 20 65 6e 66 6f 72 63 65 20 74  do not enforce t
e140: 68 69 73 20 66 6f 72 20 69 6d 70 6f 73 74 65 72  his for imposter
e150: 20 74 61 62 6c 65 73 2e 29 20 2a 2f 0a 20 20 69   tables.) */.  i
e160: 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 69 6d 70  f( !db->init.imp
e170: 6f 73 74 65 72 54 61 62 6c 65 20 29 7b 0a 20 20  osterTable ){.  
e180: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 50 6b    for(i=0; i<nPk
e190: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 54  ; i++){.      pT
e1a0: 61 62 2d 3e 61 43 6f 6c 5b 70 50 6b 2d 3e 61 69  ab->aCol[pPk->ai
e1b0: 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 6e 6f 74 4e 75  Column[i]].notNu
e1c0: 6c 6c 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20  ll = OE_Abort;. 
e1d0: 20 20 20 7d 0a 20 20 20 20 70 50 6b 2d 3e 75 6e     }.    pPk->un
e1e0: 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 31 3b 0a 20  iqNotNull = 1;. 
e1f0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 6f 6f   }..  /* The roo
e200: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 50 52  t page of the PR
e210: 49 4d 41 52 59 20 4b 45 59 20 69 73 20 74 68 65  IMARY KEY is the
e220: 20 74 61 62 6c 65 20 72 6f 6f 74 20 70 61 67 65   table root page
e230: 20 2a 2f 0a 20 20 70 50 6b 2d 3e 74 6e 75 6d 20   */.  pPk->tnum 
e240: 3d 20 70 54 61 62 2d 3e 74 6e 75 6d 3b 0a 0a 20  = pTab->tnum;.. 
e250: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 69   /* Update the i
e260: 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65  n-memory represe
e270: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 55  ntation of all U
e280: 4e 49 51 55 45 20 69 6e 64 69 63 65 73 20 62 79  NIQUE indices by
e290: 20 63 6f 6e 76 65 72 74 69 6e 67 0a 20 20 2a 2a   converting.  **
e2a0: 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
e2b0: 20 63 6f 6c 75 6d 6e 20 69 6e 74 6f 20 6f 6e 65   column into one
e2c0: 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73   or more columns
e2d0: 20 6f 66 20 74 68 65 20 50 52 49 4d 41 52 59 20   of the PRIMARY 
e2e0: 4b 45 59 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  KEY..  */.  for(
e2f0: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
e300: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
e310: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
e320: 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 49  int n;.    if( I
e330: 73 50 72 69 6d 61 72 79 4b 65 79 49 6e 64 65 78  sPrimaryKeyIndex
e340: 28 70 49 64 78 29 20 29 20 63 6f 6e 74 69 6e 75  (pIdx) ) continu
e350: 65 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30  e;.    for(i=n=0
e360: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
e370: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e380: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
e390: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
e3a0: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
e3b0: 5b 69 5d 29 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  [i]) ) n++;.    
e3c0: 7d 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  }.    if( n==0 )
e3d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
e3e0: 69 6e 64 65 78 20 69 73 20 61 20 73 75 70 65 72  index is a super
e3f0: 73 65 74 20 6f 66 20 74 68 65 20 70 72 69 6d 61  set of the prima
e400: 72 79 20 6b 65 79 20 2a 2f 0a 20 20 20 20 20 20  ry key */.      
e410: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 3d 20  pIdx->nColumn = 
e420: 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20  pIdx->nKeyCol;. 
e430: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
e440: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
e450: 69 7a 65 49 6e 64 65 78 4f 62 6a 65 63 74 28 64  izeIndexObject(d
e460: 62 2c 20 70 49 64 78 2c 20 70 49 64 78 2d 3e 6e  b, pIdx, pIdx->n
e470: 4b 65 79 43 6f 6c 2b 6e 29 20 29 20 72 65 74 75  KeyCol+n) ) retu
e480: 72 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c  rn;.    for(i=0,
e490: 20 6a 3d 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c   j=pIdx->nKeyCol
e4a0: 3b 20 69 3c 6e 50 6b 3b 20 69 2b 2b 29 7b 0a 20  ; i<nPk; i++){. 
e4b0: 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f 6c       if( !hasCol
e4c0: 75 6d 6e 28 70 49 64 78 2d 3e 61 69 43 6f 6c 75  umn(pIdx->aiColu
e4d0: 6d 6e 2c 20 70 49 64 78 2d 3e 6e 4b 65 79 43 6f  mn, pIdx->nKeyCo
e4e0: 6c 2c 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d 6e  l, pPk->aiColumn
e4f0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [i]) ){.        
e500: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
e510: 5d 20 3d 20 70 50 6b 2d 3e 61 69 43 6f 6c 75 6d  ] = pPk->aiColum
e520: 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 70 49  n[i];.        pI
e530: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6a 5d 20 3d 20  dx->azColl[j] = 
e540: 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a  pPk->azColl[i];.
e550: 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20          j++;.   
e560: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
e570: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f  ssert( pIdx->nCo
e580: 6c 75 6d 6e 3e 3d 70 49 64 78 2d 3e 6e 4b 65 79  lumn>=pIdx->nKey
e590: 43 6f 6c 2b 6e 20 29 3b 0a 20 20 20 20 61 73 73  Col+n );.    ass
e5a0: 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
e5b0: 6d 6e 3e 3d 6a 20 29 3b 0a 20 20 7d 0a 0a 20 20  mn>=j );.  }..  
e5c0: 2f 2a 20 41 64 64 20 61 6c 6c 20 74 61 62 6c 65  /* Add all table
e5d0: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 74 68 65 20   columns to the 
e5e0: 50 52 49 4d 41 52 59 20 4b 45 59 20 69 6e 64 65  PRIMARY KEY inde
e5f0: 78 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 6b  x.  */.  if( nPk
e600: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
e610: 20 20 20 69 66 28 20 72 65 73 69 7a 65 49 6e 64     if( resizeInd
e620: 65 78 4f 62 6a 65 63 74 28 64 62 2c 20 70 50 6b  exObject(db, pPk
e630: 2c 20 70 54 61 62 2d 3e 6e 43 6f 6c 29 20 29 20  , pTab->nCol) ) 
e640: 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 6f 72 28  return;.    for(
e650: 69 3d 30 2c 20 6a 3d 6e 50 6b 3b 20 69 3c 70 54  i=0, j=nPk; i<pT
e660: 61 62 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ab->nCol; i++){.
e670: 20 20 20 20 20 20 69 66 28 20 21 68 61 73 43 6f        if( !hasCo
e680: 6c 75 6d 6e 28 70 50 6b 2d 3e 61 69 43 6f 6c 75  lumn(pPk->aiColu
e690: 6d 6e 2c 20 6a 2c 20 69 29 20 29 7b 0a 20 20 20  mn, j, i) ){.   
e6a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70       assert( j<p
e6b0: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  Pk->nColumn );. 
e6c0: 20 20 20 20 20 20 20 70 50 6b 2d 3e 61 69 43 6f         pPk->aiCo
e6d0: 6c 75 6d 6e 5b 6a 5d 20 3d 20 69 3b 0a 20 20 20  lumn[j] = i;.   
e6e0: 20 20 20 20 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c       pPk->azColl
e6f0: 5b 6a 5d 20 3d 20 73 71 6c 69 74 65 33 53 74 72  [j] = sqlite3Str
e700: 42 49 4e 41 52 59 3b 0a 20 20 20 20 20 20 20 20  BINARY;.        
e710: 6a 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j++;.      }.   
e720: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
e730: 50 6b 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 6a 20 29  Pk->nColumn==j )
e740: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
e750: 61 62 2d 3e 6e 43 6f 6c 3d 3d 6a 20 29 3b 0a 20  ab->nCol==j );. 
e760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 6b 2d   }else{.    pPk-
e770: 3e 6e 43 6f 6c 75 6d 6e 20 3d 20 70 54 61 62 2d  >nColumn = pTab-
e780: 3e 6e 43 6f 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >nCol;.  }.}../*
e790: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e7a0: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 72 65   is called to re
e7b0: 70 6f 72 74 20 74 68 65 20 66 69 6e 61 6c 20 22  port the final "
e7c0: 29 22 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  )" that terminat
e7d0: 65 73 0a 2a 2a 20 61 20 43 52 45 41 54 45 20 54  es.** a CREATE T
e7e0: 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
e7f0: 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  **.** The table 
e800: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 6f  structure that o
e810: 74 68 65 72 20 61 63 74 69 6f 6e 20 72 6f 75 74  ther action rout
e820: 69 6e 65 73 20 68 61 76 65 20 62 65 65 6e 20 62  ines have been b
e830: 75 69 6c 64 69 6e 67 0a 2a 2a 20 69 73 20 61 64  uilding.** is ad
e840: 64 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ded to the inter
e850: 6e 61 6c 20 68 61 73 68 20 74 61 62 6c 65 73 2c  nal hash tables,
e860: 20 61 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   assuming no err
e870: 6f 72 73 20 68 61 76 65 0a 2a 2a 20 6f 63 63 75  ors have.** occu
e880: 72 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  rred..**.** An e
e890: 6e 74 72 79 20 66 6f 72 20 74 68 65 20 74 61 62  ntry for the tab
e8a0: 6c 65 20 69 73 20 6d 61 64 65 20 69 6e 20 74 68  le is made in th
e8b0: 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 6f  e master table o
e8c0: 6e 20 64 69 73 6b 2c 20 75 6e 6c 65 73 73 0a 2a  n disk, unless.*
e8d0: 2a 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  * this is a temp
e8e0: 6f 72 61 72 79 20 74 61 62 6c 65 20 6f 72 20 64  orary table or d
e8f0: 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 31 2e  b->init.busy==1.
e900: 20 20 57 68 65 6e 20 64 62 2d 3e 69 6e 69 74 2e    When db->init.
e910: 62 75 73 79 3d 3d 31 0a 2a 2a 20 69 74 20 6d 65  busy==1.** it me
e920: 61 6e 73 20 77 65 20 61 72 65 20 72 65 61 64 69  ans we are readi
e930: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  ng the sqlite_ma
e940: 73 74 65 72 20 74 61 62 6c 65 20 62 65 63 61 75  ster table becau
e950: 73 65 20 77 65 20 6a 75 73 74 0a 2a 2a 20 63 6f  se we just.** co
e960: 6e 6e 65 63 74 65 64 20 74 6f 20 74 68 65 20 64  nnected to the d
e970: 61 74 61 62 61 73 65 20 6f 72 20 62 65 63 61 75  atabase or becau
e980: 73 65 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  se the sqlite_ma
e990: 73 74 65 72 20 74 61 62 6c 65 20 68 61 73 0a 2a  ster table has.*
e9a0: 2a 20 72 65 63 65 6e 74 6c 79 20 63 68 61 6e 67  * recently chang
e9b0: 65 64 2c 20 73 6f 20 74 68 65 20 65 6e 74 72 79  ed, so the entry
e9c0: 20 66 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20   for this table 
e9d0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 69  already exists i
e9e0: 6e 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f  n.** the sqlite_
e9f0: 6d 61 73 74 65 72 20 74 61 62 6c 65 2e 20 20 57  master table.  W
ea00: 65 20 64 6f 20 6e 6f 74 20 77 61 6e 74 20 74 6f  e do not want to
ea10: 20 63 72 65 61 74 65 20 69 74 20 61 67 61 69 6e   create it again
ea20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
ea30: 53 65 6c 65 63 74 20 61 72 67 75 6d 65 6e 74 20  Select argument 
ea40: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 74 20  is not NULL, it 
ea50: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73 20  means that this 
ea60: 72 6f 75 74 69 6e 65 0a 2a 2a 20 77 61 73 20 63  routine.** was c
ea70: 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74 65 20  alled to create 
ea80: 61 20 74 61 62 6c 65 20 67 65 6e 65 72 61 74 65  a table generate
ea90: 64 20 66 72 6f 6d 20 61 20 0a 2a 2a 20 22 43 52  d from a .** "CR
eaa0: 45 41 54 45 20 54 41 42 4c 45 20 2e 2e 2e 20 41  EATE TABLE ... A
eab0: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 22 20 73 74  S SELECT ..." st
eac0: 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20 63 6f  atement.  The co
ead0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a  lumn names of.**
eae0: 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20 77   the new table w
eaf0: 69 6c 6c 20 6d 61 74 63 68 20 74 68 65 20 72 65  ill match the re
eb00: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
eb10: 53 45 4c 45 43 54 2e 0a 2a 2f 0a 76 6f 69 64 20  SELECT..*/.void 
eb20: 73 71 6c 69 74 65 33 45 6e 64 54 61 62 6c 65 28  sqlite3EndTable(
eb30: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
eb40: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
eb50: 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  rse context */. 
eb60: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6e 73 2c 20 20   Token *pCons,  
eb70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
eb80: 27 2c 27 20 74 6f 6b 65 6e 20 61 66 74 65 72 20  ',' token after 
eb90: 74 68 65 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20  the last column 
eba0: 64 65 66 6e 2e 20 2a 2f 0a 20 20 54 6f 6b 65 6e  defn. */.  Token
ebb0: 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20 20 20   *pEnd,         
ebc0: 20 20 20 2f 2a 20 54 68 65 20 27 29 27 20 62 65     /* The ')' be
ebd0: 66 6f 72 65 20 6f 70 74 69 6f 6e 73 20 69 6e 20  fore options in 
ebe0: 74 68 65 20 43 52 45 41 54 45 20 54 41 42 4c 45  the CREATE TABLE
ebf0: 20 2a 2f 0a 20 20 75 38 20 74 61 62 4f 70 74 73   */.  u8 tabOpts
ec00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
ec10: 20 45 78 74 72 61 20 74 61 62 6c 65 20 6f 70 74   Extra table opt
ec20: 69 6f 6e 73 2e 20 55 73 75 61 6c 6c 79 20 30 2e  ions. Usually 0.
ec30: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
ec40: 65 6c 65 63 74 20 20 20 20 20 20 20 20 20 2f 2a  elect         /*
ec50: 20 53 65 6c 65 63 74 20 66 72 6f 6d 20 61 20 22   Select from a "
ec60: 43 52 45 41 54 45 20 2e 2e 2e 20 41 53 20 53 45  CREATE ... AS SE
ec70: 4c 45 43 54 22 20 2a 2f 0a 29 7b 0a 20 20 54 61  LECT" */.){.  Ta
ec80: 62 6c 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ble *p;         
ec90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
eca0: 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71  ew table */.  sq
ecb0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
ecc0: 73 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64  se->db; /* The d
ecd0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
ece0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  on */.  int iDb;
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed00: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6e    /* Database in
ed10: 20 77 68 69 63 68 20 74 68 65 20 74 61 62 6c 65   which the table
ed20: 20 6c 69 76 65 73 20 2a 2f 0a 20 20 49 6e 64 65   lives */.  Inde
ed30: 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20  x *pIdx;        
ed40: 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6d 70 6c        /* An impl
ed50: 69 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  ied index of the
ed60: 20 74 61 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28   table */..  if(
ed70: 20 70 45 6e 64 3d 3d 30 20 26 26 20 70 53 65 6c   pEnd==0 && pSel
ed80: 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ect==0 ){.    re
ed90: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65  turn;.  }.  asse
eda0: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
edb0: 61 69 6c 65 64 20 29 3b 0a 20 20 70 20 3d 20 70  ailed );.  p = p
edc0: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
edd0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
ede0: 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
edf0: 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  ( !db->init.busy
ee00: 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29 3b 0a   || !pSelect );.
ee10: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d  .  /* If the db-
ee20: 3e 69 6e 69 74 2e 62 75 73 79 20 69 73 20 31 20  >init.busy is 1 
ee30: 69 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  it means we are 
ee40: 72 65 61 64 69 6e 67 20 74 68 65 20 53 51 4c 20  reading the SQL 
ee50: 6f 66 66 20 74 68 65 0a 20 20 2a 2a 20 22 73 71  off the.  ** "sq
ee60: 6c 69 74 65 5f 6d 61 73 74 65 72 22 20 6f 72 20  lite_master" or 
ee70: 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
ee80: 74 65 72 22 20 74 61 62 6c 65 20 6f 6e 20 74 68  ter" table on th
ee90: 65 20 64 69 73 6b 2e 0a 20 20 2a 2a 20 53 6f 20  e disk..  ** So 
eea0: 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  do not write to 
eeb0: 74 68 65 20 64 69 73 6b 20 61 67 61 69 6e 2e 20  the disk again. 
eec0: 20 45 78 74 72 61 63 74 20 74 68 65 20 72 6f 6f   Extract the roo
eed0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  t page number.  
eee0: 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
eef0: 20 66 72 6f 6d 20 74 68 65 20 64 62 2d 3e 69 6e   from the db->in
ef00: 69 74 2e 6e 65 77 54 6e 75 6d 20 66 69 65 6c 64  it.newTnum field
ef10: 2e 20 20 28 54 68 65 20 70 61 67 65 20 6e 75 6d  .  (The page num
ef20: 62 65 72 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  ber.  ** should 
ef30: 68 61 76 65 20 62 65 65 6e 20 70 75 74 20 74 68  have been put th
ef40: 65 72 65 20 62 79 20 74 68 65 20 73 71 6c 69 74  ere by the sqlit
ef50: 65 4f 70 65 6e 43 62 20 72 6f 75 74 69 6e 65 2e  eOpenCb routine.
ef60: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ).  **.  ** If t
ef70: 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6e 75 6d  he root page num
ef80: 62 65 72 20 69 73 20 31 2c 20 74 68 61 74 20 6d  ber is 1, that m
ef90: 65 61 6e 73 20 74 68 69 73 20 69 73 20 74 68 65  eans this is the
efa0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20   sqlite_master. 
efb0: 20 2a 2a 20 74 61 62 6c 65 20 69 74 73 65 6c 66   ** table itself
efc0: 2e 20 20 53 6f 20 6d 61 72 6b 20 69 74 20 72 65  .  So mark it re
efd0: 61 64 2d 6f 6e 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ad-only..  */.  
efe0: 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73  if( db->init.bus
eff0: 79 20 29 7b 0a 20 20 20 20 70 2d 3e 74 6e 75 6d  y ){.    p->tnum
f000: 20 3d 20 64 62 2d 3e 69 6e 69 74 2e 6e 65 77 54   = db->init.newT
f010: 6e 75 6d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  num;.    if( p->
f020: 74 6e 75 6d 3d 3d 31 20 29 20 70 2d 3e 74 61 62  tnum==1 ) p->tab
f030: 46 6c 61 67 73 20 7c 3d 20 54 46 5f 52 65 61 64  Flags |= TF_Read
f040: 6f 6e 6c 79 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  only;.  }..  /* 
f050: 53 70 65 63 69 61 6c 20 70 72 6f 63 65 73 73 69  Special processi
f060: 6e 67 20 66 6f 72 20 57 49 54 48 4f 55 54 20 52  ng for WITHOUT R
f070: 4f 57 49 44 20 54 61 62 6c 65 73 20 2a 2f 0a 20  OWID Tables */. 
f080: 20 69 66 28 20 74 61 62 4f 70 74 73 20 26 20 54   if( tabOpts & T
f090: 46 5f 57 69 74 68 6f 75 74 52 6f 77 69 64 20 29  F_WithoutRowid )
f0a0: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61  {.    if( (p->ta
f0b0: 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f  bFlags & TF_Auto
f0c0: 69 6e 63 72 65 6d 65 6e 74 29 20 29 7b 0a 20 20  increment) ){.  
f0d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f0e0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
f0f0: 20 20 20 20 20 20 22 41 55 54 4f 49 4e 43 52 45        "AUTOINCRE
f100: 4d 45 4e 54 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  MENT not allowed
f110: 20 6f 6e 20 57 49 54 48 4f 55 54 20 52 4f 57 49   on WITHOUT ROWI
f120: 44 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  D tables");.    
f130: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
f140: 20 20 20 20 69 66 28 20 28 70 2d 3e 74 61 62 46      if( (p->tabF
f150: 6c 61 67 73 20 26 20 54 46 5f 48 61 73 50 72 69  lags & TF_HasPri
f160: 6d 61 72 79 4b 65 79 29 3d 3d 30 20 29 7b 0a 20  maryKey)==0 ){. 
f170: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
f180: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 50 52  rMsg(pParse, "PR
f190: 49 4d 41 52 59 20 4b 45 59 20 6d 69 73 73 69 6e  IMARY KEY missin
f1a0: 67 20 6f 6e 20 74 61 62 6c 65 20 25 73 22 2c 20  g on table %s", 
f1b0: 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  p->zName);.    }
f1c0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 74  else{.      p->t
f1d0: 61 62 46 6c 61 67 73 20 7c 3d 20 54 46 5f 57 69  abFlags |= TF_Wi
f1e0: 74 68 6f 75 74 52 6f 77 69 64 20 7c 20 54 46 5f  thoutRowid | TF_
f1f0: 4e 6f 56 69 73 69 62 6c 65 52 6f 77 69 64 3b 0a  NoVisibleRowid;.
f200: 20 20 20 20 20 20 63 6f 6e 76 65 72 74 54 6f 57        convertToW
f210: 69 74 68 6f 75 74 52 6f 77 69 64 54 61 62 6c 65  ithoutRowidTable
f220: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
f230: 20 7d 0a 20 20 7d 0a 0a 20 20 69 44 62 20 3d 20   }.  }..  iDb = 
f240: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
f250: 6e 64 65 78 28 64 62 2c 20 70 2d 3e 70 53 63 68  ndex(db, p->pSch
f260: 65 6d 61 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ema);..#ifndef S
f270: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
f280: 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61  .  /* Resolve na
f290: 6d 65 73 20 69 6e 20 61 6c 6c 20 43 48 45 43 4b  mes in all CHECK
f2a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78 70 72   constraint expr
f2b0: 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  essions..  */.  
f2c0: 69 66 28 20 70 2d 3e 70 43 68 65 63 6b 20 29 7b  if( p->pCheck ){
f2d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f  .    sqlite3Reso
f2e0: 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65  lveSelfReference
f2f0: 28 70 50 61 72 73 65 2c 20 70 2c 20 4e 43 5f 49  (pParse, p, NC_I
f300: 73 43 68 65 63 6b 2c 20 30 2c 20 70 2d 3e 70 43  sCheck, 0, p->pC
f310: 68 65 63 6b 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  heck);.  }.#endi
f320: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
f330: 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 29  LITE_OMIT_CHECK)
f340: 20 2a 2f 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61   */..  /* Estima
f350: 74 65 20 74 68 65 20 61 76 65 72 61 67 65 20 72  te the average r
f360: 6f 77 20 73 69 7a 65 20 66 6f 72 20 74 68 65 20  ow size for the 
f370: 74 61 62 6c 65 20 61 6e 64 20 66 6f 72 20 61 6c  table and for al
f380: 6c 20 69 6d 70 6c 69 65 64 20 69 6e 64 69 63 65  l implied indice
f390: 73 20 2a 2f 0a 20 20 65 73 74 69 6d 61 74 65 54  s */.  estimateT
f3a0: 61 62 6c 65 57 69 64 74 68 28 70 29 3b 0a 20 20  ableWidth(p);.  
f3b0: 66 6f 72 28 70 49 64 78 3d 70 2d 3e 70 49 6e 64  for(pIdx=p->pInd
f3c0: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
f3d0: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
f3e0: 20 65 73 74 69 6d 61 74 65 49 6e 64 65 78 57 69   estimateIndexWi
f3f0: 64 74 68 28 70 49 64 78 29 3b 0a 20 20 7d 0a 0a  dth(pIdx);.  }..
f400: 20 20 2f 2a 20 49 66 20 6e 6f 74 20 69 6e 69 74    /* If not init
f410: 69 61 6c 69 7a 69 6e 67 2c 20 74 68 65 6e 20 63  ializing, then c
f420: 72 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66  reate a record f
f430: 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
f440: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 53 51 4c  .  ** in the SQL
f450: 49 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65  ITE_MASTER table
f460: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
f470: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
f480: 68 69 73 20 69 73 20 61 20 54 45 4d 50 4f 52 41  his is a TEMPORA
f490: 52 59 20 74 61 62 6c 65 2c 20 77 72 69 74 65 20  RY table, write 
f4a0: 74 68 65 20 65 6e 74 72 79 20 69 6e 74 6f 20 74  the entry into t
f4b0: 68 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a  he auxiliary.  *
f4c0: 2a 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f  * file instead o
f4d0: 66 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  f into the main 
f4e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
f4f0: 20 2a 2f 0a 20 20 69 66 28 20 21 64 62 2d 3e 69   */.  if( !db->i
f500: 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
f510: 69 6e 74 20 6e 3b 0a 20 20 20 20 56 64 62 65 20  int n;.    Vdbe 
f520: 2a 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54  *v;.    char *zT
f530: 79 70 65 3b 20 20 20 20 2f 2a 20 22 76 69 65 77  ype;    /* "view
f540: 22 20 6f 72 20 22 74 61 62 6c 65 22 20 2a 2f 0a  " or "table" */.
f550: 20 20 20 20 63 68 61 72 20 2a 7a 54 79 70 65 32      char *zType2
f560: 3b 20 20 20 2f 2a 20 22 56 49 45 57 22 20 6f 72  ;   /* "VIEW" or
f570: 20 22 54 41 42 4c 45 22 20 2a 2f 0a 20 20 20 20   "TABLE" */.    
f580: 63 68 61 72 20 2a 7a 53 74 6d 74 3b 20 20 20 20  char *zStmt;    
f590: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 43  /* Text of the C
f5a0: 52 45 41 54 45 20 54 41 42 4c 45 20 6f 72 20 43  REATE TABLE or C
f5b0: 52 45 41 54 45 20 56 49 45 57 20 73 74 61 74 65  REATE VIEW state
f5c0: 6d 65 6e 74 20 2a 2f 0a 0a 20 20 20 20 76 20 3d  ment */..    v =
f5d0: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
f5e0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 69 66 28  pParse);.    if(
f5f0: 20 4e 45 56 45 52 28 76 3d 3d 30 29 20 29 20 72   NEVER(v==0) ) r
f600: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 71 6c 69  eturn;..    sqli
f610: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
f620: 20 4f 50 5f 43 6c 6f 73 65 2c 20 30 29 3b 0a 0a   OP_Close, 0);..
f630: 20 20 20 20 2f 2a 20 0a 20 20 20 20 2a 2a 20 49      /* .    ** I
f640: 6e 69 74 69 61 6c 69 7a 65 20 7a 54 79 70 65 20  nitialize zType 
f650: 66 6f 72 20 74 68 65 20 6e 65 77 20 76 69 65 77  for the new view
f660: 20 6f 72 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a   or table..    *
f670: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 53 65  /.    if( p->pSe
f680: 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lect==0 ){.     
f690: 20 2f 2a 20 41 20 72 65 67 75 6c 61 72 20 74 61   /* A regular ta
f6a0: 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 7a 54 79  ble */.      zTy
f6b0: 70 65 20 3d 20 22 74 61 62 6c 65 22 3b 0a 20 20  pe = "table";.  
f6c0: 20 20 20 20 7a 54 79 70 65 32 20 3d 20 22 54 41      zType2 = "TA
f6d0: 42 4c 45 22 3b 0a 23 69 66 6e 64 65 66 20 53 51  BLE";.#ifndef SQ
f6e0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
f6f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f700: 2f 2a 20 41 20 76 69 65 77 20 2a 2f 0a 20 20 20  /* A view */.   
f710: 20 20 20 7a 54 79 70 65 20 3d 20 22 76 69 65 77     zType = "view
f720: 22 3b 0a 20 20 20 20 20 20 7a 54 79 70 65 32 20  ";.      zType2 
f730: 3d 20 22 56 49 45 57 22 3b 0a 23 65 6e 64 69 66  = "VIEW";.#endif
f740: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
f750: 66 20 74 68 69 73 20 69 73 20 61 20 43 52 45 41  f this is a CREA
f760: 54 45 20 54 41 42 4c 45 20 78 78 20 41 53 20 53  TE TABLE xx AS S
f770: 45 4c 45 43 54 20 2e 2e 2e 2c 20 65 78 65 63 75  ELECT ..., execu
f780: 74 65 20 74 68 65 20 53 45 4c 45 43 54 0a 20 20  te the SELECT.  
f790: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
f7a0: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6e  o populate the n
f7b0: 65 77 20 74 61 62 6c 65 2e 20 54 68 65 20 72 6f  ew table. The ro
f7c0: 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 66  ot-page number f
f7d0: 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65  or the.    ** ne
f7e0: 77 20 74 61 62 6c 65 20 69 73 20 69 6e 20 72 65  w table is in re
f7f0: 67 69 73 74 65 72 20 70 50 61 72 73 65 2d 3e 72  gister pParse->r
f800: 65 67 52 6f 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20  egRoot..    **. 
f810: 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20 53     ** Once the S
f820: 45 4c 45 43 54 20 68 61 73 20 62 65 65 6e 20 63  ELECT has been c
f830: 6f 64 65 64 20 62 79 20 73 71 6c 69 74 65 33 53  oded by sqlite3S
f840: 65 6c 65 63 74 28 29 2c 20 69 74 20 69 73 20 69  elect(), it is i
f850: 6e 20 61 0a 20 20 20 20 2a 2a 20 73 75 69 74 61  n a.    ** suita
f860: 62 6c 65 20 73 74 61 74 65 20 74 6f 20 71 75 65  ble state to que
f870: 72 79 20 66 6f 72 20 74 68 65 20 63 6f 6c 75 6d  ry for the colum
f880: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 79 70 65  n names and type
f890: 73 20 74 6f 20 62 65 20 75 73 65 64 0a 20 20 20  s to be used.   
f8a0: 20 2a 2a 20 62 79 20 74 68 65 20 6e 65 77 20 74   ** by the new t
f8b0: 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  able..    **.   
f8c0: 20 2a 2a 20 41 20 73 68 61 72 65 64 2d 63 61 63   ** A shared-cac
f8d0: 68 65 20 77 72 69 74 65 2d 6c 6f 63 6b 20 69 73  he write-lock is
f8e0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f   not required to
f8f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6e 65   write to the ne
f900: 77 20 74 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20  w table,.    ** 
f910: 61 73 20 61 20 73 63 68 65 6d 61 2d 6c 6f 63 6b  as a schema-lock
f920: 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61   must have alrea
f930: 64 79 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  dy been obtained
f940: 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e 20 53   to create it. S
f950: 69 6e 63 65 0a 20 20 20 20 2a 2a 20 61 20 73 63  ince.    ** a sc
f960: 68 65 6d 61 2d 6c 6f 63 6b 20 65 78 63 6c 75 64  hema-lock exclud
f970: 65 73 20 61 6c 6c 20 6f 74 68 65 72 20 64 61 74  es all other dat
f980: 61 62 61 73 65 20 75 73 65 72 73 2c 20 74 68 65  abase users, the
f990: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 6f 75 6c   write-lock woul
f9a0: 64 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 64 75  d.    ** be redu
f9b0: 6e 64 61 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndant..    */.  
f9c0: 20 20 69 66 28 20 70 53 65 6c 65 63 74 20 29 7b    if( pSelect ){
f9d0: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 44 65 73  .      SelectDes
f9e0: 74 20 64 65 73 74 3b 20 20 20 20 2f 2a 20 57 68  t dest;    /* Wh
f9f0: 65 72 65 20 74 68 65 20 53 45 4c 45 43 54 20 73  ere the SELECT s
fa00: 68 6f 75 6c 64 20 73 74 6f 72 65 20 72 65 73 75  hould store resu
fa10: 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  lts */.      int
fa20: 20 72 65 67 59 69 65 6c 64 3b 20 20 20 20 20 20   regYield;      
fa30: 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
fa40: 64 69 6e 67 20 63 6f 2d 72 6f 75 74 69 6e 65 20  ding co-routine 
fa50: 65 6e 74 72 79 2d 70 6f 69 6e 74 20 2a 2f 0a 20  entry-point */. 
fa60: 20 20 20 20 20 69 6e 74 20 61 64 64 72 54 6f 70       int addrTop
fa70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  ;        /* Top 
fa80: 6f 66 20 74 68 65 20 63 6f 2d 72 6f 75 74 69 6e  of the co-routin
fa90: 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  e */.      int r
faa0: 65 67 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  egRec;         /
fab0: 2a 20 41 20 72 65 63 6f 72 64 20 74 6f 20 62 65  * A record to be
fac0: 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74 68 65   insert into the
fad0: 20 6e 65 77 20 74 61 62 6c 65 20 2a 2f 0a 20 20   new table */.  
fae0: 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69 64      int regRowid
faf0: 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  ;       /* Rowid
fb00: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 72 6f 77   of the next row
fb10: 20 74 6f 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20   to insert */.  
fb20: 20 20 20 20 69 6e 74 20 61 64 64 72 49 6e 73 4c      int addrInsL
fb30: 6f 6f 70 3b 20 20 20 20 2f 2a 20 54 6f 70 20 6f  oop;    /* Top o
fb40: 66 20 74 68 65 20 6c 6f 6f 70 20 66 6f 72 20 69  f the loop for i
fb50: 6e 73 65 72 74 69 6e 67 20 72 6f 77 73 20 2a 2f  nserting rows */
fb60: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 53  .      Table *pS
fb70: 65 6c 54 61 62 3b 20 20 20 20 20 2f 2a 20 41 20  elTab;     /* A 
fb80: 74 61 62 6c 65 20 74 68 61 74 20 64 65 73 63 72  table that descr
fb90: 69 62 65 73 20 74 68 65 20 53 45 4c 45 43 54 20  ibes the SELECT 
fba0: 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 20 20  results */..    
fbb0: 20 20 72 65 67 59 69 65 6c 64 20 3d 20 2b 2b 70    regYield = ++p
fbc0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fbd0: 20 20 20 72 65 67 52 65 63 20 3d 20 2b 2b 70 50     regRec = ++pP
fbe0: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
fbf0: 20 20 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70    regRowid = ++p
fc00: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
fc10: 20 20 20 61 73 73 65 72 74 28 70 50 61 72 73 65     assert(pParse
fc20: 2d 3e 6e 54 61 62 3d 3d 31 29 3b 0a 20 20 20 20  ->nTab==1);.    
fc30: 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72    sqlite3MayAbor
fc40: 74 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  t(pParse);.     
fc50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
fc60: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 57 72 69  p3(v, OP_OpenWri
fc70: 74 65 2c 20 31 2c 20 70 50 61 72 73 65 2d 3e 72  te, 1, pParse->r
fc80: 65 67 52 6f 6f 74 2c 20 69 44 62 29 3b 0a 20 20  egRoot, iDb);.  
fc90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
fca0: 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41  hangeP5(v, OPFLA
fcb0: 47 5f 50 32 49 53 52 45 47 29 3b 0a 20 20 20 20  G_P2ISREG);.    
fcc0: 20 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d    pParse->nTab =
fcd0: 20 32 3b 0a 20 20 20 20 20 20 61 64 64 72 54 6f   2;.      addrTo
fce0: 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
fcf0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
fd00: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
fd10: 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
fd20: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 2c 20  _InitCoroutine, 
fd30: 72 65 67 59 69 65 6c 64 2c 20 30 2c 20 61 64 64  regYield, 0, add
fd40: 72 54 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  rTop);.      sql
fd50: 69 74 65 33 53 65 6c 65 63 74 44 65 73 74 49 6e  ite3SelectDestIn
fd60: 69 74 28 26 64 65 73 74 2c 20 53 52 54 5f 43 6f  it(&dest, SRT_Co
fd70: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
fd80: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
fd90: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
fda0: 70 53 65 6c 65 63 74 2c 20 26 64 65 73 74 29 3b  pSelect, &dest);
fdb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
fdc0: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45  beAddOp1(v, OP_E
fdd0: 6e 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67  ndCoroutine, reg
fde0: 59 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 73 71  Yield);.      sq
fdf0: 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
fe00: 65 28 76 2c 20 61 64 64 72 54 6f 70 20 2d 20 31  e(v, addrTop - 1
fe10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
fe20: 72 73 65 2d 3e 6e 45 72 72 20 29 20 72 65 74 75  rse->nErr ) retu
fe30: 72 6e 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61  rn;.      pSelTa
fe40: 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
fe50: 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
fe60: 72 73 65 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20  rse, pSelect);. 
fe70: 20 20 20 20 20 69 66 28 20 70 53 65 6c 54 61 62       if( pSelTab
fe80: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
fe90: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
fea0: 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
feb0: 70 2d 3e 6e 43 6f 6c 20 3d 20 70 53 65 6c 54 61  p->nCol = pSelTa
fec0: 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 20 20 20 20 70  b->nCol;.      p
fed0: 2d 3e 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62  ->aCol = pSelTab
fee0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 70 53  ->aCol;.      pS
fef0: 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
ff00: 0a 20 20 20 20 20 20 70 53 65 6c 54 61 62 2d 3e  .      pSelTab->
ff10: 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  aCol = 0;.      
ff20: 73 71 6c 69 74 65 33 44 65 6c 65 74 65 54 61 62  sqlite3DeleteTab
ff30: 6c 65 28 64 62 2c 20 70 53 65 6c 54 61 62 29 3b  le(db, pSelTab);
ff40: 0a 20 20 20 20 20 20 61 64 64 72 49 6e 73 4c 6f  .      addrInsLo
ff50: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
ff60: 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 59 69 65  AddOp1(v, OP_Yie
ff70: 6c 64 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d  ld, dest.iSDParm
ff80: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
ff90: 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
ffa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ffb0: 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f  3(v, OP_MakeReco
ffc0: 72 64 2c 20 64 65 73 74 2e 69 53 64 73 74 2c 20  rd, dest.iSdst, 
ffd0: 64 65 73 74 2e 6e 53 64 73 74 2c 20 72 65 67 52  dest.nSdst, regR
ffe0: 65 63 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ec);.      sqlit
fff0: 65 33 54 61 62 6c 65 41 66 66 69 6e 69 74 79 28  e3TableAffinity(
10000 76 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  v, p, 0);.      
10010 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10020 32 28 76 2c 20 4f 50 5f 4e 65 77 52 6f 77 69 64  2(v, OP_NewRowid
10030 2c 20 31 2c 20 72 65 67 52 6f 77 69 64 29 3b 0a  , 1, regRowid);.
10040 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10050 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
10060 73 65 72 74 2c 20 31 2c 20 72 65 67 52 65 63 2c  sert, 1, regRec,
10070 20 72 65 67 52 6f 77 69 64 29 3b 0a 20 20 20 20   regRowid);.    
10080 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74    sqlite3VdbeGot
10090 6f 28 76 2c 20 61 64 64 72 49 6e 73 4c 6f 6f 70  o(v, addrInsLoop
100a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
100b0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
100c0 61 64 64 72 49 6e 73 4c 6f 6f 70 29 3b 0a 20 20  addrInsLoop);.  
100d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
100e0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c 6f 73  ddOp1(v, OP_Clos
100f0 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  e, 1);.    }..  
10100 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
10110 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
10120 66 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  f the CREATE sta
10130 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 66  tement */.    if
10140 28 20 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ( pSelect ){.   
10150 20 20 20 7a 53 74 6d 74 20 3d 20 63 72 65 61 74     zStmt = creat
10160 65 54 61 62 6c 65 53 74 6d 74 28 64 62 2c 20 70  eTableStmt(db, p
10170 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
10180 20 20 20 20 54 6f 6b 65 6e 20 2a 70 45 6e 64 32      Token *pEnd2
10190 20 3d 20 74 61 62 4f 70 74 73 20 3f 20 26 70 50   = tabOpts ? &pP
101a0 61 72 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e  arse->sLastToken
101b0 20 3a 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 6e   : pEnd;.      n
101c0 20 3d 20 28 69 6e 74 29 28 70 45 6e 64 32 2d 3e   = (int)(pEnd2->
101d0 7a 20 2d 20 70 50 61 72 73 65 2d 3e 73 4e 61 6d  z - pParse->sNam
101e0 65 54 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 20  eToken.z);.     
101f0 20 69 66 28 20 70 45 6e 64 32 2d 3e 7a 5b 30 5d   if( pEnd2->z[0]
10200 21 3d 27 3b 27 20 29 20 6e 20 2b 3d 20 70 45 6e  !=';' ) n += pEn
10210 64 32 2d 3e 6e 3b 0a 20 20 20 20 20 20 7a 53 74  d2->n;.      zSt
10220 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  mt = sqlite3MPri
10230 6e 74 66 28 64 62 2c 20 0a 20 20 20 20 20 20 20  ntf(db, .       
10240 20 20 20 22 43 52 45 41 54 45 20 25 73 20 25 2e     "CREATE %s %.
10250 2a 73 22 2c 20 7a 54 79 70 65 32 2c 20 6e 2c 20  *s", zType2, n, 
10260 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10270 65 6e 2e 7a 0a 20 20 20 20 20 20 29 3b 0a 20 20  en.z.      );.  
10280 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 20 73 6c    }..    /* A sl
10290 6f 74 20 66 6f 72 20 74 68 65 20 72 65 63 6f 72  ot for the recor
102a0 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  d has already be
102b0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  en allocated in 
102c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 53 51 4c 49  the .    ** SQLI
102d0 54 45 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 2e  TE_MASTER table.
102e0 20 20 57 65 20 6a 75 73 74 20 6e 65 65 64 20 74    We just need t
102f0 6f 20 75 70 64 61 74 65 20 74 68 61 74 20 73 6c  o update that sl
10300 6f 74 20 77 69 74 68 20 61 6c 6c 0a 20 20 20 20  ot with all.    
10310 2a 2a 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  ** the informati
10320 6f 6e 20 77 65 27 76 65 20 63 6f 6c 6c 65 63 74  on we've collect
10330 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
10340 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72 73  qlite3NestedPars
10350 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  e(pParse,.      
10360 22 55 50 44 41 54 45 20 25 51 2e 25 73 20 22 0a  "UPDATE %Q.%s ".
10370 20 20 20 20 20 20 20 20 20 22 53 45 54 20 74 79           "SET ty
10380 70 65 3d 27 25 73 27 2c 20 6e 61 6d 65 3d 25 51  pe='%s', name=%Q
10390 2c 20 74 62 6c 5f 6e 61 6d 65 3d 25 51 2c 20 72  , tbl_name=%Q, r
103a0 6f 6f 74 70 61 67 65 3d 23 25 64 2c 20 73 71 6c  ootpage=#%d, sql
103b0 3d 25 51 20 22 0a 20 20 20 20 20 20 20 22 57 48  =%Q ".       "WH
103c0 45 52 45 20 72 6f 77 69 64 3d 23 25 64 22 2c 0a  ERE rowid=#%d",.
103d0 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 44        db->aDb[iD
103e0 62 5d 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41  b].zName, SCHEMA
103f0 5f 54 41 42 4c 45 28 69 44 62 29 2c 0a 20 20 20  _TABLE(iDb),.   
10400 20 20 20 7a 54 79 70 65 2c 0a 20 20 20 20 20 20     zType,.      
10410 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
10420 70 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  p->zName,.      
10430 70 50 61 72 73 65 2d 3e 72 65 67 52 6f 6f 74 2c  pParse->regRoot,
10440 0a 20 20 20 20 20 20 7a 53 74 6d 74 2c 0a 20 20  .      zStmt,.  
10450 20 20 20 20 70 50 61 72 73 65 2d 3e 72 65 67 52      pParse->regR
10460 6f 77 69 64 0a 20 20 20 20 29 3b 0a 20 20 20 20  owid.    );.    
10470 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
10480 2c 20 7a 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  , zStmt);.    sq
10490 6c 69 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69  lite3ChangeCooki
104a0 65 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  e(pParse, iDb);.
104b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
104c0 4f 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45  OMIT_AUTOINCREME
104d0 4e 54 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  NT.    /* Check 
104e0 74 6f 20 73 65 65 20 69 66 20 77 65 20 6e 65 65  to see if we nee
104f0 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 73  d to create an s
10500 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 20 74  qlite_sequence t
10510 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 2a 2a 20  able for.    ** 
10520 6b 65 65 70 69 6e 67 20 74 72 61 63 6b 20 6f 66  keeping track of
10530 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 20 6b   autoincrement k
10540 65 79 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  eys..    */.    
10550 69 66 28 20 70 2d 3e 74 61 62 46 6c 61 67 73 20  if( p->tabFlags 
10560 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
10570 6e 74 20 29 7b 0a 20 20 20 20 20 20 44 62 20 2a  nt ){.      Db *
10580 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69  pDb = &db->aDb[i
10590 44 62 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Db];.      asser
105a0 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
105b0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
105c0 62 2c 20 30 29 20 29 3b 0a 20 20 20 20 20 20 69  b, 0) );.      i
105d0 66 28 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 2d  f( pDb->pSchema-
105e0 3e 70 53 65 71 54 61 62 3d 3d 30 20 29 7b 0a 20  >pSeqTab==0 ){. 
105f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65         sqlite3Ne
10600 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
10610 2c 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45  ,.          "CRE
10620 41 54 45 20 54 41 42 4c 45 20 25 51 2e 73 71 6c  ATE TABLE %Q.sql
10630 69 74 65 5f 73 65 71 75 65 6e 63 65 28 6e 61 6d  ite_sequence(nam
10640 65 2c 73 65 71 29 22 2c 0a 20 20 20 20 20 20 20  e,seq)",.       
10650 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65 0a 20 20     pDb->zName.  
10660 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
10670 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
10680 20 20 20 2f 2a 20 52 65 70 61 72 73 65 20 65 76     /* Reparse ev
10690 65 72 79 74 68 69 6e 67 20 74 6f 20 75 70 64 61  erything to upda
106a0 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
106b0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
106c0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
106d0 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d 61  beAddParseSchema
106e0 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20 20 20  Op(v, iDb,.     
106f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
10700 69 6e 74 66 28 64 62 2c 20 22 74 62 6c 5f 6e 61  intf(db, "tbl_na
10710 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79 70 65  me='%q' AND type
10720 21 3d 27 74 72 69 67 67 65 72 27 22 2c 20 70 2d  !='trigger'", p-
10730 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 7d 0a 0a 0a  >zName));.  }...
10740 20 20 2f 2a 20 41 64 64 20 74 68 65 20 74 61 62    /* Add the tab
10750 6c 65 20 74 6f 20 74 68 65 20 69 6e 2d 6d 65 6d  le to the in-mem
10760 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74 69  ory representati
10770 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  on of the databa
10780 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  se..  */.  if( d
10790 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
107a0 20 20 20 20 54 61 62 6c 65 20 2a 70 4f 6c 64 3b      Table *pOld;
107b0 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63  .    Schema *pSc
107c0 68 65 6d 61 20 3d 20 70 2d 3e 70 53 63 68 65 6d  hema = p->pSchem
107d0 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  a;.    assert( s
107e0 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65  qlite3SchemaMute
107f0 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30  xHeld(db, iDb, 0
10800 29 20 29 3b 0a 20 20 20 20 70 4f 6c 64 20 3d 20  ) );.    pOld = 
10810 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
10820 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  t(&pSchema->tblH
10830 61 73 68 2c 20 70 2d 3e 7a 4e 61 6d 65 2c 20 70  ash, p->zName, p
10840 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 20  );.    if( pOld 
10850 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
10860 20 70 3d 3d 70 4f 6c 64 20 29 3b 20 20 2f 2a 20   p==pOld );  /* 
10870 4d 61 6c 6c 6f 63 20 6d 75 73 74 20 68 61 76 65  Malloc must have
10880 20 66 61 69 6c 65 64 20 69 6e 73 69 64 65 20 48   failed inside H
10890 61 73 68 49 6e 73 65 72 74 28 29 20 2a 2f 0a 20  ashInsert() */. 
108a0 20 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46       db->mallocF
108b0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  ailed = 1;.     
108c0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
108d0 20 20 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54     pParse->pNewT
108e0 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 64 62  able = 0;.    db
108f0 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
10900 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b  E_InternChanges;
10910 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10920 5f 4f 4d 49 54 5f 41 4c 54 45 52 54 41 42 4c 45  _OMIT_ALTERTABLE
10930 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 70 53 65  .    if( !p->pSe
10940 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 63 6f  lect ){.      co
10950 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
10960 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
10970 70 50 61 72 73 65 2d 3e 73 4e 61 6d 65 54 6f 6b  pParse->sNameTok
10980 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20  en.z;.      int 
10990 6e 4e 61 6d 65 3b 0a 20 20 20 20 20 20 61 73 73  nName;.      ass
109a0 65 72 74 28 20 21 70 53 65 6c 65 63 74 20 26 26  ert( !pSelect &&
109b0 20 70 43 6f 6e 73 20 26 26 20 70 45 6e 64 20 29   pCons && pEnd )
109c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e  ;.      if( pCon
109d0 73 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  s->z==0 ){.     
109e0 20 20 20 70 43 6f 6e 73 20 3d 20 70 45 6e 64 3b     pCons = pEnd;
109f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
10a00 4e 61 6d 65 20 3d 20 28 69 6e 74 29 28 28 63 6f  Name = (int)((co
10a10 6e 73 74 20 63 68 61 72 20 2a 29 70 43 6f 6e 73  nst char *)pCons
10a20 2d 3e 7a 20 2d 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->z - zName);.  
10a30 20 20 20 20 70 2d 3e 61 64 64 43 6f 6c 4f 66 66      p->addColOff
10a40 73 65 74 20 3d 20 31 33 20 2b 20 73 71 6c 69 74  set = 13 + sqlit
10a50 65 33 55 74 66 38 43 68 61 72 4c 65 6e 28 7a 4e  e3Utf8CharLen(zN
10a60 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
10a70 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
10a80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10a90 4f 4d 49 54 5f 56 49 45 57 0a 2f 2a 0a 2a 2a 20  OMIT_VIEW./*.** 
10aa0 54 68 65 20 70 61 72 73 65 72 20 63 61 6c 6c 73  The parser calls
10ab0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   this routine in
10ac0 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
10ad0 20 61 20 6e 65 77 20 56 49 45 57 0a 2a 2f 0a 76   a new VIEW.*/.v
10ae0 6f 69 64 20 73 71 6c 69 74 65 33 43 72 65 61 74  oid sqlite3Creat
10af0 65 56 69 65 77 28 0a 20 20 50 61 72 73 65 20 2a  eView(.  Parse *
10b00 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54  pParse,     /* T
10b10 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65  he parsing conte
10b20 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  xt */.  Token *p
10b30 42 65 67 69 6e 2c 20 20 20 20 20 2f 2a 20 54 68  Begin,     /* Th
10b40 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20 74  e CREATE token t
10b50 68 61 74 20 62 65 67 69 6e 73 20 74 68 65 20 73  hat begins the s
10b60 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 54 6f  tatement */.  To
10b70 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
10b80 20 2f 2a 20 54 68 65 20 74 6f 6b 65 6e 20 74 68   /* The token th
10b90 61 74 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  at holds the nam
10ba0 65 20 6f 66 20 74 68 65 20 76 69 65 77 20 2a 2f  e of the view */
10bb0 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32  .  Token *pName2
10bc0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 74 6f 6b  ,     /* The tok
10bd0 65 6e 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68  en that holds th
10be0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69  e name of the vi
10bf0 65 77 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  ew */.  ExprList
10c00 20 2a 70 43 4e 61 6d 65 73 2c 20 2f 2a 20 4f 70   *pCNames, /* Op
10c10 74 69 6f 6e 61 6c 20 6c 69 73 74 20 6f 66 20 76  tional list of v
10c20 69 65 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  iew column names
10c30 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
10c40 65 6c 65 63 74 2c 20 20 20 2f 2a 20 41 20 53 45  elect,   /* A SE
10c50 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
10c60 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
10c70 74 68 65 20 6e 65 77 20 76 69 65 77 20 2a 2f 0a  the new view */.
10c80 20 20 69 6e 74 20 69 73 54 65 6d 70 2c 20 20 20    int isTemp,   
10c90 20 20 20 20 20 2f 2a 20 54 52 55 45 20 66 6f 72       /* TRUE for
10ca0 20 61 20 54 45 4d 50 4f 52 41 52 59 20 76 69 65   a TEMPORARY vie
10cb0 77 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 45 72 72  w */.  int noErr
10cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 70            /* Sup
10cd0 70 72 65 73 73 20 65 72 72 6f 72 20 6d 65 73 73  press error mess
10ce0 61 67 65 73 20 69 66 20 56 49 45 57 20 61 6c 72  ages if VIEW alr
10cf0 65 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29  eady exists */.)
10d00 7b 0a 20 20 54 61 62 6c 65 20 2a 70 3b 0a 20 20  {.  Table *p;.  
10d10 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20 63  int n;.  const c
10d20 68 61 72 20 2a 7a 3b 0a 20 20 54 6f 6b 65 6e 20  har *z;.  Token 
10d30 73 45 6e 64 3b 0a 20 20 44 62 46 69 78 65 72 20  sEnd;.  DbFixer 
10d40 73 46 69 78 3b 0a 20 20 54 6f 6b 65 6e 20 2a 70  sFix;.  Token *p
10d50 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Name = 0;.  int 
10d60 69 44 62 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  iDb;.  sqlite3 *
10d70 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
10d80 0a 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ..  if( pParse->
10d90 6e 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 73 71  nVar>0 ){.    sq
10da0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
10db0 61 72 73 65 2c 20 22 70 61 72 61 6d 65 74 65 72  arse, "parameter
10dc0 73 20 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65  s are not allowe
10dd0 64 20 69 6e 20 76 69 65 77 73 22 29 3b 0a 20 20  d in views");.  
10de0 20 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 76 69    goto create_vi
10df0 65 77 5f 66 61 69 6c 3b 0a 20 20 7d 0a 20 20 73  ew_fail;.  }.  s
10e00 71 6c 69 74 65 33 53 74 61 72 74 54 61 62 6c 65  qlite3StartTable
10e10 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
10e20 20 70 4e 61 6d 65 32 2c 20 69 73 54 65 6d 70 2c   pName2, isTemp,
10e30 20 31 2c 20 30 2c 20 6e 6f 45 72 72 29 3b 0a 20   1, 0, noErr);. 
10e40 20 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65   p = pParse->pNe
10e50 77 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 70 3d  wTable;.  if( p=
10e60 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45  =0 || pParse->nE
10e70 72 72 20 29 20 67 6f 74 6f 20 63 72 65 61 74 65  rr ) goto create
10e80 5f 76 69 65 77 5f 66 61 69 6c 3b 0a 20 20 73 71  _view_fail;.  sq
10e90 6c 69 74 65 33 54 77 6f 50 61 72 74 4e 61 6d 65  lite3TwoPartName
10ea0 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 31 2c  (pParse, pName1,
10eb0 20 70 4e 61 6d 65 32 2c 20 26 70 4e 61 6d 65 29   pName2, &pName)
10ec0 3b 0a 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65  ;.  iDb = sqlite
10ed0 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
10ee0 62 2c 20 70 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  b, p->pSchema);.
10ef0 20 20 73 71 6c 69 74 65 33 46 69 78 49 6e 69 74    sqlite3FixInit
10f00 28 26 73 46 69 78 2c 20 70 50 61 72 73 65 2c 20  (&sFix, pParse, 
10f10 69 44 62 2c 20 22 76 69 65 77 22 2c 20 70 4e 61  iDb, "view", pNa
10f20 6d 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  me);.  if( sqlit
10f30 65 33 46 69 78 53 65 6c 65 63 74 28 26 73 46 69  e3FixSelect(&sFi
10f40 78 2c 20 70 53 65 6c 65 63 74 29 20 29 20 67 6f  x, pSelect) ) go
10f50 74 6f 20 63 72 65 61 74 65 5f 76 69 65 77 5f 66  to create_view_f
10f60 61 69 6c 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  ail;..  /* Make 
10f70 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 6e  a copy of the en
10f80 74 69 72 65 20 53 45 4c 45 43 54 20 73 74 61 74  tire SELECT stat
10f90 65 6d 65 6e 74 20 74 68 61 74 20 64 65 66 69 6e  ement that defin
10fa0 65 73 20 74 68 65 20 76 69 65 77 2e 0a 20 20 2a  es the view..  *
10fb0 2a 20 54 68 69 73 20 77 69 6c 6c 20 66 6f 72 63  * This will forc
10fc0 65 20 61 6c 6c 20 74 68 65 20 45 78 70 72 2e 74  e all the Expr.t
10fd0 6f 6b 65 6e 2e 7a 20 76 61 6c 75 65 73 20 74 6f  oken.z values to
10fe0 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a   be dynamically.
10ff0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 72    ** allocated r
11000 61 74 68 65 72 20 74 68 61 6e 20 70 6f 69 6e 74  ather than point
11010 20 74 6f 20 74 68 65 20 69 6e 70 75 74 20 73 74   to the input st
11020 72 69 6e 67 20 2d 20 77 68 69 63 68 20 6d 65 61  ring - which mea
11030 6e 73 20 74 68 61 74 0a 20 20 2a 2a 20 74 68 65  ns that.  ** the
11040 79 20 77 69 6c 6c 20 70 65 72 73 69 73 74 20 61  y will persist a
11050 66 74 65 72 20 74 68 65 20 63 75 72 72 65 6e 74  fter the current
11060 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
11070 63 61 6c 6c 20 72 65 74 75 72 6e 73 2e 0a 20 20  call returns..  
11080 2a 2f 0a 20 20 70 2d 3e 70 53 65 6c 65 63 74 20  */.  p->pSelect 
11090 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
110a0 75 70 28 64 62 2c 20 70 53 65 6c 65 63 74 2c 20  up(db, pSelect, 
110b0 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b  EXPRDUP_REDUCE);
110c0 0a 20 20 70 2d 3e 70 43 68 65 63 6b 20 3d 20 73  .  p->pCheck = s
110d0 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
110e0 70 28 64 62 2c 20 70 43 4e 61 6d 65 73 2c 20 45  p(db, pCNames, E
110f0 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
11100 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
11110 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 63 72  Failed ) goto cr
11120 65 61 74 65 5f 76 69 65 77 5f 66 61 69 6c 3b 0a  eate_view_fail;.
11130 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
11140 20 65 6e 64 20 6f 66 20 74 68 65 20 43 52 45 41   end of the CREA
11150 54 45 20 56 49 45 57 20 73 74 61 74 65 6d 65 6e  TE VIEW statemen
11160 74 2e 20 20 4d 61 6b 65 20 73 45 6e 64 20 70 6f  t.  Make sEnd po
11170 69 6e 74 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  int to.  ** the 
11180 65 6e 64 2e 0a 20 20 2a 2f 0a 20 20 73 45 6e 64  end..  */.  sEnd
11190 20 3d 20 70 50 61 72 73 65 2d 3e 73 4c 61 73 74   = pParse->sLast
111a0 54 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  Token;.  assert(
111b0 20 73 45 6e 64 2e 7a 5b 30 5d 21 3d 30 20 29 3b   sEnd.z[0]!=0 );
111c0 0a 20 20 69 66 28 20 73 45 6e 64 2e 7a 5b 30 5d  .  if( sEnd.z[0]
111d0 21 3d 27 3b 27 20 29 7b 0a 20 20 20 20 73 45 6e  !=';' ){.    sEn
111e0 64 2e 7a 20 2b 3d 20 73 45 6e 64 2e 6e 3b 0a 20  d.z += sEnd.n;. 
111f0 20 7d 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 30 3b   }.  sEnd.n = 0;
11200 0a 20 20 6e 20 3d 20 28 69 6e 74 29 28 73 45 6e  .  n = (int)(sEn
11210 64 2e 7a 20 2d 20 70 42 65 67 69 6e 2d 3e 7a 29  d.z - pBegin->z)
11220 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20  ;.  assert( n>0 
11230 29 3b 0a 20 20 7a 20 3d 20 70 42 65 67 69 6e 2d  );.  z = pBegin-
11240 3e 7a 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c  >z;.  while( sql
11250 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 6e 2d  ite3Isspace(z[n-
11260 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
11270 73 45 6e 64 2e 7a 20 3d 20 26 7a 5b 6e 2d 31 5d  sEnd.z = &z[n-1]
11280 3b 0a 20 20 73 45 6e 64 2e 6e 20 3d 20 31 3b 0a  ;.  sEnd.n = 1;.
11290 0a 20 20 2f 2a 20 55 73 65 20 73 71 6c 69 74 65  .  /* Use sqlite
112a0 33 45 6e 64 54 61 62 6c 65 28 29 20 74 6f 20 61  3EndTable() to a
112b0 64 64 20 74 68 65 20 76 69 65 77 20 74 6f 20 74  dd the view to t
112c0 68 65 20 53 51 4c 49 54 45 5f 4d 41 53 54 45 52  he SQLITE_MASTER
112d0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 71 6c 69   table */.  sqli
112e0 74 65 33 45 6e 64 54 61 62 6c 65 28 70 50 61 72  te3EndTable(pPar
112f0 73 65 2c 20 30 2c 20 26 73 45 6e 64 2c 20 30 2c  se, 0, &sEnd, 0,
11300 20 30 29 3b 0a 0a 63 72 65 61 74 65 5f 76 69 65   0);..create_vie
11310 77 5f 66 61 69 6c 3a 0a 20 20 73 71 6c 69 74 65  w_fail:.  sqlite
11320 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
11330 2c 20 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  , pSelect);.  sq
11340 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
11350 65 74 65 28 64 62 2c 20 70 43 4e 61 6d 65 73 29  ete(db, pCNames)
11360 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  ;.  return;.}.#e
11370 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11380 4d 49 54 5f 56 49 45 57 20 2a 2f 0a 0a 23 69 66  MIT_VIEW */..#if
11390 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
113a0 5f 4f 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21  _OMIT_VIEW) || !
113b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
113c0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
113d0 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 54 61 62 6c  )./*.** The Tabl
113e0 65 20 73 74 72 75 63 74 75 72 65 20 70 54 61 62  e structure pTab
113f0 6c 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 56  le is really a V
11400 49 45 57 2e 20 20 46 69 6c 6c 20 69 6e 20 74 68  IEW.  Fill in th
11410 65 20 6e 61 6d 65 73 20 6f 66 0a 2a 2a 20 74 68  e names of.** th
11420 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65  e columns of the
11430 20 76 69 65 77 20 69 6e 20 74 68 65 20 70 54 61   view in the pTa
11440 62 6c 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ble structure.  
11450 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
11460 72 0a 2a 2a 20 6f 66 20 65 72 72 6f 72 73 2e 20  r.** of errors. 
11470 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
11480 73 65 65 6e 20 6c 65 61 76 65 20 61 6e 20 65 72  seen leave an er
11490 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70  ror message in p
114a0 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
114b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 69  */.int sqlite3Vi
114c0 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
114d0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
114e0 54 61 62 6c 65 20 2a 70 54 61 62 6c 65 29 7b 0a  Table *pTable){.
114f0 20 20 54 61 62 6c 65 20 2a 70 53 65 6c 54 61 62    Table *pSelTab
11500 3b 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 74 61  ;   /* A fake ta
11510 62 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 77  ble from which w
11520 65 20 67 65 74 20 74 68 65 20 72 65 73 75 6c 74  e get the result
11530 20 73 65 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74   set */.  Select
11540 20 2a 70 53 65 6c 3b 20 20 20 20 20 2f 2a 20 43   *pSel;     /* C
11550 6f 70 79 20 6f 66 20 74 68 65 20 53 45 4c 45 43  opy of the SELEC
11560 54 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  T that implement
11570 73 20 74 68 65 20 76 69 65 77 20 2a 2f 0a 20 20  s the view */.  
11580 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
11590 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
115a0 72 72 6f 72 73 20 65 6e 63 6f 75 6e 74 65 72 65  rrors encountere
115b0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
115c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70           /* Temp
115d0 6f 72 61 72 69 6c 79 20 68 6f 6c 64 73 20 74 68  orarily holds th
115e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
115f0 6f 72 73 20 61 73 73 69 67 6e 65 64 20 2a 2f 0a  ors assigned */.
11600 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11610 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20  pParse->db;  /* 
11620 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
11630 69 6f 6e 20 66 6f 72 20 6d 61 6c 6c 6f 63 20 65  ion for malloc e
11640 72 72 6f 72 73 20 2a 2f 0a 20 20 73 71 6c 69 74  rrors */.  sqlit
11650 65 33 5f 78 61 75 74 68 20 78 41 75 74 68 3b 20  e3_xauth xAuth; 
11660 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 78        /* Saved x
11670 41 75 74 68 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  Auth pointer */.
11680 20 20 75 38 20 62 45 6e 61 62 6c 65 64 4c 41 3b    u8 bEnabledLA;
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
116a0 53 61 76 65 64 20 64 62 2d 3e 6c 6f 6f 6b 61 73  Saved db->lookas
116b0 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 73 74 61  ide.bEnabled sta
116c0 74 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  te */..  assert(
116d0 20 70 54 61 62 6c 65 20 29 3b 0a 0a 23 69 66 6e   pTable );..#ifn
116e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
116f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
11700 66 28 20 73 71 6c 69 74 65 33 56 74 61 62 43 61  f( sqlite3VtabCa
11710 6c 6c 43 6f 6e 6e 65 63 74 28 70 50 61 72 73 65  llConnect(pParse
11720 2c 20 70 54 61 62 6c 65 29 20 29 7b 0a 20 20 20  , pTable) ){.   
11730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
11740 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
11750 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 6c 65  IsVirtual(pTable
11760 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
11770 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
11780 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 0a 20  LITE_OMIT_VIEW. 
11790 20 2f 2a 20 41 20 70 6f 73 69 74 69 76 65 20 6e   /* A positive n
117a0 43 6f 6c 20 6d 65 61 6e 73 20 74 68 65 20 63 6f  Col means the co
117b0 6c 75 6d 6e 73 20 6e 61 6d 65 73 20 66 6f 72 20  lumns names for 
117c0 74 68 69 73 20 76 69 65 77 20 61 72 65 0a 20 20  this view are.  
117d0 2a 2a 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 6e  ** already known
117e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61  ..  */.  if( pTa
117f0 62 6c 65 2d 3e 6e 43 6f 6c 3e 30 20 29 20 72 65  ble->nCol>0 ) re
11800 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 20  turn 0;..  /* A 
11810 6e 65 67 61 74 69 76 65 20 6e 43 6f 6c 20 69 73  negative nCol is
11820 20 61 20 73 70 65 63 69 61 6c 20 6d 61 72 6b 65   a special marke
11830 72 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 77  r meaning that w
11840 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a  e are currently.
11850 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f 20 63    ** trying to c
11860 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6c 75 6d  ompute the colum
11870 6e 20 6e 61 6d 65 73 2e 20 20 49 66 20 77 65 20  n names.  If we 
11880 65 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  enter this routi
11890 6e 65 20 77 69 74 68 0a 20 20 2a 2a 20 61 20 6e  ne with.  ** a n
118a0 65 67 61 74 69 76 65 20 6e 43 6f 6c 2c 20 69 74  egative nCol, it
118b0 20 6d 65 61 6e 73 20 74 77 6f 20 6f 72 20 6d 6f   means two or mo
118c0 72 65 20 76 69 65 77 73 20 66 6f 72 6d 20 61 20  re views form a 
118d0 6c 6f 6f 70 2c 20 6c 69 6b 65 20 74 68 69 73 3a  loop, like this:
118e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 43  .  **.  **     C
118f0 52 45 41 54 45 20 56 49 45 57 20 6f 6e 65 20 41  REATE VIEW one A
11900 53 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  S SELECT * FROM 
11910 74 77 6f 3b 0a 20 20 2a 2a 20 20 20 20 20 43 52  two;.  **     CR
11920 45 41 54 45 20 56 49 45 57 20 74 77 6f 20 41 53  EATE VIEW two AS
11930 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 6f   SELECT * FROM o
11940 6e 65 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63  ne;.  **.  ** Ac
11950 74 75 61 6c 6c 79 2c 20 74 68 65 20 65 72 72 6f  tually, the erro
11960 72 20 61 62 6f 76 65 20 69 73 20 6e 6f 77 20 63  r above is now c
11970 61 75 67 68 74 20 70 72 69 6f 72 20 74 6f 20 72  aught prior to r
11980 65 61 63 68 69 6e 67 20 74 68 69 73 20 70 6f 69  eaching this poi
11990 6e 74 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  nt..  ** But the
119a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 65 73 74 20   following test 
119b0 69 73 20 73 74 69 6c 6c 20 69 6d 70 6f 72 74 61  is still importa
119c0 6e 74 20 61 73 20 69 74 20 64 6f 65 73 20 63 6f  nt as it does co
119d0 6d 65 20 75 70 0a 20 20 2a 2a 20 69 6e 20 74 68  me up.  ** in th
119e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 2a  e following:.  *
119f0 2a 20 0a 20 20 2a 2a 20 20 20 20 20 43 52 45 41  * .  **     CREA
11a00 54 45 20 54 41 42 4c 45 20 6d 61 69 6e 2e 65 78  TE TABLE main.ex
11a10 31 28 61 29 3b 0a 20 20 2a 2a 20 20 20 20 20 43  1(a);.  **     C
11a20 52 45 41 54 45 20 54 45 4d 50 20 56 49 45 57 20  REATE TEMP VIEW 
11a30 65 78 31 20 41 53 20 53 45 4c 45 43 54 20 61 20  ex1 AS SELECT a 
11a40 46 52 4f 4d 20 65 78 31 3b 0a 20 20 2a 2a 20 20  FROM ex1;.  **  
11a50 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
11a60 20 74 65 6d 70 2e 65 78 31 3b 0a 20 20 2a 2f 0a   temp.ex1;.  */.
11a70 20 20 69 66 28 20 70 54 61 62 6c 65 2d 3e 6e 43    if( pTable->nC
11a80 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ol<0 ){.    sqli
11a90 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
11aa0 73 65 2c 20 22 76 69 65 77 20 25 73 20 69 73 20  se, "view %s is 
11ab0 63 69 72 63 75 6c 61 72 6c 79 20 64 65 66 69 6e  circularly defin
11ac0 65 64 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e 61  ed", pTable->zNa
11ad0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
11ae0 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
11af0 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3e 3d 30   pTable->nCol>=0
11b00 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20   );..  /* If we 
11b10 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
11b20 20 6d 65 61 6e 73 20 77 65 20 6e 65 65 64 20 74   means we need t
11b30 6f 20 63 6f 6d 70 75 74 65 20 74 68 65 20 74 61  o compute the ta
11b40 62 6c 65 20 6e 61 6d 65 73 2e 0a 20 20 2a 2a 20  ble names..  ** 
11b50 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 61  Note that the ca
11b60 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73  ll to sqlite3Res
11b70 75 6c 74 53 65 74 4f 66 53 65 6c 65 63 74 28 29  ultSetOfSelect()
11b80 20 77 69 6c 6c 20 65 78 70 61 6e 64 20 61 6e 79   will expand any
11b90 0a 20 20 2a 2a 20 22 2a 22 20 65 6c 65 6d 65 6e  .  ** "*" elemen
11ba0 74 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ts in the result
11bb0 73 20 73 65 74 20 6f 66 20 74 68 65 20 76 69 65  s set of the vie
11bc0 77 20 61 6e 64 20 77 69 6c 6c 20 61 73 73 69 67  w and will assig
11bd0 6e 20 63 75 72 73 6f 72 73 0a 20 20 2a 2a 20 74  n cursors.  ** t
11be0 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 20 6f  o the elements o
11bf0 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
11c00 65 2e 20 20 42 75 74 20 77 65 20 64 6f 20 6e 6f  e.  But we do no
11c10 74 20 77 61 6e 74 20 74 68 65 73 65 20 63 68 61  t want these cha
11c20 6e 67 65 73 0a 20 20 2a 2a 20 74 6f 20 62 65 20  nges.  ** to be 
11c30 70 65 72 6d 61 6e 65 6e 74 2e 20 20 53 6f 20 74  permanent.  So t
11c40 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69  he computation i
11c50 73 20 64 6f 6e 65 20 6f 6e 20 61 20 63 6f 70 79  s done on a copy
11c60 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 0a 20   of the SELECT. 
11c70 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 68   ** statement th
11c80 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 76  at defines the v
11c90 69 65 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  iew..  */.  asse
11ca0 72 74 28 20 70 54 61 62 6c 65 2d 3e 70 53 65 6c  rt( pTable->pSel
11cb0 65 63 74 20 29 3b 0a 20 20 62 45 6e 61 62 6c 65  ect );.  bEnable
11cc0 64 4c 41 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61 73  dLA = db->lookas
11cd0 69 64 65 2e 62 45 6e 61 62 6c 65 64 3b 0a 20 20  ide.bEnabled;.  
11ce0 69 66 28 20 70 54 61 62 6c 65 2d 3e 70 43 68 65  if( pTable->pChe
11cf0 63 6b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f  ck ){.    db->lo
11d00 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
11d10 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
11d20 33 43 6f 6c 75 6d 6e 73 46 72 6f 6d 45 78 70 72  3ColumnsFromExpr
11d30 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 54 61  List(pParse, pTa
11d40 62 6c 65 2d 3e 70 43 68 65 63 6b 2c 20 0a 20 20  ble->pCheck, .  
11d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 54               &pT
11d70 61 62 6c 65 2d 3e 6e 43 6f 6c 2c 20 26 70 54 61  able->nCol, &pTa
11d80 62 6c 65 2d 3e 61 43 6f 6c 29 3b 0a 20 20 7d 65  ble->aCol);.  }e
11d90 6c 73 65 7b 0a 20 20 20 20 70 53 65 6c 20 3d 20  lse{.    pSel = 
11da0 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
11db0 28 64 62 2c 20 70 54 61 62 6c 65 2d 3e 70 53 65  (db, pTable->pSe
11dc0 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  lect, 0);.    if
11dd0 28 20 70 53 65 6c 20 29 7b 0a 20 20 20 20 20 20  ( pSel ){.      
11de0 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  n = pParse->nTab
11df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
11e00 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75 72 73  rcListAssignCurs
11e10 6f 72 73 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ors(pParse, pSel
11e20 2d 3e 70 53 72 63 29 3b 0a 20 20 20 20 20 20 70  ->pSrc);.      p
11e30 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 2d 31  Table->nCol = -1
11e40 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
11e50 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d  aside.bEnabled =
11e60 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
11e70 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
11e80 41 54 49 4f 4e 0a 20 20 20 20 20 20 78 41 75 74  ATION.      xAut
11e90 68 20 3d 20 64 62 2d 3e 78 41 75 74 68 3b 0a 20  h = db->xAuth;. 
11ea0 20 20 20 20 20 64 62 2d 3e 78 41 75 74 68 20 3d       db->xAuth =
11eb0 20 30 3b 0a 20 20 20 20 20 20 70 53 65 6c 54 61   0;.      pSelTa
11ec0 62 20 3d 20 73 71 6c 69 74 65 33 52 65 73 75 6c  b = sqlite3Resul
11ed0 74 53 65 74 4f 66 53 65 6c 65 63 74 28 70 50 61  tSetOfSelect(pPa
11ee0 72 73 65 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20  rse, pSel);.    
11ef0 20 20 64 62 2d 3e 78 41 75 74 68 20 3d 20 78 41    db->xAuth = xA
11f00 75 74 68 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  uth;.#else.     
11f10 20 70 53 65 6c 54 61 62 20 3d 20 73 71 6c 69 74   pSelTab = sqlit
11f20 65 33 52 65 73 75 6c 74 53 65 74 4f 66 53 65 6c  e3ResultSetOfSel
11f30 65 63 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ect(pParse, pSel
11f40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
11f50 70 50 61 72 73 65 2d 3e 6e 54 61 62 20 3d 20 6e  pParse->nTab = n
11f60 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 6c  ;.      if( pSel
11f70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 61  Tab ){.        a
11f80 73 73 65 72 74 28 20 70 54 61 62 6c 65 2d 3e 61  ssert( pTable->a
11f90 43 6f 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Col==0 );.      
11fa0 20 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3d    pTable->nCol =
11fb0 20 70 53 65 6c 54 61 62 2d 3e 6e 43 6f 6c 3b 0a   pSelTab->nCol;.
11fc0 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 2d 3e          pTable->
11fd0 61 43 6f 6c 20 3d 20 70 53 65 6c 54 61 62 2d 3e  aCol = pSelTab->
11fe0 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 53  aCol;.        pS
11ff0 65 6c 54 61 62 2d 3e 6e 43 6f 6c 20 3d 20 30 3b  elTab->nCol = 0;
12000 0a 20 20 20 20 20 20 20 20 70 53 65 6c 54 61 62  .        pSelTab
12010 2d 3e 61 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  ->aCol = 0;.    
12020 20 20 20 20 73 71 6c 69 74 65 33 44 65 6c 65 74      sqlite3Delet
12030 65 54 61 62 6c 65 28 64 62 2c 20 70 53 65 6c 54  eTable(db, pSelT
12040 61 62 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ab);.        ass
12050 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68 65  ert( sqlite3Sche
12060 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20  maMutexHeld(db, 
12070 30 2c 20 70 54 61 62 6c 65 2d 3e 70 53 63 68 65  0, pTable->pSche
12080 6d 61 29 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ma) );.      }el
12090 73 65 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62  se{.        pTab
120a0 6c 65 2d 3e 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20  le->nCol = 0;.  
120b0 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
120c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
120d0 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
120e0 64 62 2c 20 70 53 65 6c 29 3b 0a 20 20 20 20 7d  db, pSel);.    }
120f0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 6e 45   else {.      nE
12100 72 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rr++;.    }.  }.
12110 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
12120 62 45 6e 61 62 6c 65 64 20 3d 20 62 45 6e 61 62  bEnabled = bEnab
12130 6c 65 64 4c 41 3b 0a 20 20 70 54 61 62 6c 65 2d  ledLA;.  pTable-
12140 3e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  >pSchema->schema
12150 46 6c 61 67 73 20 7c 3d 20 44 42 5f 55 6e 72 65  Flags |= DB_Unre
12160 73 65 74 56 69 65 77 73 3b 0a 23 65 6e 64 69 66  setViews;.#endif
12170 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
12180 56 49 45 57 20 2a 2f 0a 20 20 72 65 74 75 72 6e  VIEW */.  return
12190 20 6e 45 72 72 3b 20 20 0a 7d 0a 23 65 6e 64 69   nErr;  .}.#endi
121a0 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
121b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29 20  LITE_OMIT_VIEW) 
121c0 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
121d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
121e0 41 42 4c 45 29 20 2a 2f 0a 0a 23 69 66 6e 64 65  ABLE) */..#ifnde
121f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
12200 45 57 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74  EW./*.** Clear t
12210 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  he column names 
12220 66 72 6f 6d 20 65 76 65 72 79 20 56 49 45 57 20  from every VIEW 
12230 69 6e 20 64 61 74 61 62 61 73 65 20 69 64 78 2e  in database idx.
12240 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
12250 73 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41  sqliteViewResetA
12260 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ll(sqlite3 *db, 
12270 69 6e 74 20 69 64 78 29 7b 0a 20 20 48 61 73 68  int idx){.  Hash
12280 45 6c 65 6d 20 2a 69 3b 0a 20 20 61 73 73 65 72  Elem *i;.  asser
12290 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
122a0 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 64  MutexHeld(db, id
122b0 78 2c 20 30 29 20 29 3b 0a 20 20 69 66 28 20 21  x, 0) );.  if( !
122c0 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 64 62  DbHasProperty(db
122d0 2c 20 69 64 78 2c 20 44 42 5f 55 6e 72 65 73 65  , idx, DB_Unrese
122e0 74 56 69 65 77 73 29 20 29 20 72 65 74 75 72 6e  tViews) ) return
122f0 3b 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  ;.  for(i=sqlite
12300 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
12310 44 62 5b 69 64 78 5d 2e 70 53 63 68 65 6d 61 2d  Db[idx].pSchema-
12320 3e 74 62 6c 48 61 73 68 29 3b 20 69 3b 69 3d 73  >tblHash); i;i=s
12330 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
12340 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
12350 61 62 20 3d 20 73 71 6c 69 74 65 48 61 73 68 44  ab = sqliteHashD
12360 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20  ata(i);.    if( 
12370 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b  pTab->pSelect ){
12380 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  .      sqlite3De
12390 6c 65 74 65 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  leteColumnNames(
123a0 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
123b0 20 70 54 61 62 2d 3e 61 43 6f 6c 20 3d 20 30 3b   pTab->aCol = 0;
123c0 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 43 6f  .      pTab->nCo
123d0 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  l = 0;.    }.  }
123e0 0a 20 20 44 62 43 6c 65 61 72 50 72 6f 70 65 72  .  DbClearProper
123f0 74 79 28 64 62 2c 20 69 64 78 2c 20 44 42 5f 55  ty(db, idx, DB_U
12400 6e 72 65 73 65 74 56 69 65 77 73 29 3b 0a 7d 0a  nresetViews);.}.
12410 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
12420 71 6c 69 74 65 56 69 65 77 52 65 73 65 74 41 6c  qliteViewResetAl
12430 6c 28 41 2c 42 29 0a 23 65 6e 64 69 66 20 2f 2a  l(A,B).#endif /*
12440 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45   SQLITE_OMIT_VIE
12450 57 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  W */../*.** This
12460 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12470 6c 65 64 20 62 79 20 74 68 65 20 56 44 42 45 20  led by the VDBE 
12480 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 69 6e  to adjust the in
12490 74 65 72 6e 61 6c 20 73 63 68 65 6d 61 0a 2a 2a  ternal schema.**
124a0 20 75 73 65 64 20 62 79 20 53 51 4c 69 74 65 20   used by SQLite 
124b0 77 68 65 6e 20 74 68 65 20 62 74 72 65 65 20 6c  when the btree l
124c0 61 79 65 72 20 6d 6f 76 65 73 20 61 20 74 61 62  ayer moves a tab
124d0 6c 65 20 72 6f 6f 74 20 70 61 67 65 2e 20 54 68  le root page. Th
124e0 65 0a 2a 2a 20 72 6f 6f 74 2d 70 61 67 65 20 6f  e.** root-page o
124f0 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
12500 65 78 20 69 6e 20 64 61 74 61 62 61 73 65 20 69  ex in database i
12510 44 62 20 68 61 73 20 63 68 61 6e 67 65 64 20 66  Db has changed f
12520 72 6f 6d 20 69 46 72 6f 6d 0a 2a 2a 20 74 6f 20  rom iFrom.** to 
12530 69 54 6f 2e 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65  iTo..**.** Ticke
12540 74 20 23 31 37 32 38 3a 20 20 54 68 65 20 73 79  t #1728:  The sy
12550 6d 62 6f 6c 20 74 61 62 6c 65 20 6d 69 67 68 74  mbol table might
12560 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 69   still contain i
12570 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 6f 6e  nformation.** on
12580 20 74 61 62 6c 65 73 20 61 6e 64 2f 6f 72 20 69   tables and/or i
12590 6e 64 69 63 65 73 20 74 68 61 74 20 61 72 65 20  ndices that are 
125a0 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 62  the process of b
125b0 65 69 6e 67 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  eing deleted..**
125c0 20 49 66 20 79 6f 75 20 61 72 65 20 75 6e 6c 75   If you are unlu
125d0 63 6b 79 2c 20 6f 6e 65 20 6f 66 20 74 68 6f 73  cky, one of thos
125e0 65 20 64 65 6c 65 74 65 64 20 69 6e 64 69 63 65  e deleted indice
125f0 73 20 6f 72 20 74 61 62 6c 65 73 20 6d 69 67 68  s or tables migh
12600 74 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 73 61  t.** have the sa
12610 6d 65 20 72 6f 6f 74 70 61 67 65 20 6e 75 6d 62  me rootpage numb
12620 65 72 20 61 73 20 74 68 65 20 72 65 61 6c 20 74  er as the real t
12630 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 74 68  able or index th
12640 61 74 20 69 73 0a 2a 2a 20 62 65 69 6e 67 20 6d  at is.** being m
12650 6f 76 65 64 2e 20 20 53 6f 20 77 65 20 63 61 6e  oved.  So we can
12660 6e 6f 74 20 73 74 6f 70 20 73 65 61 72 63 68 69  not stop searchi
12670 6e 67 20 61 66 74 65 72 20 74 68 65 20 66 69 72  ng after the fir
12680 73 74 20 6d 61 74 63 68 20 0a 2a 2a 20 62 65 63  st match .** bec
12690 61 75 73 65 20 74 68 65 20 66 69 72 73 74 20 6d  ause the first m
126a0 61 74 63 68 20 6d 69 67 68 74 20 62 65 20 66 6f  atch might be fo
126b0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 64 65 6c  r one of the del
126c0 65 74 65 64 20 69 6e 64 69 63 65 73 0a 2a 2a 20  eted indices.** 
126d0 6f 72 20 74 61 62 6c 65 73 20 61 6e 64 20 6e 6f  or tables and no
126e0 74 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  t the table/inde
126f0 78 20 74 68 61 74 20 69 73 20 61 63 74 75 61 6c  x that is actual
12700 6c 79 20 62 65 69 6e 67 20 6d 6f 76 65 64 2e 0a  ly being moved..
12710 2a 2a 20 57 65 20 6d 75 73 74 20 63 6f 6e 74 69  ** We must conti
12720 6e 75 65 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69  nue looping unti
12730 6c 20 61 6c 6c 20 74 61 62 6c 65 73 20 61 6e 64  l all tables and
12740 20 69 6e 64 69 63 65 73 20 77 69 74 68 0a 2a 2a   indices with.**
12750 20 72 6f 6f 74 70 61 67 65 3d 3d 69 46 72 6f 6d   rootpage==iFrom
12760 20 68 61 76 65 20 62 65 65 6e 20 63 6f 6e 76 65   have been conve
12770 72 74 65 64 20 74 6f 20 68 61 76 65 20 61 20 72  rted to have a r
12780 6f 6f 74 70 61 67 65 20 6f 66 20 69 54 6f 0a 2a  ootpage of iTo.*
12790 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  * in order to be
127a0 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 77 65   certain that we
127b0 20 67 6f 74 20 74 68 65 20 72 69 67 68 74 20 6f   got the right o
127c0 6e 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ne..*/.#ifndef S
127d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
127e0 41 43 55 55 4d 0a 76 6f 69 64 20 73 71 6c 69 74  ACUUM.void sqlit
127f0 65 33 52 6f 6f 74 50 61 67 65 4d 6f 76 65 64 28  e3RootPageMoved(
12800 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
12810 20 69 44 62 2c 20 69 6e 74 20 69 46 72 6f 6d 2c   iDb, int iFrom,
12820 20 69 6e 74 20 69 54 6f 29 7b 0a 20 20 48 61 73   int iTo){.  Has
12830 68 45 6c 65 6d 20 2a 70 45 6c 65 6d 3b 0a 20 20  hElem *pElem;.  
12840 48 61 73 68 20 2a 70 48 61 73 68 3b 0a 20 20 44  Hash *pHash;.  D
12850 62 20 2a 70 44 62 3b 0a 0a 20 20 61 73 73 65 72  b *pDb;..  asser
12860 74 28 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61  t( sqlite3Schema
12870 4d 75 74 65 78 48 65 6c 64 28 64 62 2c 20 69 44  MutexHeld(db, iD
12880 62 2c 20 30 29 20 29 3b 0a 20 20 70 44 62 20 3d  b, 0) );.  pDb =
12890 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
128a0 20 20 70 48 61 73 68 20 3d 20 26 70 44 62 2d 3e    pHash = &pDb->
128b0 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
128c0 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d 3d 73 71  ;.  for(pElem=sq
128d0 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 70 48  liteHashFirst(pH
128e0 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20 70 45 6c  ash); pElem; pEl
128f0 65 6d 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78  em=sqliteHashNex
12900 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20 20 20 54  t(pElem)){.    T
12910 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 73 71 6c  able *pTab = sql
12920 69 74 65 48 61 73 68 44 61 74 61 28 70 45 6c 65  iteHashData(pEle
12930 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  m);.    if( pTab
12940 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d 20 29 7b  ->tnum==iFrom ){
12950 0a 20 20 20 20 20 20 70 54 61 62 2d 3e 74 6e 75  .      pTab->tnu
12960 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20 7d 0a 20  m = iTo;.    }. 
12970 20 7d 0a 20 20 70 48 61 73 68 20 3d 20 26 70 44   }.  pHash = &pD
12980 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  b->pSchema->idxH
12990 61 73 68 3b 0a 20 20 66 6f 72 28 70 45 6c 65 6d  ash;.  for(pElem
129a0 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
129b0 28 70 48 61 73 68 29 3b 20 70 45 6c 65 6d 3b 20  (pHash); pElem; 
129c0 70 45 6c 65 6d 3d 73 71 6c 69 74 65 48 61 73 68  pElem=sqliteHash
129d0 4e 65 78 74 28 70 45 6c 65 6d 29 29 7b 0a 20 20  Next(pElem)){.  
129e0 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20    Index *pIdx = 
129f0 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
12a00 45 6c 65 6d 29 3b 0a 20 20 20 20 69 66 28 20 70  Elem);.    if( p
12a10 49 64 78 2d 3e 74 6e 75 6d 3d 3d 69 46 72 6f 6d  Idx->tnum==iFrom
12a20 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e   ){.      pIdx->
12a30 74 6e 75 6d 20 3d 20 69 54 6f 3b 0a 20 20 20 20  tnum = iTo;.    
12a40 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
12a50 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 63 6f 64 65  /*.** Write code
12a60 20 74 6f 20 65 72 61 73 65 20 74 68 65 20 74 61   to erase the ta
12a70 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61  ble with root-pa
12a80 67 65 20 69 54 61 62 6c 65 20 66 72 6f 6d 20 64  ge iTable from d
12a90 61 74 61 62 61 73 65 20 69 44 62 2e 0a 2a 2a 20  atabase iDb..** 
12aa0 41 6c 73 6f 20 77 72 69 74 65 20 63 6f 64 65 20  Also write code 
12ab0 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 73 71  to modify the sq
12ac0 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
12ad0 65 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c 20 73  e and internal s
12ae0 63 68 65 6d 61 0a 2a 2a 20 69 66 20 61 20 72 6f  chema.** if a ro
12af0 6f 74 2d 70 61 67 65 20 6f 66 20 61 6e 6f 74 68  ot-page of anoth
12b00 65 72 20 74 61 62 6c 65 20 69 73 20 6d 6f 76 65  er table is move
12b10 64 20 62 79 20 74 68 65 20 62 74 72 65 65 2d 6c  d by the btree-l
12b20 61 79 65 72 20 77 68 69 6c 73 74 0a 2a 2a 20 65  ayer whilst.** e
12b30 72 61 73 69 6e 67 20 69 54 61 62 6c 65 20 28 74  rasing iTable (t
12b40 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 77  his can happen w
12b50 69 74 68 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  ith an auto-vacu
12b60 75 6d 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  um database)..*/
12b70 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65   .static void de
12b80 73 74 72 6f 79 52 6f 6f 74 50 61 67 65 28 50 61  stroyRootPage(Pa
12b90 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74  rse *pParse, int
12ba0 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 69 44 62   iTable, int iDb
12bb0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
12bc0 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
12bd0 61 72 73 65 29 3b 0a 20 20 69 6e 74 20 72 31 20  arse);.  int r1 
12be0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
12bf0 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 61  Reg(pParse);.  a
12c00 73 73 65 72 74 28 20 69 54 61 62 6c 65 3e 31 20  ssert( iTable>1 
12c10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
12c20 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 44 65 73  AddOp3(v, OP_Des
12c30 74 72 6f 79 2c 20 69 54 61 62 6c 65 2c 20 72 31  troy, iTable, r1
12c40 2c 20 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  , iDb);.  sqlite
12c50 33 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  3MayAbort(pParse
12c60 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
12c70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
12c80 4d 0a 20 20 2f 2a 20 4f 50 5f 44 65 73 74 72 6f  M.  /* OP_Destro
12c90 79 20 73 74 6f 72 65 73 20 61 6e 20 69 6e 20 69  y stores an in i
12ca0 6e 74 65 67 65 72 20 72 31 2e 20 49 66 20 74 68  nteger r1. If th
12cb0 69 73 20 69 6e 74 65 67 65 72 0a 20 20 2a 2a 20  is integer.  ** 
12cc0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12cd0 6e 20 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74  n it is the root
12ce0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
12cf0 61 20 74 61 62 6c 65 20 6d 6f 76 65 64 20 74 6f  a table moved to
12d00 0a 20 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 69  .  ** location i
12d10 54 61 62 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f  Table. The follo
12d20 77 69 6e 67 20 63 6f 64 65 20 6d 6f 64 69 66 69  wing code modifi
12d30 65 73 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61  es the sqlite_ma
12d40 73 74 65 72 20 74 61 62 6c 65 20 74 6f 0a 20 20  ster table to.  
12d50 2a 2a 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  ** reflect this.
12d60 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 22  .  **.  ** The "
12d70 23 4e 4e 4e 22 20 69 6e 20 74 68 65 20 53 51 4c  #NNN" in the SQL
12d80 20 69 73 20 61 20 73 70 65 63 69 61 6c 20 63 6f   is a special co
12d90 6e 73 74 61 6e 74 20 74 68 61 74 20 6d 65 61 6e  nstant that mean
12da0 73 20 77 68 61 74 65 76 65 72 20 76 61 6c 75 65  s whatever value
12db0 0a 20 20 2a 2a 20 69 73 20 69 6e 20 72 65 67 69  .  ** is in regi
12dc0 73 74 65 72 20 4e 4e 4e 2e 20 20 53 65 65 20 67  ster NNN.  See g
12dd0 72 61 6d 6d 61 72 20 72 75 6c 65 73 20 61 73 73  rammar rules ass
12de0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
12df0 20 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 2a   TK_REGISTER.  *
12e00 2a 20 74 6f 6b 65 6e 20 66 6f 72 20 61 64 64 69  * token for addi
12e10 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12e20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  on..  */.  sqlit
12e30 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50  e3NestedParse(pP
12e40 61 72 73 65 2c 20 0a 20 20 20 20 20 22 55 50 44  arse, .     "UPD
12e50 41 54 45 20 25 51 2e 25 73 20 53 45 54 20 72 6f  ATE %Q.%s SET ro
12e60 6f 74 70 61 67 65 3d 25 64 20 57 48 45 52 45 20  otpage=%d WHERE 
12e70 23 25 64 20 41 4e 44 20 72 6f 6f 74 70 61 67 65  #%d AND rootpage
12e80 3d 23 25 64 22 2c 0a 20 20 20 20 20 70 50 61 72  =#%d",.     pPar
12e90 73 65 2d 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d  se->db->aDb[iDb]
12ea0 2e 7a 4e 61 6d 65 2c 20 53 43 48 45 4d 41 5f 54  .zName, SCHEMA_T
12eb0 41 42 4c 45 28 69 44 62 29 2c 20 69 54 61 62 6c  ABLE(iDb), iTabl
12ec0 65 2c 20 72 31 2c 20 72 31 29 3b 0a 23 65 6e 64  e, r1, r1);.#end
12ed0 69 66 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  if.  sqlite3Rele
12ee0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
12ef0 65 2c 20 72 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e, r1);.}../*.**
12f00 20 57 72 69 74 65 20 56 44 42 45 20 63 6f 64 65   Write VDBE code
12f10 20 74 6f 20 65 72 61 73 65 20 74 61 62 6c 65 20   to erase table 
12f20 70 54 61 62 20 61 6e 64 20 61 6c 6c 20 61 73 73  pTab and all ass
12f30 6f 63 69 61 74 65 64 20 69 6e 64 69 63 65 73 20  ociated indices 
12f40 6f 6e 20 64 69 73 6b 2e 0a 2a 2a 20 43 6f 64 65  on disk..** Code
12f50 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 73   to update the s
12f60 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
12f70 6c 65 73 20 61 6e 64 20 69 6e 74 65 72 6e 61 6c  les and internal
12f80 20 73 63 68 65 6d 61 20 64 65 66 69 6e 69 74 69   schema definiti
12f90 6f 6e 73 0a 2a 2a 20 69 6e 20 63 61 73 65 20 61  ons.** in case a
12fa0 20 72 6f 6f 74 2d 70 61 67 65 20 62 65 6c 6f 6e   root-page belon
12fb0 67 69 6e 67 20 74 6f 20 61 6e 6f 74 68 65 72 20  ging to another 
12fc0 74 61 62 6c 65 20 69 73 20 6d 6f 76 65 64 20 62  table is moved b
12fd0 79 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65  y the btree laye
12fe0 72 0a 2a 2a 20 69 73 20 61 6c 73 6f 20 61 64 64  r.** is also add
12ff0 65 64 20 28 74 68 69 73 20 63 61 6e 20 68 61 70  ed (this can hap
13000 70 65 6e 20 77 69 74 68 20 61 6e 20 61 75 74 6f  pen with an auto
13010 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
13020 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
13030 64 20 64 65 73 74 72 6f 79 54 61 62 6c 65 28 50  d destroyTable(P
13040 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 61  arse *pParse, Ta
13050 62 6c 65 20 2a 70 54 61 62 29 7b 0a 23 69 66 64  ble *pTab){.#ifd
13060 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13070 55 54 4f 56 41 43 55 55 4d 0a 20 20 49 6e 64 65  UTOVACUUM.  Inde
13080 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74 20 69  x *pIdx;.  int i
13090 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  Db = sqlite3Sche
130a0 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65  maToIndex(pParse
130b0 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68  ->db, pTab->pSch
130c0 65 6d 61 29 3b 0a 20 20 64 65 73 74 72 6f 79 52  ema);.  destroyR
130d0 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
130e0 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pTab->tnum, iDb)
130f0 3b 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  ;.  for(pIdx=pTa
13100 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
13110 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
13120 74 29 7b 0a 20 20 20 20 64 65 73 74 72 6f 79 52  t){.    destroyR
13130 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c 20  ootPage(pParse, 
13140 70 49 64 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 29  pIdx->tnum, iDb)
13150 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 2f 2a  ;.  }.#else.  /*
13160 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
13170 20 6d 61 79 20 62 65 20 61 75 74 6f 2d 76 61 63   may be auto-vac
13180 75 75 6d 20 63 61 70 61 62 6c 65 20 28 69 66 20  uum capable (if 
13190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
131a0 56 41 43 55 55 4d 0a 20 20 2a 2a 20 69 73 20 6e  VACUUM.  ** is n
131b0 6f 74 20 64 65 66 69 6e 65 64 29 2c 20 74 68 65  ot defined), the
131c0 6e 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  n it is importan
131d0 74 20 74 6f 20 63 61 6c 6c 20 4f 50 5f 44 65 73  t to call OP_Des
131e0 74 72 6f 79 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  troy on the.  **
131f0 20 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78   table and index
13200 20 72 6f 6f 74 2d 70 61 67 65 73 20 69 6e 20 6f   root-pages in o
13210 72 64 65 72 2c 20 73 74 61 72 74 69 6e 67 20 77  rder, starting w
13220 69 74 68 20 74 68 65 20 6e 75 6d 65 72 69 63 61  ith the numerica
13230 6c 6c 79 20 0a 20 20 2a 2a 20 6c 61 72 67 65 73  lly .  ** larges
13240 74 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62  t root-page numb
13250 65 72 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74  er. This guarant
13260 65 65 73 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66  ees that none of
13270 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 73 0a   the root-pages.
13280 20 20 2a 2a 20 74 6f 20 62 65 20 64 65 73 74 72    ** to be destr
13290 6f 79 65 64 20 69 73 20 72 65 6c 6f 63 61 74 65  oyed is relocate
132a0 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
132b0 4f 50 5f 44 65 73 74 72 6f 79 2e 20 69 2e 65 2e  OP_Destroy. i.e.
132c0 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 66 6f 6c   if the.  ** fol
132d0 6c 6f 77 69 6e 67 20 77 65 72 65 20 63 6f 64 65  lowing were code
132e0 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 50 5f  d:.  **.  ** OP_
132f0 44 65 73 74 72 6f 79 20 34 20 30 0a 20 20 2a 2a  Destroy 4 0.  **
13300 20 2e 2e 2e 0a 20 20 2a 2a 20 4f 50 5f 44 65 73   ....  ** OP_Des
13310 74 72 6f 79 20 35 20 30 0a 20 20 2a 2a 0a 20 20  troy 5 0.  **.  
13320 2a 2a 20 61 6e 64 20 72 6f 6f 74 20 70 61 67 65  ** and root page
13330 20 35 20 68 61 70 70 65 6e 65 64 20 74 6f 20 62   5 happened to b
13340 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  e the largest ro
13350 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 20 69  ot-page number i
13360 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
13370 61 73 65 2c 20 74 68 65 6e 20 72 6f 6f 74 20 70  ase, then root p
13380 61 67 65 20 35 20 77 6f 75 6c 64 20 62 65 20 6d  age 5 would be m
13390 6f 76 65 64 20 74 6f 20 70 61 67 65 20 34 20 62  oved to page 4 b
133a0 79 20 74 68 65 20 0a 20 20 2a 2a 20 22 4f 50 5f  y the .  ** "OP_
133b0 44 65 73 74 72 6f 79 20 34 20 30 22 20 6f 70 63  Destroy 4 0" opc
133c0 6f 64 65 2e 20 54 68 65 20 73 75 62 73 65 71 75  ode. The subsequ
133d0 65 6e 74 20 22 4f 50 5f 44 65 73 74 72 6f 79 20  ent "OP_Destroy 
133e0 35 20 30 22 20 77 6f 75 6c 64 20 68 69 74 0a 20  5 0" would hit. 
133f0 20 2a 2a 20 61 20 66 72 65 65 2d 6c 69 73 74 20   ** a free-list 
13400 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  page..  */.  int
13410 20 69 54 61 62 20 3d 20 70 54 61 62 2d 3e 74 6e   iTab = pTab->tn
13420 75 6d 3b 0a 20 20 69 6e 74 20 69 44 65 73 74 72  um;.  int iDestr
13430 6f 79 65 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69  oyed = 0;..  whi
13440 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 49 6e 64  le( 1 ){.    Ind
13450 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 69 6e  ex *pIdx;.    in
13460 74 20 69 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  t iLargest = 0;.
13470 0a 20 20 20 20 69 66 28 20 69 44 65 73 74 72 6f  .    if( iDestro
13480 79 65 64 3d 3d 30 20 7c 7c 20 69 54 61 62 3c 69  yed==0 || iTab<i
13490 44 65 73 74 72 6f 79 65 64 20 29 7b 0a 20 20 20  Destroyed ){.   
134a0 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69 54     iLargest = iT
134b0 61 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ab;.    }.    fo
134c0 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
134d0 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
134e0 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
134f0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 70      int iIdx = p
13500 49 64 78 2d 3e 74 6e 75 6d 3b 0a 20 20 20 20 20  Idx->tnum;.     
13510 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 70   assert( pIdx->p
13520 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
13530 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 69  chema );.      i
13540 66 28 20 28 69 44 65 73 74 72 6f 79 65 64 3d 3d  f( (iDestroyed==
13550 30 20 7c 7c 20 28 69 49 64 78 3c 69 44 65 73 74  0 || (iIdx<iDest
13560 72 6f 79 65 64 29 29 20 26 26 20 69 49 64 78 3e  royed)) && iIdx>
13570 69 4c 61 72 67 65 73 74 20 29 7b 0a 20 20 20 20  iLargest ){.    
13580 20 20 20 20 69 4c 61 72 67 65 73 74 20 3d 20 69      iLargest = i
13590 49 64 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Idx;.      }.   
135a0 20 7d 0a 20 20 20 20 69 66 28 20 69 4c 61 72 67   }.    if( iLarg
135b0 65 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  est==0 ){.      
135c0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 65 6c 73  return;.    }els
135d0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 62  e{.      int iDb
135e0 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
135f0 54 6f 49 6e 64 65 78 28 70 50 61 72 73 65 2d 3e  ToIndex(pParse->
13600 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
13610 61 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  a);.      assert
13620 28 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c  ( iDb>=0 && iDb<
13630 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6e 44 62 20  pParse->db->nDb 
13640 29 3b 0a 20 20 20 20 20 20 64 65 73 74 72 6f 79  );.      destroy
13650 52 6f 6f 74 50 61 67 65 28 70 50 61 72 73 65 2c  RootPage(pParse,
13660 20 69 4c 61 72 67 65 73 74 2c 20 69 44 62 29 3b   iLargest, iDb);
13670 0a 20 20 20 20 20 20 69 44 65 73 74 72 6f 79 65  .      iDestroye
13680 64 20 3d 20 69 4c 61 72 67 65 73 74 3b 0a 20 20  d = iLargest;.  
13690 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d    }.  }.#endif.}
136a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 65  ../*.** Remove e
136b0 6e 74 72 69 65 73 20 66 72 6f 6d 20 74 68 65 20  ntries from the 
136c0 73 71 6c 69 74 65 5f 73 74 61 74 4e 20 74 61 62  sqlite_statN tab
136d0 6c 65 73 20 28 66 6f 72 20 4e 20 69 6e 20 28 31  les (for N in (1
136e0 2c 32 2c 33 29 29 0a 2a 2a 20 61 66 74 65 72 20  ,2,3)).** after 
136f0 61 20 44 52 4f 50 20 49 4e 44 45 58 20 6f 72 20  a DROP INDEX or 
13700 44 52 4f 50 20 54 41 42 4c 45 20 63 6f 6d 6d 61  DROP TABLE comma
13710 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nd..*/.static vo
13720 69 64 20 73 71 6c 69 74 65 33 43 6c 65 61 72 53  id sqlite3ClearS
13730 74 61 74 54 61 62 6c 65 73 28 0a 20 20 50 61 72  tatTables(.  Par
13740 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
13750 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
13760 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
13770 69 6e 74 20 69 44 62 2c 20 20 20 20 20 20 20 20  int iDb,        
13780 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
13790 74 61 62 61 73 65 20 6e 75 6d 62 65 72 20 2a 2f  tabase number */
137a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
137b0 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 69 64  Type,     /* "id
137c0 78 22 20 6f 72 20 22 74 62 6c 22 20 2a 2f 0a 20  x" or "tbl" */. 
137d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
137e0 6d 65 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me      /* Name 
137f0 6f 66 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  of index or tabl
13800 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  e */.){.  int i;
13810 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13820 44 62 4e 61 6d 65 20 3d 20 70 50 61 72 73 65 2d  DbName = pParse-
13830 3e 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  >db->aDb[iDb].zN
13840 61 6d 65 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  ame;.  for(i=1; 
13850 69 3c 3d 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<=4; i++){.    
13860 63 68 61 72 20 7a 54 61 62 5b 32 34 5d 3b 0a 20  char zTab[24];. 
13870 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
13880 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 62 29  ntf(sizeof(zTab)
13890 2c 7a 54 61 62 2c 22 73 71 6c 69 74 65 5f 73 74  ,zTab,"sqlite_st
138a0 61 74 25 64 22 2c 69 29 3b 0a 20 20 20 20 69 66  at%d",i);.    if
138b0 28 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62  ( sqlite3FindTab
138c0 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  le(pParse->db, z
138d0 54 61 62 2c 20 7a 44 62 4e 61 6d 65 29 20 29 7b  Tab, zDbName) ){
138e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4e 65  .      sqlite3Ne
138f0 73 74 65 64 50 61 72 73 65 28 70 50 61 72 73 65  stedParse(pParse
13900 2c 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45 54  ,.        "DELET
13910 45 20 46 52 4f 4d 20 25 51 2e 25 73 20 57 48 45  E FROM %Q.%s WHE
13920 52 45 20 25 73 3d 25 51 22 2c 0a 20 20 20 20 20  RE %s=%Q",.     
13930 20 20 20 7a 44 62 4e 61 6d 65 2c 20 7a 54 61 62     zDbName, zTab
13940 2c 20 7a 54 79 70 65 2c 20 7a 4e 61 6d 65 0a 20  , zType, zName. 
13950 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
13960 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
13970 61 74 65 20 63 6f 64 65 20 74 6f 20 64 72 6f 70  ate code to drop
13980 20 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 76 6f 69   a table..*/.voi
13990 64 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f  d sqlite3CodeDro
139a0 70 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50  pTable(Parse *pP
139b0 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
139c0 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
139d0 69 73 56 69 65 77 29 7b 0a 20 20 56 64 62 65 20  isView){.  Vdbe 
139e0 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  *v;.  sqlite3 *d
139f0 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
13a00 20 20 54 72 69 67 67 65 72 20 2a 70 54 72 69 67    Trigger *pTrig
13a10 67 65 72 3b 0a 20 20 44 62 20 2a 70 44 62 20 3d  ger;.  Db *pDb =
13a20 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d 3b 0a   &db->aDb[iDb];.
13a30 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
13a40 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
13a50 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b   assert( v!=0 );
13a60 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57  .  sqlite3BeginW
13a70 72 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50  riteOperation(pP
13a80 61 72 73 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a  arse, 1, iDb);..
13a90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13aa0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
13ab0 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c  .  if( IsVirtual
13ac0 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71  (pTab) ){.    sq
13ad0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28  lite3VdbeAddOp0(
13ae0 76 2c 20 4f 50 5f 56 42 65 67 69 6e 29 3b 0a 20  v, OP_VBegin);. 
13af0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
13b00 44 72 6f 70 20 61 6c 6c 20 74 72 69 67 67 65 72  Drop all trigger
13b10 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
13b20 68 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e  h the table bein
13b30 67 20 64 72 6f 70 70 65 64 2e 20 43 6f 64 65 0a  g dropped. Code.
13b40 20 20 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65    ** is generate
13b50 64 20 74 6f 20 72 65 6d 6f 76 65 20 65 6e 74 72  d to remove entr
13b60 69 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65 5f  ies from sqlite_
13b70 6d 61 73 74 65 72 20 61 6e 64 2f 6f 72 0a 20 20  master and/or.  
13b80 2a 2a 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  ** sqlite_temp_m
13b90 61 73 74 65 72 20 69 66 20 72 65 71 75 69 72 65  aster if require
13ba0 64 2e 0a 20 20 2a 2f 0a 20 20 70 54 72 69 67 67  d..  */.  pTrigg
13bb0 65 72 20 3d 20 73 71 6c 69 74 65 33 54 72 69 67  er = sqlite3Trig
13bc0 67 65 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20  gerList(pParse, 
13bd0 70 54 61 62 29 3b 0a 20 20 77 68 69 6c 65 28 20  pTab);.  while( 
13be0 70 54 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  pTrigger ){.    
13bf0 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
13c00 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d  ->pSchema==pTab-
13c10 3e 70 53 63 68 65 6d 61 20 7c 7c 20 0a 20 20 20  >pSchema || .   
13c20 20 20 20 20 20 70 54 72 69 67 67 65 72 2d 3e 70       pTrigger->p
13c30 53 63 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b  Schema==db->aDb[
13c40 31 5d 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20  1].pSchema );.  
13c50 20 20 73 71 6c 69 74 65 33 44 72 6f 70 54 72 69    sqlite3DropTri
13c60 67 67 65 72 50 74 72 28 70 50 61 72 73 65 2c 20  ggerPtr(pParse, 
13c70 70 54 72 69 67 67 65 72 29 3b 0a 20 20 20 20 70  pTrigger);.    p
13c80 54 72 69 67 67 65 72 20 3d 20 70 54 72 69 67 67  Trigger = pTrigg
13c90 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a  er->pNext;.  }..
13ca0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13cb0 4d 49 54 5f 41 55 54 4f 49 4e 43 52 45 4d 45 4e  MIT_AUTOINCREMEN
13cc0 54 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 61 6e  T.  /* Remove an
13cd0 79 20 65 6e 74 72 69 65 73 20 6f 66 20 74 68 65  y entries of the
13ce0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
13cf0 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65   table associate
13d00 64 20 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20  d with.  ** the 
13d10 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
13d20 70 65 64 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ped. This is don
13d30 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 61 62  e before the tab
13d40 6c 65 20 69 73 20 64 72 6f 70 70 65 64 0a 20 20  le is dropped.  
13d50 2a 2a 20 61 74 20 74 68 65 20 62 74 72 65 65 20  ** at the btree 
13d60 6c 65 76 65 6c 2c 20 69 6e 20 63 61 73 65 20 74  level, in case t
13d70 68 65 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  he sqlite_sequen
13d80 63 65 20 74 61 62 6c 65 20 6e 65 65 64 73 20 74  ce table needs t
13d90 6f 0a 20 20 2a 2a 20 6d 6f 76 65 20 61 73 20 61  o.  ** move as a
13da0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 64   result of the d
13db0 72 6f 70 20 28 63 61 6e 20 68 61 70 70 65 6e 20  rop (can happen 
13dc0 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d  in auto-vacuum m
13dd0 6f 64 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ode)..  */.  if(
13de0 20 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20   pTab->tabFlags 
13df0 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65  & TF_Autoincreme
13e00 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
13e10 33 4e 65 73 74 65 64 50 61 72 73 65 28 70 50 61  3NestedParse(pPa
13e20 72 73 65 2c 0a 20 20 20 20 20 20 22 44 45 4c 45  rse,.      "DELE
13e30 54 45 20 46 52 4f 4d 20 25 51 2e 73 71 6c 69 74  TE FROM %Q.sqlit
13e40 65 5f 73 65 71 75 65 6e 63 65 20 57 48 45 52 45  e_sequence WHERE
13e50 20 6e 61 6d 65 3d 25 51 22 2c 0a 20 20 20 20 20   name=%Q",.     
13e60 20 70 44 62 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61   pDb->zName, pTa
13e70 62 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a  b->zName.    );.
13e80 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
13e90 20 44 72 6f 70 20 61 6c 6c 20 53 51 4c 49 54 45   Drop all SQLITE
13ea0 5f 4d 41 53 54 45 52 20 74 61 62 6c 65 20 61 6e  _MASTER table an
13eb0 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 20  d index entries 
13ec0 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
13ed0 65 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 54 68  e.  ** table. Th
13ee0 65 20 70 72 6f 67 72 61 6d 20 6e 61 6d 65 20 6c  e program name l
13ef0 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 74 68 65  oops through the
13f00 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 61 6e   master table an
13f10 64 20 64 65 6c 65 74 65 73 0a 20 20 2a 2a 20 65  d deletes.  ** e
13f20 76 65 72 79 20 72 6f 77 20 74 68 61 74 20 72 65  very row that re
13f30 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c 65 20  fers to a table 
13f40 6f 66 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  of the same name
13f50 20 61 73 20 74 68 65 20 6f 6e 65 20 62 65 69 6e   as the one bein
13f60 67 0a 20 20 2a 2a 20 64 72 6f 70 70 65 64 2e 20  g.  ** dropped. 
13f70 54 72 69 67 67 65 72 73 20 61 72 65 20 68 61 6e  Triggers are han
13f80 64 6c 65 64 20 73 65 70 61 72 61 74 65 6c 79 20  dled separately 
13f90 62 65 63 61 75 73 65 20 61 20 74 72 69 67 67 65  because a trigge
13fa0 72 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 63 72  r can be.  ** cr
13fb0 65 61 74 65 64 20 69 6e 20 74 68 65 20 74 65 6d  eated in the tem
13fc0 70 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  p database that 
13fd0 72 65 66 65 72 73 20 74 6f 20 61 20 74 61 62 6c  refers to a tabl
13fe0 65 20 69 6e 20 61 6e 6f 74 68 65 72 0a 20 20 2a  e in another.  *
13ff0 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  * database..  */
14000 0a 20 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  .  sqlite3Nested
14010 50 61 72 73 65 28 70 50 61 72 73 65 2c 20 0a 20  Parse(pParse, . 
14020 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
14030 4d 20 25 51 2e 25 73 20 57 48 45 52 45 20 74 62  M %Q.%s WHERE tb
14040 6c 5f 6e 61 6d 65 3d 25 51 20 61 6e 64 20 74 79  l_name=%Q and ty
14050 70 65 21 3d 27 74 72 69 67 67 65 72 27 22 2c 0a  pe!='trigger'",.
14060 20 20 20 20 20 20 70 44 62 2d 3e 7a 4e 61 6d 65        pDb->zName
14070 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69  , SCHEMA_TABLE(i
14080 44 62 29 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  Db), pTab->zName
14090 29 3b 0a 20 20 69 66 28 20 21 69 73 56 69 65 77  );.  if( !isView
140a0 20 26 26 20 21 49 73 56 69 72 74 75 61 6c 28 70   && !IsVirtual(p
140b0 54 61 62 29 20 29 7b 0a 20 20 20 20 64 65 73 74  Tab) ){.    dest
140c0 72 6f 79 54 61 62 6c 65 28 70 50 61 72 73 65 2c  royTable(pParse,
140d0 20 70 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f   pTab);.  }..  /
140e0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 74 61 62  * Remove the tab
140f0 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 53 51  le entry from SQ
14100 4c 69 74 65 27 73 20 69 6e 74 65 72 6e 61 6c 20  Lite's internal 
14110 73 63 68 65 6d 61 20 61 6e 64 20 6d 6f 64 69 66  schema and modif
14120 79 0a 20 20 2a 2a 20 74 68 65 20 73 63 68 65 6d  y.  ** the schem
14130 61 20 63 6f 6f 6b 69 65 2e 0a 20 20 2a 2f 0a 20  a cookie..  */. 
14140 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14150 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
14160 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
14170 20 4f 50 5f 56 44 65 73 74 72 6f 79 2c 20 69 44   OP_VDestroy, iD
14180 62 2c 20 30 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  b, 0, 0, pTab->z
14190 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  Name, 0);.  }.  
141a0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
141b0 34 28 76 2c 20 4f 50 5f 44 72 6f 70 54 61 62 6c  4(v, OP_DropTabl
141c0 65 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20 70 54  e, iDb, 0, 0, pT
141d0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  ab->zName, 0);. 
141e0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
141f0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
14200 29 3b 0a 20 20 73 71 6c 69 74 65 56 69 65 77 52  );.  sqliteViewR
14210 65 73 65 74 41 6c 6c 28 64 62 2c 20 69 44 62 29  esetAll(db, iDb)
14220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
14230 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
14240 64 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b  d to do the work
14250 20 6f 66 20 61 20 44 52 4f 50 20 54 41 42 4c 45   of a DROP TABLE
14260 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 70   statement..** p
14270 4e 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65  Name is the name
14280 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
14290 20 62 65 20 64 72 6f 70 70 65 64 2e 0a 2a 2f 0a   be dropped..*/.
142a0 76 6f 69 64 20 73 71 6c 69 74 65 33 44 72 6f 70  void sqlite3Drop
142b0 54 61 62 6c 65 28 50 61 72 73 65 20 2a 70 50 61  Table(Parse *pPa
142c0 72 73 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 4e  rse, SrcList *pN
142d0 61 6d 65 2c 20 69 6e 74 20 69 73 56 69 65 77 2c  ame, int isView,
142e0 20 69 6e 74 20 6e 6f 45 72 72 29 7b 0a 20 20 54   int noErr){.  T
142f0 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 56 64  able *pTab;.  Vd
14300 62 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33  be *v;.  sqlite3
14310 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
14320 62 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20  b;.  int iDb;.. 
14330 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
14340 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
14350 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14360 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  e;.  }.  assert(
14370 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d 30   pParse->nErr==0
14380 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e   );.  assert( pN
14390 61 6d 65 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a  ame->nSrc==1 );.
143a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 61    if( sqlite3Rea
143b0 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29 20  dSchema(pParse) 
143c0 29 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70  ) goto exit_drop
143d0 5f 74 61 62 6c 65 3b 0a 20 20 69 66 28 20 6e 6f  _table;.  if( no
143e0 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
143f0 73 73 45 72 72 2b 2b 3b 0a 20 20 70 54 61 62 20  ssErr++;.  pTab 
14400 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65 54  = sqlite3LocateT
14410 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65 2c  ableItem(pParse,
14420 20 69 73 56 69 65 77 2c 20 26 70 4e 61 6d 65 2d   isView, &pName-
14430 3e 61 5b 30 5d 29 3b 0a 20 20 69 66 28 20 6e 6f  >a[0]);.  if( no
14440 45 72 72 20 29 20 64 62 2d 3e 73 75 70 70 72 65  Err ) db->suppre
14450 73 73 45 72 72 2d 2d 3b 0a 0a 20 20 69 66 28 20  ssErr--;..  if( 
14460 70 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 69  pTab==0 ){.    i
14470 66 28 20 6e 6f 45 72 72 20 29 20 73 71 6c 69 74  f( noErr ) sqlit
14480 65 33 43 6f 64 65 56 65 72 69 66 79 4e 61 6d 65  e3CodeVerifyName
14490 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  dSchema(pParse, 
144a0 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 44 61 74  pName->a[0].zDat
144b0 61 62 61 73 65 29 3b 0a 20 20 20 20 67 6f 74 6f  abase);.    goto
144c0 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
144d0 3b 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71  ;.  }.  iDb = sq
144e0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
144f0 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
14500 68 65 6d 61 29 3b 0a 20 20 61 73 73 65 72 74 28  hema);.  assert(
14510 20 69 44 62 3e 3d 30 20 26 26 20 69 44 62 3c 64   iDb>=0 && iDb<d
14520 62 2d 3e 6e 44 62 20 29 3b 0a 0a 20 20 2f 2a 20  b->nDb );..  /* 
14530 49 66 20 70 54 61 62 20 69 73 20 61 20 76 69 72  If pTab is a vir
14540 74 75 61 6c 20 74 61 62 6c 65 2c 20 63 61 6c 6c  tual table, call
14550 20 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61   ViewGetColumnNa
14560 6d 65 73 28 29 20 74 6f 20 65 6e 73 75 72 65 0a  mes() to ensure.
14570 20 20 2a 2a 20 69 74 20 69 73 20 69 6e 69 74 69    ** it is initi
14580 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
14590 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
145a0 62 29 20 26 26 20 73 71 6c 69 74 65 33 56 69 65  b) && sqlite3Vie
145b0 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28  wGetColumnNames(
145c0 70 50 61 72 73 65 2c 20 70 54 61 62 29 20 29 7b  pParse, pTab) ){
145d0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64  .    goto exit_d
145e0 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 23  rop_table;.  }.#
145f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14600 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
14610 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  .  {.    int cod
14620 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e;.    const cha
14630 72 20 2a 7a 54 61 62 20 3d 20 53 43 48 45 4d 41  r *zTab = SCHEMA
14640 5f 54 41 42 4c 45 28 69 44 62 29 3b 0a 20 20 20  _TABLE(iDb);.   
14650 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14660 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
14670 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  zName;.    const
14680 20 63 68 61 72 20 2a 7a 41 72 67 32 20 3d 20 30   char *zArg2 = 0
14690 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
146a0 33 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73  3AuthCheck(pPars
146b0 65 2c 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  e, SQLITE_DELETE
146c0 2c 20 7a 54 61 62 2c 20 30 2c 20 7a 44 62 29 29  , zTab, 0, zDb))
146d0 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  {.      goto exi
146e0 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20 20  t_drop_table;.  
146f0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 56 69    }.    if( isVi
14700 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ew ){.      if( 
14710 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26 20  !OMIT_TEMPDB && 
14720 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  iDb==1 ){.      
14730 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
14740 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 3b 0a  DROP_TEMP_VIEW;.
14750 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14760 20 20 20 20 20 63 6f 64 65 20 3d 20 53 51 4c 49       code = SQLI
14770 54 45 5f 44 52 4f 50 5f 56 49 45 57 3b 0a 20 20  TE_DROP_VIEW;.  
14780 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
14790 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
147a0 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 65  LTABLE.    }else
147b0 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
147c0 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  Tab) ){.      co
147d0 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
147e0 5f 56 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 7a  _VTABLE;.      z
147f0 41 72 67 32 20 3d 20 73 71 6c 69 74 65 33 47 65  Arg2 = sqlite3Ge
14800 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
14810 29 2d 3e 70 4d 6f 64 2d 3e 7a 4e 61 6d 65 3b 0a  )->pMod->zName;.
14820 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
14830 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4f 4d 49  {.      if( !OMI
14840 54 5f 54 45 4d 50 44 42 20 26 26 20 69 44 62 3d  T_TEMPDB && iDb=
14850 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =1 ){.        co
14860 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 52 4f 50  de = SQLITE_DROP
14870 5f 54 45 4d 50 5f 54 41 42 4c 45 3b 0a 20 20 20  _TEMP_TABLE;.   
14880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14890 20 20 63 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f    code = SQLITE_
148a0 44 52 4f 50 5f 54 41 42 4c 45 3b 0a 20 20 20 20  DROP_TABLE;.    
148b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
148c0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
148d0 63 6b 28 70 50 61 72 73 65 2c 20 63 6f 64 65 2c  ck(pParse, code,
148e0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 7a 41   pTab->zName, zA
148f0 72 67 32 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  rg2, zDb) ){.   
14900 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14910 70 5f 74 61 62 6c 65 3b 0a 20 20 20 20 7d 0a 20  p_table;.    }. 
14920 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 75     if( sqlite3Au
14930 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  thCheck(pParse, 
14940 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 2c 20 70  SQLITE_DELETE, p
14950 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 30 2c 20 7a  Tab->zName, 0, z
14960 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
14970 6f 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c  o exit_drop_tabl
14980 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  e;.    }.  }.#en
14990 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
149a0 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d 3e  3StrNICmp(pTab->
149b0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 22  zName, "sqlite_"
149c0 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 26 26 20  , 7)==0 .    && 
149d0 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
149e0 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 22 73 71  pTab->zName, "sq
149f0 6c 69 74 65 5f 73 74 61 74 22 2c 20 31 31 29 21  lite_stat", 11)!
14a00 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14a10 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
14a20 2c 20 22 74 61 62 6c 65 20 25 73 20 6d 61 79 20  , "table %s may 
14a30 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64 22 2c  not be dropped",
14a40 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
14a50 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f     goto exit_dro
14a60 70 5f 74 61 62 6c 65 3b 0a 20 20 7d 0a 0a 23 69  p_table;.  }..#i
14a70 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14a80 54 5f 56 49 45 57 0a 20 20 2f 2a 20 45 6e 73 75  T_VIEW.  /* Ensu
14a90 72 65 20 44 52 4f 50 20 54 41 42 4c 45 20 69 73  re DROP TABLE is
14aa0 20 6e 6f 74 20 75 73 65 64 20 6f 6e 20 61 20 76   not used on a v
14ab0 69 65 77 2c 20 61 6e 64 20 44 52 4f 50 20 56 49  iew, and DROP VI
14ac0 45 57 20 69 73 20 6e 6f 74 20 75 73 65 64 0a 20  EW is not used. 
14ad0 20 2a 2a 20 6f 6e 20 61 20 74 61 62 6c 65 2e 0a   ** on a table..
14ae0 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 56 69 65    */.  if( isVie
14af0 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c 65  w && pTab->pSele
14b00 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ct==0 ){.    sql
14b10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
14b20 72 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 54  rse, "use DROP T
14b30 41 42 4c 45 20 74 6f 20 64 65 6c 65 74 65 20 74  ABLE to delete t
14b40 61 62 6c 65 20 25 73 22 2c 20 70 54 61 62 2d 3e  able %s", pTab->
14b50 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f  zName);.    goto
14b60 20 65 78 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65   exit_drop_table
14b70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 69 73 56  ;.  }.  if( !isV
14b80 69 65 77 20 26 26 20 70 54 61 62 2d 3e 70 53 65  iew && pTab->pSe
14b90 6c 65 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  lect ){.    sqli
14ba0 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
14bb0 73 65 2c 20 22 75 73 65 20 44 52 4f 50 20 56 49  se, "use DROP VI
14bc0 45 57 20 74 6f 20 64 65 6c 65 74 65 20 76 69 65  EW to delete vie
14bd0 77 20 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  w %s", pTab->zNa
14be0 6d 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78  me);.    goto ex
14bf0 69 74 5f 64 72 6f 70 5f 74 61 62 6c 65 3b 0a 20  it_drop_table;. 
14c00 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
14c10 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
14c20 20 72 65 6d 6f 76 65 20 74 68 65 20 74 61 62 6c   remove the tabl
14c30 65 20 66 72 6f 6d 20 74 68 65 20 6d 61 73 74 65  e from the maste
14c40 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 6e 20  r table.  ** on 
14c50 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 76 20 3d  disk..  */.  v =
14c60 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
14c70 70 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76  pParse);.  if( v
14c80 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
14c90 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
14ca0 6f 6e 28 70 50 61 72 73 65 2c 20 31 2c 20 69 44  on(pParse, 1, iD
14cb0 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 43  b);.    sqlite3C
14cc0 6c 65 61 72 53 74 61 74 54 61 62 6c 65 73 28 70  learStatTables(p
14cd0 50 61 72 73 65 2c 20 69 44 62 2c 20 22 74 62 6c  Parse, iDb, "tbl
14ce0 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ", pTab->zName);
14cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 6b 44 72  .    sqlite3FkDr
14d00 6f 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20  opTable(pParse, 
14d10 70 4e 61 6d 65 2c 20 70 54 61 62 29 3b 0a 20 20  pName, pTab);.  
14d20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 44 72 6f    sqlite3CodeDro
14d30 70 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 70  pTable(pParse, p
14d40 54 61 62 2c 20 69 44 62 2c 20 69 73 56 69 65 77  Tab, iDb, isView
14d50 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
14d60 70 5f 74 61 62 6c 65 3a 0a 20 20 73 71 6c 69 74  p_table:.  sqlit
14d70 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
14d80 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
14d90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14da0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63  e is called to c
14db0 72 65 61 74 65 20 61 20 6e 65 77 20 66 6f 72 65  reate a new fore
14dc0 69 67 6e 20 6b 65 79 20 6f 6e 20 74 68 65 20 74  ign key on the t
14dd0 61 62 6c 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c  able.** currentl
14de0 79 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  y under construc
14df0 74 69 6f 6e 2e 20 20 70 46 72 6f 6d 43 6f 6c 20  tion.  pFromCol 
14e00 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68  determines which
14e10 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20 69 6e 20 74   columns.** in t
14e20 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
14e30 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 66 6f   point to the fo
14e40 72 65 69 67 6e 20 6b 65 79 2e 20 20 49 66 20 70  reign key.  If p
14e50 46 72 6f 6d 43 6f 6c 3d 3d 30 20 74 68 65 6e 0a  FromCol==0 then.
14e60 2a 2a 20 63 6f 6e 6e 65 63 74 20 74 68 65 20 6b  ** connect the k
14e70 65 79 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  ey to the last c
14e80 6f 6c 75 6d 6e 20 69 6e 73 65 72 74 65 64 2e 20  olumn inserted. 
14e90 20 70 54 6f 20 69 73 20 74 68 65 20 6e 61 6d 65   pTo is the name
14ea0 20 6f 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   of.** the table
14eb0 20 72 65 66 65 72 72 65 64 20 74 6f 20 28 61 2e   referred to (a.
14ec0 6b 2e 61 20 74 68 65 20 22 70 61 72 65 6e 74 22  k.a the "parent"
14ed0 20 74 61 62 6c 65 29 2e 20 20 70 54 6f 43 6f 6c   table).  pToCol
14ee0 20 69 73 20 61 20 6c 69 73 74 0a 2a 2a 20 6f 66   is a list.** of
14ef0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
14f00 61 72 65 6e 74 20 70 54 6f 20 74 61 62 6c 65 2e  arent pTo table.
14f10 20 20 66 6c 61 67 73 20 63 6f 6e 74 61 69 6e 73    flags contains
14f20 20 61 6c 6c 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74   all.** informat
14f30 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ion about the co
14f40 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75 74 69 6f  nflict resolutio
14f50 6e 20 61 6c 67 6f 72 69 74 68 6d 73 20 73 70 65  n algorithms spe
14f60 63 69 66 69 65 64 0a 2a 2a 20 69 6e 20 74 68 65  cified.** in the
14f70 20 4f 4e 20 44 45 4c 45 54 45 2c 20 4f 4e 20 55   ON DELETE, ON U
14f80 50 44 41 54 45 20 61 6e 64 20 4f 4e 20 49 4e 53  PDATE and ON INS
14f90 45 52 54 20 63 6c 61 75 73 65 73 2e 0a 2a 2a 0a  ERT clauses..**.
14fa0 2a 2a 20 41 6e 20 46 4b 65 79 20 73 74 72 75 63  ** An FKey struc
14fb0 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
14fc0 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65  and added to the
14fd0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
14fe0 0a 2a 2a 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  .** under constr
14ff0 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 50  uction in the pP
15000 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
15010 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  field..**.** The
15020 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 73 20   foreign key is 
15030 73 65 74 20 66 6f 72 20 49 4d 4d 45 44 49 41 54  set for IMMEDIAT
15040 45 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 20 41  E processing.  A
15050 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
15060 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 44 65  .** to sqlite3De
15070 66 65 72 46 6f 72 65 69 67 6e 4b 65 79 28 29 20  ferForeignKey() 
15080 6d 69 67 68 74 20 63 68 61 6e 67 65 20 74 68 69  might change thi
15090 73 20 74 6f 20 44 45 46 45 52 52 45 44 2e 0a 2a  s to DEFERRED..*
150a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 72  /.void sqlite3Cr
150b0 65 61 74 65 46 6f 72 65 69 67 6e 4b 65 79 28 0a  eateForeignKey(.
150c0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
150d0 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
150e0 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
150f0 78 70 72 4c 69 73 74 20 2a 70 46 72 6f 6d 43 6f  xprList *pFromCo
15100 6c 2c 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73 20 69  l,  /* Columns i
15110 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
15120 74 20 70 6f 69 6e 74 20 74 6f 20 6f 74 68 65 72  t point to other
15130 20 74 61 62 6c 65 20 2a 2f 0a 20 20 54 6f 6b 65   table */.  Toke
15140 6e 20 2a 70 54 6f 2c 20 20 20 20 20 20 20 20 20  n *pTo,         
15150 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
15160 6f 74 68 65 72 20 74 61 62 6c 65 20 2a 2f 0a 20  other table */. 
15170 20 45 78 70 72 4c 69 73 74 20 2a 70 54 6f 43 6f   ExprList *pToCo
15180 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 73  l,    /* Columns
15190 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 74 61   in the other ta
151a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ble */.  int fla
151b0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
151c0 20 43 6f 6e 66 6c 69 63 74 20 72 65 73 6f 6c 75   Conflict resolu
151d0 74 69 6f 6e 20 61 6c 67 6f 72 69 74 68 6d 73 2e  tion algorithms.
151e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
151f0 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
15200 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  b;.#ifndef SQLIT
15210 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
15220 45 59 0a 20 20 46 4b 65 79 20 2a 70 46 4b 65 79  EY.  FKey *pFKey
15230 20 3d 20 30 3b 0a 20 20 46 4b 65 79 20 2a 70 4e   = 0;.  FKey *pN
15240 65 78 74 54 6f 3b 0a 20 20 54 61 62 6c 65 20 2a  extTo;.  Table *
15250 70 20 3d 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  p = pParse->pNew
15260 54 61 62 6c 65 3b 0a 20 20 69 6e 74 20 6e 42 79  Table;.  int nBy
15270 74 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  te;.  int i;.  i
15280 6e 74 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20  nt nCol;.  char 
15290 2a 7a 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  *z;..  assert( p
152a0 54 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  To!=0 );.  if( p
152b0 3d 3d 30 20 7c 7c 20 49 4e 5f 44 45 43 4c 41 52  ==0 || IN_DECLAR
152c0 45 5f 56 54 41 42 20 29 20 67 6f 74 6f 20 66 6b  E_VTAB ) goto fk
152d0 5f 65 6e 64 3b 0a 20 20 69 66 28 20 70 46 72 6f  _end;.  if( pFro
152e0 6d 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  mCol==0 ){.    i
152f0 6e 74 20 69 43 6f 6c 20 3d 20 70 2d 3e 6e 43 6f  nt iCol = p->nCo
15300 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 4e 45 56  l-1;.    if( NEV
15310 45 52 28 69 43 6f 6c 3c 30 29 20 29 20 67 6f 74  ER(iCol<0) ) got
15320 6f 20 66 6b 5f 65 6e 64 3b 0a 20 20 20 20 69 66  o fk_end;.    if
15330 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f 43  ( pToCol && pToC
15340 6f 6c 2d 3e 6e 45 78 70 72 21 3d 31 20 29 7b 0a  ol->nExpr!=1 ){.
15350 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
15360 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 66  orMsg(pParse, "f
15370 6f 72 65 69 67 6e 20 6b 65 79 20 6f 6e 20 25 73  oreign key on %s
15380 22 0a 20 20 20 20 20 20 20 20 20 22 20 73 68 6f  ".         " sho
15390 75 6c 64 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  uld reference on
153a0 6c 79 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6f 66  ly one column of
153b0 20 74 61 62 6c 65 20 25 54 22 2c 0a 20 20 20 20   table %T",.    
153c0 20 20 20 20 20 70 2d 3e 61 43 6f 6c 5b 69 43 6f       p->aCol[iCo
153d0 6c 5d 2e 7a 4e 61 6d 65 2c 20 70 54 6f 29 3b 0a  l].zName, pTo);.
153e0 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e        goto fk_en
153f0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f  d;.    }.    nCo
15400 6c 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  l = 1;.  }else i
15410 66 28 20 70 54 6f 43 6f 6c 20 26 26 20 70 54 6f  f( pToCol && pTo
15420 43 6f 6c 2d 3e 6e 45 78 70 72 21 3d 70 46 72 6f  Col->nExpr!=pFro
15430 6d 43 6f 6c 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  mCol->nExpr ){. 
15440 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
15450 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
15460 20 20 20 22 6e 75 6d 62 65 72 20 6f 66 20 63 6f     "number of co
15470 6c 75 6d 6e 73 20 69 6e 20 66 6f 72 65 69 67 6e  lumns in foreign
15480 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
15490 74 63 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  tch the number o
154a0 66 20 22 0a 20 20 20 20 20 20 20 20 22 63 6f 6c  f ".        "col
154b0 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 66 65  umns in the refe
154c0 72 65 6e 63 65 64 20 74 61 62 6c 65 22 29 3b 0a  renced table");.
154d0 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65 6e 64 3b      goto fk_end;
154e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 43  .  }else{.    nC
154f0 6f 6c 20 3d 20 70 46 72 6f 6d 43 6f 6c 2d 3e 6e  ol = pFromCol->n
15500 45 78 70 72 3b 0a 20 20 7d 0a 20 20 6e 42 79 74  Expr;.  }.  nByt
15510 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 46 4b 65  e = sizeof(*pFKe
15520 79 29 20 2b 20 28 6e 43 6f 6c 2d 31 29 2a 73 69  y) + (nCol-1)*si
15530 7a 65 6f 66 28 70 46 4b 65 79 2d 3e 61 43 6f 6c  zeof(pFKey->aCol
15540 5b 30 5d 29 20 2b 20 70 54 6f 2d 3e 6e 20 2b 20  [0]) + pTo->n + 
15550 31 3b 0a 20 20 69 66 28 20 70 54 6f 43 6f 6c 20  1;.  if( pToCol 
15560 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
15570 69 3c 70 54 6f 43 6f 6c 2d 3e 6e 45 78 70 72 3b  i<pToCol->nExpr;
15580 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 42 79   i++){.      nBy
15590 74 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  te += sqlite3Str
155a0 6c 65 6e 33 30 28 70 54 6f 43 6f 6c 2d 3e 61 5b  len30(pToCol->a[
155b0 69 5d 2e 7a 4e 61 6d 65 29 20 2b 20 31 3b 0a 20  i].zName) + 1;. 
155c0 20 20 20 7d 0a 20 20 7d 0a 20 20 70 46 4b 65 79     }.  }.  pFKey
155d0 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
155e0 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
155f0 20 29 3b 0a 20 20 69 66 28 20 70 46 4b 65 79 3d   );.  if( pFKey=
15600 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66  =0 ){.    goto f
15610 6b 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 70 46 4b  k_end;.  }.  pFK
15620 65 79 2d 3e 70 46 72 6f 6d 20 3d 20 70 3b 0a 20  ey->pFrom = p;. 
15630 20 70 46 4b 65 79 2d 3e 70 4e 65 78 74 46 72 6f   pFKey->pNextFro
15640 6d 20 3d 20 70 2d 3e 70 46 4b 65 79 3b 0a 20 20  m = p->pFKey;.  
15650 7a 20 3d 20 28 63 68 61 72 2a 29 26 70 46 4b 65  z = (char*)&pFKe
15660 79 2d 3e 61 43 6f 6c 5b 6e 43 6f 6c 5d 3b 0a 20  y->aCol[nCol];. 
15670 20 70 46 4b 65 79 2d 3e 7a 54 6f 20 3d 20 7a 3b   pFKey->zTo = z;
15680 0a 20 20 6d 65 6d 63 70 79 28 7a 2c 20 70 54 6f  .  memcpy(z, pTo
15690 2d 3e 7a 2c 20 70 54 6f 2d 3e 6e 29 3b 0a 20 20  ->z, pTo->n);.  
156a0 7a 5b 70 54 6f 2d 3e 6e 5d 20 3d 20 30 3b 0a 20  z[pTo->n] = 0;. 
156b0 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28   sqlite3Dequote(
156c0 7a 29 3b 0a 20 20 7a 20 2b 3d 20 70 54 6f 2d 3e  z);.  z += pTo->
156d0 6e 2b 31 3b 0a 20 20 70 46 4b 65 79 2d 3e 6e 43  n+1;.  pFKey->nC
156e0 6f 6c 20 3d 20 6e 43 6f 6c 3b 0a 20 20 69 66 28  ol = nCol;.  if(
156f0 20 70 46 72 6f 6d 43 6f 6c 3d 3d 30 20 29 7b 0a   pFromCol==0 ){.
15700 20 20 20 20 70 46 4b 65 79 2d 3e 61 43 6f 6c 5b      pFKey->aCol[
15710 30 5d 2e 69 46 72 6f 6d 20 3d 20 70 2d 3e 6e 43  0].iFrom = p->nC
15720 6f 6c 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ol-1;.  }else{. 
15730 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
15740 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
15750 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
15760 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 43 6f 6c 3b  (j=0; j<p->nCol;
15770 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
15780 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
15790 70 28 70 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  p(p->aCol[j].zNa
157a0 6d 65 2c 20 70 46 72 6f 6d 43 6f 6c 2d 3e 61 5b  me, pFromCol->a[
157b0 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
157c0 20 20 20 20 20 20 20 20 20 20 70 46 4b 65 79 2d            pFKey-
157d0 3e 61 43 6f 6c 5b 69 5d 2e 69 46 72 6f 6d 20 3d  >aCol[i].iFrom =
157e0 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   j;.          br
157f0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
15800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15810 20 6a 3e 3d 70 2d 3e 6e 43 6f 6c 20 29 7b 0a 20   j>=p->nCol ){. 
15820 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
15830 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
15840 20 20 20 20 20 20 20 20 20 20 22 75 6e 6b 6e 6f            "unkno
15850 77 6e 20 63 6f 6c 75 6d 6e 20 5c 22 25 73 5c 22  wn column \"%s\"
15860 20 69 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20   in foreign key 
15870 64 65 66 69 6e 69 74 69 6f 6e 22 2c 20 0a 20 20  definition", .  
15880 20 20 20 20 20 20 20 20 70 46 72 6f 6d 43 6f 6c          pFromCol
15890 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20  ->a[i].zName);. 
158a0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65         goto fk_e
158b0 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  nd;.      }.    
158c0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 6f 43  }.  }.  if( pToC
158d0 6f 6c 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ol ){.    for(i=
158e0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
158f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
15900 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
15910 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d  ToCol->a[i].zNam
15920 65 29 3b 0a 20 20 20 20 20 20 70 46 4b 65 79 2d  e);.      pFKey-
15930 3e 61 43 6f 6c 5b 69 5d 2e 7a 43 6f 6c 20 3d 20  >aCol[i].zCol = 
15940 7a 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  z;.      memcpy(
15950 7a 2c 20 70 54 6f 43 6f 6c 2d 3e 61 5b 69 5d 2e  z, pToCol->a[i].
15960 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
15970 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[n] = 0;.     
15980 20 7a 20 2b 3d 20 6e 2b 31 3b 0a 20 20 20 20 7d   z += n+1;.    }
15990 0a 20 20 7d 0a 20 20 70 46 4b 65 79 2d 3e 69 73  .  }.  pFKey->is
159a0 44 65 66 65 72 72 65 64 20 3d 20 30 3b 0a 20 20  Deferred = 0;.  
159b0 70 46 4b 65 79 2d 3e 61 41 63 74 69 6f 6e 5b 30  pFKey->aAction[0
159c0 5d 20 3d 20 28 75 38 29 28 66 6c 61 67 73 20 26  ] = (u8)(flags &
159d0 20 30 78 66 66 29 3b 20 20 20 20 20 20 20 20 20   0xff);         
159e0 20 20 20 2f 2a 20 4f 4e 20 44 45 4c 45 54 45 20     /* ON DELETE 
159f0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 70 46 4b 65  action */.  pFKe
15a00 79 2d 3e 61 41 63 74 69 6f 6e 5b 31 5d 20 3d 20  y->aAction[1] = 
15a10 28 75 38 29 28 28 66 6c 61 67 73 20 3e 3e 20 38  (u8)((flags >> 8
15a20 20 29 20 26 20 30 78 66 66 29 3b 20 20 20 20 2f   ) & 0xff);    /
15a30 2a 20 4f 4e 20 55 50 44 41 54 45 20 61 63 74 69  * ON UPDATE acti
15a40 6f 6e 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  on */..  assert(
15a50 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75   sqlite3SchemaMu
15a60 74 65 78 48 65 6c 64 28 64 62 2c 20 30 2c 20 70  texHeld(db, 0, p
15a70 2d 3e 70 53 63 68 65 6d 61 29 20 29 3b 0a 20 20  ->pSchema) );.  
15a80 70 4e 65 78 74 54 6f 20 3d 20 28 46 4b 65 79 20  pNextTo = (FKey 
15a90 2a 29 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73  *)sqlite3HashIns
15aa0 65 72 74 28 26 70 2d 3e 70 53 63 68 65 6d 61 2d  ert(&p->pSchema-
15ab0 3e 66 6b 65 79 48 61 73 68 2c 20 0a 20 20 20 20  >fkeyHash, .    
15ac0 20 20 70 46 4b 65 79 2d 3e 7a 54 6f 2c 20 28 76    pFKey->zTo, (v
15ad0 6f 69 64 20 2a 29 70 46 4b 65 79 0a 20 20 29 3b  oid *)pFKey.  );
15ae0 0a 20 20 69 66 28 20 70 4e 65 78 74 54 6f 3d 3d  .  if( pNextTo==
15af0 70 46 4b 65 79 20 29 7b 0a 20 20 20 20 64 62 2d  pFKey ){.    db-
15b00 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
15b10 31 3b 0a 20 20 20 20 67 6f 74 6f 20 66 6b 5f 65  1;.    goto fk_e
15b20 6e 64 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e  nd;.  }.  if( pN
15b30 65 78 74 54 6f 20 29 7b 0a 20 20 20 20 61 73 73  extTo ){.    ass
15b40 65 72 74 28 20 70 4e 65 78 74 54 6f 2d 3e 70 50  ert( pNextTo->pP
15b50 72 65 76 54 6f 3d 3d 30 20 29 3b 0a 20 20 20 20  revTo==0 );.    
15b60 70 46 4b 65 79 2d 3e 70 4e 65 78 74 54 6f 20 3d  pFKey->pNextTo =
15b70 20 70 4e 65 78 74 54 6f 3b 0a 20 20 20 20 70 4e   pNextTo;.    pN
15b80 65 78 74 54 6f 2d 3e 70 50 72 65 76 54 6f 20 3d  extTo->pPrevTo =
15b90 20 70 46 4b 65 79 3b 0a 20 20 7d 0a 0a 20 20 2f   pFKey;.  }..  /
15ba0 2a 20 4c 69 6e 6b 20 74 68 65 20 66 6f 72 65 69  * Link the forei
15bb0 67 6e 20 6b 65 79 20 74 6f 20 74 68 65 20 74 61  gn key to the ta
15bc0 62 6c 65 20 61 73 20 74 68 65 20 6c 61 73 74 20  ble as the last 
15bd0 73 74 65 70 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  step..  */.  p->
15be0 70 46 4b 65 79 20 3d 20 70 46 4b 65 79 3b 0a 20  pFKey = pFKey;. 
15bf0 20 70 46 4b 65 79 20 3d 20 30 3b 0a 0a 66 6b 5f   pFKey = 0;..fk_
15c00 65 6e 64 3a 0a 20 20 73 71 6c 69 74 65 33 44 62  end:.  sqlite3Db
15c10 46 72 65 65 28 64 62 2c 20 70 46 4b 65 79 29 3b  Free(db, pFKey);
15c20 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
15c30 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
15c40 46 4f 52 45 49 47 4e 5f 4b 45 59 29 20 2a 2f 0a  FOREIGN_KEY) */.
15c50 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
15c60 74 44 65 6c 65 74 65 28 64 62 2c 20 70 46 72 6f  tDelete(db, pFro
15c70 6d 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  mCol);.  sqlite3
15c80 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64  ExprListDelete(d
15c90 62 2c 20 70 54 6f 43 6f 6c 29 3b 0a 7d 0a 0a 2f  b, pToCol);.}../
15ca0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
15cb0 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  e is called when
15cc0 20 61 6e 20 49 4e 49 54 49 41 4c 4c 59 20 49 4d   an INITIALLY IM
15cd0 4d 45 44 49 41 54 45 20 6f 72 20 49 4e 49 54 49  MEDIATE or INITI
15ce0 41 4c 4c 59 20 44 45 46 45 52 52 45 44 0a 2a 2a  ALLY DEFERRED.**
15cf0 20 63 6c 61 75 73 65 20 69 73 20 73 65 65 6e 20   clause is seen 
15d00 61 73 20 70 61 72 74 20 6f 66 20 61 20 66 6f 72  as part of a for
15d10 65 69 67 6e 20 6b 65 79 20 64 65 66 69 6e 69 74  eign key definit
15d20 69 6f 6e 2e 20 20 54 68 65 20 69 73 44 65 66 65  ion.  The isDefe
15d30 72 72 65 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65  rred.** paramete
15d40 72 20 69 73 20 31 20 66 6f 72 20 49 4e 49 54 49  r is 1 for INITI
15d50 41 4c 4c 59 20 44 45 46 45 52 52 45 44 20 61 6e  ALLY DEFERRED an
15d60 64 20 30 20 66 6f 72 20 49 4e 49 54 49 41 4c 4c  d 0 for INITIALL
15d70 59 20 49 4d 4d 45 44 49 41 54 45 2e 0a 2a 2a 20  Y IMMEDIATE..** 
15d80 54 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  The behavior of 
15d90 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
15da0 79 20 63 72 65 61 74 65 64 20 66 6f 72 65 69 67  y created foreig
15db0 6e 20 6b 65 79 20 69 73 20 61 64 6a 75 73 74 65  n key is adjuste
15dc0 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  d.** accordingly
15dd0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15de0 33 44 65 66 65 72 46 6f 72 65 69 67 6e 4b 65 79  3DeferForeignKey
15df0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
15e00 69 6e 74 20 69 73 44 65 66 65 72 72 65 64 29 7b  int isDeferred){
15e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15e20 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
15e30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 0a  .  Table *pTab;.
15e40 20 20 46 4b 65 79 20 2a 70 46 4b 65 79 3b 0a 20    FKey *pFKey;. 
15e50 20 69 66 28 20 28 70 54 61 62 20 3d 20 70 50 61   if( (pTab = pPa
15e60 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 29 3d  rse->pNewTable)=
15e70 3d 30 20 7c 7c 20 28 70 46 4b 65 79 20 3d 20 70  =0 || (pFKey = p
15e80 54 61 62 2d 3e 70 46 4b 65 79 29 3d 3d 30 20 29  Tab->pFKey)==0 )
15e90 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
15ea0 74 28 20 69 73 44 65 66 65 72 72 65 64 3d 3d 30  t( isDeferred==0
15eb0 20 7c 7c 20 69 73 44 65 66 65 72 72 65 64 3d 3d   || isDeferred==
15ec0 31 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  1 ); /* EV: R-30
15ed0 33 32 33 2d 32 31 39 31 37 20 2a 2f 0a 20 20 70  323-21917 */.  p
15ee0 46 4b 65 79 2d 3e 69 73 44 65 66 65 72 72 65 64  FKey->isDeferred
15ef0 20 3d 20 28 75 38 29 69 73 44 65 66 65 72 72 65   = (u8)isDeferre
15f00 64 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  d;.#endif.}../*.
15f10 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
15f20 20 74 68 61 74 20 77 69 6c 6c 20 65 72 61 73 65   that will erase
15f30 20 61 6e 64 20 72 65 66 69 6c 6c 20 69 6e 64 65   and refill inde
15f40 78 20 2a 70 49 64 78 2e 20 20 54 68 69 73 20 69  x *pIdx.  This i
15f50 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 69 6e 69  s.** used to ini
15f60 74 69 61 6c 69 7a 65 20 61 20 6e 65 77 6c 79 20  tialize a newly 
15f70 63 72 65 61 74 65 64 20 69 6e 64 65 78 20 6f 72  created index or
15f80 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
15f90 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f 66 20  e.** content of 
15fa0 61 6e 20 69 6e 64 65 78 20 69 6e 20 72 65 73 70  an index in resp
15fb0 6f 6e 73 65 20 74 6f 20 61 20 52 45 49 4e 44 45  onse to a REINDE
15fc0 58 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a  X command..**.**
15fd0 20 69 66 20 6d 65 6d 52 6f 6f 74 50 61 67 65 20   if memRootPage 
15fe0 69 73 20 6e 6f 74 20 6e 65 67 61 74 69 76 65 2c  is not negative,
15ff0 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
16000 68 65 20 69 6e 64 65 78 20 69 73 20 6e 65 77 6c  he index is newl
16010 79 0a 2a 2a 20 63 72 65 61 74 65 64 2e 20 20 54  y.** created.  T
16020 68 65 20 72 65 67 69 73 74 65 72 20 73 70 65 63  he register spec
16030 69 66 69 65 64 20 62 79 20 6d 65 6d 52 6f 6f 74  ified by memRoot
16040 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  Page contains th
16050 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6e  e.** root page n
16060 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69 6e 64  umber of the ind
16070 65 78 2e 20 20 49 66 20 6d 65 6d 52 6f 6f 74 50  ex.  If memRootP
16080 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
16090 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 69 6e 64   then.** the ind
160a0 65 78 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ex already exist
160b0 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20 63 6c  s and must be cl
160c0 65 61 72 65 64 20 62 65 66 6f 72 65 20 62 65 69  eared before bei
160d0 6e 67 20 72 65 66 69 6c 6c 65 64 20 61 6e 64 0a  ng refilled and.
160e0 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
160f0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 69   number of the i
16100 6e 64 65 78 20 69 73 20 74 61 6b 65 6e 20 66 72  ndex is taken fr
16110 6f 6d 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d 2e  om pIndex->tnum.
16120 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16130 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e 64  sqlite3RefillInd
16140 65 78 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ex(Parse *pParse
16150 2c 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 2c  , Index *pIndex,
16160 20 69 6e 74 20 6d 65 6d 52 6f 6f 74 50 61 67 65   int memRootPage
16170 29 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  ){.  Table *pTab
16180 20 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c   = pIndex->pTabl
16190 65 3b 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  e;  /* The table
161a0 20 74 68 61 74 20 69 73 20 69 6e 64 65 78 65 64   that is indexed
161b0 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 20 3d   */.  int iTab =
161c0 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
161d0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 63 75       /* Btree cu
161e0 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20 70 54  rsor used for pT
161f0 61 62 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ab */.  int iIdx
16200 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
16210 2b 3b 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20  +;     /* Btree 
16220 63 75 72 73 6f 72 20 75 73 65 64 20 66 6f 72 20  cursor used for 
16230 70 49 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20  pIndex */.  int 
16240 69 53 6f 72 74 65 72 3b 20 20 20 20 20 20 20 20  iSorter;        
16250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
16260 72 73 6f 72 20 6f 70 65 6e 65 64 20 62 79 20 4f  rsor opened by O
16270 70 65 6e 53 6f 72 74 65 72 20 28 69 66 20 69 6e  penSorter (if in
16280 20 75 73 65 29 20 2a 2f 0a 20 20 69 6e 74 20 61   use) */.  int a
16290 64 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  ddr1;           
162a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
162b0 72 65 73 73 20 6f 66 20 74 6f 70 20 6f 66 20 6c  ress of top of l
162c0 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64  oop */.  int add
162d0 72 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  r2;             
162e0 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
162f0 73 73 20 74 6f 20 6a 75 6d 70 20 74 6f 20 66 6f  ss to jump to fo
16300 72 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  r next iteration
16310 20 2a 2f 0a 20 20 69 6e 74 20 74 6e 75 6d 3b 20   */.  int tnum; 
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
16340 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
16350 69 6e 74 20 69 50 61 72 74 49 64 78 4c 61 62 65  int iPartIdxLabe
16360 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
16370 2a 20 4a 75 6d 70 20 74 6f 20 74 68 69 73 20 6c  * Jump to this l
16380 61 62 65 6c 20 74 6f 20 73 6b 69 70 20 61 20 72  abel to skip a r
16390 6f 77 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b  ow */.  Vdbe *v;
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61         /* Genera
163c0 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 69  te code into thi
163d0 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
163e0 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
163f0 70 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  pKey;           
16400 20 20 20 20 20 20 2f 2a 20 4b 65 79 49 6e 66 6f        /* KeyInfo
16410 20 66 6f 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20   for index */.  
16420 69 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20  int regRecord;  
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16440 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
16450 6e 67 20 61 73 73 65 6d 62 6c 65 64 20 69 6e 64  ng assembled ind
16460 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
16470 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
16480 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 2f 2a  rse->db;      /*
16490 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
164a0 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
164b0 74 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53  t iDb = sqlite3S
164c0 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c  chemaToIndex(db,
164d0 20 70 49 6e 64 65 78 2d 3e 70 53 63 68 65 6d 61   pIndex->pSchema
164e0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
164f0 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a  TE_OMIT_AUTHORIZ
16500 41 54 49 4f 4e 0a 20 20 69 66 28 20 73 71 6c 69  ATION.  if( sqli
16510 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50 61  te3AuthCheck(pPa
16520 72 73 65 2c 20 53 51 4c 49 54 45 5f 52 45 49 4e  rse, SQLITE_REIN
16530 44 45 58 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61  DEX, pIndex->zNa
16540 6d 65 2c 20 30 2c 0a 20 20 20 20 20 20 64 62 2d  me, 0,.      db-
16550 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 20  >aDb[iDb].zName 
16560 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
16570 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
16580 2a 20 52 65 71 75 69 72 65 20 61 20 77 72 69 74  * Require a writ
16590 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  e-lock on the ta
165a0 62 6c 65 20 74 6f 20 70 65 72 66 6f 72 6d 20 74  ble to perform t
165b0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f  his operation */
165c0 0a 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c  .  sqlite3TableL
165d0 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c  ock(pParse, iDb,
165e0 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 31 2c 20   pTab->tnum, 1, 
165f0 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 0a 20  pTab->zName);.. 
16600 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
16610 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
16620 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
16630 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f 6f 74 50  ;.  if( memRootP
16640 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 74 6e  age>=0 ){.    tn
16650 75 6d 20 3d 20 6d 65 6d 52 6f 6f 74 50 61 67 65  um = memRootPage
16660 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
16670 6e 75 6d 20 3d 20 70 49 6e 64 65 78 2d 3e 74 6e  num = pIndex->tn
16680 75 6d 3b 0a 20 20 7d 0a 20 20 70 4b 65 79 20 3d  um;.  }.  pKey =
16690 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f   sqlite3KeyInfoO
166a0 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  fIndex(pParse, p
166b0 49 6e 64 65 78 29 3b 0a 0a 20 20 2f 2a 20 4f 70  Index);..  /* Op
166c0 65 6e 20 74 68 65 20 73 6f 72 74 65 72 20 63 75  en the sorter cu
166d0 72 73 6f 72 20 69 66 20 77 65 20 61 72 65 20 74  rsor if we are t
166e0 6f 20 75 73 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20  o use one. */.  
166f0 69 53 6f 72 74 65 72 20 3d 20 70 50 61 72 73 65  iSorter = pParse
16700 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 73 71 6c 69  ->nTab++;.  sqli
16710 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
16720 20 4f 50 5f 53 6f 72 74 65 72 4f 70 65 6e 2c 20   OP_SorterOpen, 
16730 69 53 6f 72 74 65 72 2c 20 30 2c 20 70 49 6e 64  iSorter, 0, pInd
16740 65 78 2d 3e 6e 4b 65 79 43 6f 6c 2c 20 28 63 68  ex->nKeyCol, (ch
16750 61 72 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20  ar*).           
16760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
16770 4b 65 79 49 6e 66 6f 52 65 66 28 70 4b 65 79 29  KeyInfoRef(pKey)
16780 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a  , P4_KEYINFO);..
16790 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 74 61    /* Open the ta
167a0 62 6c 65 2e 20 4c 6f 6f 70 20 74 68 72 6f 75 67  ble. Loop throug
167b0 68 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20 74 68  h all rows of th
167c0 65 20 74 61 62 6c 65 2c 20 69 6e 73 65 72 74 69  e table, inserti
167d0 6e 67 20 69 6e 64 65 78 0a 20 20 2a 2a 20 72 65  ng index.  ** re
167e0 63 6f 72 64 73 20 69 6e 74 6f 20 74 68 65 20 73  cords into the s
167f0 6f 72 74 65 72 2e 20 2a 2f 0a 20 20 73 71 6c 69  orter. */.  sqli
16800 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61  te3OpenTable(pPa
16810 72 73 65 2c 20 69 54 61 62 2c 20 69 44 62 2c 20  rse, iTab, iDb, 
16820 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
16830 64 29 3b 0a 20 20 61 64 64 72 31 20 3d 20 73 71  d);.  addr1 = sq
16840 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
16850 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
16860 61 62 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65  ab, 0); VdbeCove
16870 72 61 67 65 28 76 29 3b 0a 20 20 72 65 67 52 65  rage(v);.  regRe
16880 63 6f 72 64 20 3d 20 73 71 6c 69 74 65 33 47 65  cord = sqlite3Ge
16890 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
168a0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 47 65 6e 65  ;..  sqlite3Gene
168b0 72 61 74 65 49 6e 64 65 78 4b 65 79 28 70 50 61  rateIndexKey(pPa
168c0 72 73 65 2c 70 49 6e 64 65 78 2c 69 54 61 62 2c  rse,pIndex,iTab,
168d0 72 65 67 52 65 63 6f 72 64 2c 30 2c 26 69 50 61  regRecord,0,&iPa
168e0 72 74 49 64 78 4c 61 62 65 6c 2c 30 2c 30 29 3b  rtIdxLabel,0,0);
168f0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
16900 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72 74 65  dOp2(v, OP_Sorte
16910 72 49 6e 73 65 72 74 2c 20 69 53 6f 72 74 65 72  rInsert, iSorter
16920 2c 20 72 65 67 52 65 63 6f 72 64 29 3b 0a 20 20  , regRecord);.  
16930 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 50 61  sqlite3ResolvePa
16940 72 74 49 64 78 4c 61 62 65 6c 28 70 50 61 72 73  rtIdxLabel(pPars
16950 65 2c 20 69 50 61 72 74 49 64 78 4c 61 62 65 6c  e, iPartIdxLabel
16960 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16970 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78  AddOp2(v, OP_Nex
16980 74 2c 20 69 54 61 62 2c 20 61 64 64 72 31 2b 31  t, iTab, addr1+1
16990 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28  ); VdbeCoverage(
169a0 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  v);.  sqlite3Vdb
169b0 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
169c0 72 31 29 3b 0a 20 20 69 66 28 20 6d 65 6d 52 6f  r1);.  if( memRo
169d0 6f 74 50 61 67 65 3c 30 20 29 20 73 71 6c 69 74  otPage<0 ) sqlit
169e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
169f0 4f 50 5f 43 6c 65 61 72 2c 20 74 6e 75 6d 2c 20  OP_Clear, tnum, 
16a00 69 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  iDb);.  sqlite3V
16a10 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f  dbeAddOp4(v, OP_
16a20 4f 70 65 6e 57 72 69 74 65 2c 20 69 49 64 78 2c  OpenWrite, iIdx,
16a30 20 74 6e 75 6d 2c 20 69 44 62 2c 20 0a 20 20 20   tnum, iDb, .   
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 20 28 63 68 61 72 20 2a 29 70 4b 65 79 2c 20 50   (char *)pKey, P
16a60 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 73 71  4_KEYINFO);.  sq
16a70 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16a80 35 28 76 2c 20 4f 50 46 4c 41 47 5f 42 55 4c 4b  5(v, OPFLAG_BULK
16a90 43 53 52 7c 28 28 6d 65 6d 52 6f 6f 74 50 61 67  CSR|((memRootPag
16aa0 65 3e 3d 30 29 3f 4f 50 46 4c 41 47 5f 50 32 49  e>=0)?OPFLAG_P2I
16ab0 53 52 45 47 3a 30 29 29 3b 0a 0a 20 20 61 64 64  SREG:0));..  add
16ac0 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  r1 = sqlite3Vdbe
16ad0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 6f 72  AddOp2(v, OP_Sor
16ae0 74 65 72 53 6f 72 74 2c 20 69 53 6f 72 74 65 72  terSort, iSorter
16af0 2c 20 30 29 3b 20 56 64 62 65 43 6f 76 65 72 61  , 0); VdbeCovera
16b00 67 65 28 76 29 3b 0a 20 20 61 73 73 65 72 74 28  ge(v);.  assert(
16b10 20 70 4b 65 79 21 3d 30 20 7c 7c 20 64 62 2d 3e   pKey!=0 || db->
16b20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
16b30 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 29 3b 0a  pParse->nErr );.
16b40 20 20 69 66 28 20 49 73 55 6e 69 71 75 65 49 6e    if( IsUniqueIn
16b50 64 65 78 28 70 49 6e 64 65 78 29 20 26 26 20 70  dex(pIndex) && p
16b60 4b 65 79 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  Key!=0 ){.    in
16b70 74 20 6a 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t j2 = sqlite3Vd
16b80 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16b90 20 2b 20 33 3b 0a 20 20 20 20 73 71 6c 69 74 65   + 3;.    sqlite
16ba0 33 56 64 62 65 47 6f 74 6f 28 76 2c 20 6a 32 29  3VdbeGoto(v, j2)
16bb0 3b 0a 20 20 20 20 61 64 64 72 32 20 3d 20 73 71  ;.    addr2 = sq
16bc0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
16bd0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
16be0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
16bf0 74 28 76 2c 20 4f 50 5f 53 6f 72 74 65 72 43 6f  t(v, OP_SorterCo
16c00 6d 70 61 72 65 2c 20 69 53 6f 72 74 65 72 2c 20  mpare, iSorter, 
16c10 6a 32 2c 20 72 65 67 52 65 63 6f 72 64 2c 0a 20  j2, regRecord,. 
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c30 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
16c40 6e 4b 65 79 43 6f 6c 29 3b 20 56 64 62 65 43 6f  nKeyCol); VdbeCo
16c50 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 73  verage(v);.    s
16c60 71 6c 69 74 65 33 55 6e 69 71 75 65 43 6f 6e 73  qlite3UniqueCons
16c70 74 72 61 69 6e 74 28 70 50 61 72 73 65 2c 20 4f  traint(pParse, O
16c80 45 5f 41 62 6f 72 74 2c 20 70 49 6e 64 65 78 29  E_Abort, pIndex)
16c90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
16ca0 64 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ddr2 = sqlite3Vd
16cb0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
16cc0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
16cd0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16ce0 53 6f 72 74 65 72 44 61 74 61 2c 20 69 53 6f 72  SorterData, iSor
16cf0 74 65 72 2c 20 72 65 67 52 65 63 6f 72 64 2c 20  ter, regRecord, 
16d00 69 49 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  iIdx);.  sqlite3
16d10 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
16d20 5f 4c 61 73 74 2c 20 69 49 64 78 2c 20 30 2c 20  _Last, iIdx, 0, 
16d30 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  -1);.  sqlite3Vd
16d40 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49  beAddOp3(v, OP_I
16d50 64 78 49 6e 73 65 72 74 2c 20 69 49 64 78 2c 20  dxInsert, iIdx, 
16d60 72 65 67 52 65 63 6f 72 64 2c 20 30 29 3b 0a 20  regRecord, 0);. 
16d70 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
16d80 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47 5f 55  geP5(v, OPFLAG_U
16d90 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b 0a 20  SESEEKRESULT);. 
16da0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
16db0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
16dc0 65 67 52 65 63 6f 72 64 29 3b 0a 20 20 73 71 6c  egRecord);.  sql
16dd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
16de0 2c 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 2c  , OP_SorterNext,
16df0 20 69 53 6f 72 74 65 72 2c 20 61 64 64 72 32 29   iSorter, addr2)
16e00 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
16e10 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16e20 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16e30 31 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 56 64  1);..  sqlite3Vd
16e40 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
16e50 6c 6f 73 65 2c 20 69 54 61 62 29 3b 0a 20 20 73  lose, iTab);.  s
16e60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
16e70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 69 49  (v, OP_Close, iI
16e80 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx);.  sqlite3Vd
16e90 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
16ea0 6c 6f 73 65 2c 20 69 53 6f 72 74 65 72 29 3b 0a  lose, iSorter);.
16eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
16ec0 65 20 68 65 61 70 20 73 70 61 63 65 20 74 6f 20  e heap space to 
16ed0 68 6f 6c 64 20 61 6e 20 49 6e 64 65 78 20 6f 62  hold an Index ob
16ee0 6a 65 63 74 20 77 69 74 68 20 6e 43 6f 6c 20 63  ject with nCol c
16ef0 6f 6c 75 6d 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e  olumns..**.** In
16f00 63 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63  crease the alloc
16f10 61 74 69 6f 6e 20 73 69 7a 65 20 74 6f 20 70 72  ation size to pr
16f20 6f 76 69 64 65 20 61 6e 20 65 78 74 72 61 20 6e  ovide an extra n
16f30 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 6f  Extra bytes.** o
16f40 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  f 8-byte aligned
16f50 20 73 70 61 63 65 20 61 66 74 65 72 20 74 68 65   space after the
16f60 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 61 6e   Index object an
16f70 64 20 72 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f  d return a.** po
16f80 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 65 78  inter to this ex
16f90 74 72 61 20 73 70 61 63 65 20 69 6e 20 2a 70 70  tra space in *pp
16fa0 45 78 74 72 61 2e 0a 2a 2f 0a 49 6e 64 65 78 20  Extra..*/.Index 
16fb0 2a 73 71 6c 69 74 65 33 41 6c 6c 6f 63 61 74 65  *sqlite3Allocate
16fc0 49 6e 64 65 78 4f 62 6a 65 63 74 28 0a 20 20 73  IndexObject(.  s
16fd0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
16fe0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16ff0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
17000 69 31 36 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  i16 nCol,       
17010 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75       /* Total nu
17020 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
17030 69 6e 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a  in the index */.
17040 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
17050 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17060 20 6f 66 20 62 79 74 65 73 20 6f 66 20 65 78 74   of bytes of ext
17070 72 61 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f  ra space to allo
17080 63 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  c */.  char **pp
17090 45 78 74 72 61 20 20 20 20 20 20 20 2f 2a 20 50  Extra       /* P
170a0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22 65  ointer to the "e
170b0 78 74 72 61 22 20 73 70 61 63 65 20 2a 2f 0a 29  xtra" space */.)
170c0 7b 0a 20 20 49 6e 64 65 78 20 2a 70 3b 20 20 20  {.  Index *p;   
170d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
170e0 63 61 74 65 64 20 69 6e 64 65 78 20 6f 62 6a 65  cated index obje
170f0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ct */.  int nByt
17100 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
17110 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66  Bytes of space f
17120 6f 72 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  or Index object 
17130 2b 20 61 72 72 61 79 73 20 2a 2f 0a 0a 20 20 6e  + arrays */..  n
17140 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
17150 7a 65 6f 66 28 49 6e 64 65 78 29 29 20 2b 20 20  zeof(Index)) +  
17160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17170 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 20  ndex structure  
17180 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 52 4f 55  */.          ROU
17190 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
171a0 29 2a 6e 43 6f 6c 29 20 2b 20 20 20 20 20 20 20  )*nCol) +       
171b0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a 43 6f 6c    /* Index.azCol
171c0 6c 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20  l     */.       
171d0 20 20 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66     ROUND8(sizeof
171e0 28 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31  (LogEst)*(nCol+1
171f0 29 20 2b 20 20 20 20 20 2f 2a 20 49 6e 64 65 78  ) +     /* Index
17200 2e 61 69 52 6f 77 4c 6f 67 45 73 74 20 20 20 2a  .aiRowLogEst   *
17210 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
17220 20 20 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e     sizeof(i16)*n
17230 43 6f 6c 20 2b 20 20 20 20 20 20 20 20 20 20 20  Col +           
17240 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c 75   /* Index.aiColu
17250 6d 6e 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  mn   */.        
17260 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
17270 75 38 29 2a 6e 43 6f 6c 29 3b 20 20 20 20 20 20  u8)*nCol);      
17280 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 2e         /* Index.
17290 61 53 6f 72 74 4f 72 64 65 72 20 2a 2f 0a 20 20  aSortOrder */.  
172a0 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  p = sqlite3DbMal
172b0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74  locZero(db, nByt
172c0 65 20 2b 20 6e 45 78 74 72 61 29 3b 0a 20 20 69  e + nExtra);.  i
172d0 66 28 20 70 20 29 7b 0a 20 20 20 20 63 68 61 72  f( p ){.    char
172e0 20 2a 70 45 78 74 72 61 20 3d 20 28 28 63 68 61   *pExtra = ((cha
172f0 72 2a 29 70 29 2b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)+ROUND8(siz
17300 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
17310 20 70 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 6f   p->azColl = (co
17320 6e 73 74 20 63 68 61 72 2a 2a 29 70 45 78 74 72  nst char**)pExtr
17330 61 3b 20 70 45 78 74 72 61 20 2b 3d 20 52 4f 55  a; pExtra += ROU
17340 4e 44 38 28 73 69 7a 65 6f 66 28 63 68 61 72 2a  ND8(sizeof(char*
17350 29 2a 6e 43 6f 6c 29 3b 0a 20 20 20 20 70 2d 3e  )*nCol);.    p->
17360 61 69 52 6f 77 4c 6f 67 45 73 74 20 3d 20 28 4c  aiRowLogEst = (L
17370 6f 67 45 73 74 2a 29 70 45 78 74 72 61 3b 20 70  ogEst*)pExtra; p
17380 45 78 74 72 61 20 2b 3d 20 73 69 7a 65 6f 66 28  Extra += sizeof(
17390 4c 6f 67 45 73 74 29 2a 28 6e 43 6f 6c 2b 31 29  LogEst)*(nCol+1)
173a0 3b 0a 20 20 20 20 70 2d 3e 61 69 43 6f 6c 75 6d  ;.    p->aiColum
173b0 6e 20 3d 20 28 69 31 36 2a 29 70 45 78 74 72 61  n = (i16*)pExtra
173c0 3b 20 20 20 20 20 20 20 70 45 78 74 72 61 20 2b  ;       pExtra +
173d0 3d 20 73 69 7a 65 6f 66 28 69 31 36 29 2a 6e 43  = sizeof(i16)*nC
173e0 6f 6c 3b 0a 20 20 20 20 70 2d 3e 61 53 6f 72 74  ol;.    p->aSort
173f0 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 70 45 78  Order = (u8*)pEx
17400 74 72 61 3b 0a 20 20 20 20 70 2d 3e 6e 43 6f 6c  tra;.    p->nCol
17410 75 6d 6e 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20  umn = nCol;.    
17420 70 2d 3e 6e 4b 65 79 43 6f 6c 20 3d 20 6e 43 6f  p->nKeyCol = nCo
17430 6c 20 2d 20 31 3b 0a 20 20 20 20 2a 70 70 45 78  l - 1;.    *ppEx
17440 74 72 61 20 3d 20 28 28 63 68 61 72 2a 29 70 29  tra = ((char*)p)
17450 20 2b 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 20 20   + nByte;.  }.  
17460 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
17470 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
17480 69 6e 64 65 78 20 66 6f 72 20 61 6e 20 53 51 4c  index for an SQL
17490 20 74 61 62 6c 65 2e 20 20 70 4e 61 6d 65 31 2e   table.  pName1.
174a0 70 4e 61 6d 65 32 20 69 73 20 74 68 65 20 6e 61  pName2 is the na
174b0 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  me of the index 
174c0 0a 2a 2a 20 61 6e 64 20 70 54 62 6c 4c 69 73 74  .** and pTblList
174d0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
174e0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69  the table that i
174f0 73 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e  s to be indexed.
17500 20 20 42 6f 74 68 20 77 69 6c 6c 20 0a 2a 2a 20    Both will .** 
17510 62 65 20 4e 55 4c 4c 20 66 6f 72 20 61 20 70 72  be NULL for a pr
17520 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 61 6e 20  imary key or an 
17530 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 63 72  index that is cr
17540 65 61 74 65 64 20 74 6f 20 73 61 74 69 73 66 79  eated to satisfy
17550 20 61 0a 2a 2a 20 55 4e 49 51 55 45 20 63 6f 6e   a.** UNIQUE con
17560 73 74 72 61 69 6e 74 2e 20 20 49 66 20 70 54 61  straint.  If pTa
17570 62 6c 65 20 61 6e 64 20 70 49 6e 64 65 78 20 61  ble and pIndex a
17580 72 65 20 4e 55 4c 4c 2c 20 75 73 65 20 70 50 61  re NULL, use pPa
17590 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 0a 2a  rse->pNewTable.*
175a0 2a 20 61 73 20 74 68 65 20 74 61 62 6c 65 20 74  * as the table t
175b0 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20 20 70  o be indexed.  p
175c0 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
175d0 20 69 73 20 61 20 74 61 62 6c 65 20 74 68 61 74   is a table that
175e0 20 69 73 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79   is.** currently
175f0 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75 63 74   being construct
17600 65 64 20 62 79 20 61 20 43 52 45 41 54 45 20 54  ed by a CREATE T
17610 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ABLE statement..
17620 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 69 73 20 61  **.** pList is a
17630 20 6c 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73   list of columns
17640 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
17650 20 70 4c 69 73 74 20 77 69 6c 6c 20 62 65 20 4e   pList will be N
17660 55 4c 4c 20 69 66 20 74 68 69 73 0a 2a 2a 20 69  ULL if this.** i
17670 73 20 61 20 70 72 69 6d 61 72 79 20 6b 65 79 20  s a primary key 
17680 6f 72 20 75 6e 69 71 75 65 2d 63 6f 6e 73 74 72  or unique-constr
17690 61 69 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74  aint on the most
176a0 20 72 65 63 65 6e 74 20 63 6f 6c 75 6d 6e 20 61   recent column a
176b0 64 64 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 74  dded.** to the t
176c0 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 75  able currently u
176d0 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
176e0 6e 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  n.  .**.** If th
176f0 65 20 69 6e 64 65 78 20 69 73 20 63 72 65 61 74  e index is creat
17700 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
17710 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
17720 72 20 74 6f 20 74 68 65 20 6e 65 77 20 49 6e 64  r to the new Ind
17730 65 78 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ex.** structure.
17740 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
17750 20 73 71 6c 69 74 65 33 41 64 64 50 72 69 6d 61   sqlite3AddPrima
17760 72 79 4b 65 79 28 29 20 74 6f 20 6d 61 72 6b 20  ryKey() to mark 
17770 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 61 73 20  the index.** as 
17780 74 68 65 20 74 61 62 6c 65 73 20 70 72 69 6d 61  the tables prima
17790 72 79 20 6b 65 79 20 28 49 6e 64 65 78 2e 69 64  ry key (Index.id
177a0 78 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 44  xType==SQLITE_ID
177b0 58 54 59 50 45 5f 50 52 49 4d 41 52 59 4b 45 59  XTYPE_PRIMARYKEY
177c0 29 0a 2a 2f 0a 49 6e 64 65 78 20 2a 73 71 6c 69  ).*/.Index *sqli
177d0 74 65 33 43 72 65 61 74 65 49 6e 64 65 78 28 0a  te3CreateIndex(.
177e0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
177f0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 69 6e 66 6f       /* All info
17800 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
17810 69 73 20 70 61 72 73 65 20 2a 2f 0a 20 20 54 6f  is parse */.  To
17820 6b 65 6e 20 2a 70 4e 61 6d 65 31 2c 20 20 20 20  ken *pName1,    
17830 20 2f 2a 20 46 69 72 73 74 20 70 61 72 74 20 6f   /* First part o
17840 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20 4d 61  f index name. Ma
17850 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  y be NULL */.  T
17860 6f 6b 65 6e 20 2a 70 4e 61 6d 65 32 2c 20 20 20  oken *pName2,   
17870 20 20 2f 2a 20 53 65 63 6f 6e 64 20 70 61 72 74    /* Second part
17880 20 6f 66 20 69 6e 64 65 78 20 6e 61 6d 65 2e 20   of index name. 
17890 4d 61 79 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  May be NULL */. 
178a0 20 53 72 63 4c 69 73 74 20 2a 70 54 62 6c 4e 61   SrcList *pTblNa
178b0 6d 65 2c 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20  me, /* Table to 
178c0 69 6e 64 65 78 2e 20 55 73 65 20 70 50 61 72 73  index. Use pPars
178d0 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 69 66 20  e->pNewTable if 
178e0 30 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  0 */.  ExprList 
178f0 2a 70 4c 69 73 74 2c 20 20 20 2f 2a 20 41 20 6c  *pList,   /* A l
17900 69 73 74 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 74  ist of columns t
17910 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f 0a  o be indexed */.
17920 20 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20    int onError,  
17930 20 20 20 20 20 2f 2a 20 4f 45 5f 41 62 6f 72 74       /* OE_Abort
17940 2c 20 4f 45 5f 49 67 6e 6f 72 65 2c 20 4f 45 5f  , OE_Ignore, OE_
17950 52 65 70 6c 61 63 65 2c 20 6f 72 20 4f 45 5f 4e  Replace, or OE_N
17960 6f 6e 65 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  one */.  Token *
17970 70 53 74 61 72 74 2c 20 20 20 20 20 2f 2a 20 54  pStart,     /* T
17980 68 65 20 43 52 45 41 54 45 20 74 6f 6b 65 6e 20  he CREATE token 
17990 74 68 61 74 20 62 65 67 69 6e 73 20 74 68 69 73  that begins this
179a0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
179b0 45 78 70 72 20 2a 70 50 49 57 68 65 72 65 2c 20  Expr *pPIWhere, 
179c0 20 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75     /* WHERE clau
179d0 73 65 20 66 6f 72 20 70 61 72 74 69 61 6c 20 69  se for partial i
179e0 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
179f0 73 6f 72 74 4f 72 64 65 72 2c 20 20 20 20 20 2f  sortOrder,     /
17a00 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 6f 66 20  * Sort order of 
17a10 70 72 69 6d 61 72 79 20 6b 65 79 20 77 68 65 6e  primary key when
17a20 20 70 4c 69 73 74 3d 3d 4e 55 4c 4c 20 2a 2f 0a   pList==NULL */.
17a30 20 20 69 6e 74 20 69 66 4e 6f 74 45 78 69 73 74    int ifNotExist
17a40 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 65 72 72       /* Omit err
17a50 6f 72 20 69 66 20 69 6e 64 65 78 20 61 6c 72 65  or if index alre
17a60 61 64 79 20 65 78 69 73 74 73 20 2a 2f 0a 29 7b  ady exists */.){
17a70 0a 20 20 49 6e 64 65 78 20 2a 70 52 65 74 20 3d  .  Index *pRet =
17a80 20 30 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74   0;     /* Point
17a90 65 72 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  er to return */.
17aa0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
17ab0 30 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  0;     /* Table 
17ac0 74 6f 20 62 65 20 69 6e 64 65 78 65 64 20 2a 2f  to be indexed */
17ad0 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  .  Index *pIndex
17ae0 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20 69   = 0;   /* The i
17af0 6e 64 65 78 20 74 6f 20 62 65 20 63 72 65 61 74  ndex to be creat
17b00 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4e  ed */.  char *zN
17b10 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ame = 0;     /* 
17b20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  Name of the inde
17b30 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  x */.  int nName
17b40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17b50 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
17b60 65 72 73 20 69 6e 20 7a 4e 61 6d 65 20 2a 2f 0a  ers in zName */.
17b70 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 44 62    int i, j;.  Db
17b80 46 69 78 65 72 20 73 46 69 78 3b 20 20 20 20 20  Fixer sFix;     
17b90 20 20 20 2f 2a 20 46 6f 72 20 61 73 73 69 67 6e     /* For assign
17ba0 69 6e 67 20 64 61 74 61 62 61 73 65 20 6e 61 6d  ing database nam
17bb0 65 73 20 74 6f 20 70 54 61 62 6c 65 20 2a 2f 0a  es to pTable */.
17bc0 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 4d    int sortOrderM
17bd0 61 73 6b 3b 20 20 20 2f 2a 20 31 20 74 6f 20 68  ask;   /* 1 to h
17be0 6f 6e 6f 72 20 44 45 53 43 20 69 6e 20 69 6e 64  onor DESC in ind
17bf0 65 78 2e 20 20 30 20 74 6f 20 69 67 6e 6f 72 65  ex.  0 to ignore
17c00 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  . */.  sqlite3 *
17c10 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
17c20 0a 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20  .  Db *pDb;     
17c30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
17c40 70 65 63 69 66 69 63 20 74 61 62 6c 65 20 63 6f  pecific table co
17c50 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 69 6e 64  ntaining the ind
17c60 65 78 65 64 20 64 61 74 61 62 61 73 65 20 2a 2f  exed database */
17c70 0a 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20  .  int iDb;     
17c80 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
17c90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17ca0 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 77   that is being w
17cb0 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 6f 6b 65  ritten */.  Toke
17cc0 6e 20 2a 70 4e 61 6d 65 20 3d 20 30 3b 20 20 20  n *pName = 0;   
17cd0 20 2f 2a 20 55 6e 71 75 61 6c 69 66 69 65 64 20   /* Unqualified 
17ce0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 64 65  name of the inde
17cf0 78 20 74 6f 20 63 72 65 61 74 65 20 2a 2f 0a 20  x to create */. 
17d00 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
17d10 5f 69 74 65 6d 20 2a 70 4c 69 73 74 49 74 65 6d  _item *pListItem
17d20 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67  ; /* For looping
17d30 20 6f 76 65 72 20 70 4c 69 73 74 20 2a 2f 0a 20   over pList */. 
17d40 20 69 6e 74 20 6e 45 78 74 72 61 20 3d 20 30 3b   int nExtra = 0;
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
17d70 61 74 65 64 20 66 6f 72 20 7a 45 78 74 72 61 5b  ated for zExtra[
17d80 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  ] */.  int nExtr
17d90 61 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  aCol;           
17da0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17db0 72 20 6f 66 20 65 78 74 72 61 20 63 6f 6c 75 6d  r of extra colum
17dc0 6e 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 63  ns needed */.  c
17dd0 68 61 72 20 2a 7a 45 78 74 72 61 20 3d 20 30 3b  har *zExtra = 0;
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 2f 2a 20 45 78 74 72 61 20 73 70 61 63 65 20 61  /* Extra space a
17e00 66 74 65 72 20 74 68 65 20 49 6e 64 65 78 20 6f  fter the Index o
17e10 62 6a 65 63 74 20 2a 2f 0a 20 20 49 6e 64 65 78  bject */.  Index
17e20 20 2a 70 50 6b 20 3d 20 30 3b 20 20 20 20 20 20   *pPk = 0;      
17e30 2f 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20 69  /* PRIMARY KEY i
17e40 6e 64 65 78 20 66 6f 72 20 57 49 54 48 4f 55 54  ndex for WITHOUT
17e50 20 52 4f 57 49 44 20 74 61 62 6c 65 73 20 2a 2f   ROWID tables */
17e60 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
17e70 6f 63 46 61 69 6c 65 64 20 7c 7c 20 49 4e 5f 44  ocFailed || IN_D
17e80 45 43 4c 41 52 45 5f 56 54 41 42 20 7c 7c 20 70  ECLARE_VTAB || p
17e90 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30 20 29 7b  Parse->nErr>0 ){
17ea0 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63  .    goto exit_c
17eb0 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d  reate_index;.  }
17ec0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
17ed0 21 3d 73 71 6c 69 74 65 33 52 65 61 64 53 63 68  !=sqlite3ReadSch
17ee0 65 6d 61 28 70 50 61 72 73 65 29 20 29 7b 0a 20  ema(pParse) ){. 
17ef0 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
17f00 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 0a  ate_index;.  }..
17f10 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
17f20 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 69 73  he table that is
17f30 20 74 6f 20 62 65 20 69 6e 64 65 78 65 64 2e 20   to be indexed. 
17f40 20 52 65 74 75 72 6e 20 65 61 72 6c 79 20 69 66   Return early if
17f50 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 2a 2f   not found..  */
17f60 0a 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21  .  if( pTblName!
17f70 3d 30 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 55 73  =0 ){..    /* Us
17f80 65 20 74 68 65 20 74 77 6f 2d 70 61 72 74 20 69  e the two-part i
17f90 6e 64 65 78 20 6e 61 6d 65 20 74 6f 20 64 65 74  ndex name to det
17fa0 65 72 6d 69 6e 65 20 74 68 65 20 64 61 74 61 62  ermine the datab
17fb0 61 73 65 20 0a 20 20 20 20 2a 2a 20 74 6f 20 73  ase .    ** to s
17fc0 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 74 61  earch for the ta
17fd0 62 6c 65 2e 20 27 46 69 78 27 20 74 68 65 20 74  ble. 'Fix' the t
17fe0 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68 69  able name to thi
17ff0 73 20 64 62 0a 20 20 20 20 2a 2a 20 62 65 66 6f  s db.    ** befo
18000 72 65 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 74 68  re looking up th
18010 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
18020 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 61 6d      assert( pNam
18030 65 31 20 26 26 20 70 4e 61 6d 65 32 20 29 3b 0a  e1 && pName2 );.
18040 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
18050 33 54 77 6f 50 61 72 74 4e 61 6d 65 28 70 50 61  3TwoPartName(pPa
18060 72 73 65 2c 20 70 4e 61 6d 65 31 2c 20 70 4e 61  rse, pName1, pNa
18070 6d 65 32 2c 20 26 70 4e 61 6d 65 29 3b 0a 20 20  me2, &pName);.  
18080 20 20 69 66 28 20 69 44 62 3c 30 20 29 20 67 6f    if( iDb<0 ) go
18090 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
180a0 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65 72 74  ndex;.    assert
180b0 28 20 70 4e 61 6d 65 20 26 26 20 70 4e 61 6d 65  ( pName && pName
180c0 2d 3e 7a 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ->z );..#ifndef 
180d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 4d 50  SQLITE_OMIT_TEMP
180e0 44 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  DB.    /* If the
180f0 20 69 6e 64 65 78 20 6e 61 6d 65 20 77 61 73 20   index name was 
18100 75 6e 71 75 61 6c 69 66 69 65 64 2c 20 63 68 65  unqualified, che
18110 63 6b 20 69 66 20 74 68 65 20 74 61 62 6c 65 0a  ck if the table.
18120 20 20 20 20 2a 2a 20 69 73 20 61 20 74 65 6d 70      ** is a temp
18130 20 74 61 62 6c 65 2e 20 49 66 20 73 6f 2c 20 73   table. If so, s
18140 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
18150 74 6f 20 31 2e 20 44 6f 20 6e 6f 74 20 64 6f 20  to 1. Do not do 
18160 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  this.    ** if i
18170 6e 69 74 69 61 6c 69 73 69 6e 67 20 61 20 64 61  nitialising a da
18180 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20  tabase schema.. 
18190 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 64     */.    if( !d
181a0 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29 7b 0a  b->init.busy ){.
181b0 20 20 20 20 20 20 70 54 61 62 20 3d 20 73 71 6c        pTab = sql
181c0 69 74 65 33 53 72 63 4c 69 73 74 4c 6f 6f 6b 75  ite3SrcListLooku
181d0 70 28 70 50 61 72 73 65 2c 20 70 54 62 6c 4e 61  p(pParse, pTblNa
181e0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
181f0 4e 61 6d 65 32 2d 3e 6e 3d 3d 30 20 26 26 20 70  Name2->n==0 && p
18200 54 61 62 20 26 26 20 70 54 61 62 2d 3e 70 53 63  Tab && pTab->pSc
18210 68 65 6d 61 3d 3d 64 62 2d 3e 61 44 62 5b 31 5d  hema==db->aDb[1]
18220 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  .pSchema ){.    
18230 20 20 20 20 69 44 62 20 3d 20 31 3b 0a 20 20 20      iDb = 1;.   
18240 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
18250 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 69  f..    sqlite3Fi
18260 78 49 6e 69 74 28 26 73 46 69 78 2c 20 70 50 61  xInit(&sFix, pPa
18270 72 73 65 2c 20 69 44 62 2c 20 22 69 6e 64 65 78  rse, iDb, "index
18280 22 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ", pName);.    i
18290 66 28 20 73 71 6c 69 74 65 33 46 69 78 53 72 63  f( sqlite3FixSrc
182a0 4c 69 73 74 28 26 73 46 69 78 2c 20 70 54 62 6c  List(&sFix, pTbl
182b0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Name) ){.      /
182c0 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 70 61  * Because the pa
182d0 72 73 65 72 20 63 6f 6e 73 74 72 75 63 74 73 20  rser constructs 
182e0 70 54 62 6c 4e 61 6d 65 20 66 72 6f 6d 20 61 20  pTblName from a 
182f0 73 69 6e 67 6c 65 20 69 64 65 6e 74 69 66 69 65  single identifie
18300 72 2c 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  r,.      ** sqli
18310 74 65 33 46 69 78 53 72 63 4c 69 73 74 20 63 61  te3FixSrcList ca
18320 6e 20 6e 65 76 65 72 20 66 61 69 6c 2e 20 2a 2f  n never fail. */
18330 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
18340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 62  ;.    }.    pTab
18350 20 3d 20 73 71 6c 69 74 65 33 4c 6f 63 61 74 65   = sqlite3Locate
18360 54 61 62 6c 65 49 74 65 6d 28 70 50 61 72 73 65  TableItem(pParse
18370 2c 20 30 2c 20 26 70 54 62 6c 4e 61 6d 65 2d 3e  , 0, &pTblName->
18380 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  a[0]);.    asser
18390 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
183a0 6c 65 64 3d 3d 30 20 7c 7c 20 70 54 61 62 3d 3d  led==0 || pTab==
183b0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
183c0 62 3d 3d 30 20 29 20 67 6f 74 6f 20 65 78 69 74  b==0 ) goto exit
183d0 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20  _create_index;. 
183e0 20 20 20 69 66 28 20 69 44 62 3d 3d 31 20 26 26     if( iDb==1 &&
183f0 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 53   db->aDb[iDb].pS
18400 63 68 65 6d 61 21 3d 70 54 61 62 2d 3e 70 53 63  chema!=pTab->pSc
18410 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 73 71  hema ){.      sq
18420 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18430 61 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20  arse, .         
18440 20 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65    "cannot create
18450 20 61 20 54 45 4d 50 20 69 6e 64 65 78 20 6f 6e   a TEMP index on
18460 20 6e 6f 6e 2d 54 45 4d 50 20 74 61 62 6c 65 20   non-TEMP table 
18470 5c 22 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20  \"%s\"",.       
18480 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29      pTab->zName)
18490 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69  ;.      goto exi
184a0 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a  t_create_index;.
184b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 48      }.    if( !H
184c0 61 73 52 6f 77 69 64 28 70 54 61 62 29 20 29 20  asRowid(pTab) ) 
184d0 70 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69  pPk = sqlite3Pri
184e0 6d 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61  maryKeyIndex(pTa
184f0 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
18500 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 3d 3d   assert( pName==
18510 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18520 20 70 53 74 61 72 74 3d 3d 30 20 29 3b 0a 20 20   pStart==0 );.  
18530 20 20 70 54 61 62 20 3d 20 70 50 61 72 73 65 2d    pTab = pParse-
18540 3e 70 4e 65 77 54 61 62 6c 65 3b 0a 20 20 20 20  >pNewTable;.    
18550 69 66 28 20 21 70 54 61 62 20 29 20 67 6f 74 6f  if( !pTab ) goto
18560 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
18570 65 78 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ex;.    iDb = sq
18580 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
18590 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70 53 63  ex(db, pTab->pSc
185a0 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 70 44 62  hema);.  }.  pDb
185b0 20 3d 20 26 64 62 2d 3e 61 44 62 5b 69 44 62 5d   = &db->aDb[iDb]
185c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  ;..  assert( pTa
185d0 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
185e0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
185f0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
18600 65 33 53 74 72 4e 49 43 6d 70 28 70 54 61 62 2d  e3StrNICmp(pTab-
18610 3e 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f  >zName, "sqlite_
18620 22 2c 20 37 29 3d 3d 30 20 0a 20 20 20 20 20 20  ", 7)==0 .      
18630 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
18640 79 3d 3d 30 0a 23 69 66 20 53 51 4c 49 54 45 5f  y==0.#if SQLITE_
18650 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
18660 49 4f 4e 0a 20 20 20 20 20 20 20 26 26 20 73 71  ION.       && sq
18670 6c 69 74 65 33 55 73 65 72 41 75 74 68 54 61 62  lite3UserAuthTab
18680 6c 65 28 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3d  le(pTab->zName)=
18690 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
186a0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 4e 49   && sqlite3StrNI
186b0 43 6d 70 28 26 70 54 61 62 2d 3e 7a 4e 61 6d 65  Cmp(&pTab->zName
186c0 5b 37 5d 2c 22 61 6c 74 65 72 74 61 62 5f 22 2c  [7],"altertab_",
186d0 39 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  9)!=0 ){.    sql
186e0 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
186f0 72 73 65 2c 20 22 74 61 62 6c 65 20 25 73 20 6d  rse, "table %s m
18700 61 79 20 6e 6f 74 20 62 65 20 69 6e 64 65 78 65  ay not be indexe
18710 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  d", pTab->zName)
18720 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  ;.    goto exit_
18730 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
18740 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18750 5f 4f 4d 49 54 5f 56 49 45 57 0a 20 20 69 66 28  _OMIT_VIEW.  if(
18760 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
18770 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
18780 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76  orMsg(pParse, "v
18790 69 65 77 73 20 6d 61 79 20 6e 6f 74 20 62 65 20  iews may not be 
187a0 69 6e 64 65 78 65 64 22 29 3b 0a 20 20 20 20 67  indexed");.    g
187b0 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
187c0 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65 6e 64 69  index;.  }.#endi
187d0 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
187e0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
187f0 4c 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75  LE.  if( IsVirtu
18800 61 6c 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  al(pTab) ){.    
18810 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
18820 70 50 61 72 73 65 2c 20 22 76 69 72 74 75 61 6c  pParse, "virtual
18830 20 74 61 62 6c 65 73 20 6d 61 79 20 6e 6f 74 20   tables may not 
18840 62 65 20 69 6e 64 65 78 65 64 22 29 3b 0a 20 20  be indexed");.  
18850 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61    goto exit_crea
18860 74 65 5f 69 6e 64 65 78 3b 0a 20 20 7d 0a 23 65  te_index;.  }.#e
18870 6e 64 69 66 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ndif..  /*.  ** 
18880 46 69 6e 64 20 74 68 65 20 6e 61 6d 65 20 6f 66  Find the name of
18890 20 74 68 65 20 69 6e 64 65 78 2e 20 20 4d 61 6b   the index.  Mak
188a0 65 20 73 75 72 65 20 74 68 65 72 65 20 69 73 20  e sure there is 
188b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 61 6e 6f 74  not already anot
188c0 68 65 72 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6f  her.  ** index o
188d0 72 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  r table with the
188e0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 0a 20 20   same name.  .  
188f0 2a 2a 0a 20 20 2a 2a 20 45 78 63 65 70 74 69 6f  **.  ** Exceptio
18900 6e 3a 20 20 49 66 20 77 65 20 61 72 65 20 72 65  n:  If we are re
18910 61 64 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20  ading the names 
18920 6f 66 20 70 65 72 6d 61 6e 65 6e 74 20 69 6e 64  of permanent ind
18930 69 63 65 73 20 66 72 6f 6d 20 74 68 65 0a 20 20  ices from the.  
18940 2a 2a 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ** sqlite_master
18950 20 74 61 62 6c 65 20 28 62 65 63 61 75 73 65 20   table (because 
18960 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
18970 73 73 20 63 68 61 6e 67 65 64 20 74 68 65 20 73  ss changed the s
18980 63 68 65 6d 61 29 20 61 6e 64 0a 20 20 2a 2a 20  chema) and.  ** 
18990 6f 6e 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78  one of the index
189a0 20 6e 61 6d 65 73 20 63 6f 6c 6c 69 64 65 73 20   names collides 
189b0 77 69 74 68 20 74 68 65 20 6e 61 6d 65 20 6f 66  with the name of
189c0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
189d0 6c 65 20 6f 72 0a 20 20 2a 2a 20 69 6e 64 65 78  le or.  ** index
189e0 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 63  , then we will c
189f0 6f 6e 74 69 6e 75 65 20 74 6f 20 70 72 6f 63 65  ontinue to proce
18a00 73 73 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20  ss this index.. 
18a10 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 4e 61 6d   **.  ** If pNam
18a20 65 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  e==0 it means th
18a30 61 74 20 77 65 20 61 72 65 0a 20 20 2a 2a 20 64  at we are.  ** d
18a40 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 70 72  ealing with a pr
18a50 69 6d 61 72 79 20 6b 65 79 20 6f 72 20 55 4e 49  imary key or UNI
18a60 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20  QUE constraint. 
18a70 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 76 65   We have to inve
18a80 6e 74 20 6f 75 72 0a 20 20 2a 2a 20 6f 77 6e 20  nt our.  ** own 
18a90 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
18aa0 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 7a 4e   pName ){.    zN
18ab0 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
18ac0 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70  eFromToken(db, p
18ad0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
18ae0 4e 61 6d 65 3d 3d 30 20 29 20 67 6f 74 6f 20 65  Name==0 ) goto e
18af0 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78  xit_create_index
18b00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
18b10 61 6d 65 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  ame->z!=0 );.   
18b20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
18b30 73 71 6c 69 74 65 33 43 68 65 63 6b 4f 62 6a 65  sqlite3CheckObje
18b40 63 74 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 7a  ctName(pParse, z
18b50 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 67  Name) ){.      g
18b60 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f  oto exit_create_
18b70 69 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20  index;.    }.   
18b80 20 69 66 28 20 21 64 62 2d 3e 69 6e 69 74 2e 62   if( !db->init.b
18b90 75 73 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  usy ){.      if(
18ba0 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c   sqlite3FindTabl
18bb0 65 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 30 29 21  e(db, zName, 0)!
18bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
18bd0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
18be0 61 72 73 65 2c 20 22 74 68 65 72 65 20 69 73 20  arse, "there is 
18bf0 61 6c 72 65 61 64 79 20 61 20 74 61 62 6c 65 20  already a table 
18c00 6e 61 6d 65 64 20 25 73 22 2c 20 7a 4e 61 6d 65  named %s", zName
18c10 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
18c20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
18c30 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  x;.      }.    }
18c40 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
18c50 46 69 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 4e  FindIndex(db, zN
18c60 61 6d 65 2c 20 70 44 62 2d 3e 7a 4e 61 6d 65 29  ame, pDb->zName)
18c70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
18c80 20 21 69 66 4e 6f 74 45 78 69 73 74 20 29 7b 0a   !ifNotExist ){.
18c90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18ca0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
18cb0 22 69 6e 64 65 78 20 25 73 20 61 6c 72 65 61 64  "index %s alread
18cc0 79 20 65 78 69 73 74 73 22 2c 20 7a 4e 61 6d 65  y exists", zName
18cd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18ce0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18cf0 21 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 20 29  !db->init.busy )
18d00 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18d10 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
18d20 61 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a  a(pParse, iDb);.
18d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
18d40 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18d50 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  ndex;.    }.  }e
18d60 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  lse{.    int n;.
18d70 20 20 20 20 49 6e 64 65 78 20 2a 70 4c 6f 6f 70      Index *pLoop
18d80 3b 0a 20 20 20 20 66 6f 72 28 70 4c 6f 6f 70 3d  ;.    for(pLoop=
18d90 70 54 61 62 2d 3e 70 49 6e 64 65 78 2c 20 6e 3d  pTab->pIndex, n=
18da0 31 3b 20 70 4c 6f 6f 70 3b 20 70 4c 6f 6f 70 3d  1; pLoop; pLoop=
18db0 70 4c 6f 6f 70 2d 3e 70 4e 65 78 74 2c 20 6e 2b  pLoop->pNext, n+
18dc0 2b 29 7b 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  +){}.    zName =
18dd0 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
18de0 64 62 2c 20 22 73 71 6c 69 74 65 5f 61 75 74 6f  db, "sqlite_auto
18df0 69 6e 64 65 78 5f 25 73 5f 25 64 22 2c 20 70 54  index_%s_%d", pT
18e00 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20  ab->zName, n);. 
18e10 20 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20     if( zName==0 
18e20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  ){.      goto ex
18e30 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
18e40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18e50 20 43 68 65 63 6b 20 66 6f 72 20 61 75 74 68 6f   Check for autho
18e60 72 69 7a 61 74 69 6f 6e 20 74 6f 20 63 72 65 61  rization to crea
18e70 74 65 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 2a  te an index..  *
18e80 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
18e90 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
18ea0 49 4f 4e 0a 20 20 7b 0a 20 20 20 20 63 6f 6e 73  ION.  {.    cons
18eb0 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 70 44  t char *zDb = pD
18ec0 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66  b->zName;.    if
18ed0 28 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65  ( sqlite3AuthChe
18ee0 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  ck(pParse, SQLIT
18ef0 45 5f 49 4e 53 45 52 54 2c 20 53 43 48 45 4d 41  E_INSERT, SCHEMA
18f00 5f 54 41 42 4c 45 28 69 44 62 29 2c 20 30 2c 20  _TABLE(iDb), 0, 
18f10 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
18f20 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18f30 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ndex;.    }.    
18f40 69 20 3d 20 53 51 4c 49 54 45 5f 43 52 45 41 54  i = SQLITE_CREAT
18f50 45 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28  E_INDEX;.    if(
18f60 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
18f70 20 69 44 62 3d 3d 31 20 29 20 69 20 3d 20 53 51   iDb==1 ) i = SQ
18f80 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
18f90 5f 49 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20  _INDEX;.    if( 
18fa0 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
18fb0 28 70 50 61 72 73 65 2c 20 69 2c 20 7a 4e 61 6d  (pParse, i, zNam
18fc0 65 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20  e, pTab->zName, 
18fd0 7a 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f  zDb) ){.      go
18fe0 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69  to exit_create_i
18ff0 6e 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ndex;.    }.  }.
19000 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
19010 70 4c 69 73 74 3d 3d 30 2c 20 69 74 20 6d 65 61  pList==0, it mea
19020 6e 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ns this routine 
19030 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 20 6d 61  was called to ma
19040 6b 65 20 61 20 70 72 69 6d 61 72 79 0a 20 20 2a  ke a primary.  *
19050 2a 20 6b 65 79 20 6f 75 74 20 6f 66 20 74 68 65  * key out of the
19060 20 6c 61 73 74 20 63 6f 6c 75 6d 6e 20 61 64 64   last column add
19070 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
19080 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
19090 6f 6e 2e 0a 20 20 2a 2a 20 53 6f 20 63 72 65 61  on..  ** So crea
190a0 74 65 20 61 20 66 61 6b 65 20 6c 69 73 74 20 74  te a fake list t
190b0 6f 20 73 69 6d 75 6c 61 74 65 20 74 68 69 73 2e  o simulate this.
190c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73  .  */.  if( pLis
190d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 54 6f 6b 65  t==0 ){.    Toke
190e0 6e 20 70 72 65 76 43 6f 6c 3b 0a 20 20 20 20 70  n prevCol;.    p
190f0 72 65 76 43 6f 6c 2e 7a 20 3d 20 70 54 61 62 2d  revCol.z = pTab-
19100 3e 61 43 6f 6c 5b 70 54 61 62 2d 3e 6e 43 6f 6c  >aCol[pTab->nCol
19110 2d 31 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  -1].zName;.    p
19120 72 65 76 43 6f 6c 2e 6e 20 3d 20 73 71 6c 69 74  revCol.n = sqlit
19130 65 33 53 74 72 6c 65 6e 33 30 28 70 72 65 76 43  e3Strlen30(prevC
19140 6f 6c 2e 7a 29 3b 0a 20 20 20 20 70 4c 69 73 74  ol.z);.    pList
19150 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
19160 73 74 41 70 70 65 6e 64 28 70 50 61 72 73 65 2c  stAppend(pParse,
19170 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
19180 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c    sqlite3ExprAll
19190 6f 63 28 64 62 2c 20 54 4b 5f 49 44 2c 20 26 70  oc(db, TK_ID, &p
191a0 72 65 76 43 6f 6c 2c 20 30 29 29 3b 0a 20 20 20  revCol, 0));.   
191b0 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
191c0 67 6f 74 6f 20 65 78 69 74 5f 63 72 65 61 74 65  goto exit_create
191d0 5f 69 6e 64 65 78 3b 0a 20 20 20 20 61 73 73 65  _index;.    asse
191e0 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
191f0 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==1 );.    sqlit
19200 65 33 45 78 70 72 4c 69 73 74 53 65 74 53 6f 72  e3ExprListSetSor
19210 74 4f 72 64 65 72 28 70 4c 69 73 74 2c 20 73 6f  tOrder(pList, so
19220 72 74 4f 72 64 65 72 29 3b 0a 20 20 7d 65 6c 73  rtOrder);.  }els
19230 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  e{.    sqlite3Ex
19240 70 72 4c 69 73 74 43 68 65 63 6b 4c 65 6e 67 74  prListCheckLengt
19250 68 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2c  h(pParse, pList,
19260 20 22 69 6e 64 65 78 22 29 3b 0a 20 20 7d 0a 0a   "index");.  }..
19270 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
19280 68 6f 77 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  how many bytes o
19290 66 20 73 70 61 63 65 20 61 72 65 20 72 65 71 75  f space are requ
192a0 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 65 78  ired to store ex
192b0 70 6c 69 63 69 74 6c 79 0a 20 20 2a 2a 20 73 70  plicitly.  ** sp
192c0 65 63 69 66 69 65 64 20 63 6f 6c 6c 61 74 69 6f  ecified collatio
192d0 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65 73  n sequence names
192e0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
192f0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
19300 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
19310 20 2a 70 45 78 70 72 20 3d 20 70 4c 69 73 74 2d   *pExpr = pList-
19320 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
19330 20 61 73 73 65 72 74 28 20 70 45 78 70 72 21 3d   assert( pExpr!=
19340 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  0 );.    if( pEx
19350 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41  pr->op==TK_COLLA
19360 54 45 20 29 7b 0a 20 20 20 20 20 20 6e 45 78 74  TE ){.      nExt
19370 72 61 20 2b 3d 20 28 31 20 2b 20 73 71 6c 69 74  ra += (1 + sqlit
19380 65 33 53 74 72 6c 65 6e 33 30 28 70 45 78 70 72  e3Strlen30(pExpr
19390 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 29 3b 0a 20 20  ->u.zToken));.  
193a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 0a 20    }.  }..  /* . 
193b0 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65   ** Allocate the
193c0 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
193d0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20  . .  */.  nName 
193e0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
193f0 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 45 78 74  0(zName);.  nExt
19400 72 61 43 6f 6c 20 3d 20 70 50 6b 20 3f 20 70 50  raCol = pPk ? pP
19410 6b 2d 3e 6e 4b 65 79 43 6f 6c 20 3a 20 31 3b 0a  k->nKeyCol : 1;.
19420 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c 69 74    pIndex = sqlit
19430 65 33 41 6c 6c 6f 63 61 74 65 49 6e 64 65 78 4f  e3AllocateIndexO
19440 62 6a 65 63 74 28 64 62 2c 20 70 4c 69 73 74 2d  bject(db, pList-
19450 3e 6e 45 78 70 72 20 2b 20 6e 45 78 74 72 61 43  >nExpr + nExtraC
19460 6f 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol,.            
19470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19480 20 20 20 20 20 20 20 20 20 20 6e 4e 61 6d 65 20            nName 
19490 2b 20 6e 45 78 74 72 61 20 2b 20 31 2c 20 26 7a  + nExtra + 1, &z
194a0 45 78 74 72 61 29 3b 0a 20 20 69 66 28 20 64 62  Extra);.  if( db
194b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
194c0 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69 74 5f  {.    goto exit_
194d0 63 72 65 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20  create_index;.  
194e0 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
194f0 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
19500 28 70 49 6e 64 65 78 2d 3e 61 69 52 6f 77 4c 6f  (pIndex->aiRowLo
19510 67 45 73 74 29 20 29 3b 0a 20 20 61 73 73 65 72  gEst) );.  asser
19520 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
19530 49 47 4e 4d 45 4e 54 28 70 49 6e 64 65 78 2d 3e  IGNMENT(pIndex->
19540 61 7a 43 6f 6c 6c 29 20 29 3b 0a 20 20 70 49 6e  azColl) );.  pIn
19550 64 65 78 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 45 78  dex->zName = zEx
19560 74 72 61 3b 0a 20 20 7a 45 78 74 72 61 20 2b 3d  tra;.  zExtra +=
19570 20 6e 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 6d 65   nName + 1;.  me
19580 6d 63 70 79 28 70 49 6e 64 65 78 2d 3e 7a 4e 61  mcpy(pIndex->zNa
19590 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  me, zName, nName
195a0 2b 31 29 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70  +1);.  pIndex->p
195b0 54 61 62 6c 65 20 3d 20 70 54 61 62 3b 0a 20 20  Table = pTab;.  
195c0 70 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 20  pIndex->onError 
195d0 3d 20 28 75 38 29 6f 6e 45 72 72 6f 72 3b 0a 20  = (u8)onError;. 
195e0 20 70 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74   pIndex->uniqNot
195f0 4e 75 6c 6c 20 3d 20 6f 6e 45 72 72 6f 72 21 3d  Null = onError!=
19600 4f 45 5f 4e 6f 6e 65 3b 0a 20 20 70 49 6e 64 65  OE_None;.  pInde
19610 78 2d 3e 69 64 78 54 79 70 65 20 3d 20 70 4e 61  x->idxType = pNa
19620 6d 65 20 3f 20 53 51 4c 49 54 45 5f 49 44 58 54  me ? SQLITE_IDXT
19630 59 50 45 5f 41 50 50 44 45 46 20 3a 20 53 51 4c  YPE_APPDEF : SQL
19640 49 54 45 5f 49 44 58 54 59 50 45 5f 55 4e 49 51  ITE_IDXTYPE_UNIQ
19650 55 45 3b 0a 20 20 70 49 6e 64 65 78 2d 3e 70 53  UE;.  pIndex->pS
19660 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
19670 69 44 62 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20  iDb].pSchema;.  
19680 70 49 6e 64 65 78 2d 3e 6e 4b 65 79 43 6f 6c 20  pIndex->nKeyCol 
19690 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
196a0 20 20 69 66 28 20 70 50 49 57 68 65 72 65 20 29    if( pPIWhere )
196b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  {.    sqlite3Res
196c0 6f 6c 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63  olveSelfReferenc
196d0 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  e(pParse, pTab, 
196e0 4e 43 5f 50 61 72 74 49 64 78 2c 20 70 50 49 57  NC_PartIdx, pPIW
196f0 68 65 72 65 2c 20 30 29 3b 0a 20 20 20 20 70 49  here, 0);.    pI
19700 6e 64 65 78 2d 3e 70 50 61 72 74 49 64 78 57 68  ndex->pPartIdxWh
19710 65 72 65 20 3d 20 70 50 49 57 68 65 72 65 3b 0a  ere = pPIWhere;.
19720 20 20 20 20 70 50 49 57 68 65 72 65 20 3d 20 30      pPIWhere = 0
19730 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
19740 73 71 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74  sqlite3SchemaMut
19750 65 78 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20  exHeld(db, iDb, 
19760 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  0) );..  /* Chec
19770 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 73  k to see if we s
19780 68 6f 75 6c 64 20 68 6f 6e 6f 72 20 44 45 53 43  hould honor DESC
19790 20 72 65 71 75 65 73 74 73 20 6f 6e 20 69 6e 64   requests on ind
197a0 65 78 20 63 6f 6c 75 6d 6e 73 0a 20 20 2a 2f 0a  ex columns.  */.
197b0 20 20 69 66 28 20 70 44 62 2d 3e 70 53 63 68 65    if( pDb->pSche
197c0 6d 61 2d 3e 66 69 6c 65 5f 66 6f 72 6d 61 74 3e  ma->file_format>
197d0 3d 34 20 29 7b 0a 20 20 20 20 73 6f 72 74 4f 72  =4 ){.    sortOr
197e0 64 65 72 4d 61 73 6b 20 3d 20 2d 31 3b 20 20 20  derMask = -1;   
197f0 2f 2a 20 48 6f 6e 6f 72 20 44 45 53 43 20 2a 2f  /* Honor DESC */
19800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 6f  .  }else{.    so
19810 72 74 4f 72 64 65 72 4d 61 73 6b 20 3d 20 30 3b  rtOrderMask = 0;
19820 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 44 45      /* Ignore DE
19830 53 43 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20  SC */.  }..  /* 
19840 41 6e 61 6c 79 7a 65 20 74 68 65 20 6c 69 73 74  Analyze the list
19850 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
19860 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20 74 65  that form the te
19870 72 6d 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78  rms of the index
19880 20 61 6e 64 0a 20 20 2a 2a 20 72 65 70 6f 72 74   and.  ** report
19890 20 61 6e 79 20 65 72 72 6f 72 73 2e 20 20 49 6e   any errors.  In
198a0 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
198b0 20 77 68 65 72 65 20 74 68 65 20 65 78 70 72 65   where the expre
198c0 73 73 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ssion is exactly
198d0 0a 20 20 2a 2a 20 61 20 74 61 62 6c 65 20 63 6f  .  ** a table co
198e0 6c 75 6d 6e 2c 20 73 74 6f 72 65 20 74 68 61 74  lumn, store that
198f0 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 69 43 6f 6c   column in aiCol
19900 75 6d 6e 5b 5d 2e 20 20 46 6f 72 20 67 65 6e 65  umn[].  For gene
19910 72 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  ral expressions,
19920 0a 20 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 70  .  ** populate p
19930 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78 70 72 20  Index->aColExpr 
19940 61 6e 64 20 73 74 6f 72 65 20 58 4e 5f 45 58 50  and store XN_EXP
19950 52 20 28 2d 32 29 20 69 6e 20 61 69 43 6f 6c 75  R (-2) in aiColu
19960 6d 6e 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mn[]..  **.  ** 
19970 54 4f 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61  TODO: Issue a wa
19980 72 6e 69 6e 67 20 69 66 20 74 77 6f 20 6f 72 20  rning if two or 
19990 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20  more columns of 
199a0 74 68 65 20 69 6e 64 65 78 20 61 72 65 20 69 64  the index are id
199b0 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 20 54 4f  entical..  ** TO
199c0 44 4f 3a 20 49 73 73 75 65 20 61 20 77 61 72 6e  DO: Issue a warn
199d0 69 6e 67 20 69 66 20 74 68 65 20 74 61 62 6c 65  ing if the table
199e0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
199f0 75 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  used as part of 
19a00 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6b  the.  ** index k
19a10 65 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ey..  */.  for(i
19a20 3d 30 2c 20 70 4c 69 73 74 49 74 65 6d 3d 70 4c  =0, pListItem=pL
19a30 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
19a40 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 4c 69  >nExpr; i++, pLi
19a50 73 74 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  stItem++){.    E
19a60 78 70 72 20 2a 70 43 45 78 70 72 3b 20 20 20 20  xpr *pCExpr;    
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a80 20 54 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20   The i-th index 
19a90 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
19aa0 20 20 69 6e 74 20 72 65 71 75 65 73 74 65 64 53    int requestedS
19ab0 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20  ortOrder;       
19ac0 20 2f 2a 20 41 53 43 20 6f 72 20 44 45 53 43 20   /* ASC or DESC 
19ad0 6f 6e 20 74 68 65 20 69 2d 74 68 20 65 78 70 72  on the i-th expr
19ae0 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f  ession */.    co
19af0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b  nst char *zColl;
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b10 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
19b20 63 65 20 6e 61 6d 65 20 2a 2f 0a 0a 20 20 20 20  ce name */..    
19b30 73 71 6c 69 74 65 33 53 74 72 69 6e 67 54 6f 49  sqlite3StringToI
19b40 64 28 70 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78  d(pListItem->pEx
19b50 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pr);.    sqlite3
19b60 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65 72  ResolveSelfRefer
19b70 65 6e 63 65 28 70 50 61 72 73 65 2c 20 70 54 61  ence(pParse, pTa
19b80 62 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c 20 70  b, NC_IdxExpr, p
19b90 4c 69 73 74 49 74 65 6d 2d 3e 70 45 78 70 72 2c  ListItem->pExpr,
19ba0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61   0);.    if( pPa
19bb0 72 73 65 2d 3e 6e 45 72 72 20 29 20 67 6f 74 6f  rse->nErr ) goto
19bc0 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64   exit_create_ind
19bd0 65 78 3b 0a 20 20 20 20 70 43 45 78 70 72 20 3d  ex;.    pCExpr =
19be0 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70   sqlite3ExprSkip
19bf0 43 6f 6c 6c 61 74 65 28 70 4c 69 73 74 49 74 65  Collate(pListIte
19c00 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69  m->pExpr);.    i
19c10 66 28 20 70 43 45 78 70 72 2d 3e 6f 70 21 3d 54  f( pCExpr->op!=T
19c20 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
19c30 20 20 69 66 28 20 70 54 61 62 3d 3d 70 50 61 72    if( pTab==pPar
19c40 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 29 7b  se->pNewTable ){
19c50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19c60 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
19c70 20 22 65 78 70 72 65 73 73 69 6f 6e 73 20 70 72   "expressions pr
19c80 6f 68 69 62 69 74 65 64 20 69 6e 20 50 52 49 4d  ohibited in PRIM
19c90 41 52 59 20 4b 45 59 20 61 6e 64 20 22 0a 20 20  ARY KEY and ".  
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 55                "U
19cc0 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
19cd0 73 22 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  s");.        got
19ce0 6f 20 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e  o exit_create_in
19cf0 64 65 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dex;.      }.   
19d00 20 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e 61     if( pIndex->a
19d10 43 6f 6c 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20  ColExpr==0 ){.  
19d20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
19d30 70 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 45  pCopy = sqlite3E
19d40 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70  xprListDup(db, p
19d50 4c 69 73 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  List, 0);.      
19d60 20 20 70 49 6e 64 65 78 2d 3e 61 43 6f 6c 45 78    pIndex->aColEx
19d70 70 72 20 3d 20 70 43 6f 70 79 3b 0a 20 20 20 20  pr = pCopy;.    
19d80 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c      if( !db->mal
19d90 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
19da0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19db0 43 6f 70 79 21 3d 30 20 29 3b 0a 20 20 20 20 20  Copy!=0 );.     
19dc0 20 20 20 20 20 70 4c 69 73 74 49 74 65 6d 20 3d       pListItem =
19dd0 20 26 70 43 6f 70 79 2d 3e 61 5b 69 5d 3b 0a 20   &pCopy->a[i];. 
19de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
19df0 0a 20 20 20 20 20 20 6a 20 3d 20 58 4e 5f 45 58  .      j = XN_EX
19e00 50 52 3b 0a 20 20 20 20 20 20 70 49 6e 64 65 78  PR;.      pIndex
19e10 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 3d 20  ->aiColumn[i] = 
19e20 58 4e 5f 45 58 50 52 3b 0a 20 20 20 20 20 20 70  XN_EXPR;.      p
19e30 49 6e 64 65 78 2d 3e 75 6e 69 71 4e 6f 74 4e 75  Index->uniqNotNu
19e40 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ll = 0;.    }els
19e50 65 7b 0a 20 20 20 20 20 20 6a 20 3d 20 70 43 45  e{.      j = pCE
19e60 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
19e70 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 3d 30      assert( j<=0
19e80 78 37 66 66 66 20 29 3b 0a 20 20 20 20 20 20 69  x7fff );.      i
19e90 66 28 20 6a 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( j<0 ){.      
19ea0 20 20 6a 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65    j = pTab->iPKe
19eb0 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  y;.      }else i
19ec0 66 28 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  f( pTab->aCol[j]
19ed0 2e 6e 6f 74 4e 75 6c 6c 3d 3d 30 20 29 7b 0a 20  .notNull==0 ){. 
19ee0 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 75         pIndex->u
19ef0 6e 69 71 4e 6f 74 4e 75 6c 6c 20 3d 20 30 3b 0a  niqNotNull = 0;.
19f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49        }.      pI
19f10 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
19f20 5d 20 3d 20 28 69 31 36 29 6a 3b 0a 20 20 20 20  ] = (i16)j;.    
19f30 7d 0a 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 30 3b  }.    zColl = 0;
19f40 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 49 74  .    if( pListIt
19f50 65 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  em->pExpr->op==T
19f60 4b 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20  K_COLLATE ){.   
19f70 20 20 20 69 6e 74 20 6e 43 6f 6c 6c 3b 0a 20 20     int nColl;.  
19f80 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 4c 69 73      zColl = pLis
19f90 74 49 74 65 6d 2d 3e 70 45 78 70 72 2d 3e 75 2e  tItem->pExpr->u.
19fa0 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e 43  zToken;.      nC
19fb0 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72  oll = sqlite3Str
19fc0 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 20 2b 20 31  len30(zColl) + 1
19fd0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19fe0 6e 45 78 74 72 61 3e 3d 6e 43 6f 6c 6c 20 29 3b  nExtra>=nColl );
19ff0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 45  .      memcpy(zE
1a000 78 74 72 61 2c 20 7a 43 6f 6c 6c 2c 20 6e 43 6f  xtra, zColl, nCo
1a010 6c 6c 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c  ll);.      zColl
1a020 20 3d 20 7a 45 78 74 72 61 3b 0a 20 20 20 20 20   = zExtra;.     
1a030 20 7a 45 78 74 72 61 20 2b 3d 20 6e 43 6f 6c 6c   zExtra += nColl
1a040 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 20 2d  ;.      nExtra -
1a050 3d 20 6e 43 6f 6c 6c 3b 0a 20 20 20 20 7d 65 6c  = nColl;.    }el
1a060 73 65 20 69 66 28 20 6a 3e 3d 30 20 29 7b 0a 20  se if( j>=0 ){. 
1a070 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 54 61       zColl = pTa
1a080 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 43 6f 6c 6c  b->aCol[j].zColl
1a090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1a0a0 21 7a 43 6f 6c 6c 20 29 20 7a 43 6f 6c 6c 20 3d  !zColl ) zColl =
1a0b0 20 73 71 6c 69 74 65 33 53 74 72 42 49 4e 41 52   sqlite3StrBINAR
1a0c0 59 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e  Y;.    if( !db->
1a0d0 69 6e 69 74 2e 62 75 73 79 20 26 26 20 21 73 71  init.busy && !sq
1a0e0 6c 69 74 65 33 4c 6f 63 61 74 65 43 6f 6c 6c 53  lite3LocateCollS
1a0f0 65 71 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c 6c  eq(pParse, zColl
1a100 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ) ){.      goto 
1a110 65 78 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65  exit_create_inde
1a120 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  x;.    }.    pIn
1a130 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 20 3d  dex->azColl[i] =
1a140 20 7a 43 6f 6c 6c 3b 0a 20 20 20 20 72 65 71 75   zColl;.    requ
1a150 65 73 74 65 64 53 6f 72 74 4f 72 64 65 72 20 3d  estedSortOrder =
1a160 20 70 4c 69 73 74 49 74 65 6d 2d 3e 73 6f 72 74   pListItem->sort
1a170 4f 72 64 65 72 20 26 20 73 6f 72 74 4f 72 64 65  Order & sortOrde
1a180 72 4d 61 73 6b 3b 0a 20 20 20 20 70 49 6e 64 65  rMask;.    pInde
1a190 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1a1a0 20 3d 20 28 75 38 29 72 65 71 75 65 73 74 65 64   = (u8)requested
1a1b0 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  SortOrder;.  }..
1a1c0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1a1d0 74 61 62 6c 65 20 6b 65 79 20 74 6f 20 74 68 65  table key to the
1a1e0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1a1f0 78 2e 20 20 46 6f 72 20 57 49 54 48 4f 55 54 20  x.  For WITHOUT 
1a200 52 4f 57 49 44 0a 20 20 2a 2a 20 74 61 62 6c 65  ROWID.  ** table
1a210 73 20 28 77 68 65 6e 20 70 50 6b 21 3d 30 29 20  s (when pPk!=0) 
1a220 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65  this will be the
1a230 20 64 65 63 6c 61 72 65 64 20 50 52 49 4d 41 52   declared PRIMAR
1a240 59 20 4b 45 59 2e 20 20 46 6f 72 0a 20 20 2a 2a  Y KEY.  For.  **
1a250 20 6e 6f 72 6d 61 6c 20 74 61 62 6c 65 73 20 28   normal tables (
1a260 77 68 65 6e 20 70 50 6b 3d 3d 30 29 20 74 68 69  when pPk==0) thi
1a270 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 72 6f  s will be the ro
1a280 77 69 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  wid..  */.  if( 
1a290 70 50 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 6a  pPk ){.    for(j
1a2a0 3d 30 3b 20 6a 3c 70 50 6b 2d 3e 6e 4b 65 79 43  =0; j<pPk->nKeyC
1a2b0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1a2c0 69 6e 74 20 78 20 3d 20 70 50 6b 2d 3e 61 69 43  int x = pPk->aiC
1a2d0 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
1a2e0 61 73 73 65 72 74 28 20 78 3e 3d 30 20 29 3b 0a  assert( x>=0 );.
1a2f0 20 20 20 20 20 20 69 66 28 20 68 61 73 43 6f 6c        if( hasCol
1a300 75 6d 6e 28 70 49 6e 64 65 78 2d 3e 61 69 43 6f  umn(pIndex->aiCo
1a310 6c 75 6d 6e 2c 20 70 49 6e 64 65 78 2d 3e 6e 4b  lumn, pIndex->nK
1a320 65 79 43 6f 6c 2c 20 78 29 20 29 7b 0a 20 20 20  eyCol, x) ){.   
1a330 20 20 20 20 20 70 49 6e 64 65 78 2d 3e 6e 43 6f       pIndex->nCo
1a340 6c 75 6d 6e 2d 2d 3b 20 0a 20 20 20 20 20 20 7d  lumn--; .      }
1a350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
1a360 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  ndex->aiColumn[i
1a370 5d 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70  ] = x;.        p
1a380 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d  Index->azColl[i]
1a390 20 3d 20 70 50 6b 2d 3e 61 7a 43 6f 6c 6c 5b 6a   = pPk->azColl[j
1a3a0 5d 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65  ];.        pInde
1a3b0 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d  x->aSortOrder[i]
1a3c0 20 3d 20 70 50 6b 2d 3e 61 53 6f 72 74 4f 72 64   = pPk->aSortOrd
1a3d0 65 72 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  er[j];.        i
1a3e0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
1a3f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d  }.    assert( i=
1a400 3d 70 49 6e 64 65 78 2d 3e 6e 43 6f 6c 75 6d 6e  =pIndex->nColumn
1a410 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1a420 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75 6d   pIndex->aiColum
1a430 6e 5b 69 5d 20 3d 20 58 4e 5f 52 4f 57 49 44 3b  n[i] = XN_ROWID;
1a440 0a 20 20 20 20 70 49 6e 64 65 78 2d 3e 61 7a 43  .    pIndex->azC
1a450 6f 6c 6c 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  oll[i] = sqlite3
1a460 53 74 72 42 49 4e 41 52 59 3b 0a 20 20 7d 0a 20  StrBINARY;.  }. 
1a470 20 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52   sqlite3DefaultR
1a480 6f 77 45 73 74 28 70 49 6e 64 65 78 29 3b 0a 20  owEst(pIndex);. 
1a490 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 4e 65   if( pParse->pNe
1a4a0 77 54 61 62 6c 65 3d 3d 30 20 29 20 65 73 74 69  wTable==0 ) esti
1a4b0 6d 61 74 65 49 6e 64 65 78 57 69 64 74 68 28 70  mateIndexWidth(p
1a4c0 49 6e 64 65 78 29 3b 0a 0a 20 20 69 66 28 20 70  Index);..  if( p
1a4d0 54 61 62 3d 3d 70 50 61 72 73 65 2d 3e 70 4e 65  Tab==pParse->pNe
1a4e0 77 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 2f 2a  wTable ){.    /*
1a4f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61   This routine ha
1a500 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 74 6f  s been called to
1a510 20 63 72 65 61 74 65 20 61 6e 20 61 75 74 6f 6d   create an autom
1a520 61 74 69 63 20 69 6e 64 65 78 20 61 73 20 61 0a  atic index as a.
1a530 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 20 6f 66      ** result of
1a540 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20 6f   a PRIMARY KEY o
1a550 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65 20  r UNIQUE clause 
1a560 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 64 65 66 69  on a column defi
1a570 6e 69 74 69 6f 6e 2c 20 6f 72 0a 20 20 20 20 2a  nition, or.    *
1a580 2a 20 61 20 50 52 49 4d 41 52 59 20 4b 45 59 20  * a PRIMARY KEY 
1a590 6f 72 20 55 4e 49 51 55 45 20 63 6c 61 75 73 65  or UNIQUE clause
1a5a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63   following the c
1a5b0 6f 6c 75 6d 6e 20 64 65 66 69 6e 69 74 69 6f 6e  olumn definition
1a5c0 73 2e 0a 20 20 20 20 2a 2a 20 69 2e 65 2e 20 6f  s..    ** i.e. o
1a5d0 6e 65 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a 20 20  ne of:.    **.  
1a5e0 20 20 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c    ** CREATE TABL
1a5f0 45 20 74 28 78 20 50 52 49 4d 41 52 59 20 4b 45  E t(x PRIMARY KE
1a600 59 2c 20 79 29 3b 0a 20 20 20 20 2a 2a 20 43 52  Y, y);.    ** CR
1a610 45 41 54 45 20 54 41 42 4c 45 20 74 28 78 2c 20  EATE TABLE t(x, 
1a620 79 2c 20 55 4e 49 51 55 45 28 78 2c 20 79 29 29  y, UNIQUE(x, y))
1a630 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
1a640 45 69 74 68 65 72 20 77 61 79 2c 20 63 68 65 63  Either way, chec
1a650 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
1a660 74 61 62 6c 65 20 61 6c 72 65 61 64 79 20 68 61  table already ha
1a670 73 20 73 75 63 68 20 61 6e 20 69 6e 64 65 78 2e  s such an index.
1a680 20 49 66 0a 20 20 20 20 2a 2a 20 73 6f 2c 20 64   If.    ** so, d
1a690 6f 6e 27 74 20 62 6f 74 68 65 72 20 63 72 65 61  on't bother crea
1a6a0 74 69 6e 67 20 74 68 69 73 20 6f 6e 65 2e 20 54  ting this one. T
1a6b0 68 69 73 20 6f 6e 6c 79 20 61 70 70 6c 69 65 73  his only applies
1a6c0 20 74 6f 0a 20 20 20 20 2a 2a 20 61 75 74 6f 6d   to.    ** autom
1a6d0 61 74 69 63 61 6c 6c 79 20 63 72 65 61 74 65 64  atically created
1a6e0 20 69 6e 64 69 63 65 73 2e 20 55 73 65 72 73 20   indices. Users 
1a6f0 63 61 6e 20 64 6f 20 61 73 20 74 68 65 79 20 77  can do as they w
1a700 69 73 68 20 77 69 74 68 0a 20 20 20 20 2a 2a 20  ish with.    ** 
1a710 65 78 70 6c 69 63 69 74 20 69 6e 64 69 63 65 73  explicit indices
1a720 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1a730 54 77 6f 20 55 4e 49 51 55 45 20 6f 72 20 50 52  Two UNIQUE or PR
1a740 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73 74 72  IMARY KEY constr
1a750 61 69 6e 74 73 20 61 72 65 20 63 6f 6e 73 69 64  aints are consid
1a760 65 72 65 64 20 65 71 75 69 76 61 6c 65 6e 74 0a  ered equivalent.
1a770 20 20 20 20 2a 2a 20 28 61 6e 64 20 74 68 75 73      ** (and thus
1a780 20 73 75 70 70 72 65 73 73 69 6e 67 20 74 68 65   suppressing the
1a790 20 73 65 63 6f 6e 64 20 6f 6e 65 29 20 65 76 65   second one) eve
1a7a0 6e 20 69 66 20 74 68 65 79 20 68 61 76 65 20 64  n if they have d
1a7b0 69 66 66 65 72 65 6e 74 0a 20 20 20 20 2a 2a 20  ifferent.    ** 
1a7c0 73 6f 72 74 20 6f 72 64 65 72 73 2e 0a 20 20 20  sort orders..   
1a7d0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
1a7e0 65 72 65 20 61 72 65 20 64 69 66 66 65 72 65 6e  ere are differen
1a7f0 74 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  t collating sequ
1a800 65 6e 63 65 73 20 6f 72 20 69 66 20 74 68 65 20  ences or if the 
1a810 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 20 20 2a  columns of.    *
1a820 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  * the constraint
1a830 20 6f 63 63 75 72 20 69 6e 20 64 69 66 66 65 72   occur in differ
1a840 65 6e 74 20 6f 72 64 65 72 73 2c 20 74 68 65 6e  ent orders, then
1a850 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73   the constraints
1a860 20 61 72 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   are.    ** cons
1a870 69 64 65 72 65 64 20 64 69 73 74 69 6e 63 74 20  idered distinct 
1a880 61 6e 64 20 62 6f 74 68 20 72 65 73 75 6c 74 20  and both result 
1a890 69 6e 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  in separate indi
1a8a0 63 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ces..    */.    
1a8b0 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 20  Index *pIdx;.   
1a8c0 20 66 6f 72 28 70 49 64 78 3d 70 54 61 62 2d 3e   for(pIdx=pTab->
1a8d0 70 49 6e 64 65 78 3b 20 70 49 64 78 3b 20 70 49  pIndex; pIdx; pI
1a8e0 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b  dx=pIdx->pNext){
1a8f0 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  .      int k;.  
1a900 20 20 20 20 61 73 73 65 72 74 28 20 49 73 55 6e      assert( IsUn
1a910 69 71 75 65 49 6e 64 65 78 28 70 49 64 78 29 20  iqueIndex(pIdx) 
1a920 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a930 20 70 49 64 78 2d 3e 69 64 78 54 79 70 65 21 3d   pIdx->idxType!=
1a940 53 51 4c 49 54 45 5f 49 44 58 54 59 50 45 5f 41  SQLITE_IDXTYPE_A
1a950 50 50 44 45 46 20 29 3b 0a 20 20 20 20 20 20 61  PPDEF );.      a
1a960 73 73 65 72 74 28 20 49 73 55 6e 69 71 75 65 49  ssert( IsUniqueI
1a970 6e 64 65 78 28 70 49 6e 64 65 78 29 20 29 3b 0a  ndex(pIndex) );.
1a980 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d  .      if( pIdx-
1a990 3e 6e 4b 65 79 43 6f 6c 21 3d 70 49 6e 64 65 78  >nKeyCol!=pIndex
1a9a0 2d 3e 6e 4b 65 79 43 6f 6c 20 29 20 63 6f 6e 74  ->nKeyCol ) cont
1a9b0 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
1a9c0 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e 6e 4b 65  k=0; k<pIdx->nKe
1a9d0 79 43 6f 6c 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  yCol; k++){.    
1a9e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1a9f0 7a 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  z1;.        cons
1aa00 74 20 63 68 61 72 20 2a 7a 32 3b 0a 20 20 20 20  t char *z2;.    
1aa10 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78      assert( pIdx
1aa20 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3e 3d 30  ->aiColumn[k]>=0
1aa30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1aa40 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b  pIdx->aiColumn[k
1aa50 5d 21 3d 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c  ]!=pIndex->aiCol
1aa60 75 6d 6e 5b 6b 5d 20 29 20 62 72 65 61 6b 3b 0a  umn[k] ) break;.
1aa70 20 20 20 20 20 20 20 20 7a 31 20 3d 20 70 49 64          z1 = pId
1aa80 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1aa90 20 20 20 20 20 20 7a 32 20 3d 20 70 49 6e 64 65        z2 = pInde
1aaa0 78 2d 3e 61 7a 43 6f 6c 6c 5b 6b 5d 3b 0a 20 20  x->azColl[k];.  
1aab0 20 20 20 20 20 20 69 66 28 20 7a 31 21 3d 7a 32        if( z1!=z2
1aac0 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
1aad0 6d 70 28 7a 31 2c 20 7a 32 29 20 29 20 62 72 65  mp(z1, z2) ) bre
1aae0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1aaf0 20 20 69 66 28 20 6b 3d 3d 70 49 64 78 2d 3e 6e    if( k==pIdx->n
1ab00 4b 65 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  KeyCol ){.      
1ab10 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1ab20 72 6f 72 21 3d 70 49 6e 64 65 78 2d 3e 6f 6e 45  ror!=pIndex->onE
1ab30 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rror ){.        
1ab40 20 20 2f 2a 20 54 68 69 73 20 63 6f 6e 73 74 72    /* This constr
1ab50 61 69 6e 74 20 63 72 65 61 74 65 73 20 74 68 65  aint creates the
1ab60 20 73 61 6d 65 20 69 6e 64 65 78 20 61 73 20 61   same index as a
1ab70 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1ab80 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e      ** constrain
1ab90 74 20 73 70 65 63 69 66 69 65 64 20 73 6f 6d 65  t specified some
1aba0 77 68 65 72 65 20 69 6e 20 74 68 65 20 43 52 45  where in the CRE
1abb0 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
1abc0 65 6e 74 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ent..          *
1abd0 2a 20 48 6f 77 65 76 65 72 20 74 68 65 20 4f 4e  * However the ON
1abe0 20 43 4f 4e 46 4c 49 43 54 20 63 6c 61 75 73 65   CONFLICT clause
1abf0 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2e  s are different.
1ac00 20 49 66 20 62 6f 74 68 20 74 68 69 73 20 0a 20   If both this . 
1ac10 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
1ac20 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 20 70  traint and the p
1ac30 72 65 76 69 6f 75 73 20 65 71 75 69 76 61 6c 65  revious equivale
1ac40 6e 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 68 61  nt constraint ha
1ac50 76 65 20 65 78 70 6c 69 63 69 74 0a 20 20 20 20  ve explicit.    
1ac60 20 20 20 20 20 20 2a 2a 20 4f 4e 20 43 4f 4e 46        ** ON CONF
1ac70 4c 49 43 54 20 63 6c 61 75 73 65 73 20 74 68 69  LICT clauses thi
1ac80 73 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 4f  s is an error. O
1ac90 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
1aca0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65  e.          ** e
1acb0 78 70 6c 69 63 69 74 6c 79 20 73 70 65 63 69 66  xplicitly specif
1acc0 69 65 64 20 62 65 68 61 76 69 6f 72 20 66 6f 72  ied behavior for
1acd0 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
1ace0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1acf0 20 20 20 69 66 28 20 21 28 70 49 64 78 2d 3e 6f     if( !(pIdx->o
1ad00 6e 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75  nError==OE_Defau
1ad10 6c 74 20 7c 7c 20 70 49 6e 64 65 78 2d 3e 6f 6e  lt || pIndex->on
1ad20 45 72 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c  Error==OE_Defaul
1ad30 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
1ad40 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1ad50 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
1ad60 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 6e 66             "conf
1ad70 6c 69 63 74 69 6e 67 20 4f 4e 20 43 4f 4e 46 4c  licting ON CONFL
1ad80 49 43 54 20 63 6c 61 75 73 65 73 20 73 70 65 63  ICT clauses spec
1ad90 69 66 69 65 64 22 2c 20 30 29 3b 0a 20 20 20 20  ified", 0);.    
1ada0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1adb0 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
1adc0 72 6f 72 3d 3d 4f 45 5f 44 65 66 61 75 6c 74 20  ror==OE_Default 
1add0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1ade0 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 20 3d 20 70  Idx->onError = p
1adf0 49 6e 64 65 78 2d 3e 6f 6e 45 72 72 6f 72 3b 0a  Index->onError;.
1ae00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1ae10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 52      }.        pR
1ae20 65 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20  et = pIdx;.     
1ae30 20 20 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65     goto exit_cre
1ae40 61 74 65 5f 69 6e 64 65 78 3b 0a 20 20 20 20 20  ate_index;.     
1ae50 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1ae60 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 6e 65 77 20  /* Link the new 
1ae70 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
1ae80 74 6f 20 69 74 73 20 74 61 62 6c 65 20 61 6e 64  to its table and
1ae90 20 74 6f 20 74 68 65 20 6f 74 68 65 72 0a 20 20   to the other.  
1aea0 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
1aeb0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 73  abase structures
1aec0 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  . .  */.  assert
1aed0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3d 3d  ( pParse->nErr==
1aee0 30 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 69  0 );.  if( db->i
1aef0 6e 69 74 2e 62 75 73 79 20 29 7b 0a 20 20 20 20  nit.busy ){.    
1af00 49 6e 64 65 78 20 2a 70 3b 0a 20 20 20 20 61 73  Index *p;.    as
1af10 73 65 72 74 28 20 73 71 6c 69 74 65 33 53 63 68  sert( sqlite3Sch
1af20 65 6d 61 4d 75 74 65 78 48 65 6c 64 28 64 62 2c  emaMutexHeld(db,
1af30 20 30 2c 20 70 49 6e 64 65 78 2d 3e 70 53 63 68   0, pIndex->pSch
1af40 65 6d 61 29 20 29 3b 0a 20 20 20 20 70 20 3d 20  ema) );.    p = 
1af50 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
1af60 74 28 26 70 49 6e 64 65 78 2d 3e 70 53 63 68 65  t(&pIndex->pSche
1af70 6d 61 2d 3e 69 64 78 48 61 73 68 2c 20 0a 20 20  ma->idxHash, .  
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af90 20 20 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e          pIndex->
1afa0 7a 4e 61 6d 65 2c 20 70 49 6e 64 65 78 29 3b 0a  zName, pIndex);.
1afb0 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
1afc0 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d 70 49     assert( p==pI
1afd0 6e 64 65 78 20 29 3b 20 20 2f 2a 20 4d 61 6c 6c  ndex );  /* Mall
1afe0 6f 63 20 6d 75 73 74 20 68 61 76 65 20 66 61 69  oc must have fai
1aff0 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 62 2d  led */.      db-
1b000 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
1b010 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78  1;.      goto ex
1b020 69 74 5f 63 72 65 61 74 65 5f 69 6e 64 65 78 3b  it_create_index;
1b030 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 66  .    }.    db->f
1b040 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49  lags |= SQLITE_I
1b050 6e 74 65 72 6e 43 68 61 6e 67 65 73 3b 0a 20 20  nternChanges;.  
1b060 20 20 69 66 28 20 70 54 62 6c 4e 61 6d 65 21 3d    if( pTblName!=
1b070 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 64 65  0 ){.      pInde
1b080 78 2d 3e 74 6e 75 6d 20 3d 20 64 62 2d 3e 69 6e  x->tnum = db->in
1b090 69 74 2e 6e 65 77 54 6e 75 6d 3b 0a 20 20 20 20  it.newTnum;.    
1b0a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
1b0b0 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74 69  his is the initi
1b0c0 61 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  al CREATE INDEX 
1b0d0 73 74 61 74 65 6d 65 6e 74 20 28 6f 72 20 43 52  statement (or CR
1b0e0 45 41 54 45 20 54 41 42 4c 45 20 69 66 20 74 68  EATE TABLE if th
1b0f0 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69 73 20  e.  ** index is 
1b100 61 6e 20 69 6d 70 6c 69 65 64 20 69 6e 64 65 78  an implied index
1b110 20 66 6f 72 20 61 20 55 4e 49 51 55 45 20 6f 72   for a UNIQUE or
1b120 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e   PRIMARY KEY con
1b130 73 74 72 61 69 6e 74 29 20 74 68 65 6e 0a 20 20  straint) then.  
1b140 2a 2a 20 65 6d 69 74 20 63 6f 64 65 20 74 6f 20  ** emit code to 
1b150 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 69 6e 64  allocate the ind
1b160 65 78 20 72 6f 6f 74 70 61 67 65 20 6f 6e 20 64  ex rootpage on d
1b170 69 73 6b 20 61 6e 64 20 6d 61 6b 65 20 61 6e 20  isk and make an 
1b180 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 74  entry for.  ** t
1b190 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20  he index in the 
1b1a0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
1b1b0 62 6c 65 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ble and populate
1b1c0 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 0a   the index with.
1b1d0 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 42    ** content.  B
1b1e0 75 74 2c 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68  ut, do not do th
1b1f0 69 73 20 69 66 20 77 65 20 61 72 65 20 73 69 6d  is if we are sim
1b200 70 6c 79 20 72 65 61 64 69 6e 67 20 74 68 65 20  ply reading the 
1b210 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 0a 20 20  sqlite_master.  
1b220 2a 2a 20 74 61 62 6c 65 20 74 6f 20 70 61 72 73  ** table to pars
1b230 65 20 74 68 65 20 73 63 68 65 6d 61 2c 20 6f 72  e the schema, or
1b240 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 69   if this index i
1b250 73 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45  s the PRIMARY KE
1b260 59 20 69 6e 64 65 78 0a 20 20 2a 2a 20 6f 66 20  Y index.  ** of 
1b270 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
1b280 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
1b290 20 49 66 20 70 54 62 6c 4e 61 6d 65 3d 3d 30 20   If pTblName==0 
1b2a0 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 69 6e  it means this in
1b2b0 64 65 78 20 69 73 20 67 65 6e 65 72 61 74 65 64  dex is generated
1b2c0 20 61 73 20 61 6e 20 69 6d 70 6c 69 65 64 20 50   as an implied P
1b2d0 52 49 4d 41 52 59 20 4b 45 59 0a 20 20 2a 2a 20  RIMARY KEY.  ** 
1b2e0 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20  or UNIQUE index 
1b2f0 69 6e 20 61 20 43 52 45 41 54 45 20 54 41 42 4c  in a CREATE TABL
1b300 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 69  E statement.  Si
1b310 6e 63 65 20 74 68 65 20 74 61 62 6c 65 0a 20 20  nce the table.  
1b320 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
1b330 20 63 72 65 61 74 65 64 2c 20 69 74 20 63 6f 6e   created, it con
1b340 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 20 61 6e  tains no data an
1b350 64 20 74 68 65 20 69 6e 64 65 78 20 69 6e 69 74  d the index init
1b360 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1b370 73 74 65 70 20 63 61 6e 20 62 65 20 73 6b 69 70  step can be skip
1b380 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  ped..  */.  else
1b390 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54   if( HasRowid(pT
1b3a0 61 62 29 20 7c 7c 20 70 54 62 6c 4e 61 6d 65 21  ab) || pTblName!
1b3b0 3d 30 20 29 7b 0a 20 20 20 20 56 64 62 65 20 2a  =0 ){.    Vdbe *
1b3c0 76 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 74  v;.    char *zSt
1b3d0 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 4d 65 6d  mt;.    int iMem
1b3e0 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1b3f0 6d 3b 0a 0a 20 20 20 20 76 20 3d 20 73 71 6c 69  m;..    v = sqli
1b400 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
1b410 65 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d 30  e);.    if( v==0
1b420 20 29 20 67 6f 74 6f 20 65 78 69 74 5f 63 72 65   ) goto exit_cre
1b430 61 74 65 5f 69 6e 64 65 78 3b 0a 0a 20 20 20 20  ate_index;..    
1b440 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1b450 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1b460 65 2c 20 31 2c 20 69 44 62 29 3b 0a 0a 20 20 20  e, 1, iDb);..   
1b470 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 72   /* Create the r
1b480 6f 6f 74 70 61 67 65 20 66 6f 72 20 74 68 65 20  ootpage for the 
1b490 69 6e 64 65 78 20 75 73 69 6e 67 20 43 72 65 61  index using Crea
1b4a0 74 65 49 6e 64 65 78 2e 20 42 75 74 20 62 65 66  teIndex. But bef
1b4b0 6f 72 65 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67  ore.    ** doing
1b4c0 20 73 6f 2c 20 63 6f 64 65 20 61 20 4e 6f 6f 70   so, code a Noop
1b4d0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64   instruction and
1b4e0 20 73 74 6f 72 65 20 69 74 73 20 61 64 64 72 65   store its addre
1b4f0 73 73 20 69 6e 20 0a 20 20 20 20 2a 2a 20 49 6e  ss in .    ** In
1b500 64 65 78 2e 74 6e 75 6d 2e 20 54 68 69 73 20 69  dex.tnum. This i
1b510 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 63 61  s required in ca
1b520 73 65 20 74 68 69 73 20 69 6e 64 65 78 20 69 73  se this index is
1b530 20 61 63 74 75 61 6c 6c 79 20 61 20 0a 20 20 20   actually a .   
1b540 20 2a 2a 20 50 52 49 4d 41 52 59 20 4b 45 59 20   ** PRIMARY KEY 
1b550 61 6e 64 20 74 68 65 20 74 61 62 6c 65 20 69 73  and the table is
1b560 20 61 63 74 75 61 6c 6c 79 20 61 20 57 49 54 48   actually a WITH
1b570 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65 2e  OUT ROWID table.
1b580 20 49 6e 20 0a 20 20 20 20 2a 2a 20 74 68 61 74   In .    ** that
1b590 20 63 61 73 65 20 74 68 65 20 63 6f 6e 76 65 72   case the conver
1b5a0 74 54 6f 57 69 74 68 6f 75 74 52 6f 77 69 64 54  tToWithoutRowidT
1b5b0 61 62 6c 65 28 29 20 72 6f 75 74 69 6e 65 20 77  able() routine w
1b5c0 69 6c 6c 20 72 65 70 6c 61 63 65 0a 20 20 20 20  ill replace.    
1b5d0 2a 2a 20 74 68 65 20 4e 6f 6f 70 20 77 69 74 68  ** the Noop with
1b5e0 20 61 20 47 6f 74 6f 20 74 6f 20 6a 75 6d 70 20   a Goto to jump 
1b5f0 6f 76 65 72 20 74 68 65 20 56 44 42 45 20 63 6f  over the VDBE co
1b600 64 65 20 67 65 6e 65 72 61 74 65 64 20 62 65 6c  de generated bel
1b610 6f 77 2e 20 2a 2f 0a 20 20 20 20 70 49 6e 64 65  ow. */.    pInde
1b620 78 2d 3e 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65  x->tnum = sqlite
1b630 33 56 64 62 65 41 64 64 4f 70 30 28 76 2c 20 4f  3VdbeAddOp0(v, O
1b640 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 73 71 6c  P_Noop);.    sql
1b650 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b660 2c 20 4f 50 5f 43 72 65 61 74 65 49 6e 64 65 78  , OP_CreateIndex
1b670 2c 20 69 44 62 2c 20 69 4d 65 6d 29 3b 0a 0a 20  , iDb, iMem);.. 
1b680 20 20 20 2f 2a 20 47 61 74 68 65 72 20 74 68 65     /* Gather the
1b690 20 63 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   complete text o
1b6a0 66 20 74 68 65 20 43 52 45 41 54 45 20 49 4e 44  f the CREATE IND
1b6b0 45 58 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 74  EX statement int
1b6c0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 7a 53 74  o.    ** the zSt
1b6d0 6d 74 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  mt variable.    
1b6e0 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 61 72  */.    if( pStar
1b6f0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
1b700 20 3d 20 28 69 6e 74 29 28 70 50 61 72 73 65 2d   = (int)(pParse-
1b710 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 7a 20 2d 20  >sLastToken.z - 
1b720 70 4e 61 6d 65 2d 3e 7a 29 20 2b 20 70 50 61 72  pName->z) + pPar
1b730 73 65 2d 3e 73 4c 61 73 74 54 6f 6b 65 6e 2e 6e  se->sLastToken.n
1b740 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 61 6d  ;.      if( pNam
1b750 65 2d 3e 7a 5b 6e 2d 31 5d 3d 3d 27 3b 27 20 29  e->z[n-1]==';' )
1b760 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 2f 2a 20 41   n--;.      /* A
1b770 20 6e 61 6d 65 64 20 69 6e 64 65 78 20 77 69 74   named index wit
1b780 68 20 61 6e 20 65 78 70 6c 69 63 69 74 20 43 52  h an explicit CR
1b790 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
1b7a0 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 20 20 7a 53  ment */.      zS
1b7b0 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  tmt = sqlite3MPr
1b7c0 69 6e 74 66 28 64 62 2c 20 22 43 52 45 41 54 45  intf(db, "CREATE
1b7d0 25 73 20 49 4e 44 45 58 20 25 2e 2a 73 22 2c 0a  %s INDEX %.*s",.
1b7e0 20 20 20 20 20 20 20 20 6f 6e 45 72 72 6f 72 3d          onError=
1b7f0 3d 4f 45 5f 4e 6f 6e 65 20 3f 20 22 22 20 3a 20  =OE_None ? "" : 
1b800 22 20 55 4e 49 51 55 45 22 2c 20 6e 2c 20 70 4e  " UNIQUE", n, pN
1b810 61 6d 65 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  ame->z);.    }el
1b820 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1b830 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
1b840 63 72 65 61 74 65 64 20 62 79 20 61 20 50 52 49  created by a PRI
1b850 4d 41 52 59 20 4b 45 59 20 6f 72 20 55 4e 49 51  MARY KEY or UNIQ
1b860 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
1b870 0a 20 20 20 20 20 20 2f 2a 20 7a 53 74 6d 74 20  .      /* zStmt 
1b880 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1b890 28 22 22 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7a  (""); */.      z
1b8a0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Stmt = 0;.    }.
1b8b0 0a 20 20 20 20 2f 2a 20 41 64 64 20 61 6e 20 65  .    /* Add an e
1b8c0 6e 74 72 79 20 69 6e 20 73 71 6c 69 74 65 5f 6d  ntry in sqlite_m
1b8d0 61 73 74 65 72 20 66 6f 72 20 74 68 69 73 20 69  aster for this i
1b8e0 6e 64 65 78 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ndex.    */.    
1b8f0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1b900 73 65 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  se(pParse, .    
1b910 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1b920 20 25 51 2e 25 73 20 56 41 4c 55 45 53 28 27 69   %Q.%s VALUES('i
1b930 6e 64 65 78 27 2c 25 51 2c 25 51 2c 23 25 64 2c  ndex',%Q,%Q,#%d,
1b940 25 51 29 3b 22 2c 0a 20 20 20 20 20 20 20 20 64  %Q);",.        d
1b950 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d  b->aDb[iDb].zNam
1b960 65 2c 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28  e, SCHEMA_TABLE(
1b970 69 44 62 29 2c 0a 20 20 20 20 20 20 20 20 70 49  iDb),.        pI
1b980 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20  ndex->zName,.   
1b990 20 20 20 20 20 70 54 61 62 2d 3e 7a 4e 61 6d 65       pTab->zName
1b9a0 2c 0a 20 20 20 20 20 20 20 20 69 4d 65 6d 2c 0a  ,.        iMem,.
1b9b0 20 20 20 20 20 20 20 20 7a 53 74 6d 74 0a 20 20          zStmt.  
1b9c0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
1b9d0 44 62 46 72 65 65 28 64 62 2c 20 7a 53 74 6d 74  DbFree(db, zStmt
1b9e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6c 6c 20  );..    /* Fill 
1b9f0 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 64  the index with d
1ba00 61 74 61 20 61 6e 64 20 72 65 70 61 72 73 65 20  ata and reparse 
1ba10 74 68 65 20 73 63 68 65 6d 61 2e 20 43 6f 64 65  the schema. Code
1ba20 20 61 6e 20 4f 50 5f 45 78 70 69 72 65 0a 20 20   an OP_Expire.  
1ba30 20 20 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61    ** to invalida
1ba40 74 65 20 61 6c 6c 20 70 72 65 2d 63 6f 6d 70 69  te all pre-compi
1ba50 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
1ba60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1ba70 54 62 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  TblName ){.     
1ba80 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
1ba90 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
1baa0 65 78 2c 20 69 4d 65 6d 29 3b 0a 20 20 20 20 20  ex, iMem);.     
1bab0 20 73 71 6c 69 74 65 33 43 68 61 6e 67 65 43 6f   sqlite3ChangeCo
1bac0 6f 6b 69 65 28 70 50 61 72 73 65 2c 20 69 44 62  okie(pParse, iDb
1bad0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1bae0 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65  VdbeAddParseSche
1baf0 6d 61 4f 70 28 76 2c 20 69 44 62 2c 0a 20 20 20  maOp(v, iDb,.   
1bb00 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 50 72        sqlite3MPr
1bb10 69 6e 74 66 28 64 62 2c 20 22 6e 61 6d 65 3d 27  intf(db, "name='
1bb20 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69 6e  %q' AND type='in
1bb30 64 65 78 27 22 2c 20 70 49 6e 64 65 78 2d 3e 7a  dex'", pIndex->z
1bb40 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 73 71  Name));.      sq
1bb50 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
1bb60 76 2c 20 4f 50 5f 45 78 70 69 72 65 2c 20 30 29  v, OP_Expire, 0)
1bb70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
1bb80 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
1bb90 28 76 2c 20 70 49 6e 64 65 78 2d 3e 74 6e 75 6d  (v, pIndex->tnum
1bba0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65  );.  }..  /* Whe
1bbb0 6e 20 61 64 64 69 6e 67 20 61 6e 20 69 6e 64 65  n adding an inde
1bbc0 78 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  x to the list of
1bbd0 20 69 6e 64 69 63 65 73 20 66 6f 72 20 61 20 74   indices for a t
1bbe0 61 62 6c 65 2c 20 6d 61 6b 65 0a 20 20 2a 2a 20  able, make.  ** 
1bbf0 73 75 72 65 20 61 6c 6c 20 69 6e 64 69 63 65 73  sure all indices
1bc00 20 6c 61 62 65 6c 65 64 20 4f 45 5f 52 65 70 6c   labeled OE_Repl
1bc10 61 63 65 20 63 6f 6d 65 20 61 66 74 65 72 20 61  ace come after a
1bc20 6c 6c 20 74 68 6f 73 65 20 6c 61 62 65 6c 65 64  ll those labeled
1bc30 0a 20 20 2a 2a 20 4f 45 5f 49 67 6e 6f 72 65 2e  .  ** OE_Ignore.
1bc40 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
1bc50 61 72 79 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ary for the corr
1bc60 65 63 74 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  ect constraint c
1bc70 68 65 63 6b 0a 20 20 2a 2a 20 70 72 6f 63 65 73  heck.  ** proces
1bc80 73 69 6e 67 20 28 69 6e 20 73 71 6c 69 74 65 33  sing (in sqlite3
1bc90 47 65 6e 65 72 61 74 65 43 6f 6e 73 74 72 61 69  GenerateConstrai
1bca0 6e 74 43 68 65 63 6b 73 28 29 29 20 61 73 20 70  ntChecks()) as p
1bcb0 61 72 74 20 6f 66 0a 20 20 2a 2a 20 55 50 44 41  art of.  ** UPDA
1bcc0 54 45 20 61 6e 64 20 49 4e 53 45 52 54 20 73 74  TE and INSERT st
1bcd0 61 74 65 6d 65 6e 74 73 2e 20 20 0a 20 20 2a 2f  atements.  .  */
1bce0 0a 20 20 69 66 28 20 64 62 2d 3e 69 6e 69 74 2e  .  if( db->init.
1bcf0 62 75 73 79 20 7c 7c 20 70 54 62 6c 4e 61 6d 65  busy || pTblName
1bd00 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ==0 ){.    if( o
1bd10 6e 45 72 72 6f 72 21 3d 4f 45 5f 52 65 70 6c 61  nError!=OE_Repla
1bd20 63 65 20 7c 7c 20 70 54 61 62 2d 3e 70 49 6e 64  ce || pTab->pInd
1bd30 65 78 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 7c  ex==0.         |
1bd40 7c 20 70 54 61 62 2d 3e 70 49 6e 64 65 78 2d 3e  | pTab->pIndex->
1bd50 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 52 65 70 6c  onError==OE_Repl
1bd60 61 63 65 29 7b 0a 20 20 20 20 20 20 70 49 6e 64  ace){.      pInd
1bd70 65 78 2d 3e 70 4e 65 78 74 20 3d 20 70 54 61 62  ex->pNext = pTab
1bd80 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 20 20  ->pIndex;.      
1bd90 70 54 61 62 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pTab->pIndex = p
1bda0 49 6e 64 65 78 3b 0a 20 20 20 20 7d 65 6c 73 65  Index;.    }else
1bdb0 7b 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70  {.      Index *p
1bdc0 4f 74 68 65 72 20 3d 20 70 54 61 62 2d 3e 70 49  Other = pTab->pI
1bdd0 6e 64 65 78 3b 0a 20 20 20 20 20 20 77 68 69 6c  ndex;.      whil
1bde0 65 28 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78 74  e( pOther->pNext
1bdf0 20 26 26 20 70 4f 74 68 65 72 2d 3e 70 4e 65 78   && pOther->pNex
1be00 74 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 52  t->onError!=OE_R
1be10 65 70 6c 61 63 65 20 29 7b 0a 20 20 20 20 20 20  eplace ){.      
1be20 20 20 70 4f 74 68 65 72 20 3d 20 70 4f 74 68 65    pOther = pOthe
1be30 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
1be40 7d 0a 20 20 20 20 20 20 70 49 6e 64 65 78 2d 3e  }.      pIndex->
1be50 70 4e 65 78 74 20 3d 20 70 4f 74 68 65 72 2d 3e  pNext = pOther->
1be60 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4f 74  pNext;.      pOt
1be70 68 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  her->pNext = pIn
1be80 64 65 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  dex;.    }.    p
1be90 52 65 74 20 3d 20 70 49 6e 64 65 78 3b 0a 20 20  Ret = pIndex;.  
1bea0 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20    pIndex = 0;.  
1beb0 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
1bec0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
1bed0 2a 2f 0a 65 78 69 74 5f 63 72 65 61 74 65 5f 69  */.exit_create_i
1bee0 6e 64 65 78 3a 0a 20 20 69 66 28 20 70 49 6e 64  ndex:.  if( pInd
1bef0 65 78 20 29 20 66 72 65 65 49 6e 64 65 78 28 64  ex ) freeIndex(d
1bf00 62 2c 20 70 49 6e 64 65 78 29 3b 0a 20 20 73 71  b, pIndex);.  sq
1bf10 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1bf20 64 62 2c 20 70 50 49 57 68 65 72 65 29 3b 0a 20  db, pPIWhere);. 
1bf30 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
1bf40 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74  Delete(db, pList
1bf50 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 72 63 4c  );.  sqlite3SrcL
1bf60 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 54  istDelete(db, pT
1bf70 62 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  blName);.  sqlit
1bf80 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61  e3DbFree(db, zNa
1bf90 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  me);.  return pR
1bfa0 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c  et;.}../*.** Fil
1bfb0 6c 20 74 68 65 20 49 6e 64 65 78 2e 61 69 52 6f  l the Index.aiRo
1bfc0 77 45 73 74 5b 5d 20 61 72 72 61 79 20 77 69 74  wEst[] array wit
1bfd0 68 20 64 65 66 61 75 6c 74 20 69 6e 66 6f 72 6d  h default inform
1bfe0 61 74 69 6f 6e 20 2d 20 69 6e 66 6f 72 6d 61 74  ation - informat
1bff0 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 75 73 65  ion.** to be use
1c000 64 20 77 68 65 6e 20 77 65 20 68 61 76 65 20 6e  d when we have n
1c010 6f 74 20 72 75 6e 20 74 68 65 20 41 4e 41 4c 59  ot run the ANALY
1c020 5a 45 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  ZE command..**.*
1c030 2a 20 61 69 52 6f 77 45 73 74 5b 30 5d 20 69 73  * aiRowEst[0] is
1c040 20 73 75 70 70 6f 73 65 64 20 74 6f 20 63 6f 6e   supposed to con
1c050 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  tain the number 
1c060 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
1c070 68 65 20 69 6e 64 65 78 2e 0a 2a 2a 20 53 69 6e  he index..** Sin
1c080 63 65 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f  ce we do not kno
1c090 77 2c 20 67 75 65 73 73 20 31 20 6d 69 6c 6c 69  w, guess 1 milli
1c0a0 6f 6e 2e 20 20 61 69 52 6f 77 45 73 74 5b 31 5d  on.  aiRowEst[1]
1c0b0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1c0c0 6f 66 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  of the.** number
1c0d0 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
1c0e0 74 61 62 6c 65 20 74 68 61 74 20 6d 61 74 63 68  table that match
1c0f0 20 61 6e 79 20 70 61 72 74 69 63 75 6c 61 72 20   any particular 
1c100 76 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20  value of the.** 
1c110 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  first column of 
1c120 74 68 65 20 69 6e 64 65 78 2e 20 20 61 69 52 6f  the index.  aiRo
1c130 77 45 73 74 5b 32 5d 20 69 73 20 61 6e 20 65 73  wEst[2] is an es
1c140 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6e 75  timate of the nu
1c150 6d 62 65 72 0a 2a 2a 20 6f 66 20 72 6f 77 73 20  mber.** of rows 
1c160 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20 70  that match any p
1c170 61 72 74 69 63 75 6c 61 72 20 63 6f 6d 62 69 6e  articular combin
1c180 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
1c190 73 74 20 32 20 63 6f 6c 75 6d 6e 73 0a 2a 2a 20  st 2 columns.** 
1c1a0 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 41  of the index.  A
1c1b0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 74  nd so forth.  It
1c1c0 20 6d 75 73 74 20 61 6c 77 61 79 73 20 62 65 20   must always be 
1c1d0 74 68 65 20 63 61 73 65 20 74 68 61 74 0a 2a 0a  the case that.*.
1c1e0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 61 69 52  **           aiR
1c1f0 6f 77 45 73 74 5b 4e 5d 3c 3d 61 69 52 6f 77 45  owEst[N]<=aiRowE
1c200 73 74 5b 4e 2d 31 5d 0a 2a 2a 20 20 20 20 20 20  st[N-1].**      
1c210 20 20 20 20 20 61 69 52 6f 77 45 73 74 5b 4e 5d       aiRowEst[N]
1c220 3e 3d 31 0a 2a 2a 0a 2a 2a 20 41 70 61 72 74 20  >=1.**.** Apart 
1c230 66 72 6f 6d 20 74 68 61 74 2c 20 77 65 20 68 61  from that, we ha
1c240 76 65 20 6c 69 74 74 6c 65 20 74 6f 20 67 6f 20  ve little to go 
1c250 6f 6e 20 62 65 73 69 64 65 73 20 69 6e 74 75 69  on besides intui
1c260 74 69 6f 6e 20 61 73 20 74 6f 0a 2a 2a 20 68 6f  tion as to.** ho
1c270 77 20 61 69 52 6f 77 45 73 74 5b 5d 20 73 68 6f  w aiRowEst[] sho
1c280 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  uld be initializ
1c290 65 64 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 73  ed.  The numbers
1c2a0 20 67 65 6e 65 72 61 74 65 64 20 68 65 72 65 0a   generated here.
1c2b0 2a 2a 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20  ** are based on 
1c2c0 74 79 70 69 63 61 6c 20 76 61 6c 75 65 73 20 66  typical values f
1c2d0 6f 75 6e 64 20 69 6e 20 61 63 74 75 61 6c 20 69  ound in actual i
1c2e0 6e 64 69 63 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ndices..*/.void 
1c2f0 73 71 6c 69 74 65 33 44 65 66 61 75 6c 74 52 6f  sqlite3DefaultRo
1c300 77 45 73 74 28 49 6e 64 65 78 20 2a 70 49 64 78  wEst(Index *pIdx
1c310 29 7b 0a 20 20 2f 2a 20 20 20 20 20 20 20 20 20  ){.  /*         
1c320 20 20 20 20 20 20 20 31 30 2c 20 20 39 2c 20 20         10,  9,  
1c330 38 2c 20 20 37 2c 20 20 36 20 2a 2f 0a 20 20 4c  8,  7,  6 */.  L
1c340 6f 67 45 73 74 20 61 56 61 6c 5b 5d 20 3d 20 7b  ogEst aVal[] = {
1c350 20 33 33 2c 20 33 32 2c 20 33 30 2c 20 32 38 2c   33, 32, 30, 28,
1c360 20 32 36 20 7d 3b 0a 20 20 4c 6f 67 45 73 74 20   26 };.  LogEst 
1c370 2a 61 20 3d 20 70 49 64 78 2d 3e 61 69 52 6f 77  *a = pIdx->aiRow
1c380 4c 6f 67 45 73 74 3b 0a 20 20 69 6e 74 20 6e 43  LogEst;.  int nC
1c390 6f 70 79 20 3d 20 4d 49 4e 28 41 72 72 61 79 53  opy = MIN(ArrayS
1c3a0 69 7a 65 28 61 56 61 6c 29 2c 20 70 49 64 78 2d  ize(aVal), pIdx-
1c3b0 3e 6e 4b 65 79 43 6f 6c 29 3b 0a 20 20 69 6e 74  >nKeyCol);.  int
1c3c0 20 69 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   i;..  /* Set th
1c3d0 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 28 6e  e first entry (n
1c3e0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1c3f0 20 74 68 65 20 69 6e 64 65 78 29 20 74 6f 20 74   the index) to t
1c400 68 65 20 65 73 74 69 6d 61 74 65 64 20 0a 20 20  he estimated .  
1c410 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ** number of row
1c420 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  s in the table. 
1c430 4f 72 20 31 30 2c 20 69 66 20 74 68 65 20 65 73  Or 10, if the es
1c440 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
1c450 66 20 72 6f 77 73 20 0a 20 20 2a 2a 20 69 6e 20  f rows .  ** in 
1c460 74 68 65 20 74 61 62 6c 65 20 69 73 20 6c 65 73  the table is les
1c470 73 20 74 68 61 6e 20 74 68 61 74 2e 20 20 2a 2f  s than that.  */
1c480 0a 20 20 61 5b 30 5d 20 3d 20 70 49 64 78 2d 3e  .  a[0] = pIdx->
1c490 70 54 61 62 6c 65 2d 3e 6e 52 6f 77 4c 6f 67 45  pTable->nRowLogE
1c4a0 73 74 3b 0a 20 20 69 66 28 20 61 5b 30 5d 3c 33  st;.  if( a[0]<3
1c4b0 33 20 29 20 61 5b 30 5d 20 3d 20 33 33 3b 20 20  3 ) a[0] = 33;  
1c4c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 33 33        assert( 33
1c4d0 3d 3d 73 71 6c 69 74 65 33 4c 6f 67 45 73 74 28  ==sqlite3LogEst(
1c4e0 31 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 45 73 74  10) );..  /* Est
1c4f0 69 6d 61 74 65 20 74 68 61 74 20 61 5b 31 5d 20  imate that a[1] 
1c500 69 73 20 31 30 2c 20 61 5b 32 5d 20 69 73 20 39  is 10, a[2] is 9
1c510 2c 20 61 5b 33 5d 20 69 73 20 38 2c 20 61 5b 34  , a[3] is 8, a[4
1c520 5d 20 69 73 20 37 2c 20 61 5b 35 5d 20 69 73 0a  ] is 7, a[5] is.
1c530 20 20 2a 2a 20 36 20 61 6e 64 20 65 61 63 68 20    ** 6 and each 
1c540 73 75 62 73 65 71 75 65 6e 74 20 76 61 6c 75 65  subsequent value
1c550 20 28 69 66 20 61 6e 79 29 20 69 73 20 35 2e 20   (if any) is 5. 
1c560 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 26 61 5b   */.  memcpy(&a[
1c570 31 5d 2c 20 61 56 61 6c 2c 20 6e 43 6f 70 79 2a  1], aVal, nCopy*
1c580 73 69 7a 65 6f 66 28 4c 6f 67 45 73 74 29 29 3b  sizeof(LogEst));
1c590 0a 20 20 66 6f 72 28 69 3d 6e 43 6f 70 79 2b 31  .  for(i=nCopy+1
1c5a0 3b 20 69 3c 3d 70 49 64 78 2d 3e 6e 4b 65 79 43  ; i<=pIdx->nKeyC
1c5b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 5b  ol; i++){.    a[
1c5c0 69 5d 20 3d 20 32 33 3b 20 20 20 20 20 20 20 20  i] = 23;        
1c5d0 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
1c5e0 72 74 28 20 32 33 3d 3d 73 71 6c 69 74 65 33 4c  rt( 23==sqlite3L
1c5f0 6f 67 45 73 74 28 35 29 20 29 3b 0a 20 20 7d 0a  ogEst(5) );.  }.
1c600 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71  .  assert( 0==sq
1c610 6c 69 74 65 33 4c 6f 67 45 73 74 28 31 29 20 29  lite3LogEst(1) )
1c620 3b 0a 20 20 69 66 28 20 49 73 55 6e 69 71 75 65  ;.  if( IsUnique
1c630 49 6e 64 65 78 28 70 49 64 78 29 20 29 20 61 5b  Index(pIdx) ) a[
1c640 70 49 64 78 2d 3e 6e 4b 65 79 43 6f 6c 5d 20 3d  pIdx->nKeyCol] =
1c650 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
1c660 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  s routine will d
1c670 72 6f 70 20 61 6e 20 65 78 69 73 74 69 6e 67 20  rop an existing 
1c680 6e 61 6d 65 64 20 69 6e 64 65 78 2e 20 20 54 68  named index.  Th
1c690 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 6d  is routine.** im
1c6a0 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 44 52 4f  plements the DRO
1c6b0 50 20 49 4e 44 45 58 20 73 74 61 74 65 6d 65 6e  P INDEX statemen
1c6c0 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
1c6d0 65 33 44 72 6f 70 49 6e 64 65 78 28 50 61 72 73  e3DropIndex(Pars
1c6e0 65 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69  e *pParse, SrcLi
1c6f0 73 74 20 2a 70 4e 61 6d 65 2c 20 69 6e 74 20 69  st *pName, int i
1c700 66 45 78 69 73 74 73 29 7b 0a 20 20 49 6e 64 65  fExists){.  Inde
1c710 78 20 2a 70 49 6e 64 65 78 3b 0a 20 20 56 64 62  x *pIndex;.  Vdb
1c720 65 20 2a 76 3b 0a 20 20 73 71 6c 69 74 65 33 20  e *v;.  sqlite3 
1c730 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
1c740 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a 0a 20 20  ;.  int iDb;..  
1c750 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1c760 6e 45 72 72 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  nErr==0 );   /* 
1c770 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 77 69 74  Never called wit
1c780 68 20 70 72 69 6f 72 20 65 72 72 6f 72 73 20 2a  h prior errors *
1c790 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  /.  if( db->mall
1c7a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1c7b0 67 6f 74 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69  goto exit_drop_i
1c7c0 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ndex;.  }.  asse
1c7d0 72 74 28 20 70 4e 61 6d 65 2d 3e 6e 53 72 63 3d  rt( pName->nSrc=
1c7e0 3d 31 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  =1 );.  if( SQLI
1c7f0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 52 65  TE_OK!=sqlite3Re
1c800 61 64 53 63 68 65 6d 61 28 70 50 61 72 73 65 29  adSchema(pParse)
1c810 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   ){.    goto exi
1c820 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1c830 7d 0a 20 20 70 49 6e 64 65 78 20 3d 20 73 71 6c  }.  pIndex = sql
1c840 69 74 65 33 46 69 6e 64 49 6e 64 65 78 28 64 62  ite3FindIndex(db
1c850 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d 2e 7a 4e  , pName->a[0].zN
1c860 61 6d 65 2c 20 70 4e 61 6d 65 2d 3e 61 5b 30 5d  ame, pName->a[0]
1c870 2e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20 69  .zDatabase);.  i
1c880 66 28 20 70 49 6e 64 65 78 3d 3d 30 20 29 7b 0a  f( pIndex==0 ){.
1c890 20 20 20 20 69 66 28 20 21 69 66 45 78 69 73 74      if( !ifExist
1c8a0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  s ){.      sqlit
1c8b0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1c8c0 65 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65  e, "no such inde
1c8d0 78 3a 20 25 53 22 2c 20 70 4e 61 6d 65 2c 20 30  x: %S", pName, 0
1c8e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1c8f0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
1c900 65 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61  erifyNamedSchema
1c910 28 70 50 61 72 73 65 2c 20 70 4e 61 6d 65 2d 3e  (pParse, pName->
1c920 61 5b 30 5d 2e 7a 44 61 74 61 62 61 73 65 29 3b  a[0].zDatabase);
1c930 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
1c940 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
1c950 20 31 3b 0a 20 20 20 20 67 6f 74 6f 20 65 78 69   1;.    goto exi
1c960 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20  t_drop_index;.  
1c970 7d 0a 20 20 69 66 28 20 70 49 6e 64 65 78 2d 3e  }.  if( pIndex->
1c980 69 64 78 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  idxType!=SQLITE_
1c990 49 44 58 54 59 50 45 5f 41 50 50 44 45 46 20 29  IDXTYPE_APPDEF )
1c9a0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
1c9b0 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 69  orMsg(pParse, "i
1c9c0 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
1c9d0 77 69 74 68 20 55 4e 49 51 55 45 20 22 0a 20 20  with UNIQUE ".  
1c9e0 20 20 20 20 22 6f 72 20 50 52 49 4d 41 52 59 20      "or PRIMARY 
1c9f0 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 63  KEY constraint c
1ca00 61 6e 6e 6f 74 20 62 65 20 64 72 6f 70 70 65 64  annot be dropped
1ca10 22 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ", 0);.    goto 
1ca20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65 78 3b  exit_drop_index;
1ca30 0a 20 20 7d 0a 20 20 69 44 62 20 3d 20 73 71 6c  .  }.  iDb = sql
1ca40 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65  ite3SchemaToInde
1ca50 78 28 64 62 2c 20 70 49 6e 64 65 78 2d 3e 70 53  x(db, pIndex->pS
1ca60 63 68 65 6d 61 29 3b 0a 23 69 66 6e 64 65 66 20  chema);.#ifndef 
1ca70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
1ca80 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 7b 0a 20 20  ORIZATION.  {.  
1ca90 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 53 51 4c    int code = SQL
1caa0 49 54 45 5f 44 52 4f 50 5f 49 4e 44 45 58 3b 0a  ITE_DROP_INDEX;.
1cab0 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
1cac0 3d 20 70 49 6e 64 65 78 2d 3e 70 54 61 62 6c 65  = pIndex->pTable
1cad0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1cae0 20 2a 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b   *zDb = db->aDb[
1caf0 69 44 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  iDb].zName;.    
1cb00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1cb10 20 3d 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28   = SCHEMA_TABLE(
1cb20 69 44 62 29 3b 0a 20 20 20 20 69 66 28 20 73 71  iDb);.    if( sq
1cb30 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1cb40 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 44 45  Parse, SQLITE_DE
1cb50 4c 45 54 45 2c 20 7a 54 61 62 2c 20 30 2c 20 7a  LETE, zTab, 0, z
1cb60 44 62 29 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  Db) ){.      got
1cb70 6f 20 65 78 69 74 5f 64 72 6f 70 5f 69 6e 64 65  o exit_drop_inde
1cb80 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  x;.    }.    if(
1cb90 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
1cba0 20 69 44 62 20 29 20 63 6f 64 65 20 3d 20 53 51   iDb ) code = SQ
1cbb0 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 49  LITE_DROP_TEMP_I
1cbc0 4e 44 45 58 3b 0a 20 20 20 20 69 66 28 20 73 71  NDEX;.    if( sq
1cbd0 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70  lite3AuthCheck(p
1cbe0 50 61 72 73 65 2c 20 63 6f 64 65 2c 20 70 49 6e  Parse, code, pIn
1cbf0 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 70 54 61 62  dex->zName, pTab
1cc00 2d 3e 7a 4e 61 6d 65 2c 20 7a 44 62 29 20 29 7b  ->zName, zDb) ){
1cc10 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 78 69 74  .      goto exit
1cc20 5f 64 72 6f 70 5f 69 6e 64 65 78 3b 0a 20 20 20  _drop_index;.   
1cc30 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1cc40 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1cc50 65 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  e to remove the 
1cc60 69 6e 64 65 78 20 61 6e 64 20 66 72 6f 6d 20 74  index and from t
1cc70 68 65 20 6d 61 73 74 65 72 20 74 61 62 6c 65 20  he master table 
1cc80 2a 2f 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33  */.  v = sqlite3
1cc90 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
1cca0 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20  .  if( v ){.    
1ccb0 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69 74  sqlite3BeginWrit
1ccc0 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72 73  eOperation(pPars
1ccd0 65 2c 20 31 2c 20 69 44 62 29 3b 0a 20 20 20 20  e, 1, iDb);.    
1cce0 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
1ccf0 73 65 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  se(pParse,.     
1cd00 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25    "DELETE FROM %
1cd10 51 2e 25 73 20 57 48 45 52 45 20 6e 61 6d 65 3d  Q.%s WHERE name=
1cd20 25 51 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64  %Q AND type='ind
1cd30 65 78 27 22 2c 0a 20 20 20 20 20 20 20 64 62 2d  ex'",.       db-
1cd40 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
1cd50 20 53 43 48 45 4d 41 5f 54 41 42 4c 45 28 69 44   SCHEMA_TABLE(iD
1cd60 62 29 2c 20 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d  b), pIndex->zNam
1cd70 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 73 71 6c  e.    );.    sql
1cd80 69 74 65 33 43 6c 65 61 72 53 74 61 74 54 61 62  ite3ClearStatTab
1cd90 6c 65 73 28 70 50 61 72 73 65 2c 20 69 44 62 2c  les(pParse, iDb,
1cda0 20 22 69 64 78 22 2c 20 70 49 6e 64 65 78 2d 3e   "idx", pIndex->
1cdb0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  zName);.    sqli
1cdc0 74 65 33 43 68 61 6e 67 65 43 6f 6f 6b 69 65 28  te3ChangeCookie(
1cdd0 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20  pParse, iDb);.  
1cde0 20 20 64 65 73 74 72 6f 79 52 6f 6f 74 50 61 67    destroyRootPag
1cdf0 65 28 70 50 61 72 73 65 2c 20 70 49 6e 64 65 78  e(pParse, pIndex
1ce00 2d 3e 74 6e 75 6d 2c 20 69 44 62 29 3b 0a 20 20  ->tnum, iDb);.  
1ce10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1ce20 4f 70 34 28 76 2c 20 4f 50 5f 44 72 6f 70 49 6e  Op4(v, OP_DropIn
1ce30 64 65 78 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  dex, iDb, 0, 0, 
1ce40 70 49 6e 64 65 78 2d 3e 7a 4e 61 6d 65 2c 20 30  pIndex->zName, 0
1ce50 29 3b 0a 20 20 7d 0a 0a 65 78 69 74 5f 64 72 6f  );.  }..exit_dro
1ce60 70 5f 69 6e 64 65 78 3a 0a 20 20 73 71 6c 69 74  p_index:.  sqlit
1ce70 65 33 53 72 63 4c 69 73 74 44 65 6c 65 74 65 28  e3SrcListDelete(
1ce80 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 7d 0a 0a 2f  db, pName);.}../
1ce90 2a 0a 2a 2a 20 70 41 72 72 61 79 20 69 73 20 61  *.** pArray is a
1cea0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61   pointer to an a
1ceb0 72 72 61 79 20 6f 66 20 6f 62 6a 65 63 74 73 2e  rray of objects.
1cec0 20 45 61 63 68 20 6f 62 6a 65 63 74 20 69 6e 20   Each object in 
1ced0 74 68 65 0a 2a 2a 20 61 72 72 61 79 20 69 73 20  the.** array is 
1cee0 73 7a 45 6e 74 72 79 20 62 79 74 65 73 20 69 6e  szEntry bytes in
1cef0 20 73 69 7a 65 2e 20 54 68 69 73 20 72 6f 75 74   size. This rout
1cf00 69 6e 65 20 75 73 65 73 20 73 71 6c 69 74 65 33  ine uses sqlite3
1cf10 44 62 52 65 61 6c 6c 6f 63 28 29 0a 2a 2a 20 74  DbRealloc().** t
1cf20 6f 20 65 78 74 65 6e 64 20 74 68 65 20 61 72 72  o extend the arr
1cf30 61 79 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ay so that there
1cf40 20 69 73 20 73 70 61 63 65 20 66 6f 72 20 61 20   is space for a 
1cf50 6e 65 77 20 6f 62 6a 65 63 74 20 61 74 20 74 68  new object at th
1cf60 65 20 65 6e 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  e end..**.** Whe
1cf70 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1cf80 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70 6e 45 6e  is called, *pnEn
1cf90 74 72 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  try contains the
1cfa0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1cfb0 0a 2a 2a 20 74 68 65 20 61 72 72 61 79 20 28 69  .** the array (i
1cfc0 6e 20 65 6e 74 72 69 65 73 20 2d 20 73 6f 20 74  n entries - so t
1cfd0 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  he allocation is
1cfe0 20 28 28 2a 70 6e 45 6e 74 72 79 29 20 2a 20 73   ((*pnEntry) * s
1cff0 7a 45 6e 74 72 79 29 20 62 79 74 65 73 0a 2a 2a  zEntry) bytes.**
1d000 20 69 6e 20 74 6f 74 61 6c 29 2e 0a 2a 2a 0a 2a   in total)..**.*
1d010 2a 20 49 66 20 74 68 65 20 72 65 61 6c 6c 6f 63  * If the realloc
1d020 28 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  () is successful
1d030 20 28 69 2e 65 2e 20 69 66 20 6e 6f 20 4f 4f 4d   (i.e. if no OOM
1d040 20 63 6f 6e 64 69 74 69 6f 6e 20 6f 63 63 75 72   condition occur
1d050 73 29 2c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  s), the.** space
1d060 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
1d070 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 73  he new object is
1d080 20 7a 65 72 6f 65 64 2c 20 2a 70 6e 45 6e 74 72   zeroed, *pnEntr
1d090 79 20 75 70 64 61 74 65 64 20 74 6f 0a 2a 2a 20  y updated to.** 
1d0a0 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65 77 20  reflect the new 
1d0b0 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
1d0c0 79 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  y and a pointer 
1d0d0 74 6f 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  to the new alloc
1d0e0 61 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 65  ation.** returne
1d0f0 64 2e 20 2a 70 49 64 78 20 69 73 20 73 65 74 20  d. *pIdx is set 
1d100 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
1d110 74 68 65 20 6e 65 77 20 61 72 72 61 79 20 65 6e  the new array en
1d120 74 72 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  try in this case
1d130 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1d140 65 2c 20 69 66 20 74 68 65 20 72 65 61 6c 6c 6f  e, if the reallo
1d150 63 28 29 20 66 61 69 6c 73 2c 20 2a 70 49 64 78  c() fails, *pIdx
1d160 20 69 73 20 73 65 74 20 74 6f 20 2d 31 2c 20 2a   is set to -1, *
1d170 70 6e 45 6e 74 72 79 20 72 65 6d 61 69 6e 73 0a  pnEntry remains.
1d180 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  ** unchanged and
1d190 20 61 20 63 6f 70 79 20 6f 66 20 70 41 72 72 61   a copy of pArra
1d1a0 79 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 76  y returned..*/.v
1d1b0 6f 69 64 20 2a 73 71 6c 69 74 65 33 41 72 72 61  oid *sqlite3Arra
1d1c0 79 41 6c 6c 6f 63 61 74 65 28 0a 20 20 73 71 6c  yAllocate(.  sql
1d1d0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 2f  ite3 *db,      /
1d1e0 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  * Connection to 
1d1f0 6e 6f 74 69 66 79 20 6f 66 20 6d 61 6c 6c 6f 63  notify of malloc
1d200 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
1d210 6f 69 64 20 2a 70 41 72 72 61 79 2c 20 20 20 20  oid *pArray,    
1d220 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 62 6a   /* Array of obj
1d230 65 63 74 73 2e 20 20 4d 69 67 68 74 20 62 65 20  ects.  Might be 
1d240 72 65 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  reallocated */. 
1d250 20 69 6e 74 20 73 7a 45 6e 74 72 79 2c 20 20 20   int szEntry,   
1d260 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 65 61     /* Size of ea
1d270 63 68 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65  ch object in the
1d280 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
1d290 2a 70 6e 45 6e 74 72 79 2c 20 20 20 20 20 2f 2a  *pnEntry,     /*
1d2a0 20 4e 75 6d 62 65 72 20 6f 66 20 6f 62 6a 65 63   Number of objec
1d2b0 74 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  ts currently in 
1d2c0 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 49  use */.  int *pI
1d2d0 64 78 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  dx         /* Wr
1d2e0 69 74 65 20 74 68 65 20 69 6e 64 65 78 20 6f 66  ite the index of
1d2f0 20 61 20 6e 65 77 20 73 6c 6f 74 20 68 65 72 65   a new slot here
1d300 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
1d310 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 45  ;.  int n = *pnE
1d320 6e 74 72 79 3b 0a 20 20 69 66 28 20 28 6e 20 26  ntry;.  if( (n &
1d330 20 28 6e 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20   (n-1))==0 ){.  
1d340 20 20 69 6e 74 20 73 7a 20 3d 20 28 6e 3d 3d 30    int sz = (n==0
1d350 29 20 3f 20 31 20 3a 20 32 2a 6e 3b 0a 20 20 20  ) ? 1 : 2*n;.   
1d360 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 73 71   void *pNew = sq
1d370 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64  lite3DbRealloc(d
1d380 62 2c 20 70 41 72 72 61 79 2c 20 73 7a 2a 73 7a  b, pArray, sz*sz
1d390 45 6e 74 72 79 29 3b 0a 20 20 20 20 69 66 28 20  Entry);.    if( 
1d3a0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
1d3b0 20 2a 70 49 64 78 20 3d 20 2d 31 3b 0a 20 20 20   *pIdx = -1;.   
1d3c0 20 20 20 72 65 74 75 72 6e 20 70 41 72 72 61 79     return pArray
1d3d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 72  ;.    }.    pArr
1d3e0 61 79 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20  ay = pNew;.  }. 
1d3f0 20 7a 20 3d 20 28 63 68 61 72 2a 29 70 41 72 72   z = (char*)pArr
1d400 61 79 3b 0a 20 20 6d 65 6d 73 65 74 28 26 7a 5b  ay;.  memset(&z[
1d410 6e 20 2a 20 73 7a 45 6e 74 72 79 5d 2c 20 30 2c  n * szEntry], 0,
1d420 20 73 7a 45 6e 74 72 79 29 3b 0a 20 20 2a 70 49   szEntry);.  *pI
1d430 64 78 20 3d 20 6e 3b 0a 20 20 2b 2b 2a 70 6e 45  dx = n;.  ++*pnE
1d440 6e 74 72 79 3b 0a 20 20 72 65 74 75 72 6e 20 70  ntry;.  return p
1d450 41 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Array;.}../*.** 
1d460 41 70 70 65 6e 64 20 61 20 6e 65 77 20 65 6c 65  Append a new ele
1d470 6d 65 6e 74 20 74 6f 20 74 68 65 20 67 69 76 65  ment to the give
1d480 6e 20 49 64 4c 69 73 74 2e 20 20 43 72 65 61 74  n IdList.  Creat
1d490 65 20 61 20 6e 65 77 20 49 64 4c 69 73 74 20 69  e a new IdList i
1d4a0 66 0a 2a 2a 20 6e 65 65 64 20 62 65 2e 0a 2a 2a  f.** need be..**
1d4b0 0a 2a 2a 20 41 20 6e 65 77 20 49 64 4c 69 73 74  .** A new IdList
1d4c0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72   is returned, or
1d4d0 20 4e 55 4c 4c 20 69 66 20 6d 61 6c 6c 6f 63 28   NULL if malloc(
1d4e0 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 49 64 4c 69  ) fails..*/.IdLi
1d4f0 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
1d500 74 41 70 70 65 6e 64 28 73 71 6c 69 74 65 33 20  tAppend(sqlite3 
1d510 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 4c 69  *db, IdList *pLi
1d520 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  st, Token *pToke
1d530 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
1d540 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
1d550 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
1d560 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
1d570 62 2c 20 73 69 7a 65 6f 66 28 49 64 4c 69 73 74  b, sizeof(IdList
1d580 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69  ) );.    if( pLi
1d590 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
1d5a0 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 2d 3e 61  ;.  }.  pList->a
1d5b0 20 3d 20 73 71 6c 69 74 65 33 41 72 72 61 79 41   = sqlite3ArrayA
1d5c0 6c 6c 6f 63 61 74 65 28 0a 20 20 20 20 20 20 64  llocate(.      d
1d5d0 62 2c 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e  b,.      pList->
1d5e0 61 2c 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  a,.      sizeof(
1d5f0 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 2c 0a 20 20  pList->a[0]),.  
1d600 20 20 20 20 26 70 4c 69 73 74 2d 3e 6e 49 64 2c      &pList->nId,
1d610 0a 20 20 20 20 20 20 26 69 0a 20 20 29 3b 0a 20  .      &i.  );. 
1d620 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
1d630 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 65 6c  sqlite3IdListDel
1d640 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ete(db, pList);.
1d650 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d660 7d 0a 20 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  }.  pList->a[i].
1d670 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e  zName = sqlite3N
1d680 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c  ameFromToken(db,
1d690 20 70 54 6f 6b 65 6e 29 3b 0a 20 20 72 65 74 75   pToken);.  retu
1d6a0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
1d6b0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 49 64 4c  ** Delete an IdL
1d6c0 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
1d6d0 69 74 65 33 49 64 4c 69 73 74 44 65 6c 65 74 65  ite3IdListDelete
1d6e0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 49 64  (sqlite3 *db, Id
1d6f0 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
1d700 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
1d710 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
1d720 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
1d730 73 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  st->nId; i++){. 
1d740 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
1d750 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  (db, pList->a[i]
1d760 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
1d770 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1d780 20 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71   pList->a);.  sq
1d790 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
1d7a0 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pList);.}../*.**
1d7b0 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65   Return the inde
1d7c0 78 20 69 6e 20 70 4c 69 73 74 20 6f 66 20 74 68  x in pList of th
1d7d0 65 20 69 64 65 6e 74 69 66 69 65 72 20 6e 61 6d  e identifier nam
1d7e0 65 64 20 7a 49 64 2e 20 20 52 65 74 75 72 6e 20  ed zId.  Return 
1d7f0 2d 31 0a 2a 2a 20 69 66 20 6e 6f 74 20 66 6f 75  -1.** if not fou
1d800 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nd..*/.int sqlit
1d810 65 33 49 64 4c 69 73 74 49 6e 64 65 78 28 49 64  e3IdListIndex(Id
1d820 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 63 6f 6e  List *pList, con
1d830 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
1d840 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1d850 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
1d860 6e 20 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  n -1;.  for(i=0;
1d870 20 69 3c 70 4c 69 73 74 2d 3e 6e 49 64 3b 20 69   i<pList->nId; i
1d880 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
1d890 69 74 65 33 53 74 72 49 43 6d 70 28 70 4c 69 73  ite3StrICmp(pLis
1d8a0 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  t->a[i].zName, z
1d8b0 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
1d8c0 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
1d8d0 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n -1;.}../*.** E
1d8e0 78 70 61 6e 64 20 74 68 65 20 73 70 61 63 65 20  xpand the space 
1d8f0 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68  allocated for th
1d900 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 20  e given SrcList 
1d910 6f 62 6a 65 63 74 20 62 79 0a 2a 2a 20 63 72 65  object by.** cre
1d920 61 74 69 6e 67 20 6e 45 78 74 72 61 20 6e 65 77  ating nExtra new
1d930 20 73 6c 6f 74 73 20 62 65 67 69 6e 6e 69 6e 67   slots beginning
1d940 20 61 74 20 69 53 74 61 72 74 2e 20 20 69 53 74   at iStart.  iSt
1d950 61 72 74 20 69 73 20 7a 65 72 6f 20 62 61 73 65  art is zero base
1d960 64 2e 0a 2a 2a 20 4e 65 77 20 73 6c 6f 74 73 20  d..** New slots 
1d970 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
1d980 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 73  * For example, s
1d990 75 70 70 6f 73 65 20 61 20 53 72 63 4c 69 73 74  uppose a SrcList
1d9a0 20 69 6e 69 74 69 61 6c 6c 79 20 63 6f 6e 74 61   initially conta
1d9b0 69 6e 73 20 74 77 6f 20 65 6e 74 72 69 65 73 3a  ins two entries:
1d9c0 20 41 2c 42 2e 0a 2a 2a 20 54 6f 20 61 70 70 65   A,B..** To appe
1d9d0 6e 64 20 33 20 6e 65 77 20 65 6e 74 72 69 65 73  nd 3 new entries
1d9e0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 2c 20 64   onto the end, d
1d9f0 6f 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  o this:.**.**   
1da00 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1da10 6e 6c 61 72 67 65 28 64 62 2c 20 70 53 72 63 6c  nlarge(db, pSrcl
1da20 69 73 74 2c 20 33 2c 20 32 29 3b 0a 2a 2a 0a 2a  ist, 3, 2);.**.*
1da30 2a 20 41 66 74 65 72 20 74 68 65 20 63 61 6c 6c  * After the call
1da40 20 61 62 6f 76 65 20 69 74 20 77 6f 75 6c 64 20   above it would 
1da50 63 6f 6e 74 61 69 6e 3a 20 20 41 2c 20 42 2c 20  contain:  A, B, 
1da60 6e 69 6c 2c 20 6e 69 6c 2c 20 6e 69 6c 2e 0a 2a  nil, nil, nil..*
1da70 2a 20 49 66 20 74 68 65 20 69 53 74 61 72 74 20  * If the iStart 
1da80 61 72 67 75 6d 65 6e 74 20 68 61 64 20 62 65 65  argument had bee
1da90 6e 20 31 20 69 6e 73 74 65 61 64 20 6f 66 20 32  n 1 instead of 2
1daa0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c  , then the resul
1dab0 74 0a 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20  t.** would have 
1dac0 62 65 65 6e 3a 20 20 41 2c 20 6e 69 6c 2c 20 6e  been:  A, nil, n
1dad0 69 6c 2c 20 6e 69 6c 2c 20 42 2e 20 20 54 6f 20  il, nil, B.  To 
1dae0 70 72 65 70 65 6e 64 20 74 68 65 20 6e 65 77 20  prepend the new 
1daf0 73 6c 6f 74 73 2c 0a 2a 2a 20 74 68 65 20 69 53  slots,.** the iS
1db00 74 61 72 74 20 76 61 6c 75 65 20 77 6f 75 6c 64  tart value would
1db10 20 62 65 20 30 2e 20 20 54 68 65 20 72 65 73 75   be 0.  The resu
1db20 6c 74 20 74 68 65 6e 20 77 6f 75 6c 64 0a 2a 2a  lt then would.**
1db30 20 62 65 3a 20 6e 69 6c 2c 20 6e 69 6c 2c 20 6e   be: nil, nil, n
1db40 69 6c 2c 20 41 2c 20 42 2e 0a 2a 2a 0a 2a 2a 20  il, A, B..**.** 
1db50 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
1db60 63 61 74 69 6f 6e 20 66 61 69 6c 73 20 74 68 65  cation fails the
1db70 20 53 72 63 4c 69 73 74 20 69 73 20 75 6e 63 68   SrcList is unch
1db80 61 6e 67 65 64 2e 20 20 54 68 65 0a 2a 2a 20 64  anged.  The.** d
1db90 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1dba0 66 6c 61 67 20 77 69 6c 6c 20 62 65 20 73 65 74  flag will be set
1dbb0 20 74 6f 20 74 72 75 65 2e 0a 2a 2f 0a 53 72 63   to true..*/.Src
1dbc0 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
1dbd0 4c 69 73 74 45 6e 6c 61 72 67 65 28 0a 20 20 73  ListEnlarge(.  s
1dbe0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
1dbf0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
1dc00 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 6e 6f 74 69  nnection to noti
1dc10 66 79 20 6f 66 20 4f 4f 4d 20 65 72 72 6f 72 73  fy of OOM errors
1dc20 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
1dc30 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  Src,     /* The 
1dc40 53 72 63 4c 69 73 74 20 74 6f 20 62 65 20 65 6e  SrcList to be en
1dc50 6c 61 72 67 65 64 20 2a 2f 0a 20 20 69 6e 74 20  larged */.  int 
1dc60 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 2f  nExtra,        /
1dc70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 77 20  * Number of new 
1dc80 73 6c 6f 74 73 20 74 6f 20 61 64 64 20 74 6f 20  slots to add to 
1dc90 70 53 72 63 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69  pSrc->a[] */.  i
1dca0 6e 74 20 69 53 74 61 72 74 20 20 20 20 20 20 20  nt iStart       
1dcb0 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 70 53    /* Index in pS
1dcc0 72 63 2d 3e 61 5b 5d 20 6f 66 20 66 69 72 73 74  rc->a[] of first
1dcd0 20 6e 65 77 20 73 6c 6f 74 20 2a 2f 0a 29 7b 0a   new slot */.){.
1dce0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 53    int i;..  /* S
1dcf0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
1dd00 6e 20 63 61 6c 6c 69 6e 67 20 70 61 72 61 6d 65  n calling parame
1dd10 74 65 72 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ters */.  assert
1dd20 28 20 69 53 74 61 72 74 3e 3d 30 20 29 3b 0a 20  ( iStart>=0 );. 
1dd30 20 61 73 73 65 72 74 28 20 6e 45 78 74 72 61 3e   assert( nExtra>
1dd40 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1dd50 70 53 72 63 21 3d 30 20 29 3b 0a 20 20 61 73 73  pSrc!=0 );.  ass
1dd60 65 72 74 28 20 69 53 74 61 72 74 3c 3d 70 53 72  ert( iStart<=pSr
1dd70 63 2d 3e 6e 53 72 63 20 29 3b 0a 0a 20 20 2f 2a  c->nSrc );..  /*
1dd80 20 41 6c 6c 6f 63 61 74 65 20 61 64 64 69 74 69   Allocate additi
1dd90 6f 6e 61 6c 20 73 70 61 63 65 20 69 66 20 6e 65  onal space if ne
1dda0 65 64 65 64 20 2a 2f 0a 20 20 69 66 28 20 28 75  eded */.  if( (u
1ddb0 33 32 29 70 53 72 63 2d 3e 6e 53 72 63 2b 6e 45  32)pSrc->nSrc+nE
1ddc0 78 74 72 61 3e 70 53 72 63 2d 3e 6e 41 6c 6c 6f  xtra>pSrc->nAllo
1ddd0 63 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  c ){.    SrcList
1dde0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20   *pNew;.    int 
1ddf0 6e 41 6c 6c 6f 63 20 3d 20 70 53 72 63 2d 3e 6e  nAlloc = pSrc->n
1de00 53 72 63 2b 6e 45 78 74 72 61 3b 0a 20 20 20 20  Src+nExtra;.    
1de10 69 6e 74 20 6e 47 6f 74 3b 0a 20 20 20 20 70 4e  int nGot;.    pN
1de20 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ew = sqlite3DbRe
1de30 61 6c 6c 6f 63 28 64 62 2c 20 70 53 72 63 2c 0a  alloc(db, pSrc,.
1de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1de50 69 7a 65 6f 66 28 2a 70 53 72 63 29 20 2b 20 28  izeof(*pSrc) + (
1de60 6e 41 6c 6c 6f 63 2d 31 29 2a 73 69 7a 65 6f 66  nAlloc-1)*sizeof
1de70 28 70 53 72 63 2d 3e 61 5b 30 5d 29 20 29 3b 0a  (pSrc->a[0]) );.
1de80 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
1de90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1dea0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
1deb0 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
1dec0 6e 20 70 53 72 63 3b 0a 20 20 20 20 7d 0a 20 20  n pSrc;.    }.  
1ded0 20 20 70 53 72 63 20 3d 20 70 4e 65 77 3b 0a 20    pSrc = pNew;. 
1dee0 20 20 20 6e 47 6f 74 20 3d 20 28 73 71 6c 69 74     nGot = (sqlit
1def0 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 64  e3DbMallocSize(d
1df00 62 2c 20 70 4e 65 77 29 20 2d 20 73 69 7a 65 6f  b, pNew) - sizeo
1df10 66 28 2a 70 53 72 63 29 29 2f 73 69 7a 65 6f 66  f(*pSrc))/sizeof
1df20 28 70 53 72 63 2d 3e 61 5b 30 5d 29 2b 31 3b 0a  (pSrc->a[0])+1;.
1df30 20 20 20 20 70 53 72 63 2d 3e 6e 41 6c 6c 6f 63      pSrc->nAlloc
1df40 20 3d 20 6e 47 6f 74 3b 0a 20 20 7d 0a 0a 20 20   = nGot;.  }..  
1df50 2f 2a 20 4d 6f 76 65 20 65 78 69 73 74 69 6e 67  /* Move existing
1df60 20 73 6c 6f 74 73 20 74 68 61 74 20 63 6f 6d 65   slots that come
1df70 20 61 66 74 65 72 20 74 68 65 20 6e 65 77 6c 79   after the newly
1df80 20 69 6e 73 65 72 74 65 64 20 73 6c 6f 74 73 0a   inserted slots.
1df90 20 20 2a 2a 20 6f 75 74 20 6f 66 20 74 68 65 20    ** out of the 
1dfa0 77 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  way */.  for(i=p
1dfb0 53 72 63 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  Src->nSrc-1; i>=
1dfc0 69 53 74 61 72 74 3b 20 69 2d 2d 29 7b 0a 20 20  iStart; i--){.  
1dfd0 20 20 70 53 72 63 2d 3e 61 5b 69 2b 6e 45 78 74    pSrc->a[i+nExt
1dfe0 72 61 5d 20 3d 20 70 53 72 63 2d 3e 61 5b 69 5d  ra] = pSrc->a[i]
1dff0 3b 0a 20 20 7d 0a 20 20 70 53 72 63 2d 3e 6e 53  ;.  }.  pSrc->nS
1e000 72 63 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 0a 20  rc += nExtra;.. 
1e010 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 6e 65 77   /* Zero the new
1e020 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 6c 6f  ly allocated slo
1e030 74 73 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26  ts */.  memset(&
1e040 70 53 72 63 2d 3e 61 5b 69 53 74 61 72 74 5d 2c  pSrc->a[iStart],
1e050 20 30 2c 20 73 69 7a 65 6f 66 28 70 53 72 63 2d   0, sizeof(pSrc-
1e060 3e 61 5b 30 5d 29 2a 6e 45 78 74 72 61 29 3b 0a  >a[0])*nExtra);.
1e070 20 20 66 6f 72 28 69 3d 69 53 74 61 72 74 3b 20    for(i=iStart; 
1e080 69 3c 69 53 74 61 72 74 2b 6e 45 78 74 72 61 3b  i<iStart+nExtra;
1e090 20 69 2b 2b 29 7b 0a 20 20 20 20 70 53 72 63 2d   i++){.    pSrc-
1e0a0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 20 3d 20  >a[i].iCursor = 
1e0b0 2d 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  -1;.  }..  /* Re
1e0c0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1e0d0 6f 20 74 68 65 20 65 6e 6c 61 72 67 65 64 20 53  o the enlarged S
1e0e0 72 63 4c 69 73 74 20 2a 2f 0a 20 20 72 65 74 75  rcList */.  retu
1e0f0 72 6e 20 70 53 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  rn pSrc;.}.../*.
1e100 2a 2a 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20  ** Append a new 
1e110 74 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 74 68  table name to th
1e120 65 20 67 69 76 65 6e 20 53 72 63 4c 69 73 74 2e  e given SrcList.
1e130 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
1e140 72 63 4c 69 73 74 20 69 66 0a 2a 2a 20 6e 65 65  rcList if.** nee
1e150 64 20 62 65 2e 20 20 41 20 6e 65 77 20 65 6e 74  d be.  A new ent
1e160 72 79 20 69 73 20 63 72 65 61 74 65 64 20 69 6e  ry is created in
1e170 20 74 68 65 20 53 72 63 4c 69 73 74 20 65 76 65   the SrcList eve
1e180 6e 20 69 66 20 70 54 61 62 6c 65 20 69 73 20 4e  n if pTable is N
1e190 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 41 20 53 72 63  ULL..**.** A Src
1e1a0 4c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65 64  List is returned
1e1b0 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74 68 65  , or NULL if the
1e1c0 72 65 20 69 73 20 61 6e 20 4f 4f 4d 20 65 72 72  re is an OOM err
1e1d0 6f 72 2e 20 20 54 68 65 20 72 65 74 75 72 6e 65  or.  The returne
1e1e0 64 0a 2a 2a 20 53 72 63 4c 69 73 74 20 6d 69 67  d.** SrcList mig
1e1f0 68 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ht be the same a
1e200 73 20 74 68 65 20 53 72 63 4c 69 73 74 20 74 68  s the SrcList th
1e210 61 74 20 77 61 73 20 69 6e 70 75 74 20 6f 72 20  at was input or 
1e220 69 74 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61  it might be.** a
1e230 20 6e 65 77 20 6f 6e 65 2e 20 20 49 66 20 61 6e   new one.  If an
1e240 20 4f 4f 4d 20 65 72 72 6f 72 20 64 6f 65 73 20   OOM error does 
1e250 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74 68 65  occurs, then the
1e260 20 70 72 69 6f 72 20 76 61 6c 75 65 20 6f 66 20   prior value of 
1e270 70 4c 69 73 74 0a 2a 2a 20 74 68 61 74 20 69 73  pList.** that is
1e280 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
1e290 6f 75 74 69 6e 65 20 69 73 20 61 75 74 6f 6d 61  outine is automa
1e2a0 74 69 63 61 6c 6c 79 20 66 72 65 65 64 2e 0a 2a  tically freed..*
1e2b0 2a 0a 2a 2a 20 49 66 20 70 44 61 74 61 62 61 73  *.** If pDatabas
1e2c0 65 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2c 20 69  e is not null, i
1e2d0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
1e2e0 20 74 61 62 6c 65 20 68 61 73 20 61 6e 20 6f 70   table has an op
1e2f0 74 69 6f 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61  tional.** databa
1e300 73 65 20 6e 61 6d 65 20 70 72 65 66 69 78 2e 20  se name prefix. 
1e310 20 4c 69 6b 65 20 74 68 69 73 3a 20 20 22 64 61   Like this:  "da
1e320 74 61 62 61 73 65 2e 74 61 62 6c 65 22 2e 20 20  tabase.table".  
1e330 54 68 65 20 70 44 61 74 61 62 61 73 65 0a 2a 2a  The pDatabase.**
1e340 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 74   points to the t
1e350 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68  able name and th
1e360 65 20 70 54 61 62 6c 65 20 70 6f 69 6e 74 73 20  e pTable points 
1e370 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1e380 6e 61 6d 65 2e 0a 2a 2a 20 54 68 65 20 53 72 63  name..** The Src
1e390 4c 69 73 74 2e 61 5b 5d 2e 7a 4e 61 6d 65 20 66  List.a[].zName f
1e3a0 69 65 6c 64 20 69 73 20 66 69 6c 6c 65 64 20 77  ield is filled w
1e3b0 69 74 68 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ith the table na
1e3c0 6d 65 20 77 68 69 63 68 20 6d 69 67 68 74 0a 2a  me which might.*
1e3d0 2a 20 63 6f 6d 65 20 66 72 6f 6d 20 70 54 61 62  * come from pTab
1e3e0 6c 65 20 28 69 66 20 70 44 61 74 61 62 61 73 65  le (if pDatabase
1e3f0 20 69 73 20 4e 55 4c 4c 29 20 6f 72 20 66 72 6f   is NULL) or fro
1e400 6d 20 70 44 61 74 61 62 61 73 65 2e 20 20 0a 2a  m pDatabase.  .*
1e410 2a 20 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 7a 44  * SrcList.a[].zD
1e420 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 6c 65  atabase is fille
1e430 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
1e440 61 73 65 20 6e 61 6d 65 20 66 72 6f 6d 20 70 54  ase name from pT
1e450 61 62 6c 65 2c 0a 2a 2a 20 6f 72 20 77 69 74 68  able,.** or with
1e460 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 64 61 74 61   NULL if no data
1e470 62 61 73 65 20 69 73 20 73 70 65 63 69 66 69 65  base is specifie
1e480 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65  d..**.** In othe
1e490 72 20 77 6f 72 64 73 2c 20 69 66 20 63 61 6c 6c  r words, if call
1e4a0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1e4b0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1e4c0 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1e4d0 2c 41 2c 42 2c 30 29 3b 0a 2a 2a 0a 2a 2a 20 54  ,A,B,0);.**.** T
1e4e0 68 65 6e 20 42 20 69 73 20 61 20 74 61 62 6c 65  hen B is a table
1e4f0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
1e500 74 61 62 61 73 65 20 6e 61 6d 65 20 69 73 20 75  tabase name is u
1e510 6e 73 70 65 63 69 66 69 65 64 2e 20 20 49 66 20  nspecified.  If 
1e520 63 61 6c 6c 65 64 0a 2a 2a 20 6c 69 6b 65 20 74  called.** like t
1e530 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
1e540 20 20 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73     sqlite3SrcLis
1e550 74 41 70 70 65 6e 64 28 44 2c 41 2c 42 2c 43 29  tAppend(D,A,B,C)
1e560 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 43 20 69  ;.**.** Then C i
1e570 73 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  s the table name
1e580 20 61 6e 64 20 42 20 69 73 20 74 68 65 20 64 61   and B is the da
1e590 74 61 62 61 73 65 20 6e 61 6d 65 2e 20 20 49 66  tabase name.  If
1e5a0 20 43 20 69 73 20 64 65 66 69 6e 65 64 0a 2a 2a   C is defined.**
1e5b0 20 74 68 65 6e 20 73 6f 20 69 73 20 42 2e 20 20   then so is B.  
1e5c0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1e5d0 77 65 20 6e 65 76 65 72 20 68 61 76 65 20 61 20  we never have a 
1e5e0 63 61 73 65 20 77 68 65 72 65 3a 0a 2a 2a 0a 2a  case where:.**.*
1e5f0 2a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  *         sqlite
1e600 33 53 72 63 4c 69 73 74 41 70 70 65 6e 64 28 44  3SrcListAppend(D
1e610 2c 41 2c 30 2c 43 29 3b 0a 2a 2a 0a 2a 2a 20 42  ,A,0,C);.**.** B
1e620 6f 74 68 20 70 54 61 62 6c 65 20 61 6e 64 20 70  oth pTable and p
1e630 44 61 74 61 62 61 73 65 20 61 72 65 20 61 73 73  Database are ass
1e640 75 6d 65 64 20 74 6f 20 62 65 20 71 75 6f 74 65  umed to be quote
1e650 64 2e 20 20 54 68 65 79 20 61 72 65 20 64 65 71  d.  They are deq
1e660 75 6f 74 65 64 0a 2a 2a 20 62 65 66 6f 72 65 20  uoted.** before 
1e670 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
1e680 68 65 20 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 53  he SrcList..*/.S
1e690 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
1e6a0 72 63 4c 69 73 74 41 70 70 65 6e 64 28 0a 20 20  rcListAppend(.  
1e6b0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
1e6c0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1e6d0 6e 20 74 6f 20 6e 6f 74 69 66 79 20 6f 66 20 6d  n to notify of m
1e6e0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 2a  alloc failures *
1e6f0 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4c 69  /.  SrcList *pLi
1e700 73 74 2c 20 20 20 20 20 2f 2a 20 41 70 70 65 6e  st,     /* Appen
1e710 64 20 74 6f 20 74 68 69 73 20 53 72 63 4c 69 73  d to this SrcLis
1e720 74 2e 20 4e 55 4c 4c 20 63 72 65 61 74 65 73 20  t. NULL creates 
1e730 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 2a 2f  a new SrcList */
1e740 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
1e750 2c 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  ,      /* Table 
1e760 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 20 20 54  to append */.  T
1e770 6f 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 20  oken *pDatabase 
1e780 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6f     /* Database o
1e790 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 29  f the table */.)
1e7a0 7b 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  {.  struct SrcLi
1e7b0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
1e7c0 20 20 61 73 73 65 72 74 28 20 70 44 61 74 61 62    assert( pDatab
1e7d0 61 73 65 3d 3d 30 20 7c 7c 20 70 54 61 62 6c 65  ase==0 || pTable
1e7e0 21 3d 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  !=0 );  /* Canno
1e7f0 74 20 68 61 76 65 20 43 20 77 69 74 68 6f 75 74  t have C without
1e800 20 42 20 2a 2f 0a 20 20 69 66 28 20 70 4c 69 73   B */.  if( pLis
1e810 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
1e820 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
1e830 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
1e840 6f 66 28 53 72 63 4c 69 73 74 29 20 29 3b 0a 20  of(SrcList) );. 
1e850 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
1e860 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1e870 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
1e880 31 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  1;.  }.  pList =
1e890 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 45   sqlite3SrcListE
1e8a0 6e 6c 61 72 67 65 28 64 62 2c 20 70 4c 69 73 74  nlarge(db, pList
1e8b0 2c 20 31 2c 20 70 4c 69 73 74 2d 3e 6e 53 72 63  , 1, pList->nSrc
1e8c0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
1e8d0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
1e8e0 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1e8f0 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73 74 29  elete(db, pList)
1e900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1e910 20 20 7d 0a 20 20 70 49 74 65 6d 20 3d 20 26 70    }.  pItem = &p
1e920 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
1e930 53 72 63 2d 31 5d 3b 0a 20 20 69 66 28 20 70 44  Src-1];.  if( pD
1e940 61 74 61 62 61 73 65 20 26 26 20 70 44 61 74 61  atabase && pData
1e950 62 61 73 65 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20  base->z==0 ){.  
1e960 20 20 70 44 61 74 61 62 61 73 65 20 3d 20 30 3b    pDatabase = 0;
1e970 0a 20 20 7d 0a 20 20 69 66 28 20 70 44 61 74 61  .  }.  if( pData
1e980 62 61 73 65 20 29 7b 0a 20 20 20 20 54 6f 6b 65  base ){.    Toke
1e990 6e 20 2a 70 54 65 6d 70 20 3d 20 70 44 61 74 61  n *pTemp = pData
1e9a0 62 61 73 65 3b 0a 20 20 20 20 70 44 61 74 61 62  base;.    pDatab
1e9b0 61 73 65 20 3d 20 70 54 61 62 6c 65 3b 0a 20 20  ase = pTable;.  
1e9c0 20 20 70 54 61 62 6c 65 20 3d 20 70 54 65 6d 70    pTable = pTemp
1e9d0 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d 3e 7a  ;.  }.  pItem->z
1e9e0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
1e9f0 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20  meFromToken(db, 
1ea00 70 54 61 62 6c 65 29 3b 0a 20 20 70 49 74 65 6d  pTable);.  pItem
1ea10 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
1ea20 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
1ea30 65 6e 28 64 62 2c 20 70 44 61 74 61 62 61 73 65  en(db, pDatabase
1ea40 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73  );.  return pLis
1ea50 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  t;.}../*.** Assi
1ea60 67 6e 20 56 64 62 65 43 75 72 73 6f 72 20 69 6e  gn VdbeCursor in
1ea70 64 65 78 20 6e 75 6d 62 65 72 73 20 74 6f 20 61  dex numbers to a
1ea80 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 20 53  ll tables in a S
1ea90 72 63 4c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73  rcList.*/.void s
1eaa0 71 6c 69 74 65 33 53 72 63 4c 69 73 74 41 73 73  qlite3SrcListAss
1eab0 69 67 6e 43 75 72 73 6f 72 73 28 50 61 72 73 65  ignCursors(Parse
1eac0 20 2a 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73   *pParse, SrcLis
1ead0 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
1eae0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72 63   i;.  struct Src
1eaf0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
1eb00 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 73 74  ;.  assert(pList
1eb10 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
1eb20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1eb30 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20    if( pList ){. 
1eb40 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
1eb50 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 4c  m=pList->a; i<pL
1eb60 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
1eb70 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
1eb80 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
1eb90 6f 72 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  or>=0 ) break;. 
1eba0 20 20 20 20 20 70 49 74 65 6d 2d 3e 69 43 75 72       pItem->iCur
1ebb0 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
1ebc0 61 62 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ab++;.      if( 
1ebd0 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29  pItem->pSelect )
1ebe0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1ebf0 33 53 72 63 4c 69 73 74 41 73 73 69 67 6e 43 75  3SrcListAssignCu
1ec00 72 73 6f 72 73 28 70 50 61 72 73 65 2c 20 70 49  rsors(pParse, pI
1ec10 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 53  tem->pSelect->pS
1ec20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rc);.      }.   
1ec30 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1ec40 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
1ec50 20 53 72 63 4c 69 73 74 20 69 6e 63 6c 75 64 69   SrcList includi
1ec60 6e 67 20 61 6c 6c 20 69 74 73 20 73 75 62 73 74  ng all its subst
1ec70 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 76 6f 69 64  ructure..*/.void
1ec80 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44   sqlite3SrcListD
1ec90 65 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64  elete(sqlite3 *d
1eca0 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 4c 69 73  b, SrcList *pLis
1ecb0 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  t){.  int i;.  s
1ecc0 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
1ecd0 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
1ece0 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
1ecf0 72 6e 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  rn;.  for(pItem=
1ed00 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
1ed10 3c 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  <pList->nSrc; i+
1ed20 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
1ed30 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1ed40 62 2c 20 70 49 74 65 6d 2d 3e 7a 44 61 74 61 62  b, pItem->zDatab
1ed50 61 73 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ase);.    sqlite
1ed60 33 44 62 46 72 65 65 28 64 62 2c 20 70 49 74 65  3DbFree(db, pIte
1ed70 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 73  m->zName);.    s
1ed80 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
1ed90 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
1eda0 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
1edb0 66 67 2e 69 73 49 6e 64 65 78 65 64 42 79 20 29  fg.isIndexedBy )
1edc0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1edd0 62 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e  b, pItem->u1.zIn
1ede0 64 65 78 65 64 42 79 29 3b 0a 20 20 20 20 69 66  dexedBy);.    if
1edf0 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61  ( pItem->fg.isTa
1ee00 62 46 75 6e 63 20 29 20 73 71 6c 69 74 65 33 45  bFunc ) sqlite3E
1ee10 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
1ee20 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46 75 6e  , pItem->u1.pFun
1ee30 63 41 72 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  cArg);.    sqlit
1ee40 65 33 44 65 6c 65 74 65 54 61 62 6c 65 28 64 62  e3DeleteTable(db
1ee50 2c 20 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a  , pItem->pTab);.
1ee60 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
1ee70 74 44 65 6c 65 74 65 28 64 62 2c 20 70 49 74 65  tDelete(db, pIte
1ee80 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
1ee90 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1eea0 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e 70 4f  te(db, pItem->pO
1eeb0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49  n);.    sqlite3I
1eec0 64 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  dListDelete(db, 
1eed0 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  pItem->pUsing);.
1eee0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
1eef0 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b 0a  ree(db, pList);.
1ef00 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
1ef10 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
1ef20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f  by the parser to
1ef30 20 61 64 64 20 61 20 6e 65 77 20 74 65 72 6d 20   add a new term 
1ef40 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
1ef50 20 61 20 67 72 6f 77 69 6e 67 20 46 52 4f 4d 20   a growing FROM 
1ef60 63 6c 61 75 73 65 2e 20 20 54 68 65 20 22 70 22  clause.  The "p"
1ef70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
1ef80 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65  e part of.** the
1ef90 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 68 61   FROM clause tha
1efa0 74 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  t has already be
1efb0 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 2e 20  en constructed. 
1efc0 20 22 70 22 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20   "p" is NULL.** 
1efd0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1efe0 69 72 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65  irst term of the
1eff0 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 70   FROM clause.  p
1f000 54 61 62 6c 65 20 61 6e 64 20 70 44 61 74 61 62  Table and pDatab
1f010 61 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 6e  ase.** are the n
1f020 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
1f030 20 61 6e 64 20 64 61 74 61 62 61 73 65 20 6e 61   and database na
1f040 6d 65 64 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  med in the FROM 
1f050 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 2a 2a 20  clause term..** 
1f060 70 44 61 74 61 62 61 73 65 20 69 73 20 4e 55 4c  pDatabase is NUL
1f070 4c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  L if the databas
1f080 65 20 6e 61 6d 65 20 71 75 61 6c 69 66 69 65 72  e name qualifier
1f090 20 69 73 20 6d 69 73 73 69 6e 67 20 2d 20 74 68   is missing - th
1f0a0 65 0a 2a 2a 20 75 73 75 61 6c 20 63 61 73 65 2e  e.** usual case.
1f0b0 20 20 49 66 20 74 68 65 20 74 65 72 6d 20 68 61    If the term ha
1f0c0 73 20 61 6e 20 61 6c 69 61 73 2c 20 74 68 65 6e  s an alias, then
1f0d0 20 70 41 6c 69 61 73 20 70 6f 69 6e 74 73 20 74   pAlias points t
1f0e0 6f 20 74 68 65 0a 2a 2a 20 61 6c 69 61 73 20 74  o the.** alias t
1f0f0 6f 6b 65 6e 2e 20 20 49 66 20 74 68 65 20 74 65  oken.  If the te
1f100 72 6d 20 69 73 20 61 20 73 75 62 71 75 65 72 79  rm is a subquery
1f110 2c 20 74 68 65 6e 20 70 53 75 62 71 75 65 72 79  , then pSubquery
1f120 20 69 73 20 74 68 65 0a 2a 2a 20 53 45 4c 45 43   is the.** SELEC
1f130 54 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74  T statement that
1f140 20 74 68 65 20 73 75 62 71 75 65 72 79 20 65 6e   the subquery en
1f150 63 6f 64 65 73 2e 20 20 54 68 65 20 70 54 61 62  codes.  The pTab
1f160 6c 65 20 61 6e 64 0a 2a 2a 20 70 44 61 74 61 62  le and.** pDatab
1f170 61 73 65 20 70 61 72 61 6d 65 74 65 72 73 20 61  ase parameters a
1f180 72 65 20 4e 55 4c 4c 20 66 6f 72 20 73 75 62 71  re NULL for subq
1f190 75 65 72 69 65 73 2e 20 20 54 68 65 20 70 4f 6e  ueries.  The pOn
1f1a0 20 61 6e 64 20 70 55 73 69 6e 67 0a 2a 2a 20 70   and pUsing.** p
1f1b0 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 74 68  arameters are th
1f1c0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
1f1d0 20 4f 4e 20 61 6e 64 20 55 53 49 4e 47 20 63 6c   ON and USING cl
1f1e0 61 75 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  auses..**.** Ret
1f1f0 75 72 6e 20 61 20 6e 65 77 20 53 72 63 4c 69 73  urn a new SrcLis
1f200 74 20 77 68 69 63 68 20 65 6e 63 6f 64 65 73 20  t which encodes 
1f210 69 73 20 74 68 65 20 46 52 4f 4d 20 77 69 74 68  is the FROM with
1f220 20 74 68 65 20 6e 65 77 0a 2a 2a 20 74 65 72 6d   the new.** term
1f230 20 61 64 64 65 64 2e 0a 2a 2f 0a 53 72 63 4c 69   added..*/.SrcLi
1f240 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
1f250 73 74 41 70 70 65 6e 64 46 72 6f 6d 54 65 72 6d  stAppendFromTerm
1f260 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
1f270 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
1f280 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
1f290 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 2c 20  /.  SrcList *p, 
1f2a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f2b0 68 65 20 6c 65 66 74 20 70 61 72 74 20 6f 66 20  he left part of 
1f2c0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
1f2d0 61 6c 72 65 61 64 79 20 73 65 65 6e 20 2a 2f 0a  already seen */.
1f2e0 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 2c    Token *pTable,
1f2f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1f300 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
1f310 6f 20 61 64 64 20 74 6f 20 74 68 65 20 46 52 4f  o add to the FRO
1f320 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 54 6f  M clause */.  To
1f330 6b 65 6e 20 2a 70 44 61 74 61 62 61 73 65 2c 20  ken *pDatabase, 
1f340 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1f350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1f360 6e 74 61 69 6e 69 6e 67 20 70 54 61 62 6c 65 20  ntaining pTable 
1f370 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 41 6c 69  */.  Token *pAli
1f380 61 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  as,          /* 
1f390 54 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  The right-hand s
1f3a0 69 64 65 20 6f 66 20 74 68 65 20 41 53 20 73 75  ide of the AS su
1f3b0 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
1f3c0 20 53 65 6c 65 63 74 20 2a 70 53 75 62 71 75 65   Select *pSubque
1f3d0 72 79 2c 20 20 20 20 20 20 2f 2a 20 41 20 73 75  ry,      /* A su
1f3e0 62 71 75 65 72 79 20 75 73 65 64 20 69 6e 20 70  bquery used in p
1f3f0 6c 61 63 65 20 6f 66 20 61 20 74 61 62 6c 65 20  lace of a table 
1f400 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a  name */.  Expr *
1f410 70 4f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pOn,            
1f420 20 20 2f 2a 20 54 68 65 20 4f 4e 20 63 6c 61 75    /* The ON clau
1f430 73 65 20 6f 66 20 61 20 6a 6f 69 6e 20 2a 2f 0a  se of a join */.
1f440 20 20 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67    IdList *pUsing
1f450 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f460 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
1f470 20 61 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20   a join */.){.  
1f480 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1f490 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 73 71  tem *pItem;.  sq
1f4a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
1f4b0 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 21 70  se->db;.  if( !p
1f4c0 20 26 26 20 28 70 4f 6e 20 7c 7c 20 70 55 73 69   && (pOn || pUsi
1f4d0 6e 67 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ng) ){.    sqlit
1f4e0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1f4f0 65 2c 20 22 61 20 4a 4f 49 4e 20 63 6c 61 75 73  e, "a JOIN claus
1f500 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
1f510 66 6f 72 65 20 25 73 22 2c 20 0a 20 20 20 20 20  fore %s", .     
1f520 20 28 70 4f 6e 20 3f 20 22 4f 4e 22 20 3a 20 22   (pOn ? "ON" : "
1f530 55 53 49 4e 47 22 29 0a 20 20 20 20 29 3b 0a 20  USING").    );. 
1f540 20 20 20 67 6f 74 6f 20 61 70 70 65 6e 64 5f 66     goto append_f
1f550 72 6f 6d 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  rom_error;.  }. 
1f560 20 70 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c   p = sqlite3SrcL
1f570 69 73 74 41 70 70 65 6e 64 28 64 62 2c 20 70 2c  istAppend(db, p,
1f580 20 70 54 61 62 6c 65 2c 20 70 44 61 74 61 62 61   pTable, pDataba
1f590 73 65 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  se);.  if( p==0 
1f5a0 7c 7c 20 4e 45 56 45 52 28 70 2d 3e 6e 53 72 63  || NEVER(p->nSrc
1f5b0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==0) ){.    goto
1f5c0 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72 72   append_from_err
1f5d0 6f 72 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 20  or;.  }.  pItem 
1f5e0 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1f5f0 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 41  1];.  assert( pA
1f600 6c 69 61 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  lias!=0 );.  if(
1f610 20 70 41 6c 69 61 73 2d 3e 6e 20 29 7b 0a 20 20   pAlias->n ){.  
1f620 20 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20    pItem->zAlias 
1f630 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
1f640 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 41 6c 69 61  mToken(db, pAlia
1f650 73 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 6d 2d  s);.  }.  pItem-
1f660 3e 70 53 65 6c 65 63 74 20 3d 20 70 53 75 62 71  >pSelect = pSubq
1f670 75 65 72 79 3b 0a 20 20 70 49 74 65 6d 2d 3e 70  uery;.  pItem->p
1f680 4f 6e 20 3d 20 70 4f 6e 3b 0a 20 20 70 49 74 65  On = pOn;.  pIte
1f690 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 70 55 73 69  m->pUsing = pUsi
1f6a0 6e 67 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a  ng;.  return p;.
1f6b0 0a 20 61 70 70 65 6e 64 5f 66 72 6f 6d 5f 65 72  . append_from_er
1f6c0 72 6f 72 3a 0a 20 20 61 73 73 65 72 74 28 20 70  ror:.  assert( p
1f6d0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1f6e0 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
1f6f0 4f 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 64  On);.  sqlite3Id
1f700 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70  ListDelete(db, p
1f710 55 73 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  Using);.  sqlite
1f720 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62  3SelectDelete(db
1f730 2c 20 70 53 75 62 71 75 65 72 79 29 3b 0a 20 20  , pSubquery);.  
1f740 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1f750 2a 2a 20 41 64 64 20 61 6e 20 49 4e 44 45 58 45  ** Add an INDEXE
1f760 44 20 42 59 20 6f 72 20 4e 4f 54 20 49 4e 44 45  D BY or NOT INDE
1f770 58 45 44 20 63 6c 61 75 73 65 20 74 6f 20 74 68  XED clause to th
1f780 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
1f790 61 64 64 65 64 20 0a 2a 2a 20 65 6c 65 6d 65 6e  added .** elemen
1f7a0 74 20 6f 66 20 74 68 65 20 73 6f 75 72 63 65 2d  t of the source-
1f7b0 6c 69 73 74 20 70 61 73 73 65 64 20 61 73 20 74  list passed as t
1f7c0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1f7d0 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1f7e0 74 65 33 53 72 63 4c 69 73 74 49 6e 64 65 78 65  te3SrcListIndexe
1f7f0 64 42 79 28 50 61 72 73 65 20 2a 70 50 61 72 73  dBy(Parse *pPars
1f800 65 2c 20 53 72 63 4c 69 73 74 20 2a 70 2c 20 54  e, SrcList *p, T
1f810 6f 6b 65 6e 20 2a 70 49 6e 64 65 78 65 64 42 79  oken *pIndexedBy
1f820 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  ){.  assert( pIn
1f830 64 65 78 65 64 42 79 21 3d 30 20 29 3b 0a 20 20  dexedBy!=0 );.  
1f840 69 66 28 20 70 20 26 26 20 41 4c 57 41 59 53 28  if( p && ALWAYS(
1f850 70 2d 3e 6e 53 72 63 3e 30 29 20 29 7b 0a 20 20  p->nSrc>0) ){.  
1f860 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1f870 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
1f880 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d 31 5d 3b  p->a[p->nSrc-1];
1f890 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
1f8a0 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64 65 78 65  em->fg.notIndexe
1f8b0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
1f8c0 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
1f8d0 49 6e 64 65 78 65 64 42 79 3d 3d 30 20 29 3b 0a  IndexedBy==0 );.
1f8e0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65      assert( pIte
1f8f0 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 3d  m->fg.isTabFunc=
1f900 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
1f910 6e 64 65 78 65 64 42 79 2d 3e 6e 3d 3d 31 20 26  ndexedBy->n==1 &
1f920 26 20 21 70 49 6e 64 65 78 65 64 42 79 2d 3e 7a  & !pIndexedBy->z
1f930 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 22   ){.      /* A "
1f940 4e 4f 54 20 49 4e 44 45 58 45 44 22 20 63 6c 61  NOT INDEXED" cla
1f950 75 73 65 20 77 61 73 20 73 75 70 70 6c 69 65 64  use was supplied
1f960 2e 20 53 65 65 20 70 61 72 73 65 2e 79 20 0a 20  . See parse.y . 
1f970 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63       ** construc
1f980 74 20 22 69 6e 64 65 78 65 64 5f 6f 70 74 22 20  t "indexed_opt" 
1f990 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1f9a0 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
1f9b0 6e 6f 74 49 6e 64 65 78 65 64 20 3d 20 31 3b 0a  notIndexed = 1;.
1f9c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f9d0 20 70 49 74 65 6d 2d 3e 75 31 2e 7a 49 6e 64 65   pItem->u1.zInde
1f9e0 78 65 64 42 79 20 3d 20 73 71 6c 69 74 65 33 4e  xedBy = sqlite3N
1f9f0 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61  ameFromToken(pPa
1fa00 72 73 65 2d 3e 64 62 2c 20 70 49 6e 64 65 78 65  rse->db, pIndexe
1fa10 64 42 79 29 3b 0a 20 20 20 20 20 20 70 49 74 65  dBy);.      pIte
1fa20 6d 2d 3e 66 67 2e 69 73 49 6e 64 65 78 65 64 42  m->fg.isIndexedB
1fa30 79 20 3d 20 28 70 49 74 65 6d 2d 3e 75 31 2e 7a  y = (pItem->u1.z
1fa40 49 6e 64 65 78 65 64 42 79 21 3d 30 29 3b 0a 20  IndexedBy!=0);. 
1fa50 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1fa60 2a 20 41 64 64 20 74 68 65 20 6c 69 73 74 20 6f  * Add the list o
1fa70 66 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  f function argum
1fa80 65 6e 74 73 20 74 6f 20 74 68 65 20 53 72 63 4c  ents to the SrcL
1fa90 69 73 74 20 65 6e 74 72 79 20 66 6f 72 20 61 0a  ist entry for a.
1faa0 2a 2a 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d  ** table-valued-
1fab0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
1fac0 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
1fad0 46 75 6e 63 41 72 67 73 28 50 61 72 73 65 20 2a  FuncArgs(Parse *
1fae0 70 50 61 72 73 65 2c 20 53 72 63 4c 69 73 74 20  pParse, SrcList 
1faf0 2a 70 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  *p, ExprList *pL
1fb00 69 73 74 29 7b 0a 20 20 69 66 28 20 70 20 29 7b  ist){.  if( p ){
1fb10 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
1fb20 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
1fb30 3d 20 26 70 2d 3e 61 5b 70 2d 3e 6e 53 72 63 2d  = &p->a[p->nSrc-
1fb40 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1fb50 70 49 74 65 6d 2d 3e 66 67 2e 6e 6f 74 49 6e 64  pItem->fg.notInd
1fb60 65 78 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  exed==0 );.    a
1fb70 73 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67  ssert( pItem->fg
1fb80 2e 69 73 49 6e 64 65 78 65 64 42 79 3d 3d 30 20  .isIndexedBy==0 
1fb90 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1fba0 49 74 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75  Item->fg.isTabFu
1fbb0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 70 49 74  nc==0 );.    pIt
1fbc0 65 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 20  em->u1.pFuncArg 
1fbd0 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = pList;.    pIt
1fbe0 65 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63  em->fg.isTabFunc
1fbf0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
1fc00 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
1fc10 73 74 44 65 6c 65 74 65 28 70 50 61 72 73 65 2d  stDelete(pParse-
1fc20 3e 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 7d  >db, pList);.  }
1fc30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 62  .}../*.** When b
1fc40 75 69 6c 64 69 6e 67 20 75 70 20 61 20 46 52 4f  uilding up a FRO
1fc50 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65 20  M clause in the 
1fc60 70 61 72 73 65 72 2c 20 74 68 65 20 6a 6f 69 6e  parser, the join
1fc70 20 6f 70 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20   operator.** is 
1fc80 69 6e 69 74 69 61 6c 6c 79 20 61 74 74 61 63 68  initially attach
1fc90 65 64 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ed to the left o
1fca0 70 65 72 61 6e 64 2e 20 20 42 75 74 20 74 68 65  perand.  But the
1fcb0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 0a   code generator.
1fcc0 2a 2a 20 65 78 70 65 63 74 73 20 74 68 65 20 6a  ** expects the j
1fcd0 6f 69 6e 20 6f 70 65 72 61 74 6f 72 20 74 6f 20  oin operator to 
1fce0 62 65 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20  be on the right 
1fcf0 6f 70 65 72 61 6e 64 2e 20 20 54 68 69 73 20 72  operand.  This r
1fd00 6f 75 74 69 6e 65 0a 2a 2a 20 53 68 69 66 74 73  outine.** Shifts
1fd10 20 61 6c 6c 20 6a 6f 69 6e 20 6f 70 65 72 61 74   all join operat
1fd20 6f 72 73 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f  ors from left to
1fd30 20 72 69 67 68 74 20 66 6f 72 20 61 6e 20 65 6e   right for an en
1fd40 74 69 72 65 20 46 52 4f 4d 0a 2a 2a 20 63 6c 61  tire FROM.** cla
1fd50 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 61 6d 70  use..**.** Examp
1fd60 6c 65 3a 20 53 75 70 70 6f 73 65 20 74 68 65 20  le: Suppose the 
1fd70 6a 6f 69 6e 20 69 73 20 6c 69 6b 65 20 74 68 69  join is like thi
1fd80 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
1fd90 20 20 20 41 20 6e 61 74 75 72 61 6c 20 63 72 6f     A natural cro
1fda0 73 73 20 6a 6f 69 6e 20 42 0a 2a 2a 0a 2a 2a 20  ss join B.**.** 
1fdb0 54 68 65 20 6f 70 65 72 61 74 6f 72 20 69 73 20  The operator is 
1fdc0 22 6e 61 74 75 72 61 6c 20 63 72 6f 73 73 20 6a  "natural cross j
1fdd0 6f 69 6e 22 2e 20 20 54 68 65 20 41 20 61 6e 64  oin".  The A and
1fde0 20 42 20 6f 70 65 72 61 6e 64 73 20 61 72 65 20   B operands are 
1fdf0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 70 2d 3e  stored.** in p->
1fe00 61 5b 30 5d 20 61 6e 64 20 70 2d 3e 61 5b 31 5d  a[0] and p->a[1]
1fe10 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1fe20 20 54 68 65 20 70 61 72 73 65 72 20 69 6e 69 74   The parser init
1fe30 69 61 6c 6c 79 20 73 74 6f 72 65 73 20 74 68 65  ially stores the
1fe40 0a 2a 2a 20 6f 70 65 72 61 74 6f 72 20 77 69 74  .** operator wit
1fe50 68 20 41 2e 20 20 54 68 69 73 20 72 6f 75 74 69  h A.  This routi
1fe60 6e 65 20 73 68 69 66 74 73 20 74 68 61 74 20 6f  ne shifts that o
1fe70 70 65 72 61 74 6f 72 20 6f 76 65 72 20 74 6f 20  perator over to 
1fe80 42 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  B..*/.void sqlit
1fe90 65 33 53 72 63 4c 69 73 74 53 68 69 66 74 4a 6f  e3SrcListShiftJo
1fea0 69 6e 54 79 70 65 28 53 72 63 4c 69 73 74 20 2a  inType(SrcList *
1feb0 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  p){.  if( p ){. 
1fec0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
1fed0 72 28 69 3d 70 2d 3e 6e 53 72 63 2d 31 3b 20 69  r(i=p->nSrc-1; i
1fee0 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  >0; i--){.      
1fef0 70 2d 3e 61 5b 69 5d 2e 66 67 2e 6a 6f 69 6e 74  p->a[i].fg.joint
1ff00 79 70 65 20 3d 20 70 2d 3e 61 5b 69 2d 31 5d 2e  ype = p->a[i-1].
1ff10 66 67 2e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20  fg.jointype;.   
1ff20 20 7d 0a 20 20 20 20 70 2d 3e 61 5b 30 5d 2e 66   }.    p->a[0].f
1ff30 67 2e 6a 6f 69 6e 74 79 70 65 20 3d 20 30 3b 0a  g.jointype = 0;.
1ff40 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67    }.}../*.** Beg
1ff50 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
1ff60 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1ff70 42 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  BeginTransaction
1ff80 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1ff90 69 6e 74 20 74 79 70 65 29 7b 0a 20 20 73 71 6c  int type){.  sql
1ffa0 69 74 65 33 20 2a 64 62 3b 0a 20 20 56 64 62 65  ite3 *db;.  Vdbe
1ffb0 20 2a 76 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20   *v;.  int i;.. 
1ffc0 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21   assert( pParse!
1ffd0 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 50 61  =0 );.  db = pPa
1ffe0 72 73 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  rse->db;.  asser
1fff0 74 28 20 64 62 21 3d 30 20 29 3b 0a 2f 2a 20 20  t( db!=0 );./*  
20000 69 66 28 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  if( db->aDb[0].p
20010 42 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 20  Bt==0 ) return; 
20020 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
20030 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
20040 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43  , SQLITE_TRANSAC
20050 54 49 4f 4e 2c 20 22 42 45 47 49 4e 22 2c 20 30  TION, "BEGIN", 0
20060 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  , 0) ){.    retu
20070 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71  rn;.  }.  v = sq
20080 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
20090 72 73 65 29 3b 0a 20 20 69 66 28 20 21 76 20 29  rse);.  if( !v )
200a0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 74   return;.  if( t
200b0 79 70 65 21 3d 54 4b 5f 44 45 46 45 52 52 45 44  ype!=TK_DEFERRED
200c0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
200d0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
200e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
200f0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
20100 54 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 2c 20  Transaction, i, 
20110 28 74 79 70 65 3d 3d 54 4b 5f 45 58 43 4c 55 53  (type==TK_EXCLUS
20120 49 56 45 29 2b 31 29 3b 0a 20 20 20 20 20 20 73  IVE)+1);.      s
20130 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
20140 72 65 65 28 76 2c 20 69 29 3b 0a 20 20 20 20 7d  ree(v, i);.    }
20150 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
20160 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
20170 75 74 6f 43 6f 6d 6d 69 74 2c 20 30 2c 20 30 29  utoCommit, 0, 0)
20180 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
20190 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
201a0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43  */.void sqlite3C
201b0 6f 6d 6d 69 74 54 72 61 6e 73 61 63 74 69 6f 6e  ommitTransaction
201c0 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
201d0 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a 20 20 61  .  Vdbe *v;..  a
201e0 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d 30  ssert( pParse!=0
201f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
20200 61 72 73 65 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  arse->db!=0 );. 
20210 20 69 66 28 20 73 71 6c 69 74 65 33 41 75 74 68   if( sqlite3Auth
20220 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51  Check(pParse, SQ
20230 4c 49 54 45 5f 54 52 41 4e 53 41 43 54 49 4f 4e  LITE_TRANSACTION
20240 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
20250 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
20260 0a 20 20 7d 0a 20 20 76 20 3d 20 73 71 6c 69 74  .  }.  v = sqlit
20270 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
20280 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20  );.  if( v ){.  
20290 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
202a0 4f 70 32 28 76 2c 20 4f 50 5f 41 75 74 6f 43 6f  Op2(v, OP_AutoCo
202b0 6d 6d 69 74 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  mmit, 1, 0);.  }
202c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
202d0 63 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ck a transaction
202e0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
202f0 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61 63 74  RollbackTransact
20300 69 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73  ion(Parse *pPars
20310 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 0a  e){.  Vdbe *v;..
20320 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
20330 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
20340 20 70 50 61 72 73 65 2d 3e 64 62 21 3d 30 20 29   pParse->db!=0 )
20350 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 41  ;.  if( sqlite3A
20360 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65 2c  uthCheck(pParse,
20370 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
20380 49 4f 4e 2c 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  ION, "ROLLBACK",
20390 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65   0, 0) ){.    re
203a0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 76 20 3d 20  turn;.  }.  v = 
203b0 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
203c0 50 61 72 73 65 29 3b 0a 20 20 69 66 28 20 76 20  Parse);.  if( v 
203d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
203e0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41  beAddOp2(v, OP_A
203f0 75 74 6f 43 6f 6d 6d 69 74 2c 20 31 2c 20 31 29  utoCommit, 1, 1)
20400 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
20410 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20420 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 61  called by the pa
20430 72 73 65 72 20 77 68 65 6e 20 69 74 20 70 61 72  rser when it par
20440 73 65 73 20 61 20 63 6f 6d 6d 61 6e 64 20 74 6f  ses a command to
20450 20 63 72 65 61 74 65 2c 0a 2a 2a 20 72 65 6c 65   create,.** rele
20460 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  ase or rollback 
20470 61 6e 20 53 51 4c 20 73 61 76 65 70 6f 69 6e 74  an SQL savepoint
20480 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
20490 65 33 53 61 76 65 70 6f 69 6e 74 28 50 61 72 73  e3Savepoint(Pars
204a0 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6f  e *pParse, int o
204b0 70 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  p, Token *pName)
204c0 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  {.  char *zName 
204d0 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
204e0 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
204f0 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28  b, pName);.  if(
20500 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 56 64   zName ){.    Vd
20510 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47  be *v = sqlite3G
20520 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
20530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
20540 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
20550 4e 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  N.    static con
20560 73 74 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  st char * const 
20570 61 7a 5b 5d 20 3d 20 7b 20 22 42 45 47 49 4e 22  az[] = { "BEGIN"
20580 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52 4f  , "RELEASE", "RO
20590 4c 4c 42 41 43 4b 22 20 7d 3b 0a 20 20 20 20 61  LLBACK" };.    a
205a0 73 73 65 72 74 28 20 21 53 41 56 45 50 4f 49 4e  ssert( !SAVEPOIN
205b0 54 5f 42 45 47 49 4e 20 26 26 20 53 41 56 45 50  T_BEGIN && SAVEP
205c0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3d 3d 31 20  OINT_RELEASE==1 
205d0 26 26 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  && SAVEPOINT_ROL
205e0 4c 42 41 43 4b 3d 3d 32 20 29 3b 0a 23 65 6e 64  LBACK==2 );.#end
205f0 69 66 0a 20 20 20 20 69 66 28 20 21 76 20 7c 7c  if.    if( !v ||
20600 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
20610 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
20620 5f 53 41 56 45 50 4f 49 4e 54 2c 20 61 7a 5b 6f  _SAVEPOINT, az[o
20630 70 5d 2c 20 7a 4e 61 6d 65 2c 20 30 29 20 29 7b  p], zName, 0) ){
20640 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
20650 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  Free(pParse->db,
20660 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72   zName);.      r
20670 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
20680 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
20690 70 34 28 76 2c 20 4f 50 5f 53 61 76 65 70 6f 69  p4(v, OP_Savepoi
206a0 6e 74 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 7a 4e  nt, op, 0, 0, zN
206b0 61 6d 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  ame, P4_DYNAMIC)
206c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ;.  }.}../*.** M
206d0 61 6b 65 20 73 75 72 65 20 74 68 65 20 54 45 4d  ake sure the TEM
206e0 50 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  P database is op
206f0 65 6e 20 61 6e 64 20 61 76 61 69 6c 61 62 6c 65  en and available
20700 20 66 6f 72 20 75 73 65 2e 20 20 52 65 74 75 72   for use.  Retur
20710 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  n.** the number 
20720 6f 66 20 65 72 72 6f 72 73 2e 20 20 4c 65 61 76  of errors.  Leav
20730 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
20740 61 67 65 73 20 69 6e 20 74 68 65 20 70 50 61 72  ages in the pPar
20750 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
20760 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 70 65 6e  .int sqlite3Open
20770 54 65 6d 70 44 61 74 61 62 61 73 65 28 50 61 72  TempDatabase(Par
20780 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
20790 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
207a0 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66 28 20 64  rse->db;.  if( d
207b0 62 2d 3e 61 44 62 5b 31 5d 2e 70 42 74 3d 3d 30  b->aDb[1].pBt==0
207c0 20 26 26 20 21 70 50 61 72 73 65 2d 3e 65 78 70   && !pParse->exp
207d0 6c 61 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  lain ){.    int 
207e0 72 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70  rc;.    Btree *p
207f0 42 74 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63  Bt;.    static c
20800 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
20810 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
20820 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
20830 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  E |.          SQ
20840 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
20850 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c   |.          SQL
20860 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
20870 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 53  VE |.          S
20880 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
20890 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
208a0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
208b0 5f 54 45 4d 50 5f 44 42 3b 0a 0a 20 20 20 20 72  _TEMP_DB;..    r
208c0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
208d0 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 30  Open(db->pVfs, 0
208e0 2c 20 64 62 2c 20 26 70 42 74 2c 20 30 2c 20 66  , db, &pBt, 0, f
208f0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
20900 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20910 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
20920 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75  orMsg(pParse, "u
20930 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 61 20  nable to open a 
20940 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
20950 73 65 20 22 0a 20 20 20 20 20 20 20 20 22 66 69  se ".        "fi
20960 6c 65 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  le for storing t
20970 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 73 22  emporary tables"
20980 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d  );.      pParse-
20990 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
209a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
209b0 20 20 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70      db->aDb[1].p
209c0 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 61 73  Bt = pBt;.    as
209d0 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 31 5d  sert( db->aDb[1]
209e0 2e 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20  .pSchema );.    
209f0 69 66 28 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  if( SQLITE_NOMEM
20a00 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  ==sqlite3BtreeSe
20a10 74 50 61 67 65 53 69 7a 65 28 70 42 74 2c 20 64  tPageSize(pBt, d
20a20 62 2d 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 2c  b->nextPagesize,
20a30 20 2d 31 2c 20 30 29 20 29 7b 0a 20 20 20 20 20   -1, 0) ){.     
20a40 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
20a50 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 74  d = 1;.      ret
20a60 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  urn 1;.    }.  }
20a70 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
20a80 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  /*.** Record the
20a90 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 73   fact that the s
20aa0 63 68 65 6d 61 20 63 6f 6f 6b 69 65 20 77 69 6c  chema cookie wil
20ab0 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 76 65 72  l need to be ver
20ac0 69 66 69 65 64 0a 2a 2a 20 66 6f 72 20 64 61 74  ified.** for dat
20ad0 61 62 61 73 65 20 69 44 62 2e 20 20 54 68 65 20  abase iDb.  The 
20ae0 63 6f 64 65 20 74 6f 20 61 63 74 75 61 6c 6c 79  code to actually
20af0 20 76 65 72 69 66 79 20 74 68 65 20 73 63 68 65   verify the sche
20b00 6d 61 20 63 6f 6f 6b 69 65 0a 2a 2a 20 77 69 6c  ma cookie.** wil
20b10 6c 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65  l occur at the e
20b20 6e 64 20 6f 66 20 74 68 65 20 74 6f 70 2d 6c 65  nd of the top-le
20b30 76 65 6c 20 56 44 42 45 20 61 6e 64 20 77 69 6c  vel VDBE and wil
20b40 6c 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  l be generated.*
20b50 2a 20 6c 61 74 65 72 2c 20 62 79 20 73 71 6c 69  * later, by sqli
20b60 74 65 33 46 69 6e 69 73 68 43 6f 64 69 6e 67 28  te3FinishCoding(
20b70 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
20b80 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
20b90 6d 61 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ma(Parse *pParse
20ba0 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20 50 61  , int iDb){.  Pa
20bb0 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c 20 3d  rse *pToplevel =
20bc0 20 73 71 6c 69 74 65 33 50 61 72 73 65 54 6f 70   sqlite3ParseTop
20bd0 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b 0a 20  level(pParse);. 
20be0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
20bf0 54 6f 70 6c 65 76 65 6c 2d 3e 64 62 3b 0a 0a 20  Toplevel->db;.. 
20c00 20 61 73 73 65 72 74 28 20 69 44 62 3e 3d 30 20   assert( iDb>=0 
20c10 26 26 20 69 44 62 3c 64 62 2d 3e 6e 44 62 20 29  && iDb<db->nDb )
20c20 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
20c30 61 44 62 5b 69 44 62 5d 2e 70 42 74 21 3d 30 20  aDb[iDb].pBt!=0 
20c40 7c 7c 20 69 44 62 3d 3d 31 20 29 3b 0a 20 20 61  || iDb==1 );.  a
20c50 73 73 65 72 74 28 20 69 44 62 3c 53 51 4c 49 54  ssert( iDb<SQLIT
20c60 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2b 32  E_MAX_ATTACHED+2
20c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20c80 6c 69 74 65 33 53 63 68 65 6d 61 4d 75 74 65 78  lite3SchemaMutex
20c90 48 65 6c 64 28 64 62 2c 20 69 44 62 2c 20 30 29  Held(db, iDb, 0)
20ca0 20 29 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b   );.  if( DbMask
20cb0 54 65 73 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  Test(pToplevel->
20cc0 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
20cd0 3d 3d 30 20 29 7b 0a 20 20 20 20 44 62 4d 61 73  ==0 ){.    DbMas
20ce0 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
20cf0 63 6f 6f 6b 69 65 4d 61 73 6b 2c 20 69 44 62 29  cookieMask, iDb)
20d00 3b 0a 20 20 20 20 70 54 6f 70 6c 65 76 65 6c 2d  ;.    pToplevel-
20d10 3e 63 6f 6f 6b 69 65 56 61 6c 75 65 5b 69 44 62  >cookieValue[iDb
20d20 5d 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d  ] = db->aDb[iDb]
20d30 2e 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  .pSchema->schema
20d40 5f 63 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28  _cookie;.    if(
20d50 20 21 4f 4d 49 54 5f 54 45 4d 50 44 42 20 26 26   !OMIT_TEMPDB &&
20d60 20 69 44 62 3d 3d 31 20 29 7b 0a 20 20 20 20 20   iDb==1 ){.     
20d70 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 65 6d 70   sqlite3OpenTemp
20d80 44 61 74 61 62 61 73 65 28 70 54 6f 70 6c 65 76  Database(pToplev
20d90 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  el);.    }.  }.}
20da0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ../*.** If argum
20db0 65 6e 74 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c  ent zDb is NULL,
20dc0 20 74 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   then call sqlit
20dd0 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
20de0 6d 61 28 29 20 66 6f 72 20 65 61 63 68 20 0a 2a  ma() for each .*
20df0 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
20e00 61 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ase. Otherwise, 
20e10 69 6e 76 6f 6b 65 20 69 74 20 66 6f 72 20 74 68  invoke it for th
20e20 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 64  e database named
20e30 20 7a 44 62 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f   zDb only..*/.vo
20e40 69 64 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  id sqlite3CodeVe
20e50 72 69 66 79 4e 61 6d 65 64 53 63 68 65 6d 61 28  rifyNamedSchema(
20e60 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 63  Parse *pParse, c
20e70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
20e80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
20e90 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69   pParse->db;.  i
20ea0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
20eb0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
20ec0 7b 0a 20 20 20 20 44 62 20 2a 70 44 62 20 3d 20  {.    Db *pDb = 
20ed0 26 64 62 2d 3e 61 44 62 5b 69 5d 3b 0a 20 20 20  &db->aDb[i];.   
20ee0 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 26 26   if( pDb->pBt &&
20ef0 20 28 21 7a 44 62 20 7c 7c 20 30 3d 3d 73 71 6c   (!zDb || 0==sql
20f00 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62 2c  ite3StrICmp(zDb,
20f10 20 70 44 62 2d 3e 7a 4e 61 6d 65 29 29 20 29 7b   pDb->zName)) ){
20f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
20f30 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
20f40 50 61 72 73 65 2c 20 69 29 3b 0a 20 20 20 20 7d  Parse, i);.    }
20f50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
20f60 6e 65 72 61 74 65 20 56 44 42 45 20 63 6f 64 65  nerate VDBE code
20f70 20 74 68 61 74 20 70 72 65 70 61 72 65 73 20 66   that prepares f
20f80 6f 72 20 64 6f 69 6e 67 20 61 6e 20 6f 70 65 72  or doing an oper
20f90 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 6d 69  ation that.** mi
20fa0 67 68 74 20 63 68 61 6e 67 65 20 74 68 65 20 64  ght change the d
20fb0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
20fc0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 74 61 72  his routine star
20fd0 74 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ts a new transac
20fe0 74 69 6f 6e 20 69 66 20 77 65 20 61 72 65 20 6e  tion if we are n
20ff0 6f 74 20 61 6c 72 65 61 64 79 20 77 69 74 68 69  ot already withi
21000 6e 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  n.** a transacti
21010 6f 6e 2e 20 20 49 66 20 77 65 20 61 72 65 20 61  on.  If we are a
21020 6c 72 65 61 64 79 20 77 69 74 68 69 6e 20 61 20  lready within a 
21030 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
21040 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a  n a checkpoint.*
21050 2a 20 69 73 20 73 65 74 20 69 66 20 74 68 65 20  * is set if the 
21060 73 65 74 53 74 61 74 65 6d 65 6e 74 20 70 61 72  setStatement par
21070 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2e 20  ameter is true. 
21080 20 41 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68   A checkpoint sh
21090 6f 75 6c 64 0a 2a 2a 20 62 65 20 73 65 74 20 66  ould.** be set f
210a0 6f 72 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68  or operations th
210b0 61 74 20 6d 69 67 68 74 20 66 61 69 6c 20 28 64  at might fail (d
210c0 75 65 20 74 6f 20 61 20 63 6f 6e 73 74 72 61 69  ue to a constrai
210d0 6e 74 29 20 70 61 72 74 20 6f 66 0a 2a 2a 20 74  nt) part of.** t
210e0 68 65 20 77 61 79 20 74 68 72 6f 75 67 68 20 61  he way through a
210f0 6e 64 20 77 68 69 63 68 20 77 69 6c 6c 20 6e 65  nd which will ne
21100 65 64 20 74 6f 20 75 6e 64 6f 20 73 6f 6d 65 20  ed to undo some 
21110 77 72 69 74 65 73 20 77 69 74 68 6f 75 74 20 68  writes without h
21120 61 76 69 6e 67 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  aving to.** roll
21130 62 61 63 6b 20 74 68 65 20 77 68 6f 6c 65 20 74  back the whole t
21140 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 46 6f 72  ransaction.  For
21150 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 68 65 72   operations wher
21160 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
21170 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 68 65 63  s.** can be chec
21180 6b 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 63  ked before any c
21190 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
211a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
211b0 20 69 74 20 69 73 20 6e 65 76 65 72 0a 2a 2a 20   it is never.** 
211c0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 75 6e 64  necessary to und
211d0 6f 20 61 20 77 72 69 74 65 20 61 6e 64 20 74 68  o a write and th
211e0 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 73 68 6f  e checkpoint sho
211f0 75 6c 64 20 6e 6f 74 20 62 65 20 73 65 74 2e 0a  uld not be set..
21200 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
21210 65 67 69 6e 57 72 69 74 65 4f 70 65 72 61 74 69  eginWriteOperati
21220 6f 6e 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  on(Parse *pParse
21230 2c 20 69 6e 74 20 73 65 74 53 74 61 74 65 6d 65  , int setStateme
21240 6e 74 2c 20 69 6e 74 20 69 44 62 29 7b 0a 20 20  nt, int iDb){.  
21250 50 61 72 73 65 20 2a 70 54 6f 70 6c 65 76 65 6c  Parse *pToplevel
21260 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 54   = sqlite3ParseT
21270 6f 70 6c 65 76 65 6c 28 70 50 61 72 73 65 29 3b  oplevel(pParse);
21280 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
21290 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
212a0 65 2c 20 69 44 62 29 3b 0a 20 20 44 62 4d 61 73  e, iDb);.  DbMas
212b0 6b 53 65 74 28 70 54 6f 70 6c 65 76 65 6c 2d 3e  kSet(pToplevel->
212c0 77 72 69 74 65 4d 61 73 6b 2c 20 69 44 62 29 3b  writeMask, iDb);
212d0 0a 20 20 70 54 6f 70 6c 65 76 65 6c 2d 3e 69 73  .  pToplevel->is
212e0 4d 75 6c 74 69 57 72 69 74 65 20 7c 3d 20 73 65  MultiWrite |= se
212f0 74 53 74 61 74 65 6d 65 6e 74 3b 0a 7d 0a 0a 2f  tStatement;.}../
21300 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
21310 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  at the statement
21320 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 72   currently under
21330 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 6d 69   construction mi
21340 67 68 74 20 77 72 69 74 65 0a 2a 2a 20 6d 6f 72  ght write.** mor
21350 65 20 74 68 61 6e 20 6f 6e 65 20 65 6e 74 72 79  e than one entry
21360 20 28 65 78 61 6d 70 6c 65 3a 20 64 65 6c 65 74   (example: delet
21370 69 6e 67 20 6f 6e 65 20 72 6f 77 20 74 68 65 6e  ing one row then
21380 20 69 6e 73 65 72 74 69 6e 67 20 61 6e 6f 74 68   inserting anoth
21390 65 72 2c 0a 2a 2a 20 69 6e 73 65 72 74 69 6e 67  er,.** inserting
213a0 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 69   multiple rows i
213b0 6e 20 61 20 74 61 62 6c 65 2c 20 6f 72 20 69 6e  n a table, or in
213c0 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 61 6e  serting a row an
213d0 64 20 69 6e 64 65 78 20 65 6e 74 72 69 65 73 2e  d index entries.
213e0 29 0a 2a 2a 20 49 66 20 61 6e 20 61 62 6f 72 74  ).** If an abort
213f0 20 6f 63 63 75 72 73 20 61 66 74 65 72 20 73 6f   occurs after so
21400 6d 65 20 6f 66 20 74 68 65 73 65 20 77 72 69 74  me of these writ
21410 65 73 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65  es have complete
21420 64 2c 20 74 68 65 6e 20 69 74 20 77 69 6c 6c 0a  d, then it will.
21430 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
21440 74 6f 20 75 6e 64 6f 20 74 68 65 20 63 6f 6d 70  to undo the comp
21450 6c 65 74 65 64 20 77 72 69 74 65 73 2e 0a 2a 2f  leted writes..*/
21460 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4d 75 6c  .void sqlite3Mul
21470 74 69 57 72 69 74 65 28 50 61 72 73 65 20 2a 70  tiWrite(Parse *p
21480 50 61 72 73 65 29 7b 0a 20 20 50 61 72 73 65 20  Parse){.  Parse 
21490 2a 70 54 6f 70 6c 65 76 65 6c 20 3d 20 73 71 6c  *pToplevel = sql
214a0 69 74 65 33 50 61 72 73 65 54 6f 70 6c 65 76 65  ite3ParseTopleve
214b0 6c 28 70 50 61 72 73 65 29 3b 0a 20 20 70 54 6f  l(pParse);.  pTo
214c0 70 6c 65 76 65 6c 2d 3e 69 73 4d 75 6c 74 69 57  plevel->isMultiW
214d0 72 69 74 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 20  rite = 1;.}../* 
214e0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e  .** The code gen
214f0 65 72 61 74 6f 72 20 63 61 6c 6c 73 20 74 68 69  erator calls thi
21500 73 20 72 6f 75 74 69 6e 65 20 69 66 20 69 73 20  s routine if is 
21510 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 69  discovers that i
21520 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  t is.** possible
21530 20 74 6f 20 61 62 6f 72 74 20 61 20 73 74 61 74   to abort a stat
21540 65 6d 65 6e 74 20 70 72 69 6f 72 20 74 6f 20 63  ement prior to c
21550 6f 6d 70 6c 65 74 69 6f 6e 2e 20 20 49 6e 20 6f  ompletion.  In o
21560 72 64 65 72 20 74 6f 20 0a 2a 2a 20 70 65 72 66  rder to .** perf
21570 6f 72 6d 20 74 68 69 73 20 61 62 6f 72 74 20 77  orm this abort w
21580 69 74 68 6f 75 74 20 63 6f 72 72 75 70 74 69 6e  ithout corruptin
21590 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  g the database, 
215a0 77 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 0a  we need to make.
215b0 2a 2a 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ** sure that the
215c0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 70 72   statement is pr
215d0 6f 74 65 63 74 65 64 20 62 79 20 61 20 73 74 61  otected by a sta
215e0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
215f0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 65 63 68 6e 69  on..**.** Techni
21600 63 61 6c 6c 79 2c 20 77 65 20 6f 6e 6c 79 20 6e  cally, we only n
21610 65 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 6d  eed to set the m
21620 61 79 41 62 6f 72 74 20 66 6c 61 67 20 69 66 20  ayAbort flag if 
21630 74 68 65 0a 2a 2a 20 69 73 4d 75 6c 74 69 57 72  the.** isMultiWr
21640 69 74 65 20 66 6c 61 67 20 77 61 73 20 70 72 65  ite flag was pre
21650 76 69 6f 75 73 6c 79 20 73 65 74 2e 20 20 54 68  viously set.  Th
21660 65 72 65 20 69 73 20 61 20 74 69 6d 65 20 64 65  ere is a time de
21670 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 73 75 63 68  pendency.** such
21680 20 74 68 61 74 20 74 68 65 20 61 62 6f 72 74 20   that the abort 
21690 6d 75 73 74 20 6f 63 63 75 72 20 61 66 74 65 72  must occur after
216a0 20 74 68 65 20 6d 75 6c 74 69 77 72 69 74 65 2e   the multiwrite.
216b0 20 20 54 68 69 73 20 6d 61 6b 65 73 0a 2a 2a 20    This makes.** 
216c0 73 6f 6d 65 20 73 74 61 74 65 6d 65 6e 74 73 20  some statements 
216d0 69 6e 76 6f 6c 76 69 6e 67 20 74 68 65 20 52 45  involving the RE
216e0 50 4c 41 43 45 20 63 6f 6e 66 6c 69 63 74 20 72  PLACE conflict r
216f0 65 73 6f 6c 75 74 69 6f 6e 20 61 6c 67 6f 72 69  esolution algori
21700 74 68 6d 0a 2a 2a 20 67 6f 20 61 20 6c 69 74 74  thm.** go a litt
21710 6c 65 20 66 61 73 74 65 72 2e 20 20 42 75 74 20  le faster.  But 
21720 74 61 6b 69 6e 67 20 61 64 76 61 6e 74 61 67 65  taking advantage
21730 20 6f 66 20 74 68 69 73 20 74 69 6d 65 20 64 65   of this time de
21740 70 65 6e 64 65 6e 63 79 0a 2a 2a 20 6d 61 6b 65  pendency.** make
21750 73 20 69 74 20 6d 6f 72 65 20 64 69 66 66 69 63  s it more diffic
21760 75 6c 74 20 74 6f 20 70 72 6f 76 65 20 74 68 61  ult to prove tha
21770 74 20 74 68 65 20 63 6f 64 65 20 69 73 20 63 6f  t the code is co
21780 72 72 65 63 74 20 28 69 6e 20 0a 2a 2a 20 70 61  rrect (in .** pa
21790 72 74 69 63 75 6c 61 72 2c 20 69 74 20 70 72 65  rticular, it pre
217a0 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 77 72  vents us from wr
217b0 69 74 69 6e 67 20 61 6e 20 65 66 66 65 63 74 69  iting an effecti
217c0 76 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61  ve.** implementa
217d0 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 41  tion of sqlite3A
217e0 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 29  ssertMayAbort())
217f0 20 61 6e 64 20 73 6f 20 77 65 20 68 61 76 65 20   and so we have 
21800 63 68 6f 73 65 6e 0a 2a 2a 20 74 6f 20 74 61 6b  chosen.** to tak
21810 65 20 74 68 65 20 73 61 66 65 20 72 6f 75 74 65  e the safe route
21820 20 61 6e 64 20 73 6b 69 70 20 74 68 65 20 6f 70   and skip the op
21830 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  timization..*/.v
21840 6f 69 64 20 73 71 6c 69 74 65 33 4d 61 79 41 62  oid sqlite3MayAb
21850 6f 72 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ort(Parse *pPars
21860 65 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 54 6f  e){.  Parse *pTo
21870 70 6c 65 76 65 6c 20 3d 20 73 71 6c 69 74 65 33  plevel = sqlite3
21880 50 61 72 73 65 54 6f 70 6c 65 76 65 6c 28 70 50  ParseToplevel(pP
21890 61 72 73 65 29 3b 0a 20 20 70 54 6f 70 6c 65 76  arse);.  pToplev
218a0 65 6c 2d 3e 6d 61 79 41 62 6f 72 74 20 3d 20 31  el->mayAbort = 1
218b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ;.}../*.** Code 
218c0 61 6e 20 4f 50 5f 48 61 6c 74 20 74 68 61 74 20  an OP_Halt that 
218d0 63 61 75 73 65 73 20 74 68 65 20 76 64 62 65 20  causes the vdbe 
218e0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  to return an SQL
218f0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 0a 2a  ITE_CONSTRAINT.*
21900 2a 20 65 72 72 6f 72 2e 20 54 68 65 20 6f 6e 45  * error. The onE
21910 72 72 6f 72 20 70 61 72 61 6d 65 74 65 72 20 64  rror parameter d
21920 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20  etermines which 
21930 28 69 66 20 61 6e 79 29 20 6f 66 20 74 68 65 20  (if any) of the 
21940 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 61 6e 64  statement.** and
21950 2f 6f 72 20 63 75 72 72 65 6e 74 20 74 72 61 6e  /or current tran
21960 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
21970 64 20 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  d back..*/.void 
21980 73 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74  sqlite3HaltConst
21990 72 61 69 6e 74 28 0a 20 20 50 61 72 73 65 20 2a  raint(.  Parse *
219a0 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61  pParse,    /* Pa
219b0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
219c0 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 2c 20  .  int errCode, 
219d0 20 20 20 20 20 2f 2a 20 65 78 74 65 6e 64 65 64       /* extended
219e0 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
219f0 20 69 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20   int onError,   
21a00 20 20 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74     /* Constraint
21a10 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
21a20 2a 70 34 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *p4,         /* 
21a30 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  Error message */
21a40 0a 20 20 69 38 20 70 34 74 79 70 65 2c 20 20 20  .  i8 p4type,   
21a50 20 20 20 20 20 2f 2a 20 50 34 5f 53 54 41 54 49       /* P4_STATI
21a60 43 20 6f 72 20 50 34 5f 54 52 41 4e 53 49 45 4e  C or P4_TRANSIEN
21a70 54 20 2a 2f 0a 20 20 75 38 20 70 35 45 72 72 6d  T */.  u8 p5Errm
21a80 73 67 20 20 20 20 20 20 20 2f 2a 20 50 35 5f 45  sg       /* P5_E
21a90 72 72 4d 73 67 20 74 79 70 65 20 2a 2f 0a 29 7b  rrMsg type */.){
21aa0 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c  .  Vdbe *v = sql
21ab0 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
21ac0 73 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  se);.  assert( (
21ad0 65 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53  errCode&0xff)==S
21ae0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
21af0 20 29 3b 0a 20 20 69 66 28 20 6f 6e 45 72 72 6f   );.  if( onErro
21b00 72 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  r==OE_Abort ){. 
21b10 20 20 20 73 71 6c 69 74 65 33 4d 61 79 41 62 6f     sqlite3MayAbo
21b20 72 74 28 70 50 61 72 73 65 29 3b 0a 20 20 7d 0a  rt(pParse);.  }.
21b30 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
21b40 4f 70 34 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op4(v, OP_Halt, 
21b50 65 72 72 43 6f 64 65 2c 20 6f 6e 45 72 72 6f 72  errCode, onError
21b60 2c 20 30 2c 20 70 34 2c 20 70 34 74 79 70 65 29  , 0, p4, p4type)
21b70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
21b80 68 61 6e 67 65 50 35 28 76 2c 20 70 35 45 72 72  hangeP5(v, p5Err
21b90 6d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  msg);.}../*.** C
21ba0 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74 20 64  ode an OP_Halt d
21bb0 75 65 20 74 6f 20 55 4e 49 51 55 45 20 6f 72 20  ue to UNIQUE or 
21bc0 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6e 73  PRIMARY KEY cons
21bd0 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e  traint violation
21be0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
21bf0 33 55 6e 69 71 75 65 43 6f 6e 73 74 72 61 69 6e  3UniqueConstrain
21c00 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
21c10 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  se,    /* Parsin
21c20 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
21c30 6e 74 20 6f 6e 45 72 72 6f 72 2c 20 20 20 20 20  nt onError,     
21c40 20 2f 2a 20 43 6f 6e 73 74 72 61 69 6e 74 20 74   /* Constraint t
21c50 79 70 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ype */.  Index *
21c60 70 49 64 78 20 20 20 20 20 20 20 2f 2a 20 54 68  pIdx       /* Th
21c70 65 20 69 6e 64 65 78 20 74 68 61 74 20 74 72 69  e index that tri
21c80 67 67 65 72 73 20 74 68 65 20 63 6f 6e 73 74 72  ggers the constr
21c90 61 69 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  aint */.){.  cha
21ca0 72 20 2a 7a 45 72 72 3b 0a 20 20 69 6e 74 20 6a  r *zErr;.  int j
21cb0 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 65 72 72  ;.  StrAccum err
21cc0 4d 73 67 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  Msg;.  Table *pT
21cd0 61 62 20 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c  ab = pIdx->pTabl
21ce0 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 53 74 72  e;..  sqlite3Str
21cf0 41 63 63 75 6d 49 6e 69 74 28 26 65 72 72 4d 73  AccumInit(&errMs
21d00 67 2c 20 70 50 61 72 73 65 2d 3e 64 62 2c 20 30  g, pParse->db, 0
21d10 2c 20 30 2c 20 32 30 30 29 3b 0a 20 20 69 66 28  , 0, 200);.  if(
21d20 20 70 49 64 78 2d 3e 61 43 6f 6c 45 78 70 72 20   pIdx->aColExpr 
21d30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 58 50  ){.    sqlite3XP
21d40 72 69 6e 74 66 28 26 65 72 72 4d 73 67 2c 20 30  rintf(&errMsg, 0
21d50 2c 20 22 69 6e 64 65 78 20 27 25 71 27 22 2c 20  , "index '%q'", 
21d60 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pIdx->zName);.  
21d70 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 6a  }else{.    for(j
21d80 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 4b 65 79  =0; j<pIdx->nKey
21d90 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Col; j++){.     
21da0 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 20   char *zCol;.   
21db0 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
21dc0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3e 3d 30 20  >aiColumn[j]>=0 
21dd0 29 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20  );.      zCol = 
21de0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 49 64 78 2d  pTab->aCol[pIdx-
21df0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  >aiColumn[j]].zN
21e00 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  ame;.      if( j
21e10 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63 63   ) sqlite3StrAcc
21e20 75 6d 41 70 70 65 6e 64 28 26 65 72 72 4d 73 67  umAppend(&errMsg
21e30 2c 20 22 2c 20 22 2c 20 32 29 3b 0a 20 20 20 20  , ", ", 2);.    
21e40 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
21e50 28 26 65 72 72 4d 73 67 2c 20 30 2c 20 22 25 73  (&errMsg, 0, "%s
21e60 2e 25 73 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  .%s", pTab->zNam
21e70 65 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  e, zCol);.    }.
21e80 20 20 7d 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c    }.  zErr = sql
21e90 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69  ite3StrAccumFini
21ea0 73 68 28 26 65 72 72 4d 73 67 29 3b 0a 20 20 73  sh(&errMsg);.  s
21eb0 71 6c 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72  qlite3HaltConstr
21ec0 61 69 6e 74 28 70 50 61 72 73 65 2c 20 0a 20 20  aint(pParse, .  
21ed0 20 20 49 73 50 72 69 6d 61 72 79 4b 65 79 49 6e    IsPrimaryKeyIn
21ee0 64 65 78 28 70 49 64 78 29 20 3f 20 53 51 4c 49  dex(pIdx) ? SQLI
21ef0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
21f00 49 4d 41 52 59 4b 45 59 20 0a 20 20 20 20 20 20  IMARYKEY .      
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 20 20 20 20 20 20 3a 20 53 51 4c 49 54 45 5f 43        : SQLITE_C
21f30 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45  ONSTRAINT_UNIQUE
21f40 2c 0a 20 20 20 20 6f 6e 45 72 72 6f 72 2c 20 7a  ,.    onError, z
21f50 45 72 72 2c 20 50 34 5f 44 59 4e 41 4d 49 43 2c  Err, P4_DYNAMIC,
21f60 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
21f70 69 71 75 65 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ique);.}.../*.**
21f80 20 43 6f 64 65 20 61 6e 20 4f 50 5f 48 61 6c 74   Code an OP_Halt
21f90 20 64 75 65 20 74 6f 20 6e 6f 6e 2d 75 6e 69 71   due to non-uniq
21fa0 75 65 20 72 6f 77 69 64 2e 0a 2a 2f 0a 76 6f 69  ue rowid..*/.voi
21fb0 64 20 73 71 6c 69 74 65 33 52 6f 77 69 64 43 6f  d sqlite3RowidCo
21fc0 6e 73 74 72 61 69 6e 74 28 0a 20 20 50 61 72 73  nstraint(.  Pars
21fd0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
21fe0 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
21ff0 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 45 72 72 6f   */.  int onErro
22000 72 2c 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 6c  r,      /* Confl
22010 69 63 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 61  ict resolution a
22020 6c 67 6f 72 69 74 68 6d 20 2a 2f 0a 20 20 54 61  lgorithm */.  Ta
22030 62 6c 65 20 2a 70 54 61 62 20 20 20 20 20 20 20  ble *pTab       
22040 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 77 69 74  /* The table wit
22050 68 20 74 68 65 20 6e 6f 6e 2d 75 6e 69 71 75 65  h the non-unique
22060 20 72 6f 77 69 64 20 2a 2f 20 0a 29 7b 0a 20 20   rowid */ .){.  
22070 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 69 6e  char *zMsg;.  in
22080 74 20 72 63 3b 0a 20 20 69 66 28 20 70 54 61 62  t rc;.  if( pTab
22090 2d 3e 69 50 4b 65 79 3e 3d 30 20 29 7b 0a 20 20  ->iPKey>=0 ){.  
220a0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
220b0 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 2d 3e  MPrintf(pParse->
220c0 64 62 2c 20 22 25 73 2e 25 73 22 2c 20 70 54 61  db, "%s.%s", pTa
220d0 62 2d 3e 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20  b->zName,.      
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 20 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70      pTab->aCol[p
22100 54 61 62 2d 3e 69 50 4b 65 79 5d 2e 7a 4e 61 6d  Tab->iPKey].zNam
22110 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
22120 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
22130 52 49 4d 41 52 59 4b 45 59 3b 0a 20 20 7d 65 6c  RIMARYKEY;.  }el
22140 73 65 7b 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73  se{.    zMsg = s
22150 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 70 50  qlite3MPrintf(pP
22160 61 72 73 65 2d 3e 64 62 2c 20 22 25 73 2e 72 6f  arse->db, "%s.ro
22170 77 69 64 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  wid", pTab->zNam
22180 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
22190 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52  ITE_CONSTRAINT_R
221a0 4f 57 49 44 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OWID;.  }.  sqli
221b0 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69 6e  te3HaltConstrain
221c0 74 28 70 50 61 72 73 65 2c 20 72 63 2c 20 6f 6e  t(pParse, rc, on
221d0 45 72 72 6f 72 2c 20 7a 4d 73 67 2c 20 50 34 5f  Error, zMsg, P4_
221e0 44 59 4e 41 4d 49 43 2c 0a 20 20 20 20 20 20 20  DYNAMIC,.       
221f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22200 20 50 35 5f 43 6f 6e 73 74 72 61 69 6e 74 55 6e   P5_ConstraintUn
22210 69 71 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ique);.}../*.** 
22220 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
22230 70 49 6e 64 65 78 20 75 73 65 73 20 74 68 65 20  pIndex uses the 
22240 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
22250 63 65 20 70 43 6f 6c 6c 2e 20 20 52 65 74 75 72  ce pColl.  Retur
22260 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 69 74 20  n.** true if it 
22270 64 6f 65 73 20 61 6e 64 20 66 61 6c 73 65 20 69  does and false i
22280 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 2a  f it does not..*
22290 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
222a0 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a 73 74  _OMIT_REINDEX.st
222b0 61 74 69 63 20 69 6e 74 20 63 6f 6c 6c 61 74 69  atic int collati
222c0 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
222d0 61 72 20 2a 7a 43 6f 6c 6c 2c 20 49 6e 64 65 78  ar *zColl, Index
222e0 20 2a 70 49 6e 64 65 78 29 7b 0a 20 20 69 6e 74   *pIndex){.  int
222f0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 43   i;.  assert( zC
22300 6f 6c 6c 21 3d 30 20 29 3b 0a 20 20 66 6f 72 28  oll!=0 );.  for(
22310 69 3d 30 3b 20 69 3c 70 49 6e 64 65 78 2d 3e 6e  i=0; i<pIndex->n
22320 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Column; i++){.  
22330 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
22340 3d 20 70 49 6e 64 65 78 2d 3e 61 7a 43 6f 6c 6c  = pIndex->azColl
22350 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
22360 20 7a 21 3d 30 20 7c 7c 20 70 49 6e 64 65 78 2d   z!=0 || pIndex-
22370 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3c 30 20 29  >aiColumn[i]<0 )
22380 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 64 65 78  ;.    if( pIndex
22390 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3e 3d 30  ->aiColumn[i]>=0
223a0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 53 74   && 0==sqlite3St
223b0 72 49 43 6d 70 28 7a 2c 20 7a 43 6f 6c 6c 29 20  rICmp(z, zColl) 
223c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
223d0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
223e0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
223f0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75  f../*.** Recompu
22400 74 65 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  te all indices o
22410 66 20 70 54 61 62 20 74 68 61 74 20 75 73 65 20  f pTab that use 
22420 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
22430 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 0a 2a 2a  quence pColl..**
22440 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74 68 65   If pColl==0 the
22450 6e 20 72 65 63 6f 6d 70 75 74 65 20 61 6c 6c 20  n recompute all 
22460 69 6e 64 69 63 65 73 20 6f 66 20 70 54 61 62 2e  indices of pTab.
22470 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
22480 54 45 5f 4f 4d 49 54 5f 52 45 49 4e 44 45 58 0a  TE_OMIT_REINDEX.
22490 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 69 6e  static void rein
224a0 64 65 78 54 61 62 6c 65 28 50 61 72 73 65 20 2a  dexTable(Parse *
224b0 70 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70  pParse, Table *p
224c0 54 61 62 2c 20 63 68 61 72 20 63 6f 6e 73 74 20  Tab, char const 
224d0 2a 7a 43 6f 6c 6c 29 7b 0a 20 20 49 6e 64 65 78  *zColl){.  Index
224e0 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20   *pIndex;       
224f0 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
22500 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ex associated wi
22510 74 68 20 70 54 61 62 20 2a 2f 0a 0a 20 20 66 6f  th pTab */..  fo
22520 72 28 70 49 6e 64 65 78 3d 70 54 61 62 2d 3e 70  r(pIndex=pTab->p
22530 49 6e 64 65 78 3b 20 70 49 6e 64 65 78 3b 20 70  Index; pIndex; p
22540 49 6e 64 65 78 3d 70 49 6e 64 65 78 2d 3e 70 4e  Index=pIndex->pN
22550 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 7a 43  ext){.    if( zC
22560 6f 6c 6c 3d 3d 30 20 7c 7c 20 63 6f 6c 6c 61 74  oll==0 || collat
22570 69 6f 6e 4d 61 74 63 68 28 7a 43 6f 6c 6c 2c 20  ionMatch(zColl, 
22580 70 49 6e 64 65 78 29 20 29 7b 0a 20 20 20 20 20  pIndex) ){.     
22590 20 69 6e 74 20 69 44 62 20 3d 20 73 71 6c 69 74   int iDb = sqlit
225a0 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
225b0 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62  pParse->db, pTab
225c0 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
225d0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72    sqlite3BeginWr
225e0 69 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61  iteOperation(pPa
225f0 72 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20  rse, 0, iDb);.  
22600 20 20 20 20 73 71 6c 69 74 65 33 52 65 66 69 6c      sqlite3Refil
22610 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
22620 49 6e 64 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20  Index, -1);.    
22630 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
22640 2f 2a 0a 2a 2a 20 52 65 63 6f 6d 70 75 74 65 20  /*.** Recompute 
22650 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f 66 20 61  all indices of a
22660 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 61 6c 6c  ll tables in all
22670 20 64 61 74 61 62 61 73 65 73 20 77 68 65 72 65   databases where
22680 20 74 68 65 0a 2a 2a 20 69 6e 64 69 63 65 73 20   the.** indices 
22690 75 73 65 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e  use the collatin
226a0 67 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  g sequence pColl
226b0 2e 20 20 49 66 20 70 43 6f 6c 6c 3d 3d 30 20 74  .  If pColl==0 t
226c0 68 65 6e 20 72 65 63 6f 6d 70 75 74 65 0a 2a 2a  hen recompute.**
226d0 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 65 76 65   all indices eve
226e0 72 79 77 68 65 72 65 2e 0a 2a 2f 0a 23 69 66 6e  rywhere..*/.#ifn
226f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22700 52 45 49 4e 44 45 58 0a 73 74 61 74 69 63 20 76  REINDEX.static v
22710 6f 69 64 20 72 65 69 6e 64 65 78 44 61 74 61 62  oid reindexDatab
22720 61 73 65 73 28 50 61 72 73 65 20 2a 70 50 61 72  ases(Parse *pPar
22730 73 65 2c 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  se, char const *
22740 7a 43 6f 6c 6c 29 7b 0a 20 20 44 62 20 2a 70 44  zColl){.  Db *pD
22750 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
22760 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
22770 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
22780 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
22790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
227a0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
227b0 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71  x number */.  sq
227c0 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
227d0 73 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65  se->db;   /* The
227e0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
227f0 74 69 6f 6e 20 2a 2f 0a 20 20 48 61 73 68 45 6c  tion */.  HashEl
22800 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
22810 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
22820 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
22830 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
22840 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
22850 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
22860 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
22870 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
22880 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
22890 6c 64 73 41 6c 6c 4d 75 74 65 78 65 73 28 64 62  ldsAllMutexes(db
228a0 29 20 29 3b 20 20 2f 2a 20 4e 65 65 64 65 64 20  ) );  /* Needed 
228b0 66 6f 72 20 73 63 68 65 6d 61 20 61 63 63 65 73  for schema acces
228c0 73 20 2a 2f 0a 20 20 66 6f 72 28 69 44 62 3d 30  s */.  for(iDb=0
228d0 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69  , pDb=db->aDb; i
228e0 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b  Db<db->nDb; iDb+
228f0 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 61  +, pDb++){.    a
22900 73 73 65 72 74 28 20 70 44 62 21 3d 30 20 29 3b  ssert( pDb!=0 );
22910 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74  .    for(k=sqlit
22920 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d  eHashFirst(&pDb-
22930 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73  >pSchema->tblHas
22940 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65  h);  k; k=sqlite
22950 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20  HashNext(k)){.  
22960 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c      pTab = (Tabl
22970 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74  e*)sqliteHashDat
22980 61 28 6b 29 3b 0a 20 20 20 20 20 20 72 65 69 6e  a(k);.      rein
22990 64 65 78 54 61 62 6c 65 28 70 50 61 72 73 65 2c  dexTable(pParse,
229a0 20 70 54 61 62 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   pTab, zColl);. 
229b0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69     }.  }.}.#endi
229c0 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  f../*.** Generat
229d0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 52  e code for the R
229e0 45 49 4e 44 45 58 20 63 6f 6d 6d 61 6e 64 2e 0a  EINDEX command..
229f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 52 45 49  **.**        REI
22a00 4e 44 45 58 20 20 20 20 20 20 20 20 20 20 20 20  NDEX            
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a20 2d 2d 20 31 0a 2a 2a 20 20 20 20 20 20 20 20 52  -- 1.**        R
22a30 45 49 4e 44 45 58 20 20 3c 63 6f 6c 6c 61 74 69  EINDEX  <collati
22a40 6f 6e 3e 20 20 20 20 20 20 20 20 20 20 20 20 20  on>             
22a50 20 20 2d 2d 20 32 0a 2a 2a 20 20 20 20 20 20 20    -- 2.**       
22a60 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61 74 61   REINDEX  ?<data
22a70 62 61 73 65 3e 2e 3f 3c 74 61 62 6c 65 6e 61 6d  base>.?<tablenam
22a80 65 3e 20 20 2d 2d 20 33 0a 2a 2a 20 20 20 20 20  e>  -- 3.**     
22a90 20 20 20 52 45 49 4e 44 45 58 20 20 3f 3c 64 61     REINDEX  ?<da
22aa0 74 61 62 61 73 65 3e 2e 3f 3c 69 6e 64 65 78 6e  tabase>.?<indexn
22ab0 61 6d 65 3e 20 20 2d 2d 20 34 0a 2a 2a 0a 2a 2a  ame>  -- 4.**.**
22ac0 20 46 6f 72 6d 20 31 20 63 61 75 73 65 73 20 61   Form 1 causes a
22ad0 6c 6c 20 69 6e 64 69 63 65 73 20 69 6e 20 61 6c  ll indices in al
22ae0 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
22af0 61 73 65 73 20 74 6f 20 62 65 20 72 65 62 75 69  ases to be rebui
22b00 6c 74 2e 0a 2a 2a 20 46 6f 72 6d 20 32 20 72 65  lt..** Form 2 re
22b10 62 75 69 6c 64 73 20 61 6c 6c 20 69 6e 64 69 63  builds all indic
22b20 65 73 20 69 6e 20 61 6c 6c 20 64 61 74 61 62 61  es in all databa
22b30 73 65 73 20 74 68 61 74 20 75 73 65 20 74 68 65  ses that use the
22b40 20 6e 61 6d 65 64 0a 2a 2a 20 63 6f 6c 6c 61 74   named.** collat
22b50 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 20 46  ing function.  F
22b60 6f 72 6d 73 20 33 20 61 6e 64 20 34 20 72 65 62  orms 3 and 4 reb
22b70 75 69 6c 64 20 74 68 65 20 6e 61 6d 65 64 20 69  uild the named i
22b80 6e 64 65 78 20 6f 72 20 61 6c 6c 0a 2a 2a 20 69  ndex or all.** i
22b90 6e 64 69 63 65 73 20 61 73 73 6f 63 69 61 74 65  ndices associate
22ba0 64 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 64  d with the named
22bb0 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64   table..*/.#ifnd
22bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ef SQLITE_OMIT_R
22bd0 45 49 4e 44 45 58 0a 76 6f 69 64 20 73 71 6c 69  EINDEX.void sqli
22be0 74 65 33 52 65 69 6e 64 65 78 28 50 61 72 73 65  te3Reindex(Parse
22bf0 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20   *pParse, Token 
22c00 2a 70 4e 61 6d 65 31 2c 20 54 6f 6b 65 6e 20 2a  *pName1, Token *
22c10 70 4e 61 6d 65 32 29 7b 0a 20 20 43 6f 6c 6c 53  pName2){.  CollS
22c20 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20 20  eq *pColl;      
22c30 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74         /* Collat
22c40 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20  ing sequence to 
22c50 62 65 20 72 65 69 6e 64 65 78 65 64 2c 20 6f 72  be reindexed, or
22c60 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
22c70 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *z;             
22c80 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
22c90 66 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  f a table or ind
22ca0 65 78 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ex */.  const ch
22cb0 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20  ar *zDb;        
22cc0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
22cd0 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
22ce0 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22d00 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
22d10 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
22d20 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20 20 20  ex *pIndex;     
22d30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69           /* An i
22d40 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64 20  ndex associated 
22d50 77 69 74 68 20 70 54 61 62 20 2a 2f 0a 20 20 69  with pTab */.  i
22d60 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20  nt iDb;         
22d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
22d80 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78  e database index
22d90 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73 71 6c   number */.  sql
22da0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
22db0 65 2d 3e 64 62 3b 20 20 20 2f 2a 20 54 68 65 20  e->db;   /* The 
22dc0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22dd0 69 6f 6e 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ion */.  Token *
22de0 70 4f 62 6a 4e 61 6d 65 3b 20 20 20 20 20 20 20  pObjName;       
22df0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
22e00 74 68 65 20 74 61 62 6c 65 20 6f 72 20 69 6e 64  the table or ind
22e10 65 78 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78  ex to be reindex
22e20 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  ed */..  /* Read
22e30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 63   the database sc
22e40 68 65 6d 61 2e 20 49 66 20 61 6e 20 65 72 72 6f  hema. If an erro
22e50 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
22e60 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
22e70 0a 20 20 2a 2a 20 61 6e 64 20 63 6f 64 65 20 69  .  ** and code i
22e80 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
22e90 75 72 6e 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 69  urn NULL. */.  i
22ea0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  f( SQLITE_OK!=sq
22eb0 6c 69 74 65 33 52 65 61 64 53 63 68 65 6d 61 28  lite3ReadSchema(
22ec0 70 50 61 72 73 65 29 20 29 7b 0a 20 20 20 20 72  pParse) ){.    r
22ed0 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
22ee0 28 20 70 4e 61 6d 65 31 3d 3d 30 20 29 7b 0a 20  ( pName1==0 ){. 
22ef0 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
22f00 73 65 73 28 70 50 61 72 73 65 2c 20 30 29 3b 0a  ses(pParse, 0);.
22f10 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
22f20 6c 73 65 20 69 66 28 20 4e 45 56 45 52 28 70 4e  lse if( NEVER(pN
22f30 61 6d 65 32 3d 3d 30 29 20 7c 7c 20 70 4e 61 6d  ame2==0) || pNam
22f40 65 32 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  e2->z==0 ){.    
22f50 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 0a 20 20 20  char *zColl;.   
22f60 20 61 73 73 65 72 74 28 20 70 4e 61 6d 65 31 2d   assert( pName1-
22f70 3e 7a 20 29 3b 0a 20 20 20 20 7a 43 6f 6c 6c 20  >z );.    zColl 
22f80 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
22f90 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65 2d 3e 64  mToken(pParse->d
22fa0 62 2c 20 70 4e 61 6d 65 31 29 3b 0a 20 20 20 20  b, pName1);.    
22fb0 69 66 28 20 21 7a 43 6f 6c 6c 20 29 20 72 65 74  if( !zColl ) ret
22fc0 75 72 6e 3b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d  urn;.    pColl =
22fd0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
22fe0 53 65 71 28 64 62 2c 20 45 4e 43 28 64 62 29 2c  Seq(db, ENC(db),
22ff0 20 7a 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   zColl, 0);.    
23000 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
23010 20 20 20 72 65 69 6e 64 65 78 44 61 74 61 62 61     reindexDataba
23020 73 65 73 28 70 50 61 72 73 65 2c 20 7a 43 6f 6c  ses(pParse, zCol
23030 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
23040 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43 6f 6c  3DbFree(db, zCol
23050 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
23060 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
23070 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 43  te3DbFree(db, zC
23080 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20 69 44 62 20  oll);.  }.  iDb 
23090 3d 20 73 71 6c 69 74 65 33 54 77 6f 50 61 72 74  = sqlite3TwoPart
230a0 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 4e 61  Name(pParse, pNa
230b0 6d 65 31 2c 20 70 4e 61 6d 65 32 2c 20 26 70 4f  me1, pName2, &pO
230c0 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 69  bjName);.  if( i
230d0 44 62 3c 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  Db<0 ) return;. 
230e0 20 7a 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65   z = sqlite3Name
230f0 46 72 6f 6d 54 6f 6b 65 6e 28 64 62 2c 20 70 4f  FromToken(db, pO
23100 62 6a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  bjName);.  if( z
23110 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
23120 7a 44 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44  zDb = db->aDb[iD
23130 62 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 70 54 61 62  b].zName;.  pTab
23140 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
23150 62 6c 65 28 64 62 2c 20 7a 2c 20 7a 44 62 29 3b  ble(db, z, zDb);
23160 0a 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20  .  if( pTab ){. 
23170 20 20 20 72 65 69 6e 64 65 78 54 61 62 6c 65 28     reindexTable(
23180 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20 30 29  pParse, pTab, 0)
23190 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
231a0 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 20 20  ree(db, z);.    
231b0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49  return;.  }.  pI
231c0 6e 64 65 78 20 3d 20 73 71 6c 69 74 65 33 46 69  ndex = sqlite3Fi
231d0 6e 64 49 6e 64 65 78 28 64 62 2c 20 7a 2c 20 7a  ndIndex(db, z, z
231e0 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Db);.  sqlite3Db
231f0 46 72 65 65 28 64 62 2c 20 7a 29 3b 0a 20 20 69  Free(db, z);.  i
23200 66 28 20 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  f( pIndex ){.   
23210 20 73 71 6c 69 74 65 33 42 65 67 69 6e 57 72 69   sqlite3BeginWri
23220 74 65 4f 70 65 72 61 74 69 6f 6e 28 70 50 61 72  teOperation(pPar
23230 73 65 2c 20 30 2c 20 69 44 62 29 3b 0a 20 20 20  se, 0, iDb);.   
23240 20 73 71 6c 69 74 65 33 52 65 66 69 6c 6c 49 6e   sqlite3RefillIn
23250 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 6e 64  dex(pParse, pInd
23260 65 78 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74  ex, -1);.    ret
23270 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  urn;.  }.  sqlit
23280 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
23290 65 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 69 64  e, "unable to id
232a0 65 6e 74 69 66 79 20 74 68 65 20 6f 62 6a 65 63  entify the objec
232b0 74 20 74 6f 20 62 65 20 72 65 69 6e 64 65 78 65  t to be reindexe
232c0 64 22 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  d");.}.#endif../
232d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 4b 65  *.** Return a Ke
232e0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
232f0 74 68 61 74 20 69 73 20 61 70 70 72 6f 70 72 69  that is appropri
23300 61 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65  ate for the give
23310 6e 20 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 54  n Index..**.** T
23320 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  he KeyInfo struc
23330 74 75 72 65 20 66 6f 72 20 61 6e 20 69 6e 64 65  ture for an inde
23340 78 20 69 73 20 63 61 63 68 65 64 20 69 6e 20 74  x is cached in t
23350 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  he Index object.
23360 0a 2a 2a 20 53 6f 20 74 68 65 72 65 20 6d 69 67  .** So there mig
23370 68 74 20 62 65 20 6d 75 6c 74 69 70 6c 65 20 72  ht be multiple r
23380 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
23390 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
233a0 72 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 65  r.  The.** calle
233b0 72 20 73 68 6f 75 6c 64 20 6e 6f 74 20 74 72 79  r should not try
233c0 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 4b   to modify the K
233d0 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a  eyInfo object..*
233e0 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
233f0 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
23400 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65  lite3KeyInfoUnre
23410 66 28 29 20 6f 6e 20 74 68 65 20 72 65 74 75 72  f() on the retur
23420 6e 65 64 20 6f 62 6a 65 63 74 0a 2a 2a 20 77 68  ned object.** wh
23430 65 6e 20 69 74 20 68 61 73 20 66 69 6e 69 73 68  en it has finish
23440 65 64 20 75 73 69 6e 67 20 69 74 2e 0a 2a 2f 0a  ed using it..*/.
23450 4b 65 79 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33  KeyInfo *sqlite3
23460 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 50  KeyInfoOfIndex(P
23470 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
23480 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 69 6e  dex *pIdx){.  in
23490 74 20 69 3b 0a 20 20 69 6e 74 20 6e 43 6f 6c 20  t i;.  int nCol 
234a0 3d 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  = pIdx->nColumn;
234b0 0a 20 20 69 6e 74 20 6e 4b 65 79 20 3d 20 70 49  .  int nKey = pI
234c0 64 78 2d 3e 6e 4b 65 79 43 6f 6c 3b 0a 20 20 4b  dx->nKeyCol;.  K
234d0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 3b 0a 20 20  eyInfo *pKey;.  
234e0 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  if( pParse->nErr
234f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
23500 66 28 20 70 49 64 78 2d 3e 75 6e 69 71 4e 6f 74  f( pIdx->uniqNot
23510 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 70 4b 65 79  Null ){.    pKey
23520 20 3d 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66   = sqlite3KeyInf
23530 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64  oAlloc(pParse->d
23540 62 2c 20 6e 4b 65 79 2c 20 6e 43 6f 6c 2d 6e 4b  b, nKey, nCol-nK
23550 65 79 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ey);.  }else{.  
23560 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
23570 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 70 50 61  KeyInfoAlloc(pPa
23580 72 73 65 2d 3e 64 62 2c 20 6e 43 6f 6c 2c 20 30  rse->db, nCol, 0
23590 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4b 65  );.  }.  if( pKe
235a0 79 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  y ){.    assert(
235b0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49   sqlite3KeyInfoI
235c0 73 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 29  sWriteable(pKey)
235d0 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   );.    for(i=0;
235e0 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
235f0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
23600 2a 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61  *zColl = pIdx->a
23610 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  zColl[i];.      
23620 70 4b 65 79 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 3d  pKey->aColl[i] =
23630 20 7a 43 6f 6c 6c 3d 3d 73 71 6c 69 74 65 33 53   zColl==sqlite3S
23640 74 72 42 49 4e 41 52 59 20 3f 20 30 20 3a 0a 20  trBINARY ? 0 :. 
23650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4c 6f         sqlite3Lo
23670 63 61 74 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  cateCollSeq(pPar
23680 73 65 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20  se, zColl);.    
23690 20 20 70 4b 65 79 2d 3e 61 53 6f 72 74 4f 72 64    pKey->aSortOrd
236a0 65 72 5b 69 5d 20 3d 20 70 49 64 78 2d 3e 61 53  er[i] = pIdx->aS
236b0 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
236c0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 72 73   }.    if( pPars
236d0 65 2d 3e 6e 45 72 72 20 29 7b 0a 20 20 20 20 20  e->nErr ){.     
236e0 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55   sqlite3KeyInfoU
236f0 6e 72 65 66 28 70 4b 65 79 29 3b 0a 20 20 20 20  nref(pKey);.    
23700 20 20 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20    pKey = 0;.    
23710 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
23720 4b 65 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Key;.}..#ifndef 
23730 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54 45 0a  SQLITE_OMIT_CTE.
23740 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  /* .** This rout
23750 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ine is invoked o
23760 6e 63 65 20 70 65 72 20 43 54 45 20 62 79 20 74  nce per CTE by t
23770 68 65 20 70 61 72 73 65 72 20 77 68 69 6c 65 20  he parser while 
23780 70 61 72 73 69 6e 67 20 61 20 0a 2a 2a 20 57 49  parsing a .** WI
23790 54 48 20 63 6c 61 75 73 65 2e 20 0a 2a 2f 0a 57  TH clause. .*/.W
237a0 69 74 68 20 2a 73 71 6c 69 74 65 33 57 69 74 68  ith *sqlite3With
237b0 41 64 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Add(.  Parse *pP
237c0 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f  arse,          /
237d0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
237e0 74 20 2a 2f 0a 20 20 57 69 74 68 20 2a 70 57 69  t */.  With *pWi
237f0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
23800 2a 20 45 78 69 73 74 69 6e 67 20 57 49 54 48 20  * Existing WITH 
23810 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
23820 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  */.  Token *pNam
23830 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
23840 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6d 6d  Name of the comm
23850 6f 6e 2d 74 61 62 6c 65 20 2a 2f 0a 20 20 45 78  on-table */.  Ex
23860 70 72 4c 69 73 74 20 2a 70 41 72 67 6c 69 73 74  prList *pArglist
23870 2c 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e 61  ,     /* Optiona
23880 6c 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 6c 69  l column name li
23890 73 74 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  st for the table
238a0 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 51   */.  Select *pQ
238b0 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f 2a  uery          /*
238c0 20 51 75 65 72 79 20 75 73 65 64 20 74 6f 20 69   Query used to i
238d0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61  nitialize the ta
238e0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ble */.){.  sqli
238f0 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
23900 2d 3e 64 62 3b 0a 20 20 57 69 74 68 20 2a 70 4e  ->db;.  With *pN
23910 65 77 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  ew;.  char *zNam
23920 65 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  e;..  /* Check t
23930 68 61 74 20 74 68 65 20 43 54 45 20 6e 61 6d 65  hat the CTE name
23940 20 69 73 20 75 6e 69 71 75 65 20 77 69 74 68 69   is unique withi
23950 6e 20 74 68 69 73 20 57 49 54 48 20 63 6c 61 75  n this WITH clau
23960 73 65 2e 20 49 66 0a 20 20 2a 2a 20 6e 6f 74 2c  se. If.  ** not,
23970 20 73 74 6f 72 65 20 61 6e 20 65 72 72 6f 72 20   store an error 
23980 69 6e 20 74 68 65 20 50 61 72 73 65 20 73 74 72  in the Parse str
23990 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20 7a 4e 61  ucture. */.  zNa
239a0 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
239b0 46 72 6f 6d 54 6f 6b 65 6e 28 70 50 61 72 73 65  FromToken(pParse
239c0 2d 3e 64 62 2c 20 70 4e 61 6d 65 29 3b 0a 20 20  ->db, pName);.  
239d0 69 66 28 20 7a 4e 61 6d 65 20 26 26 20 70 57 69  if( zName && pWi
239e0 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  th ){.    int i;
239f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23a00 70 57 69 74 68 2d 3e 6e 43 74 65 3b 20 69 2b 2b  pWith->nCte; i++
23a10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
23a20 69 74 65 33 53 74 72 49 43 6d 70 28 7a 4e 61 6d  ite3StrICmp(zNam
23a30 65 2c 20 70 57 69 74 68 2d 3e 61 5b 69 5d 2e 7a  e, pWith->a[i].z
23a40 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
23a50 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
23a60 4d 73 67 28 70 50 61 72 73 65 2c 20 22 64 75 70  Msg(pParse, "dup
23a70 6c 69 63 61 74 65 20 57 49 54 48 20 74 61 62 6c  licate WITH tabl
23a80 65 20 6e 61 6d 65 3a 20 25 73 22 2c 20 7a 4e 61  e name: %s", zNa
23a90 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
23aa0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 57   }.  }..  if( pW
23ab0 69 74 68 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ith ){.    int n
23ac0 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
23ad0 57 69 74 68 29 20 2b 20 28 73 69 7a 65 6f 66 28  With) + (sizeof(
23ae0 70 57 69 74 68 2d 3e 61 5b 31 5d 29 20 2a 20 70  pWith->a[1]) * p
23af0 57 69 74 68 2d 3e 6e 43 74 65 29 3b 0a 20 20 20  With->nCte);.   
23b00 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44   pNew = sqlite3D
23b10 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 57 69  bRealloc(db, pWi
23b20 74 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  th, nByte);.  }e
23b30 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  lse{.    pNew = 
23b40 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
23b50 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a  ero(db, sizeof(*
23b60 70 57 69 74 68 29 29 3b 0a 20 20 7d 0a 20 20 61  pWith));.  }.  a
23b70 73 73 65 72 74 28 20 7a 4e 61 6d 65 21 3d 30 20  ssert( zName!=0 
23b80 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 3b 0a 20 20  || pNew==0 );.  
23b90 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
23ba0 6f 63 46 61 69 6c 65 64 3d 3d 30 20 7c 7c 20 70  ocFailed==0 || p
23bb0 4e 65 77 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28  New==0 );..  if(
23bc0 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
23bd0 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
23be0 65 6c 65 74 65 28 64 62 2c 20 70 41 72 67 6c 69  elete(db, pArgli
23bf0 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  st);.    sqlite3
23c00 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64 62 2c  SelectDelete(db,
23c10 20 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71   pQuery);.    sq
23c20 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
23c30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  zName);.    pNew
23c40 20 3d 20 70 57 69 74 68 3b 0a 20 20 7d 65 6c 73   = pWith;.  }els
23c50 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 5b 70  e{.    pNew->a[p
23c60 4e 65 77 2d 3e 6e 43 74 65 5d 2e 70 53 65 6c 65  New->nCte].pSele
23c70 63 74 20 3d 20 70 51 75 65 72 79 3b 0a 20 20 20  ct = pQuery;.   
23c80 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e 6e   pNew->a[pNew->n
23c90 43 74 65 5d 2e 70 43 6f 6c 73 20 3d 20 70 41 72  Cte].pCols = pAr
23ca0 67 6c 69 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d  glist;.    pNew-
23cb0 3e 61 5b 70 4e 65 77 2d 3e 6e 43 74 65 5d 2e 7a  >a[pNew->nCte].z
23cc0 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
23cd0 20 20 70 4e 65 77 2d 3e 61 5b 70 4e 65 77 2d 3e    pNew->a[pNew->
23ce0 6e 43 74 65 5d 2e 7a 43 74 65 45 72 72 20 3d 20  nCte].zCteErr = 
23cf0 30 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 43 74  0;.    pNew->nCt
23d00 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  e++;.  }..  retu
23d10 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
23d20 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 74 65  * Free the conte
23d30 6e 74 73 20 6f 66 20 74 68 65 20 57 69 74 68 20  nts of the With 
23d40 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
23d50 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
23d60 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ment..*/.void sq
23d70 6c 69 74 65 33 57 69 74 68 44 65 6c 65 74 65 28  lite3WithDelete(
23d80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 69 74  sqlite3 *db, Wit
23d90 68 20 2a 70 57 69 74 68 29 7b 0a 20 20 69 66 28  h *pWith){.  if(
23da0 20 70 57 69 74 68 20 29 7b 0a 20 20 20 20 69 6e   pWith ){.    in
23db0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
23dc0 3b 20 69 3c 70 57 69 74 68 2d 3e 6e 43 74 65 3b  ; i<pWith->nCte;
23dd0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
23de0 75 63 74 20 43 74 65 20 2a 70 43 74 65 20 3d 20  uct Cte *pCte = 
23df0 26 70 57 69 74 68 2d 3e 61 5b 69 5d 3b 0a 20 20  &pWith->a[i];.  
23e00 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
23e10 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 43  istDelete(db, pC
23e20 74 65 2d 3e 70 43 6f 6c 73 29 3b 0a 20 20 20 20  te->pCols);.    
23e30 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
23e40 65 6c 65 74 65 28 64 62 2c 20 70 43 74 65 2d 3e  elete(db, pCte->
23e50 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
23e60 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23e70 2c 20 70 43 74 65 2d 3e 7a 4e 61 6d 65 29 3b 0a  , pCte->zName);.
23e80 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
23e90 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 69 74  3DbFree(db, pWit
23ea0 68 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  h);.  }.}.#endif
23eb0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
23ec0 49 54 45 5f 4f 4d 49 54 5f 43 54 45 29 20 2a 2f  ITE_OMIT_CTE) */
23ed0 0a                                               .